Skip to content

Commit daa70a4

Browse files
authored
Set instrumentation version on emitted Meter scopes (#18866)
1 parent 6cf4527 commit daa70a4

21 files changed

Lines changed: 259 additions & 40 deletions

File tree

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,24 @@ public final class DbConnectionPoolMetrics {
3737

3838
public static DbConnectionPoolMetrics create(
3939
OpenTelemetry openTelemetry, String instrumentationName, String poolName) {
40-
4140
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(instrumentationName);
4241
String version = EmbeddedInstrumentationProperties.findVersion(instrumentationName);
4342
if (version != null) {
4443
meterBuilder.setInstrumentationVersion(version);
4544
}
46-
return new DbConnectionPoolMetrics(meterBuilder.build(), Attributes.of(POOL_NAME, poolName));
45+
return create(meterBuilder.build(), poolName);
46+
}
47+
48+
/**
49+
* Like {@link #create(OpenTelemetry, String, String)}, but accepts a pre-built {@link Meter}.
50+
*
51+
* @deprecated Exists only so the {@code tomcat-jdbc-8.5} javaagent can emit the pre-rename {@code
52+
* io.opentelemetry.tomcat-jdbc} scope by default; to be removed in 3.0 once v3-preview
53+
* becomes the default.
54+
*/
55+
@Deprecated
56+
public static DbConnectionPoolMetrics create(Meter meter, String poolName) {
57+
return new DbConnectionPoolMetrics(meter, Attributes.of(POOL_NAME, poolName));
4758
}
4859

4960
private final Meter meter;

instrumentation/dropwizard/dropwizard-metrics-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/dropwizardmetrics/v4_0/DropwizardMetricsAdapter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import io.opentelemetry.api.metrics.LongCounter;
2020
import io.opentelemetry.api.metrics.LongHistogram;
2121
import io.opentelemetry.api.metrics.LongUpDownCounter;
22+
import io.opentelemetry.api.metrics.MeterBuilder;
2223
import io.opentelemetry.api.metrics.ObservableDoubleGauge;
24+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
2325
import io.opentelemetry.instrumentation.api.util.VirtualField;
2426
import java.util.Map;
2527
import java.util.concurrent.ConcurrentHashMap;
@@ -57,7 +59,13 @@ public class DropwizardMetricsAdapter implements MetricRegistryListener {
5759
private final Map<String, Timer> dropwizardTimers = new ConcurrentHashMap<>();
5860

5961
public DropwizardMetricsAdapter(OpenTelemetry openTelemetry) {
60-
this.otelMeter = openTelemetry.getMeter("io.opentelemetry.dropwizard-metrics-4.0");
62+
String instrumentationName = "io.opentelemetry.dropwizard-metrics-4.0";
63+
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(instrumentationName);
64+
String version = EmbeddedInstrumentationProperties.findVersion(instrumentationName);
65+
if (version != null) {
66+
meterBuilder.setInstrumentationVersion(version);
67+
}
68+
this.otelMeter = meterBuilder.build();
6169
}
6270

6371
/**

instrumentation/failsafe-3.0/library/src/main/java/io/opentelemetry/instrumentation/failsafe/v3_0/FailsafeTelemetry.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.opentelemetry.api.metrics.LongCounter;
2323
import io.opentelemetry.api.metrics.LongHistogram;
2424
import io.opentelemetry.api.metrics.Meter;
25+
import io.opentelemetry.api.metrics.MeterBuilder;
26+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
2527

2628
/** Entrypoint for instrumenting Failsafe components. */
2729
public final class FailsafeTelemetry {
@@ -53,7 +55,7 @@ private FailsafeTelemetry(OpenTelemetry openTelemetry) {
5355
public <R> CircuitBreaker<R> createCircuitBreaker(
5456
CircuitBreaker<R> delegate, String circuitBreakerName) {
5557
CircuitBreakerConfig<R> userConfig = delegate.getConfig();
56-
Meter meter = openTelemetry.getMeter(INSTRUMENTATION_NAME);
58+
Meter meter = getMeter();
5759
LongCounter executionCounter =
5860
meter
5961
.counterBuilder("failsafe.circuit_breaker.execution.count")
@@ -86,7 +88,7 @@ public <R> CircuitBreaker<R> createCircuitBreaker(
8688
*/
8789
public <R> RetryPolicy<R> createRetryPolicy(RetryPolicy<R> delegate, String retryPolicyName) {
8890
RetryPolicyConfig<R> userConfig = delegate.getConfig();
89-
Meter meter = openTelemetry.getMeter(INSTRUMENTATION_NAME);
91+
Meter meter = getMeter();
9092
LongCounter executionCounter =
9193
meter
9294
.counterBuilder("failsafe.retry_policy.execution.count")
@@ -113,4 +115,13 @@ public <R> RetryPolicy<R> createRetryPolicy(RetryPolicy<R> delegate, String retr
113115
userConfig, executionCounter, attemptsHistogram, attributes))
114116
.build();
115117
}
118+
119+
private Meter getMeter() {
120+
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(INSTRUMENTATION_NAME);
121+
String version = EmbeddedInstrumentationProperties.findVersion(INSTRUMENTATION_NAME);
122+
if (version != null) {
123+
meterBuilder.setInstrumentationVersion(version);
124+
}
125+
return meterBuilder.build();
126+
}
116127
}

instrumentation/iceberg-1.8/library/src/main/java/io/opentelemetry/instrumentation/iceberg/v1_8/IcebergMetricsReporter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import io.opentelemetry.api.metrics.LongCounter;
1616
import io.opentelemetry.api.metrics.LongCounterBuilder;
1717
import io.opentelemetry.api.metrics.Meter;
18+
import io.opentelemetry.api.metrics.MeterBuilder;
19+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
1820
import java.util.List;
1921
import org.apache.iceberg.metrics.CounterResult;
2022
import org.apache.iceberg.metrics.MetricsReport;
@@ -48,7 +50,12 @@ final class IcebergMetricsReporter implements MetricsReporter {
4850
private final LongCounter deleteManifestsCount;
4951

5052
IcebergMetricsReporter(OpenTelemetry openTelemetry) {
51-
Meter meter = openTelemetry.getMeter(INSTRUMENTATION_NAME);
53+
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(INSTRUMENTATION_NAME);
54+
String version = EmbeddedInstrumentationProperties.findVersion(INSTRUMENTATION_NAME);
55+
if (version != null) {
56+
meterBuilder.setInstrumentationVersion(version);
57+
}
58+
Meter meter = meterBuilder.build();
5259

5360
planningDuration =
5461
applyAdvice(BASE_ADVICE, ScanMetricsBuilderFactory.totalPlanningDuration(meter, "s"))

instrumentation/jmx-metrics/library/src/main/java/io/opentelemetry/instrumentation/jmx/internal/engine/JmxMetricInsight.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ public class JmxMetricInsight {
2525
private static final Logger logger = Logger.getLogger(JmxMetricInsight.class.getName());
2626

2727
private static final String INSTRUMENTATION_SCOPE = "io.opentelemetry.jmx";
28+
// version file is generated from the gradle module name; look it up explicitly so the legacy
29+
// scope name still resolves to a version
30+
private static final String VERSION_LOOKUP_NAME = "io.opentelemetry.jmx-metrics";
2831

2932
private final OpenTelemetry openTelemetry;
3033
private final long discoveryDelay;
@@ -77,7 +80,8 @@ public void start(
7780
"Empty JMX configuration, no metrics will be collected for InstrumentationScope "
7881
+ INSTRUMENTATION_SCOPE);
7982
} else {
80-
MetricRegistrar registrar = new MetricRegistrar(openTelemetry, INSTRUMENTATION_SCOPE);
83+
MetricRegistrar registrar =
84+
new MetricRegistrar(openTelemetry, INSTRUMENTATION_SCOPE, VERSION_LOOKUP_NAME);
8185
BeanFinder finder = new BeanFinder(registrar, discoveryDelay);
8286
finder.discoverBeans(conf, connections);
8387
}

instrumentation/jmx-metrics/library/src/main/java/io/opentelemetry/instrumentation/jmx/internal/engine/MetricRegistrar.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import io.opentelemetry.api.metrics.LongCounterBuilder;
1515
import io.opentelemetry.api.metrics.LongUpDownCounterBuilder;
1616
import io.opentelemetry.api.metrics.Meter;
17+
import io.opentelemetry.api.metrics.MeterBuilder;
1718
import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
1819
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
20+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
1921
import java.util.Collection;
2022
import java.util.Optional;
2123
import java.util.function.Consumer;
@@ -31,8 +33,14 @@ class MetricRegistrar {
3133

3234
private final Meter meter;
3335

34-
MetricRegistrar(OpenTelemetry openTelemetry, String instrumentationScope) {
35-
meter = openTelemetry.getMeter(instrumentationScope);
36+
MetricRegistrar(
37+
OpenTelemetry openTelemetry, String instrumentationScope, String versionLookupName) {
38+
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(instrumentationScope);
39+
String version = EmbeddedInstrumentationProperties.findVersion(versionLookupName);
40+
if (version != null) {
41+
meterBuilder.setInstrumentationVersion(version);
42+
}
43+
meter = meterBuilder.build();
3644
}
3745

3846
/**

instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistryBuilder.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import io.micrometer.core.instrument.Timer;
1616
import io.micrometer.core.instrument.config.NamingConvention;
1717
import io.opentelemetry.api.OpenTelemetry;
18+
import io.opentelemetry.api.metrics.MeterBuilder;
19+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
1820
import java.util.concurrent.TimeUnit;
1921

2022
/** A builder of {@link OpenTelemetryMeterRegistry}. */
@@ -95,11 +97,12 @@ public MeterRegistry build() {
9597
? DistributionStatisticConfigModifier.IDENTITY
9698
: DistributionStatisticConfigModifier.DISABLE_HISTOGRAM_GAUGES;
9799

100+
MeterBuilder meterBuilder = openTelemetry.getMeterProvider().meterBuilder(INSTRUMENTATION_NAME);
101+
String version = EmbeddedInstrumentationProperties.findVersion(INSTRUMENTATION_NAME);
102+
if (version != null) {
103+
meterBuilder.setInstrumentationVersion(version);
104+
}
98105
return new OpenTelemetryMeterRegistry(
99-
clock,
100-
baseTimeUnit,
101-
namingConvention,
102-
modifier,
103-
openTelemetry.getMeterProvider().get(INSTRUMENTATION_NAME));
106+
clock, baseTimeUnit, namingConvention, modifier, meterBuilder.build());
104107
}
105108
}

instrumentation/oshi-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/v5_0/MetricsRegistration.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,60 @@
66
package io.opentelemetry.javaagent.instrumentation.oshi.v5_0;
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
9+
import io.opentelemetry.api.metrics.Meter;
10+
import io.opentelemetry.api.metrics.MeterBuilder;
911
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
12+
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
1013
import io.opentelemetry.instrumentation.oshi.v5_0.ProcessMetrics;
1114
import io.opentelemetry.instrumentation.oshi.v5_0.SystemMetrics;
15+
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1216
import java.util.ArrayList;
1317
import java.util.List;
1418
import java.util.concurrent.atomic.AtomicBoolean;
1519

1620
public class MetricsRegistration {
1721

22+
// version file is generated from the gradle module name; look it up explicitly so the legacy
23+
// scope name still resolves to a version
24+
private static final String VERSION_LOOKUP_NAME = "io.opentelemetry.oshi-5.0";
25+
// under v3-preview switch the emitted scope name to match the gradle module name, otherwise
26+
// keep the pre-rename scope so existing dashboards/filters on
27+
// otel.scope.name="io.opentelemetry.oshi" continue to work
28+
private static final String INSTRUMENTATION_NAME =
29+
AgentCommonConfig.get().isV3Preview() ? VERSION_LOOKUP_NAME : "io.opentelemetry.oshi";
30+
1831
private static final AtomicBoolean registered = new AtomicBoolean();
1932

33+
// deprecated registerObservers(Meter) overloads exist solely so we can keep emitting the legacy
34+
// io.opentelemetry.oshi scope by default; both go away in 3.0 once v3-preview becomes default
35+
@SuppressWarnings("deprecation")
2036
public static void register() {
2137
if (registered.compareAndSet(false, true)) {
38+
Meter meter = buildMeter();
2239
List<AutoCloseable> observables = new ArrayList<>();
23-
observables.addAll(SystemMetrics.registerObservers(GlobalOpenTelemetry.get()));
40+
observables.addAll(SystemMetrics.registerObservers(meter));
2441

2542
// ProcessMetrics don't follow the spec
2643
if (DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "oshi")
2744
.get("experimental_metrics/development")
2845
.getBoolean("enabled", false)) {
29-
observables.addAll(ProcessMetrics.registerObservers(GlobalOpenTelemetry.get()));
46+
observables.addAll(ProcessMetrics.registerObservers(meter));
3047
}
3148
Thread cleanupTelemetry = new Thread(() -> MetricsRegistration.closeObservables(observables));
3249
Runtime.getRuntime().addShutdownHook(cleanupTelemetry);
3350
}
3451
}
3552

53+
private static Meter buildMeter() {
54+
MeterBuilder meterBuilder =
55+
GlobalOpenTelemetry.get().getMeterProvider().meterBuilder(INSTRUMENTATION_NAME);
56+
String version = EmbeddedInstrumentationProperties.findVersion(VERSION_LOOKUP_NAME);
57+
if (version != null) {
58+
meterBuilder.setInstrumentationVersion(version);
59+
}
60+
return meterBuilder.build();
61+
}
62+
3663
private static void closeObservables(List<AutoCloseable> observables) {
3764
observables.forEach(MetricsRegistration::closeObservable);
3865
}

instrumentation/oshi-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/v5_0/ProcessMetricsTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,10 @@ protected void registerMetrics() {}
2222
protected InstrumentationExtension testing() {
2323
return testing;
2424
}
25+
26+
@Override
27+
@SuppressWarnings("deprecation") // overriding a deprecated abstract method
28+
protected String scopeName() {
29+
return "io.opentelemetry.oshi";
30+
}
2531
}

instrumentation/oshi-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/v5_0/SystemMetricsTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,10 @@ protected void registerMetrics() {}
2222
protected InstrumentationExtension testing() {
2323
return testing;
2424
}
25+
26+
@Override
27+
@SuppressWarnings("deprecation") // overriding a deprecated abstract method
28+
protected String scopeName() {
29+
return "io.opentelemetry.oshi";
30+
}
2531
}

0 commit comments

Comments
 (0)