Allows passing an OpenTelemetry instance to registerObservers() methods. (#5716)

* Allows passing an OpenTelemetry instance to registerObservers() methods.

* Deprecated registerObserver methods that were using the GlobalOpenTelemetry instance.
This commit is contained in:
Eduardo Narros 2022-03-31 03:44:57 +01:00 committed by GitHub
parent 0cc9cf0ef6
commit 2852d1d0c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 73 additions and 23 deletions

View File

@ -5,6 +5,7 @@
package io.opentelemetry.javaagent.instrumentation.oshi; package io.opentelemetry.javaagent.instrumentation.oshi;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.oshi.ProcessMetrics; import io.opentelemetry.instrumentation.oshi.ProcessMetrics;
import io.opentelemetry.instrumentation.oshi.SystemMetrics; import io.opentelemetry.instrumentation.oshi.SystemMetrics;
@ -16,12 +17,12 @@ public final class MetricsRegistration {
public static void register() { public static void register() {
if (registered.compareAndSet(false, true)) { if (registered.compareAndSet(false, true)) {
SystemMetrics.registerObservers(); SystemMetrics.registerObservers(GlobalOpenTelemetry.get());
// ProcessMetrics don't follow the spec // ProcessMetrics don't follow the spec
if (Config.get() if (Config.get()
.getBoolean("otel.instrumentation.oshi.experimental-metrics.enabled", false)) { .getBoolean("otel.instrumentation.oshi.experimental-metrics.enabled", false)) {
ProcessMetrics.registerObservers(); ProcessMetrics.registerObservers(GlobalOpenTelemetry.get());
} }
} }
} }

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.oshi; package io.opentelemetry.instrumentation.oshi;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.Meter;
@ -19,10 +20,18 @@ public class ProcessMetrics {
private ProcessMetrics() {} private ProcessMetrics() {}
/** Register observers for java runtime metrics. */ /**
* Register observers for java runtime metrics.
*
* @deprecated use {@link #registerObservers(OpenTelemetry openTelemetry)}
*/
@Deprecated
public static void registerObservers() { public static void registerObservers() {
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance registerObservers(GlobalOpenTelemetry.get());
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi"); }
public static void registerObservers(OpenTelemetry openTelemetry) {
Meter meter = openTelemetry.getMeterProvider().get("io.opentelemetry.oshi");
SystemInfo systemInfo = new SystemInfo(); SystemInfo systemInfo = new SystemInfo();
OperatingSystem osInfo = systemInfo.getOperatingSystem(); OperatingSystem osInfo = systemInfo.getOperatingSystem();
OSProcess processInfo = osInfo.getProcess(osInfo.getProcessId()); OSProcess processInfo = osInfo.getProcess(osInfo.getProcessId());

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.oshi; package io.opentelemetry.instrumentation.oshi;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.Meter;
@ -27,10 +28,18 @@ public class SystemMetrics {
private SystemMetrics() {} private SystemMetrics() {}
/** Register observers for system metrics. */ /**
* Register observers for system metrics.
*
* @deprecated use {@link #registerObservers(OpenTelemetry openTelemetry)}
*/
@Deprecated
public static void registerObservers() { public static void registerObservers() {
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance registerObservers(GlobalOpenTelemetry.get());
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi"); }
public static void registerObservers(OpenTelemetry openTelemetry) {
Meter meter = openTelemetry.getMeterProvider().get("io.opentelemetry.oshi");
SystemInfo systemInfo = new SystemInfo(); SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hal = systemInfo.getHardware(); HardwareAbstractionLayer hal = systemInfo.getHardware();

View File

@ -5,6 +5,7 @@
package io.opentelemetry.instrumentation.oshi; package io.opentelemetry.instrumentation.oshi;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
@ -16,7 +17,7 @@ class ProcessMetricsTest extends AbstractProcessMetricsTest {
@Override @Override
protected void registerMetrics() { protected void registerMetrics() {
ProcessMetrics.registerObservers(); ProcessMetrics.registerObservers(GlobalOpenTelemetry.get());
} }
@Override @Override

View File

@ -5,6 +5,7 @@
package io.opentelemetry.instrumentation.oshi; package io.opentelemetry.instrumentation.oshi;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
@ -16,7 +17,7 @@ class SystemMetricsTest extends AbstractSystemMetricsTest {
@Override @Override
protected void registerMetrics() { protected void registerMetrics() {
SystemMetrics.registerObservers(); SystemMetrics.registerObservers(GlobalOpenTelemetry.get());
} }
@Override @Override

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.javaagent.runtimemetrics; package io.opentelemetry.instrumentation.javaagent.runtimemetrics;
import com.google.auto.service.AutoService; import com.google.auto.service.AutoService;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.runtimemetrics.GarbageCollector; import io.opentelemetry.instrumentation.runtimemetrics.GarbageCollector;
import io.opentelemetry.instrumentation.runtimemetrics.MemoryPools; import io.opentelemetry.instrumentation.runtimemetrics.MemoryPools;
@ -20,8 +21,8 @@ public class RuntimeMetricsInstaller implements AgentListener {
public void afterAgent(Config config, AutoConfiguredOpenTelemetrySdk unused) { public void afterAgent(Config config, AutoConfiguredOpenTelemetrySdk unused) {
if (config.isInstrumentationEnabled( if (config.isInstrumentationEnabled(
Collections.singleton("runtime-metrics"), /* defaultEnabled= */ true)) { Collections.singleton("runtime-metrics"), /* defaultEnabled= */ true)) {
GarbageCollector.registerObservers(); GarbageCollector.registerObservers(GlobalOpenTelemetry.get());
MemoryPools.registerObservers(); MemoryPools.registerObservers(GlobalOpenTelemetry.get());
} }
} }
} }

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.runtimemetrics; package io.opentelemetry.instrumentation.runtimemetrics;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.Meter;
@ -20,7 +21,7 @@ import java.util.List;
* <p>Example usage: * <p>Example usage:
* *
* <pre>{@code * <pre>{@code
* GarbageCollector.registerObservers(); * GarbageCollector.registerObservers(GlobalOpenTelemetry.get());
* }</pre> * }</pre>
* *
* <p>Example metrics being exported: * <p>Example metrics being exported:
@ -33,12 +34,19 @@ import java.util.List;
public final class GarbageCollector { public final class GarbageCollector {
private static final AttributeKey<String> GC_KEY = AttributeKey.stringKey("gc"); private static final AttributeKey<String> GC_KEY = AttributeKey.stringKey("gc");
/** Register all observers provided by this module. */ /**
* Register all observers provided by this module.
*
* @deprecated use {@link #registerObservers(OpenTelemetry openTelemetry)}
*/
@Deprecated
public static void registerObservers() { public static void registerObservers() {
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance registerObservers(GlobalOpenTelemetry.get());
}
public static void registerObservers(OpenTelemetry openTelemetry) {
List<GarbageCollectorMXBean> garbageCollectors = ManagementFactory.getGarbageCollectorMXBeans(); List<GarbageCollectorMXBean> garbageCollectors = ManagementFactory.getGarbageCollectorMXBeans();
Meter meter = Meter meter = openTelemetry.getMeterProvider().get(GarbageCollector.class.getName());
GlobalOpenTelemetry.get().getMeterProvider().get(GarbageCollector.class.getName());
List<Attributes> labelSets = new ArrayList<>(garbageCollectors.size()); List<Attributes> labelSets = new ArrayList<>(garbageCollectors.size());
for (GarbageCollectorMXBean gc : garbageCollectors) { for (GarbageCollectorMXBean gc : garbageCollectors) {
labelSets.add(Attributes.of(GC_KEY, gc.getName())); labelSets.add(Attributes.of(GC_KEY, gc.getName()));

View File

@ -6,6 +6,7 @@
package io.opentelemetry.instrumentation.runtimemetrics; package io.opentelemetry.instrumentation.runtimemetrics;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.Meter;
@ -23,7 +24,7 @@ import java.util.List;
* <p>Example usage: * <p>Example usage:
* *
* <pre>{@code * <pre>{@code
* MemoryPools.registerObservers(); * MemoryPools.registerObservers(GlobalOpenTelemetry.get());
* }</pre> * }</pre>
* *
* <p>Example metrics being exported: Component * <p>Example metrics being exported: Component
@ -58,10 +59,14 @@ public final class MemoryPools {
private static final Attributes MAX_NON_HEAP = Attributes.of(TYPE_KEY, MAX, AREA_KEY, NON_HEAP); private static final Attributes MAX_NON_HEAP = Attributes.of(TYPE_KEY, MAX, AREA_KEY, NON_HEAP);
/** Register only the "area" measurements. */ /** Register only the "area" measurements. */
@Deprecated
public static void registerMemoryAreaObservers() { public static void registerMemoryAreaObservers() {
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance registerMemoryPoolObservers(GlobalOpenTelemetry.get());
}
public static void registerMemoryAreaObservers(OpenTelemetry openTelemetry) {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get(MemoryPools.class.getName()); Meter meter = openTelemetry.getMeterProvider().get(MemoryPools.class.getName());
meter meter
.upDownCounterBuilder("runtime.jvm.memory.area") .upDownCounterBuilder("runtime.jvm.memory.area")
.setDescription("Bytes of a given JVM memory area.") .setDescription("Bytes of a given JVM memory area.")
@ -74,10 +79,14 @@ public final class MemoryPools {
} }
/** Register only the "pool" measurements. */ /** Register only the "pool" measurements. */
@Deprecated
public static void registerMemoryPoolObservers() { public static void registerMemoryPoolObservers() {
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance registerMemoryPoolObservers(GlobalOpenTelemetry.get());
}
public static void registerMemoryPoolObservers(OpenTelemetry openTelemetry) {
List<MemoryPoolMXBean> poolBeans = ManagementFactory.getMemoryPoolMXBeans(); List<MemoryPoolMXBean> poolBeans = ManagementFactory.getMemoryPoolMXBeans();
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get(MemoryPools.class.getName()); Meter meter = openTelemetry.getMeterProvider().get(MemoryPools.class.getName());
List<Attributes> usedLabelSets = new ArrayList<>(poolBeans.size()); List<Attributes> usedLabelSets = new ArrayList<>(poolBeans.size());
List<Attributes> committedLabelSets = new ArrayList<>(poolBeans.size()); List<Attributes> committedLabelSets = new ArrayList<>(poolBeans.size());
List<Attributes> maxLabelSets = new ArrayList<>(poolBeans.size()); List<Attributes> maxLabelSets = new ArrayList<>(poolBeans.size());
@ -106,12 +115,23 @@ public final class MemoryPools {
}); });
} }
/** Register all measurements provided by this module. */ /**
* Register all measurements provided by this module.
*
* @deprecated use {@link #registerObservers(OpenTelemetry openTelemetry)}
*/
@Deprecated
public static void registerObservers() { public static void registerObservers() {
registerMemoryAreaObservers(); registerMemoryAreaObservers();
registerMemoryPoolObservers(); registerMemoryPoolObservers();
} }
/** Register all measurements provided by this module. */
public static void registerObservers(OpenTelemetry openTelemetry) {
registerMemoryAreaObservers(openTelemetry);
registerMemoryPoolObservers(openTelemetry);
}
static void recordHeap(ObservableLongMeasurement measurement, MemoryUsage usage) { static void recordHeap(ObservableLongMeasurement measurement, MemoryUsage usage) {
record(measurement, usage, USED_HEAP, COMMITTED_HEAP, MAX_HEAP); record(measurement, usage, USED_HEAP, COMMITTED_HEAP, MAX_HEAP);
} }