diff --git a/instrumentation/oshi/javaagent/oshi-javaagent.gradle b/instrumentation/oshi/javaagent/oshi-javaagent.gradle index 0c97693c69..d3c4cd5120 100644 --- a/instrumentation/oshi/javaagent/oshi-javaagent.gradle +++ b/instrumentation/oshi/javaagent/oshi-javaagent.gradle @@ -9,6 +9,7 @@ muzzle { } dependencies { + api project(':javaagent-spi') implementation project(':instrumentation:oshi:library') library group: 'com.github.oshi', name: 'oshi-core', version: '5.3.1' diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java new file mode 100644 index 0000000000..5f0189e07e --- /dev/null +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.oshi; + +import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.api.config.Config; +import io.opentelemetry.javaagent.spi.ComponentInstaller; +import java.lang.reflect.Method; +import java.util.Collections; + +/** + * {@link ComponentInstaller} to enable oshi metrics during agent startup if oshi is present on the + * system classpath. + */ +@AutoService(ComponentInstaller.class) +public class OshiMetricsInstaller implements ComponentInstaller { + @Override + public void afterByteBuddyAgent(Config config) { + if (config.isInstrumentationEnabled(Collections.singleton("oshi"), true)) { + try { + // Call oshi.SystemInfo.getCurrentPlatformEnum() to activate SystemMetrics. + // Oshi instrumentation will intercept this call and enable SystemMetrics. + Class oshiSystemInfoClass = + ClassLoader.getSystemClassLoader().loadClass("oshi.SystemInfo"); + Method getCurrentPlatformEnumMethod = + oshiSystemInfoClass.getMethod("getCurrentPlatformEnum"); + getCurrentPlatformEnumMethod.invoke(null); + } catch (Throwable ex) { + // OK + } + } + } +} diff --git a/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy b/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy index ac995e8e92..a579a75e4c 100644 --- a/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy +++ b/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy @@ -9,17 +9,11 @@ import static java.util.concurrent.TimeUnit.SECONDS import com.google.common.base.Stopwatch import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification -import oshi.PlatformEnum -import oshi.SystemInfo class OshiTest extends AgentInstrumentationSpecification { def "test system metrics is enabled"() { - setup: - PlatformEnum platform = SystemInfo.getCurrentPlatformEnum() - expect: - platform != null // TODO (trask) is this the instrumentation library name we want? findMetric("io.opentelemetry.instrumentation.oshi", "system.disk.io") != null findMetric("io.opentelemetry.instrumentation.oshi", "system.disk.operations") != null diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/OpenTelemetryAgent.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/OpenTelemetryAgent.java index 1b7bcb5156..0140e952a5 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/OpenTelemetryAgent.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/OpenTelemetryAgent.java @@ -67,17 +67,6 @@ public class OpenTelemetryAgent { System.err.println("ERROR " + thisClass.getName()); ex.printStackTrace(); } - - try { - // Call oshi.SystemInfo.getCurrentPlatformEnum() to activate SystemMetrics. - // Oshi instrumentation will intercept this call and enable SystemMetrics. - Class oshiSystemInfoClass = - ClassLoader.getSystemClassLoader().loadClass("oshi.SystemInfo"); - Method getCurrentPlatformEnumMethod = oshiSystemInfoClass.getMethod("getCurrentPlatformEnum"); - getCurrentPlatformEnumMethod.invoke(null); - } catch (Throwable ex) { - // OK - } } private static synchronized URL installBootstrapJar(Instrumentation inst)