|
6 | 6 | package io.opentelemetry.javaagent.instrumentation.oshi.v5_0; |
7 | 7 |
|
8 | 8 | import io.opentelemetry.api.GlobalOpenTelemetry; |
| 9 | +import io.opentelemetry.api.metrics.Meter; |
| 10 | +import io.opentelemetry.api.metrics.MeterBuilder; |
9 | 11 | import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil; |
| 12 | +import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties; |
10 | 13 | import io.opentelemetry.instrumentation.oshi.v5_0.ProcessMetrics; |
11 | 14 | import io.opentelemetry.instrumentation.oshi.v5_0.SystemMetrics; |
| 15 | +import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; |
12 | 16 | import java.util.ArrayList; |
13 | 17 | import java.util.List; |
14 | 18 | import java.util.concurrent.atomic.AtomicBoolean; |
15 | 19 |
|
16 | 20 | public class MetricsRegistration { |
17 | 21 |
|
| 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 | + |
18 | 31 | private static final AtomicBoolean registered = new AtomicBoolean(); |
19 | 32 |
|
| 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") |
20 | 36 | public static void register() { |
21 | 37 | if (registered.compareAndSet(false, true)) { |
| 38 | + Meter meter = buildMeter(); |
22 | 39 | List<AutoCloseable> observables = new ArrayList<>(); |
23 | | - observables.addAll(SystemMetrics.registerObservers(GlobalOpenTelemetry.get())); |
| 40 | + observables.addAll(SystemMetrics.registerObservers(meter)); |
24 | 41 |
|
25 | 42 | // ProcessMetrics don't follow the spec |
26 | 43 | if (DeclarativeConfigUtil.getInstrumentationConfig(GlobalOpenTelemetry.get(), "oshi") |
27 | 44 | .get("experimental_metrics/development") |
28 | 45 | .getBoolean("enabled", false)) { |
29 | | - observables.addAll(ProcessMetrics.registerObservers(GlobalOpenTelemetry.get())); |
| 46 | + observables.addAll(ProcessMetrics.registerObservers(meter)); |
30 | 47 | } |
31 | 48 | Thread cleanupTelemetry = new Thread(() -> MetricsRegistration.closeObservables(observables)); |
32 | 49 | Runtime.getRuntime().addShutdownHook(cleanupTelemetry); |
33 | 50 | } |
34 | 51 | } |
35 | 52 |
|
| 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 | + |
36 | 63 | private static void closeObservables(List<AutoCloseable> observables) { |
37 | 64 | observables.forEach(MetricsRegistration::closeObservable); |
38 | 65 | } |
|
0 commit comments