From e9c4be6309835a8cd812c8bfc76d6a2c9d117c2c Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Tue, 1 Feb 2022 09:57:48 +0100 Subject: [PATCH] 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 --- .../oshi/javaagent/build.gradle.kts | 8 +- .../oshi/MetricsRegistration.java | 30 +++++++ .../oshi/SystemInfoInstrumentation.java | 3 +- .../instrumentation/oshi/OshiTest.groovy | 37 --------- .../oshi/ProcessMetricsTest.java | 25 ++++++ .../oshi/SystemMetricsTest.java | 25 ++++++ instrumentation/oshi/library/build.gradle.kts | 4 +- .../instrumentation/oshi/ProcessMetrics.java | 10 +-- .../instrumentation/oshi/SystemMetrics.java | 3 +- .../oshi/AbstractMetricsTest.java | 55 ------------- .../oshi/ProcessMetricsTest.java | 32 +++----- .../oshi/SystemMetricsTest.java | 36 +++----- instrumentation/oshi/testing/build.gradle.kts | 7 ++ .../oshi/AbstractProcessMetricsTest.java | 50 +++++++++++ .../oshi/AbstractSystemMetricsTest.java | 82 +++++++++++++++++++ settings.gradle.kts | 1 + 16 files changed, 259 insertions(+), 149 deletions(-) create mode 100644 instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java delete mode 100644 instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy create mode 100644 instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/ProcessMetricsTest.java create mode 100644 instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemMetricsTest.java delete mode 100644 instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/AbstractMetricsTest.java create mode 100644 instrumentation/oshi/testing/build.gradle.kts create mode 100644 instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java create mode 100644 instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractSystemMetricsTest.java diff --git a/instrumentation/oshi/javaagent/build.gradle.kts b/instrumentation/oshi/javaagent/build.gradle.kts index 72dbfad6f5ac..16bf2f4c2880 100644 --- a/instrumentation/oshi/javaagent/build.gradle.kts +++ b/instrumentation/oshi/javaagent/build.gradle.kts @@ -17,5 +17,11 @@ dependencies { library("com.github.oshi:oshi-core:5.3.1") - testImplementation("com.google.guava:guava") + testImplementation(project(":instrumentation:oshi:testing")) +} + +tasks { + withType().configureEach { + jvmArgs("-Dotel.instrumentation.oshi.experimental-metrics.enabled=true") + } } diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java new file mode 100644 index 000000000000..059c0d2114f2 --- /dev/null +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/MetricsRegistration.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.oshi; + +import io.opentelemetry.instrumentation.api.config.Config; +import io.opentelemetry.instrumentation.oshi.ProcessMetrics; +import io.opentelemetry.instrumentation.oshi.SystemMetrics; +import java.util.concurrent.atomic.AtomicBoolean; + +public final class MetricsRegistration { + + private static final AtomicBoolean registered = new AtomicBoolean(); + + public static void register() { + if (registered.compareAndSet(false, true)) { + SystemMetrics.registerObservers(); + + // ProcessMetrics don't follow the spec + if (Config.get() + .getBoolean("otel.instrumentation.oshi.experimental-metrics.enabled", false)) { + ProcessMetrics.registerObservers(); + } + } + } + + private MetricsRegistration() {} +} diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemInfoInstrumentation.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemInfoInstrumentation.java index 02e8f127a3df..b0e5d15eaa53 100644 --- a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemInfoInstrumentation.java +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemInfoInstrumentation.java @@ -11,7 +11,6 @@ import static net.bytebuddy.matcher.ElementMatchers.isStatic; import static net.bytebuddy.matcher.ElementMatchers.named; -import io.opentelemetry.instrumentation.oshi.SystemMetrics; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; @@ -44,7 +43,7 @@ public static class GetCurrentPlatformEnumAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void onEnter() { - SystemMetrics.registerObservers(); + MetricsRegistration.register(); } } } 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 deleted file mode 100644 index d9ed2ff33449..000000000000 --- a/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.oshi - -import com.google.common.base.Stopwatch -import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification - -import static java.util.concurrent.TimeUnit.SECONDS - -class OshiTest extends AgentInstrumentationSpecification { - - def "test system metrics is enabled"() { - expect: - // TODO (trask) is this the instrumentation library name we want? - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.disk.io") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.disk.operations") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.memory.usage") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.memory.utilization") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.errors") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.io") != null - findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.packets") != null - } - - def findMetric(instrumentationName, metricName) { - Stopwatch stopwatch = Stopwatch.createStarted() - while (stopwatch.elapsed(SECONDS) < 10) { - for (def metric : metrics) { - if (metric.instrumentationLibraryInfo.name == instrumentationName && metric.name == metricName) { - return metric - } - } - } - } -} diff --git a/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/ProcessMetricsTest.java b/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/ProcessMetricsTest.java new file mode 100644 index 000000000000..5b9c55a7781a --- /dev/null +++ b/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/ProcessMetricsTest.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.oshi; + +import io.opentelemetry.instrumentation.oshi.AbstractProcessMetricsTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class ProcessMetricsTest extends AbstractProcessMetricsTest { + + @RegisterExtension + public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected void registerMetrics() {} + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemMetricsTest.java b/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemMetricsTest.java new file mode 100644 index 000000000000..4522de64c9b3 --- /dev/null +++ b/instrumentation/oshi/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/oshi/SystemMetricsTest.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.oshi; + +import io.opentelemetry.instrumentation.oshi.AbstractSystemMetricsTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class SystemMetricsTest extends AbstractSystemMetricsTest { + + @RegisterExtension + public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected void registerMetrics() {} + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/oshi/library/build.gradle.kts b/instrumentation/oshi/library/build.gradle.kts index af392eb2d5f2..23a3b0382096 100644 --- a/instrumentation/oshi/library/build.gradle.kts +++ b/instrumentation/oshi/library/build.gradle.kts @@ -5,7 +5,5 @@ plugins { dependencies { library("com.github.oshi:oshi-core:5.3.1") - testImplementation("io.opentelemetry:opentelemetry-sdk-metrics") - testImplementation(project(":testing-common")) - testImplementation("org.assertj:assertj-core") + testImplementation(project(":instrumentation:oshi:testing")) } diff --git a/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/ProcessMetrics.java b/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/ProcessMetrics.java index 0c190e8426ca..67ba15c6941f 100644 --- a/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/ProcessMetrics.java +++ b/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/ProcessMetrics.java @@ -22,7 +22,7 @@ private ProcessMetrics() {} /** Register observers for java runtime metrics. */ public static void registerObservers() { // TODO(anuraaga): registerObservers should accept an OpenTelemetry instance - Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get(ProcessMetrics.class.getName()); + Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi"); SystemInfo systemInfo = new SystemInfo(); OperatingSystem osInfo = systemInfo.getOperatingSystem(); OSProcess processInfo = osInfo.getProcess(osInfo.getProcessId()); @@ -30,7 +30,7 @@ public static void registerObservers() { meter .upDownCounterBuilder("runtime.java.memory") .setDescription("Runtime Java memory") - .setUnit("bytes") + .setUnit("By") .buildWithCallback( r -> { processInfo.updateAttributes(); @@ -41,12 +41,12 @@ public static void registerObservers() { meter .gaugeBuilder("runtime.java.cpu_time") .setDescription("Runtime Java CPU time") - .setUnit("seconds") + .setUnit("ms") .buildWithCallback( r -> { processInfo.updateAttributes(); - r.record(processInfo.getUserTime() * 1000, Attributes.of(TYPE_KEY, "user")); - r.record(processInfo.getKernelTime() * 1000, Attributes.of(TYPE_KEY, "system")); + r.record(processInfo.getUserTime(), Attributes.of(TYPE_KEY, "user")); + r.record(processInfo.getKernelTime(), Attributes.of(TYPE_KEY, "system")); }); } } diff --git a/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/SystemMetrics.java b/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/SystemMetrics.java index e6ef00e0308b..57e05ccadd99 100644 --- a/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/SystemMetrics.java +++ b/instrumentation/oshi/library/src/main/java/io/opentelemetry/instrumentation/oshi/SystemMetrics.java @@ -30,8 +30,7 @@ private SystemMetrics() {} /** Register observers for system metrics. */ public static void registerObservers() { // TODO(anuraaga): registerObservers should accept an OpenTelemetry instance - Meter meter = - GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.instrumentation.oshi"); + Meter meter = GlobalOpenTelemetry.get().getMeterProvider().get("io.opentelemetry.oshi"); SystemInfo systemInfo = new SystemInfo(); HardwareAbstractionLayer hal = systemInfo.getHardware(); diff --git a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/AbstractMetricsTest.java b/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/AbstractMetricsTest.java deleted file mode 100644 index 3f1777b9d97c..000000000000 --- a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/AbstractMetricsTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.oshi; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; - -import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; -import io.opentelemetry.sdk.metrics.data.MetricData; -import io.opentelemetry.sdk.testing.assertj.MetricAssertions; -import io.opentelemetry.sdk.testing.assertj.MetricDataAssert; -import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; -import java.util.Collection; -import java.util.function.Consumer; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; - -class AbstractMetricsTest { - - static InMemoryMetricReader metricReader; - - @BeforeAll - static void initializeOpenTelemetry() { - metricReader = InMemoryMetricReader.create(); - OpenTelemetrySdk.builder() - .setMeterProvider(SdkMeterProvider.builder().registerMetricReader(metricReader).build()) - .buildAndRegisterGlobal(); - } - - @AfterAll - static void reset() { - GlobalOpenTelemetry.resetForTest(); - } - - @SafeVarargs - protected final void waitAndAssertMetrics(Consumer... assertions) { - await() - .untilAsserted( - () -> { - Collection metrics = metricReader.collectAllMetrics(); - - assertThat(metrics).isNotEmpty(); - - for (Consumer assertion : assertions) { - assertThat(metrics) - .anySatisfy(metric -> assertion.accept(MetricAssertions.assertThat(metric))); - } - }); - } -} diff --git a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/ProcessMetricsTest.java b/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/ProcessMetricsTest.java index b9316e598e56..0ffaf20836cd 100644 --- a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/ProcessMetricsTest.java +++ b/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/ProcessMetricsTest.java @@ -5,30 +5,22 @@ package io.opentelemetry.instrumentation.oshi; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.Test; +class ProcessMetricsTest extends AbstractProcessMetricsTest { -public class ProcessMetricsTest extends AbstractMetricsTest { + @RegisterExtension + public static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); - @Test - public void test() { + @Override + protected void registerMetrics() { ProcessMetrics.registerObservers(); + } - waitAndAssertMetrics( - metric -> - metric - .hasName("runtime.java.memory") - .hasUnit("bytes") - .hasLongSum() - .points() - .anySatisfy(point -> assertThat(point.getValue()).isPositive()), - metric -> - metric - .hasName("runtime.java.cpu_time") - .hasUnit("seconds") - .hasDoubleGauge() - .points() - .anySatisfy(point -> assertThat(point.getValue()).isPositive())); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/SystemMetricsTest.java b/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/SystemMetricsTest.java index f0bf1f0a6209..bed2ee6cdbaa 100644 --- a/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/SystemMetricsTest.java +++ b/instrumentation/oshi/library/src/test/java/io/opentelemetry/instrumentation/oshi/SystemMetricsTest.java @@ -5,34 +5,22 @@ package io.opentelemetry.instrumentation.oshi; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.Test; +class SystemMetricsTest extends AbstractSystemMetricsTest { -public class SystemMetricsTest extends AbstractMetricsTest { + @RegisterExtension + public static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); - @Test - public void test() { + @Override + protected void registerMetrics() { SystemMetrics.registerObservers(); + } - waitAndAssertMetrics( - metric -> - metric - .hasName("system.memory.usage") - .hasUnit("By") - .hasLongSum() - .points() - .anySatisfy(point -> assertThat(point.getValue()).isPositive()), - metric -> - metric - .hasName("system.memory.utilization") - .hasUnit("1") - .hasDoubleGauge() - .points() - .anySatisfy(point -> assertThat(point.getValue()).isPositive()), - metric -> metric.hasName("system.network.io").hasUnit("By").hasLongSum(), - metric -> metric.hasName("system.network.packets").hasUnit("packets").hasLongSum(), - metric -> metric.hasName("system.network.errors").hasUnit("errors").hasLongSum(), - metric -> metric.hasName("system.disk.operations").hasUnit("operations").hasLongSum()); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/oshi/testing/build.gradle.kts b/instrumentation/oshi/testing/build.gradle.kts new file mode 100644 index 000000000000..484e04028aaa --- /dev/null +++ b/instrumentation/oshi/testing/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + api(project(":testing-common")) +} diff --git a/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java new file mode 100644 index 000000000000..1114ee25e6ed --- /dev/null +++ b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.oshi; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; + +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.Test; + +public abstract class AbstractProcessMetricsTest { + + protected abstract void registerMetrics(); + + protected abstract InstrumentationExtension testing(); + + @Test + void test() { + // when + registerMetrics(); + + // then + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "runtime.java.memory", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("By") + .hasLongSum() + .points() + .anySatisfy(point -> assertThat(point.getValue()).isPositive()))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "runtime.java.cpu_time", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasDoubleGauge() + .points() + .anySatisfy(point -> assertThat(point.getValue()).isPositive()))); + } +} diff --git a/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractSystemMetricsTest.java b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractSystemMetricsTest.java new file mode 100644 index 000000000000..8eb7323279a8 --- /dev/null +++ b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractSystemMetricsTest.java @@ -0,0 +1,82 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.oshi; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; + +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public abstract class AbstractSystemMetricsTest { + + protected abstract void registerMetrics(); + + protected abstract InstrumentationExtension testing(); + + @Test + public void test() { + // when + registerMetrics(); + + // then + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.memory.usage", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("By") + .hasLongSum() + .points() + .anySatisfy( + point -> Assertions.assertThat(point.getValue()).isPositive()))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.memory.utilization", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("1") + .hasDoubleGauge() + .points() + .anySatisfy( + point -> Assertions.assertThat(point.getValue()).isPositive()))); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.network.io", + metrics -> metrics.anySatisfy(metric -> assertThat(metric).hasUnit("By").hasLongSum())); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.network.packets", + metrics -> + metrics.anySatisfy(metric -> assertThat(metric).hasUnit("packets").hasLongSum())); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.network.errors", + metrics -> + metrics.anySatisfy(metric -> assertThat(metric).hasUnit("errors").hasLongSum())); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.disk.io", + metrics -> metrics.anySatisfy(metric -> assertThat(metric).hasUnit("By").hasLongSum())); + testing() + .waitAndAssertMetrics( + "io.opentelemetry.oshi", + "system.disk.operations", + metrics -> + metrics.anySatisfy( + metric -> assertThat(metric).hasUnit("operations").hasLongSum())); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2c7eb4b0956a..a5fd6f62726d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -310,6 +310,7 @@ include(":instrumentation:opentelemetry-api:opentelemetry-api-1.4:javaagent") include(":instrumentation:opentelemetry-api:opentelemetry-api-1.10:javaagent") include(":instrumentation:oshi:javaagent") include(":instrumentation:oshi:library") +include(":instrumentation:oshi:testing") include(":instrumentation:play:play-2.4:javaagent") include(":instrumentation:play:play-2.6:javaagent") include(":instrumentation:play-ws:play-ws-1.0:javaagent")