Skip to content

Commit e36be49

Browse files
authored
Implement stable semconv for db connection pool metrics (#13785)
1 parent 949b73c commit e36be49

File tree

11 files changed

+182
-48
lines changed

11 files changed

+182
-48
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbConnectionPoolMetrics.java

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
*/
2828
public final class DbConnectionPoolMetrics {
2929

30-
static final AttributeKey<String> POOL_NAME = stringKey("pool.name");
31-
static final AttributeKey<String> CONNECTION_STATE = stringKey("state");
30+
static final AttributeKey<String> POOL_NAME =
31+
stringKey(emitStableDatabaseSemconv() ? "db.client.connection.pool.name" : "pool.name");
32+
static final AttributeKey<String> CONNECTION_STATE =
33+
stringKey(emitStableDatabaseSemconv() ? "db.client.connection.state" : "state");
3234

3335
static final String STATE_IDLE = "idle";
3436
static final String STATE_USED = "used";
@@ -61,42 +63,58 @@ public ObservableLongMeasurement connections() {
6163
emitStableDatabaseSemconv() ? "db.client.connection.count" : "db.client.connections.usage";
6264
return meter
6365
.upDownCounterBuilder(metricName)
64-
.setUnit("{connections}")
66+
.setUnit(emitStableDatabaseSemconv() ? "{connection}" : "{connections}")
6567
.setDescription(
6668
"The number of connections that are currently in state described by the state attribute.")
6769
.buildObserver();
6870
}
6971

7072
public ObservableLongMeasurement minIdleConnections() {
73+
String metricName =
74+
emitStableDatabaseSemconv()
75+
? "db.client.connection.idle.min"
76+
: "db.client.connections.idle.min";
7177
return meter
72-
.upDownCounterBuilder("db.client.connections.idle.min")
73-
.setUnit("{connections}")
78+
.upDownCounterBuilder(metricName)
79+
.setUnit(emitStableDatabaseSemconv() ? "{connection}" : "{connections}")
7480
.setDescription("The minimum number of idle open connections allowed.")
7581
.buildObserver();
7682
}
7783

7884
public ObservableLongMeasurement maxIdleConnections() {
85+
String metricName =
86+
emitStableDatabaseSemconv()
87+
? "db.client.connection.idle.max"
88+
: "db.client.connections.idle.max";
7989
return meter
80-
.upDownCounterBuilder("db.client.connections.idle.max")
81-
.setUnit("{connections}")
90+
.upDownCounterBuilder(metricName)
91+
.setUnit(emitStableDatabaseSemconv() ? "{connection}" : "{connections}")
8292
.setDescription("The maximum number of idle open connections allowed.")
8393
.buildObserver();
8494
}
8595

8696
public ObservableLongMeasurement maxConnections() {
97+
String metricName =
98+
emitStableDatabaseSemconv() ? "db.client.connection.max" : "db.client.connections.max";
8799
return meter
88-
.upDownCounterBuilder("db.client.connections.max")
89-
.setUnit("{connections}")
100+
.upDownCounterBuilder(metricName)
101+
.setUnit(emitStableDatabaseSemconv() ? "{connection}" : "{connections}")
90102
.setDescription("The maximum number of open connections allowed.")
91103
.buildObserver();
92104
}
93105

94106
public ObservableLongMeasurement pendingRequestsForConnection() {
107+
String metricName =
108+
emitStableDatabaseSemconv()
109+
? "db.client.connection.pending_requests"
110+
: "db.client.connections.pending_requests";
95111
return meter
96-
.upDownCounterBuilder("db.client.connections.pending_requests")
97-
.setUnit("{requests}")
112+
.upDownCounterBuilder(metricName)
113+
.setUnit(emitStableDatabaseSemconv() ? "{request}" : "{requests}")
98114
.setDescription(
99-
"The number of pending requests for an open connection, cumulative for the entire pool.")
115+
emitStableDatabaseSemconv()
116+
? "The number of current pending requests for an open connection."
117+
: "The number of pending requests for an open connection, cumulative for the entire pool.")
100118
.buildObserver();
101119
}
102120

@@ -107,39 +125,51 @@ public BatchCallback batchCallback(
107125
return meter.batchCallback(callback, observableMeasurement, additionalMeasurements);
108126
}
109127

110-
// TODO: should be a BoundLongCounter
111128
public LongCounter connectionTimeouts() {
129+
String metricName =
130+
emitStableDatabaseSemconv()
131+
? "db.client.connection.timeouts"
132+
: "db.client.connections.timeouts";
112133
return meter
113-
.counterBuilder("db.client.connections.timeouts")
114-
.setUnit("{timeouts}")
134+
.counterBuilder(metricName)
135+
.setUnit(emitStableDatabaseSemconv() ? "{timeout}" : "{timeouts}")
115136
.setDescription(
116137
"The number of connection timeouts that have occurred trying to obtain a connection from the pool.")
117138
.build();
118139
}
119140

120-
// TODO: should be a BoundDoubleHistogram
121141
public DoubleHistogram connectionCreateTime() {
142+
String metricName =
143+
emitStableDatabaseSemconv()
144+
? "db.client.connection.create_time"
145+
: "db.client.connections.create_time";
122146
return meter
123-
.histogramBuilder("db.client.connections.create_time")
124-
.setUnit("ms")
147+
.histogramBuilder(metricName)
148+
.setUnit(emitStableDatabaseSemconv() ? "s" : "ms")
125149
.setDescription("The time it took to create a new connection.")
126150
.build();
127151
}
128152

129-
// TODO: should be a BoundDoubleHistogram
130153
public DoubleHistogram connectionWaitTime() {
154+
String metricName =
155+
emitStableDatabaseSemconv()
156+
? "db.client.connection.wait_time"
157+
: "db.client.connections.wait_time";
131158
return meter
132-
.histogramBuilder("db.client.connections.wait_time")
133-
.setUnit("ms")
159+
.histogramBuilder(metricName)
160+
.setUnit(emitStableDatabaseSemconv() ? "s" : "ms")
134161
.setDescription("The time it took to obtain an open connection from the pool.")
135162
.build();
136163
}
137164

138-
// TODO: should be a BoundDoubleHistogram
139165
public DoubleHistogram connectionUseTime() {
166+
String metricName =
167+
emitStableDatabaseSemconv()
168+
? "db.client.connection.use_time"
169+
: "db.client.connections.use_time";
140170
return meter
141-
.histogramBuilder("db.client.connections.use_time")
142-
.setUnit("ms")
171+
.histogramBuilder(metricName)
172+
.setUnit(emitStableDatabaseSemconv() ? "s" : "ms")
143173
.setDescription("The time between borrowing a connection and returning it to the pool.")
144174
.build();
145175
}

instrumentation/c3p0-0.9/javaagent/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,13 @@ dependencies {
2020

2121
testImplementation(project(":instrumentation:c3p0-0.9:testing"))
2222
}
23+
24+
tasks {
25+
val testStableSemconv by registering(Test::class) {
26+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
27+
}
28+
29+
check {
30+
dependsOn(testStableSemconv)
31+
}
32+
}

instrumentation/c3p0-0.9/library/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ dependencies {
88

99
testImplementation(project(":instrumentation:c3p0-0.9:testing"))
1010
}
11+
12+
tasks {
13+
val testStableSemconv by registering(Test::class) {
14+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
15+
}
16+
17+
check {
18+
dependsOn(testStableSemconv)
19+
}
20+
}

instrumentation/hikaricp-3.0/javaagent/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,13 @@ dependencies {
2121

2222
testImplementation(project(":instrumentation:hikaricp-3.0:testing"))
2323
}
24+
25+
tasks {
26+
val testStableSemconv by registering(Test::class) {
27+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
28+
}
29+
30+
check {
31+
dependsOn(testStableSemconv)
32+
}
33+
}

instrumentation/hikaricp-3.0/library/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ dependencies {
88

99
testImplementation(project(":instrumentation:hikaricp-3.0:testing"))
1010
}
11+
12+
tasks {
13+
val testStableSemconv by registering(Test::class) {
14+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
15+
}
16+
17+
check {
18+
dependsOn(testStableSemconv)
19+
}
20+
}

instrumentation/hikaricp-3.0/library/src/main/java/io/opentelemetry/instrumentation/hikaricp/v3_0/OpenTelemetryMetricsTracker.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.instrumentation.hikaricp.v3_0;
77

8+
import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv;
9+
810
import com.zaxxer.hikari.metrics.IMetricsTracker;
911
import io.opentelemetry.api.common.Attributes;
1012
import io.opentelemetry.api.metrics.BatchCallback;
@@ -15,6 +17,8 @@
1517
final class OpenTelemetryMetricsTracker implements IMetricsTracker {
1618

1719
private static final double NANOS_PER_MS = TimeUnit.MILLISECONDS.toNanos(1);
20+
private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1);
21+
private static final double MILLIS_PER_S = TimeUnit.SECONDS.toMillis(1);
1822

1923
private final IMetricsTracker userMetricsTracker;
2024

@@ -44,20 +48,26 @@ final class OpenTelemetryMetricsTracker implements IMetricsTracker {
4448

4549
@Override
4650
public void recordConnectionCreatedMillis(long connectionCreatedMillis) {
47-
createTime.record((double) connectionCreatedMillis, attributes);
51+
double time =
52+
emitStableDatabaseSemconv()
53+
? connectionCreatedMillis / MILLIS_PER_S
54+
: connectionCreatedMillis;
55+
createTime.record(time, attributes);
4856
userMetricsTracker.recordConnectionCreatedMillis(connectionCreatedMillis);
4957
}
5058

5159
@Override
5260
public void recordConnectionAcquiredNanos(long elapsedAcquiredNanos) {
53-
double millis = elapsedAcquiredNanos / NANOS_PER_MS;
54-
waitTime.record(millis, attributes);
61+
double time = elapsedAcquiredNanos / (emitStableDatabaseSemconv() ? NANOS_PER_S : NANOS_PER_MS);
62+
waitTime.record(time, attributes);
5563
userMetricsTracker.recordConnectionAcquiredNanos(elapsedAcquiredNanos);
5664
}
5765

5866
@Override
5967
public void recordConnectionUsageMillis(long elapsedBorrowedMillis) {
60-
useTime.record((double) elapsedBorrowedMillis, attributes);
68+
double time =
69+
emitStableDatabaseSemconv() ? elapsedBorrowedMillis / MILLIS_PER_S : elapsedBorrowedMillis;
70+
useTime.record(time, attributes);
6171
userMetricsTracker.recordConnectionUsageMillis(elapsedBorrowedMillis);
6272
}
6373

instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,12 @@ tasks {
2424
test {
2525
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service)
2626
}
27+
28+
val testStableSemconv by registering(Test::class) {
29+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
30+
}
31+
32+
check {
33+
dependsOn(testStableSemconv)
34+
}
2735
}

instrumentation/oracle-ucp-11.2/library/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,12 @@ tasks {
1414
test {
1515
usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service)
1616
}
17+
18+
val testStableSemconv by registering(Test::class) {
19+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
20+
}
21+
22+
check {
23+
dependsOn(testStableSemconv)
24+
}
1725
}

instrumentation/vibur-dbcp-11.0/javaagent/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,13 @@ dependencies {
1818

1919
testImplementation(project(":instrumentation:vibur-dbcp-11.0:testing"))
2020
}
21+
22+
tasks {
23+
val testStableSemconv by registering(Test::class) {
24+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
25+
}
26+
27+
check {
28+
dependsOn(testStableSemconv)
29+
}
30+
}

instrumentation/vibur-dbcp-11.0/library/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ dependencies {
88

99
testImplementation(project(":instrumentation:vibur-dbcp-11.0:testing"))
1010
}
11+
12+
tasks {
13+
val testStableSemconv by registering(Test::class) {
14+
jvmArgs("-Dotel.semconv-stability.opt-in=database")
15+
}
16+
17+
check {
18+
dependsOn(testStableSemconv)
19+
}
20+
}

0 commit comments

Comments
 (0)