Skip to content

Commit 3bbc41a

Browse files
author
Mateusz Rzeszutek
authored
Enable oshi ProcessMetrics in javaagent (and refactor oshi instrumentation) (#5281)
* Enable oshi ProcessMetrics in javaagent (and refactor oshi instrumentation) * Get rid of double async instrument registration logs * spotless
1 parent 8240a5f commit 3bbc41a

File tree

16 files changed

+259
-149
lines changed

16 files changed

+259
-149
lines changed

instrumentation/oshi/javaagent/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,11 @@ dependencies {
1717

1818
library("com.github.oshi:oshi-core:5.3.1")
1919

20-
testImplementation("com.google.guava:guava")
20+
testImplementation(project(":instrumentation:oshi:testing"))
21+
}
22+
23+
tasks {
24+
withType<Test>().configureEach {
25+
jvmArgs("-Dotel.instrumentation.oshi.experimental-metrics.enabled=true")
26+
}
2127
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.oshi;
7+
8+
import io.opentelemetry.instrumentation.api.config.Config;
9+
import io.opentelemetry.instrumentation.oshi.ProcessMetrics;
10+
import io.opentelemetry.instrumentation.oshi.SystemMetrics;
11+
import java.util.concurrent.atomic.AtomicBoolean;
12+
13+
public final class MetricsRegistration {
14+
15+
private static final AtomicBoolean registered = new AtomicBoolean();
16+
17+
public static void register() {
18+
if (registered.compareAndSet(false, true)) {
19+
SystemMetrics.registerObservers();
20+
21+
// ProcessMetrics don't follow the spec
22+
if (Config.get()
23+
.getBoolean("otel.instrumentation.oshi.experimental-metrics.enabled", false)) {
24+
ProcessMetrics.registerObservers();
25+
}
26+
}
27+
}
28+
29+
private MetricsRegistration() {}
30+
}

instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemInfoInstrumentation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
1212
import static net.bytebuddy.matcher.ElementMatchers.named;
1313

14-
import io.opentelemetry.instrumentation.oshi.SystemMetrics;
1514
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1615
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1716
import net.bytebuddy.asm.Advice;
@@ -44,7 +43,7 @@ public static class GetCurrentPlatformEnumAdvice {
4443

4544
@Advice.OnMethodEnter(suppress = Throwable.class)
4645
public static void onEnter() {
47-
SystemMetrics.registerObservers();
46+
MetricsRegistration.register();
4847
}
4948
}
5049
}

instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.oshi;
7+
8+
import io.opentelemetry.instrumentation.oshi.AbstractProcessMetricsTest;
9+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class ProcessMetricsTest extends AbstractProcessMetricsTest {
14+
15+
@RegisterExtension
16+
public static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
17+
18+
@Override
19+
protected void registerMetrics() {}
20+
21+
@Override
22+
protected InstrumentationExtension testing() {
23+
return testing;
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.oshi;
7+
8+
import io.opentelemetry.instrumentation.oshi.AbstractSystemMetricsTest;
9+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class SystemMetricsTest extends AbstractSystemMetricsTest {
14+
15+
@RegisterExtension
16+
public static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
17+
18+
@Override
19+
protected void registerMetrics() {}
20+
21+
@Override
22+
protected InstrumentationExtension testing() {
23+
return testing;
24+
}
25+
}

instrumentation/oshi/library/build.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,5 @@ plugins {
55
dependencies {
66
library("com.github.oshi:oshi-core:5.3.1")
77

8-
testImplementation("io.opentelemetry:opentelemetry-sdk-metrics")
9-
testImplementation(project(":testing-common"))
10-
testImplementation("org.assertj:assertj-core")
8+
testImplementation(project(":instrumentation:oshi:testing"))
119
}

instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/ProcessMetrics.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ private ProcessMetrics() {}
2222
/** Register observers for java runtime metrics. */
2323
public static void registerObservers() {
2424
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance
25-
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get(ProcessMetrics.class.getName());
25+
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi");
2626
SystemInfo systemInfo = new SystemInfo();
2727
OperatingSystem osInfo = systemInfo.getOperatingSystem();
2828
OSProcess processInfo = osInfo.getProcess(osInfo.getProcessId());
2929

3030
meter
3131
.upDownCounterBuilder("runtime.java.memory")
3232
.setDescription("Runtime Java memory")
33-
.setUnit("bytes")
33+
.setUnit("By")
3434
.buildWithCallback(
3535
r -> {
3636
processInfo.updateAttributes();
@@ -41,12 +41,12 @@ public static void registerObservers() {
4141
meter
4242
.gaugeBuilder("runtime.java.cpu_time")
4343
.setDescription("Runtime Java CPU time")
44-
.setUnit("seconds")
44+
.setUnit("ms")
4545
.buildWithCallback(
4646
r -> {
4747
processInfo.updateAttributes();
48-
r.record(processInfo.getUserTime() * 1000, Attributes.of(TYPE_KEY, "user"));
49-
r.record(processInfo.getKernelTime() * 1000, Attributes.of(TYPE_KEY, "system"));
48+
r.record(processInfo.getUserTime(), Attributes.of(TYPE_KEY, "user"));
49+
r.record(processInfo.getKernelTime(), Attributes.of(TYPE_KEY, "system"));
5050
});
5151
}
5252
}

instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/SystemMetrics.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ private SystemMetrics() {}
3030
/** Register observers for system metrics. */
3131
public static void registerObservers() {
3232
// TODO(anuraaga): registerObservers should accept an OpenTelemetry instance
33-
Meter meter =
34-
GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.instrumentation.oshi");
33+
Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi");
3534
SystemInfo systemInfo = new SystemInfo();
3635
HardwareAbstractionLayer hal = systemInfo.getHardware();
3736

instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/AbstractMetricsTest.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)