From f6a6c30f619e1b33f6df75a6a36995fe9c8297c6 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Mon, 10 Jan 2022 16:31:50 +0100 Subject: [PATCH] Micrometer library instrumentation --- .../micrometer-1.5/javaagent/build.gradle.kts | 7 +- .../v1_5/MicrometerInstrumentationModule.java | 6 - .../micrometer/v1_5/MicrometerSingletons.java | 1 + .../micrometer/v1_5/CounterTest.java | 71 +----- .../v1_5/DistributionSummaryTest.java | 154 +----------- .../micrometer/v1_5/FunctionCounterTest.java | 107 +------- .../micrometer/v1_5/FunctionTimerTest.java | 191 +------------- .../micrometer/v1_5/GaugeTest.java | 134 +--------- .../micrometer/v1_5/LongTaskTimerTest.java | 205 +-------------- .../micrometer/v1_5/MeterTest.java | 213 +--------------- .../micrometer/v1_5/TimerTest.java | 183 +------------- .../micrometer-1.5/library/build.gradle.kts | 9 + .../v1_5/AsyncInstrumentRegistry.java | 6 +- .../micrometer/v1_5/Bridging.java | 2 +- .../micrometer/v1_5/OpenTelemetryCounter.java | 8 +- .../OpenTelemetryDistributionSummary.java | 8 +- .../v1_5/OpenTelemetryFunctionCounter.java | 6 +- .../v1_5/OpenTelemetryFunctionTimer.java | 10 +- .../micrometer/v1_5/OpenTelemetryGauge.java | 6 +- .../v1_5/OpenTelemetryLongTaskTimer.java | 8 +- .../micrometer/v1_5/OpenTelemetryMeter.java | 12 +- .../v1_5/OpenTelemetryMeterRegistry.java | 27 +- .../OpenTelemetryMeterRegistryBuilder.java | 31 +++ .../micrometer/v1_5/OpenTelemetryTimer.java | 6 +- .../micrometer/v1_5/RemovableMeter.java | 2 +- .../v1_5/UnsupportedReadLogger.java | 2 +- .../micrometer/v1_5/CounterTest.java | 38 +++ .../v1_5/DistributionSummaryTest.java | 38 +++ .../micrometer/v1_5/FunctionCounterTest.java | 38 +++ .../micrometer/v1_5/FunctionTimerTest.java | 38 +++ .../micrometer/v1_5/GaugeTest.java | 38 +++ .../micrometer/v1_5/LongTaskTimerTest.java | 38 +++ .../micrometer/v1_5/MeterTest.java | 38 +++ .../micrometer/v1_5/TimerTest.java | 38 +++ .../micrometer-1.5/testing/build.gradle.kts | 9 + .../micrometer/v1_5/AbstractCounterTest.java | 82 ++++++ .../v1_5/AbstractDistributionSummaryTest.java | 172 +++++++++++++ .../v1_5/AbstractFunctionCounterTest.java | 119 +++++++++ .../v1_5/AbstractFunctionTimerTest.java | 206 +++++++++++++++ .../micrometer/v1_5/AbstractGaugeTest.java | 147 +++++++++++ .../v1_5/AbstractLongTaskTimerTest.java | 221 ++++++++++++++++ .../micrometer/v1_5/AbstractMeterTest.java | 238 ++++++++++++++++++ .../micrometer/v1_5/AbstractTimerTest.java | 200 +++++++++++++++ settings.gradle.kts | 2 + .../testing/LibraryTestRunner.java | 28 ++- 45 files changed, 1863 insertions(+), 1280 deletions(-) create mode 100644 instrumentation/micrometer/micrometer-1.5/library/build.gradle.kts rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java (97%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/Bridging.java (95%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java (83%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java (92%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java (84%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java (85%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java (83%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java (89%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java (81%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java (84%) create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistryBuilder.java rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java (94%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/RemovableMeter.java (66%) rename instrumentation/micrometer/micrometer-1.5/{javaagent/src/main/java/io/opentelemetry/javaagent => library/src/main/java/io/opentelemetry}/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java (88%) create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/CounterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/DistributionSummaryTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionCounterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionTimerTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/GaugeTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/LongTaskTimerTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/MeterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/TimerTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/build.gradle.kts create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractCounterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractDistributionSummaryTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionCounterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionTimerTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractGaugeTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractLongTaskTimerTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractMeterTest.java create mode 100644 instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractTimerTest.java diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/build.gradle.kts b/instrumentation/micrometer/micrometer-1.5/javaagent/build.gradle.kts index f5a1ce9f7b75..d23987d1dfe8 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/build.gradle.kts +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/build.gradle.kts @@ -13,9 +13,8 @@ muzzle { dependencies { library("io.micrometer:micrometer-core:1.5.0") -} -// TODO: disabled by default, since not all instruments are implemented -tasks.withType().configureEach { - jvmArgs("-Dotel.instrumentation.micrometer.enabled=true") + implementation(project(":instrumentation:micrometer:micrometer-1.5:library")) + + testImplementation(project(":instrumentation:micrometer:micrometer-1.5:testing")) } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java index 49dedf81c600..22e6e0096711 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerInstrumentationModule.java @@ -27,12 +27,6 @@ public ElementMatcher.Junction classLoaderMatcher() { return hasClassesNamed("io.micrometer.core.instrument.config.validate.Validated"); } - @Override - protected boolean defaultEnabled() { - // TODO: disabled by default, since not all instruments are implemented - return false; - } - @Override public List typeInstrumentations() { return Collections.singletonList(new MetricsInstrumentation()); diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java index 45bdec402858..e14be4f3862d 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MicrometerSingletons.java @@ -7,6 +7,7 @@ import io.micrometer.core.instrument.MeterRegistry; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.micrometer.v1_5.OpenTelemetryMeterRegistry; public final class MicrometerSingletons { diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/CounterTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/CounterTest.java index 751f25085215..22f5f09033bb 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/CounterTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/CounterTest.java @@ -5,79 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.Counter; -import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractCounterTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class CounterTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class CounterTest extends AbstractCounterTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testCounter() { - // given - Counter counter = - Counter.builder("testCounter") - .description("This is a test counter") - .tags("tag", "value") - .baseUnit("items") - .register(Metrics.globalRegistry); - - // when - counter.increment(); - counter.increment(2); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testCounter", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test counter") - .hasUnit("items") - .hasDoubleSum() - .isMonotonic() - .isCumulative() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(3) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.clearData(); - - // when - Metrics.globalRegistry.remove(counter); - counter.increment(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testCounter", - metrics -> - metrics.allSatisfy( - metric -> - assertThat(metric) - .hasDoubleSum() - .points() - .noneSatisfy(point -> assertThat(point).hasValue(4)))); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/DistributionSummaryTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/DistributionSummaryTest.java index 8bbf1b453dca..798cb0fb4418 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/DistributionSummaryTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/DistributionSummaryTest.java @@ -5,162 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.DistributionSummary; -import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractDistributionSummaryTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class DistributionSummaryTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class DistributionSummaryTest extends AbstractDistributionSummaryTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testDistributionSummary() { - // given - DistributionSummary summary = - DistributionSummary.builder("testSummary") - .description("This is a test distribution summary") - .baseUnit("things") - .scale(2.0) - .tags("tag", "value") - .register(Metrics.globalRegistry); - - // when - summary.record(21); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testSummary", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test distribution summary") - .hasUnit("things") - .hasDoubleHistogram() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasSum(42) - .hasCount(1) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.clearData(); - - // when - Metrics.globalRegistry.remove(summary); - summary.record(6); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testSummary", - metrics -> - metrics.allSatisfy( - metric -> - assertThat(metric) - .hasDoubleHistogram() - .points() - .noneSatisfy(point -> assertThat(point).hasSum(54).hasCount(2)))); - } - - @Test - void testMicrometerHistogram() { - // given - DistributionSummary summary = - DistributionSummary.builder("testSummaryHistogram") - .description("This is a test distribution summary") - .baseUnit("things") - .tags("tag", "value") - .serviceLevelObjectives(1, 10, 100, 1000) - .distributionStatisticBufferLength(10) - .register(Metrics.globalRegistry); - - // when - summary.record(0.5); - summary.record(5); - summary.record(50); - summary.record(500); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testSummaryHistogram.histogram", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> - assertThat(point).hasValue(1).attributes().containsEntry("le", "1")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(2) - .attributes() - .containsEntry("le", "10")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(3) - .attributes() - .containsEntry("le", "100")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(4) - .attributes() - .containsEntry("le", "1000")))); - } - - @Test - void testMicrometerPercentiles() { - // given - DistributionSummary summary = - DistributionSummary.builder("testSummaryPercentiles") - .description("This is a test distribution summary") - .baseUnit("things") - .tags("tag", "value") - .publishPercentiles(0.5, 0.95, 0.99) - .register(Metrics.globalRegistry); - - // when - summary.record(50); - summary.record(100); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testSummaryPercentiles.percentile", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.5")) - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.95")) - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.99")))); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionCounterTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionCounterTest.java index 9e262c50d0f0..033961ff5018 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionCounterTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionCounterTest.java @@ -5,115 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.FunctionCounter; -import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractFunctionCounterTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.util.concurrent.atomic.AtomicLong; -import org.assertj.core.api.AbstractIterableAssert; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class FunctionCounterTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class FunctionCounterTest extends AbstractFunctionCounterTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testFunctionCounter() throws Exception { - // when - AtomicLong num = new AtomicLong(12); - - FunctionCounter counter = - FunctionCounter.builder("testFunctionCounter", num, AtomicLong::get) - .description("This is a test function counter") - .tags("tag", "value") - .baseUnit("items") - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testFunctionCounter", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test function counter") - .hasUnit("items") - .hasDoubleSum() - .isMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - Metrics.globalRegistry.remove(counter); - Thread.sleep(10); // give time for any inflight metric export to be received - testing.clearData(); - - // then - Thread.sleep(100); // interval of the test metrics exporter - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testFunctionCounter", AbstractIterableAssert::isEmpty); - } - - @Test - void functionCountersWithSameNameAndDifferentTags() { - // when - AtomicLong num1 = new AtomicLong(12); - AtomicLong num2 = new AtomicLong(13); - - FunctionCounter.builder("testFunctionCounterWithTags", num1, AtomicLong::get) - .description("First description wins") - .tags("tag", "1") - .baseUnit("items") - .register(Metrics.globalRegistry); - FunctionCounter.builder("testFunctionCounterWithTags", num2, AtomicLong::get) - .description("ignored") - .tags("tag", "2") - .baseUnit("items") - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testFunctionCounterWithTags", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("First description wins") - .hasUnit("items") - .hasDoubleSum() - .isMonotonic() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(12) - .attributes() - .containsOnly(attributeEntry("tag", "1"))) - .anySatisfy( - point -> - assertThat(point) - .hasValue(13) - .attributes() - .containsOnly(attributeEntry("tag", "2"))))); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionTimerTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionTimerTest.java index eecf9eb4f2fa..85df899a5601 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionTimerTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/FunctionTimerTest.java @@ -5,199 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.FunctionTimer; -import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractFunctionTimerTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.util.concurrent.TimeUnit; -import org.assertj.core.api.AbstractIterableAssert; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class FunctionTimerTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class FunctionTimerTest extends AbstractFunctionTimerTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testFunctionTimer() throws Exception { - // given - MyTimer timerObj = new MyTimer(); - - FunctionTimer functionTimer = - FunctionTimer.builder( - "testFunctionTimer", - timerObj, - MyTimer::getCount, - MyTimer::getTotalTimeNanos, - TimeUnit.NANOSECONDS) - .description("This is a test function timer") - .tags("tag", "value") - .register(Metrics.globalRegistry); - - // when - timerObj.add(42, TimeUnit.SECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testFunctionTimer.count", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test function timer") - .hasUnit("1") - .hasLongSum() - .isMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(1) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testFunctionTimer.total_time", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test function timer") - .hasUnit("ms") - .hasDoubleSum() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(42_000) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - Metrics.globalRegistry.remove(functionTimer); - Thread.sleep(10); // give time for any inflight metric export to be received - testing.clearData(); - - // then - Thread.sleep(100); // interval of the test metrics exporter - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testFunctionTimer.count", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testFunctionTimer.total_time", AbstractIterableAssert::isEmpty); - } - - @Test - void testNanoPrecision() { - // given - MyTimer timerObj = new MyTimer(); - - FunctionTimer.builder( - "testNanoFunctionTimer", - timerObj, - MyTimer::getCount, - MyTimer::getTotalTimeNanos, - TimeUnit.NANOSECONDS) - .register(Metrics.globalRegistry); - - // when - timerObj.add(1_234_000, TimeUnit.NANOSECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testNanoFunctionTimer.total_time", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasDoubleSum() - .points() - .satisfiesExactly( - point -> assertThat(point).hasValue(1.234).attributes()))); - } - - @Test - void functionTimersWithSameNameAndDifferentTags() { - // given - MyTimer timerObj1 = new MyTimer(); - MyTimer timerObj2 = new MyTimer(); - - FunctionTimer.builder( - "testFunctionTimerWithTags", - timerObj1, - MyTimer::getCount, - MyTimer::getTotalTimeNanos, - TimeUnit.NANOSECONDS) - .tags("tag", "1") - .register(Metrics.globalRegistry); - - FunctionTimer.builder( - "testFunctionTimerWithTags", - timerObj2, - MyTimer::getCount, - MyTimer::getTotalTimeNanos, - TimeUnit.NANOSECONDS) - .tags("tag", "2") - .register(Metrics.globalRegistry); - - // when - timerObj1.add(12, TimeUnit.SECONDS); - timerObj2.add(42, TimeUnit.SECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testFunctionTimerWithTags.total_time", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasDoubleSum() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(12_000) - .attributes() - .containsOnly(attributeEntry("tag", "1"))) - .anySatisfy( - point -> - assertThat(point) - .hasValue(42_000) - .attributes() - .containsOnly(attributeEntry("tag", "2"))))); - } - - static class MyTimer { - int count = 0; - long totalTimeNanos = 0; - - void add(long time, TimeUnit unit) { - count++; - totalTimeNanos += unit.toNanos(time); - } - - public int getCount() { - return count; - } - - public double getTotalTimeNanos() { - return totalTimeNanos; - } + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/GaugeTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/GaugeTest.java index c44951e1937e..617c807ad335 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/GaugeTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/GaugeTest.java @@ -5,142 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.Gauge; -import io.micrometer.core.instrument.Metrics; -import io.opentelemetry.instrumentation.test.utils.GcUtils; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractGaugeTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.lang.ref.WeakReference; -import java.util.concurrent.atomic.AtomicLong; -import org.assertj.core.api.AbstractIterableAssert; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class GaugeTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class GaugeTest extends AbstractGaugeTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testGauge() throws Exception { - // when - Gauge gauge = - Gauge.builder("testGauge", () -> 42) - .description("This is a test gauge") - .tags("tag", "value") - .baseUnit("items") - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testGauge", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test gauge") - .hasUnit("items") - .hasDoubleGauge() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(42) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - Metrics.globalRegistry.remove(gauge); - Thread.sleep(10); // give time for any inflight metric export to be received - testing.clearData(); - - // then - Thread.sleep(100); // interval of the test metrics exporter - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testGauge", AbstractIterableAssert::isEmpty); - } - - @Test - void gaugesWithSameNameAndDifferentTags() { - // when - Gauge.builder("testGaugeWithTags", () -> 12) - .description("First description wins") - .baseUnit("items") - .tags("tag", "1") - .register(Metrics.globalRegistry); - Gauge.builder("testGaugeWithTags", () -> 42) - .description("ignored") - .baseUnit("ignored") - .tags("tag", "2") - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testGaugeWithTags", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("First description wins") - .hasUnit("items") - .hasDoubleGauge() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(12) - .attributes() - .containsOnly(attributeEntry("tag", "1"))) - .anySatisfy( - point -> - assertThat(point) - .hasValue(42) - .attributes() - .containsOnly(attributeEntry("tag", "2"))))); - } - - @Test - void testWeakRefGauge() throws InterruptedException { - // when - AtomicLong num = new AtomicLong(42); - Gauge.builder("testWeakRefGauge", num, AtomicLong::get) - .strongReference(false) - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testWeakRefGauge", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .satisfiesExactly(point -> assertThat(point).hasValue(42)))); - testing.clearData(); - - // when - WeakReference numWeakRef = new WeakReference<>(num); - num = null; - GcUtils.awaitGc(numWeakRef); - - // then - Thread.sleep(100); // interval of the test metrics exporter - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testWeakRefGauge", AbstractIterableAssert::isEmpty); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/LongTaskTimerTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/LongTaskTimerTest.java index d12769784611..f6a4e3485306 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/LongTaskTimerTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/LongTaskTimerTest.java @@ -5,213 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.LongTaskTimer; -import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractLongTaskTimerTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.time.Duration; -import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -class LongTaskTimerTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class LongTaskTimerTest extends AbstractLongTaskTimerTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testLongTaskTimer() throws Exception { - // given - LongTaskTimer timer = - LongTaskTimer.builder("testLongTaskTimer") - .description("This is a test long task timer") - .tags("tag", "value") - .register(Metrics.globalRegistry); - - // when - LongTaskTimer.Sample sample = timer.start(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimer.active", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test long task timer") - .hasUnit("tasks") - .hasLongSum() - .isNotMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(1) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - TimeUnit.MILLISECONDS.sleep(100); - sample.stop(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimer", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test long task timer") - .hasUnit("ms") - .hasDoubleHistogram() - .points() - .satisfiesExactly( - point -> - assertThat(point) - /* .hasSumGreaterThan(100) */ - .hasCount(1) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimer.active", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasLongSum() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(0) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.clearData(); - - // when - Metrics.globalRegistry.remove(timer); - timer.start(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimer.active", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasLongSum() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(0) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - TimeUnit.MILLISECONDS.sleep(100); - sample.stop(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimer", - metrics -> - metrics.allSatisfy( - metric -> - assertThat(metric) - .hasDoubleHistogram() - .points() - .noneSatisfy( - point -> - assertThat(point) - /* .hasSumGreaterThan(200) */ - .hasCount(2)))); - } - - @Test - void testMicrometerHistogram() throws InterruptedException { - // given - LongTaskTimer timer = - LongTaskTimer.builder("testLongTaskTimerHistogram") - .description("This is a test timer") - .serviceLevelObjectives(Duration.ofMillis(100), Duration.ofMillis(1000)) - .distributionStatisticBufferLength(10) - .register(Metrics.globalRegistry); - - // when - LongTaskTimer.Sample sample1 = timer.start(); - // only active tasks count - timer.start().stop(); - TimeUnit.MILLISECONDS.sleep(100); - LongTaskTimer.Sample sample2 = timer.start(); - LongTaskTimer.Sample sample3 = timer.start(); - TimeUnit.MILLISECONDS.sleep(10); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimerHistogram.histogram", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(2) - .attributes() - .containsEntry("le", "100")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(3) - .attributes() - .containsEntry("le", "1000")))); - - // when - sample1.stop(); - sample2.stop(); - sample3.stop(); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testLongTaskTimerHistogram.histogram", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(0) - .attributes() - .containsEntry("le", "100")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(0) - .attributes() - .containsEntry("le", "1000")))); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MeterTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MeterTest.java index edd335664874..057d238cd04a 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MeterTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/MeterTest.java @@ -5,221 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.Measurement; -import io.micrometer.core.instrument.Meter; -import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.Statistic; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractMeterTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.util.Arrays; -import java.util.List; -import org.assertj.core.api.AbstractIterableAssert; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.testcontainers.shaded.com.google.common.util.concurrent.AtomicDouble; - -class MeterTest { - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class MeterTest extends AbstractMeterTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testMeter() throws InterruptedException { - // given - AtomicDouble number = new AtomicDouble(12345); - - List measurements = - Arrays.asList( - new Measurement(number::get, Statistic.TOTAL), - new Measurement(number::get, Statistic.TOTAL_TIME), - new Measurement(number::get, Statistic.COUNT), - new Measurement(number::get, Statistic.ACTIVE_TASKS), - new Measurement(number::get, Statistic.DURATION), - new Measurement(number::get, Statistic.MAX), - new Measurement(number::get, Statistic.VALUE), - new Measurement(number::get, Statistic.UNKNOWN)); - - // when - Meter meter = - Meter.builder("testMeter", Meter.Type.OTHER, measurements) - .description("This is a test meter") - .baseUnit("things") - .tag("tag", "value") - .register(Metrics.globalRegistry); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.total", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleSum() - .isMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.total_time", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleSum() - .isMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.count", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleSum() - .isMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.active", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleSum() - .isNotMonotonic() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.duration", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleGauge() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.max", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleGauge() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.value", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleGauge() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testMeter.unknown", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test meter") - .hasUnit("things") - .hasDoubleGauge() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasValue(12345) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - - // when - Metrics.globalRegistry.remove(meter); - Thread.sleep(10); // give time for any inflight metric export to be received - testing.clearData(); - - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.total", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.total_time", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.count", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.active", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.duration", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.max", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.value", AbstractIterableAssert::isEmpty); - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, "testMeter.unknown", AbstractIterableAssert::isEmpty); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/TimerTest.java b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/TimerTest.java index 71e66c37a578..3c0d74ffeea3 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/TimerTest.java +++ b/instrumentation/micrometer/micrometer-1.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/TimerTest.java @@ -5,191 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; -import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; - -import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.Timer; +import io.opentelemetry.instrumentation.micrometer.v1_5.AbstractTimerTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import java.time.Duration; -import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -@SuppressWarnings("PreferJavaTimeOverload") -class TimerTest { - - static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; +class TimerTest extends AbstractTimerTest { @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - @BeforeEach - void cleanupMeters() { - Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); - } - - @Test - void testTimer() { - // given - Timer timer = - Timer.builder("testTimer") - .description("This is a test timer") - .tags("tag", "value") - .register(Metrics.globalRegistry); - - // when - timer.record(42, TimeUnit.SECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testTimer", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDescription("This is a test timer") - .hasUnit("ms") - .hasDoubleHistogram() - .points() - .satisfiesExactly( - point -> - assertThat(point) - .hasSum(42_000) - .hasCount(1) - .attributes() - .containsOnly(attributeEntry("tag", "value"))))); - testing.clearData(); - - // when - Metrics.globalRegistry.remove(timer); - timer.record(12, TimeUnit.SECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testTimer", - metrics -> - metrics.allSatisfy( - metric -> - assertThat(metric) - .hasDoubleHistogram() - .points() - .noneSatisfy(point -> assertThat(point).hasSum(54_000).hasCount(2)))); - } - - @Test - void testNanoPrecision() { - // given - Timer timer = Timer.builder("testNanoTimer").register(Metrics.globalRegistry); - - // when - timer.record(1_234_000, TimeUnit.NANOSECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testNanoTimer", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasUnit("ms") - .hasDoubleHistogram() - .points() - .satisfiesExactly( - point -> assertThat(point).hasSum(1.234).hasCount(1).attributes()))); - } - - @Test - void testMicrometerHistogram() { - // given - Timer timer = - Timer.builder("testTimerHistogram") - .description("This is a test timer") - .tags("tag", "value") - .serviceLevelObjectives( - Duration.ofSeconds(1), - Duration.ofSeconds(10), - Duration.ofSeconds(100), - Duration.ofSeconds(1000)) - .distributionStatisticBufferLength(10) - .register(Metrics.globalRegistry); - - // when - timer.record(500, TimeUnit.MILLISECONDS); - timer.record(5, TimeUnit.SECONDS); - timer.record(50, TimeUnit.SECONDS); - timer.record(500, TimeUnit.SECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testTimerHistogram.histogram", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> - assertThat(point) - .hasValue(1) - .attributes() - .containsEntry("le", "1000")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(2) - .attributes() - .containsEntry("le", "10000")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(3) - .attributes() - .containsEntry("le", "100000")) - .anySatisfy( - point -> - assertThat(point) - .hasValue(4) - .attributes() - .containsEntry("le", "1000000")))); - } - - @Test - void testMicrometerPercentiles() { - // given - Timer timer = - Timer.builder("testTimerPercentiles") - .description("This is a test timer") - .tags("tag", "value") - .publishPercentiles(0.5, 0.95, 0.99) - .register(Metrics.globalRegistry); - - // when - timer.record(50, TimeUnit.MILLISECONDS); - timer.record(100, TimeUnit.MILLISECONDS); - - // then - testing.waitAndAssertMetrics( - INSTRUMENTATION_NAME, - "testTimerPercentiles.percentile", - metrics -> - metrics.anySatisfy( - metric -> - assertThat(metric) - .hasDoubleGauge() - .points() - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.5")) - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.95")) - .anySatisfy( - point -> assertThat(point).attributes().containsEntry("phi", "0.99")))); + @Override + protected InstrumentationExtension testing() { + return testing; } } diff --git a/instrumentation/micrometer/micrometer-1.5/library/build.gradle.kts b/instrumentation/micrometer/micrometer-1.5/library/build.gradle.kts new file mode 100644 index 000000000000..3cc08bafa0a2 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("otel.library-instrumentation") +} + +dependencies { + library("io.micrometer:micrometer-core:1.5.0") + + testImplementation(project(":instrumentation:micrometer:micrometer-1.5:testing")) +} diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java similarity index 97% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java index a4235b562b30..972494ab2116 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AsyncInstrumentRegistry.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.baseUnit; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.Meter; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/Bridging.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/Bridging.java similarity index 95% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/Bridging.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/Bridging.java index 28457360b915..bf5afd621d2d 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/Bridging.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/Bridging.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.Statistic; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java similarity index 83% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java index a9f9f331a89c..40f991e6bee2 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryCounter.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.baseUnit; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Measurement; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java similarity index 92% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java index e0d06e14d33e..ce08ffd7720a 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryDistributionSummary.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.baseUnit; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.AbstractDistributionSummary; import io.micrometer.core.instrument.Clock; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java similarity index 84% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java index 3d46eeef984a..734462ff01bb 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionCounter.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.FunctionCounter; import io.micrometer.core.instrument.Measurement; import io.micrometer.core.instrument.util.MeterEquivalence; -import io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; +import io.opentelemetry.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; import java.util.Collections; import java.util.function.ToDoubleFunction; import javax.annotation.Nullable; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java similarity index 85% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java index 610ab844528a..6d05e85e84bc 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryFunctionTimer.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.FunctionTimer; import io.micrometer.core.instrument.Measurement; @@ -15,7 +15,7 @@ import io.micrometer.core.instrument.util.MeterEquivalence; import io.micrometer.core.instrument.util.TimeUtils; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; +import io.opentelemetry.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.function.ToDoubleFunction; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java similarity index 83% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java index dc27f61e99d1..9fde5f9ba5aa 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryGauge.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.Measurement; import io.micrometer.core.instrument.util.MeterEquivalence; -import io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; +import io.opentelemetry.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; import java.util.Collections; import java.util.function.ToDoubleFunction; import javax.annotation.Nullable; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java similarity index 89% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java index 76e2d8f94244..9bafb6a3ce85 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryLongTaskTimer.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.Measurement; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java similarity index 81% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java index d5e6a7df5d39..96004d958547 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeter.java @@ -3,18 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.baseUnit; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.Measurement; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.util.MeterEquivalence; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; +import io.opentelemetry.instrumentation.micrometer.v1_5.AsyncInstrumentRegistry.AsyncMeasurementHandle; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java similarity index 84% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java index c61e8324480f..58493feff6e5 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistry.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.Counter; @@ -25,20 +25,33 @@ import java.util.function.ToLongFunction; import javax.annotation.Nullable; +/** + * A {@link MeterRegistry} implementation that forwards all the captured metrics to the {@linkplain + * io.opentelemetry.api.metrics.Meter OpenTelemetry Meter} obtained from the passed {@link + * OpenTelemetry} instance. + */ public final class OpenTelemetryMeterRegistry extends MeterRegistry { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; - - // TODO: extract a library instrumentation + /** + * Returns a new {@link OpenTelemetryMeterRegistry} configured with the given {@link + * OpenTelemetry}. + */ public static MeterRegistry create(OpenTelemetry openTelemetry) { - return new OpenTelemetryMeterRegistry( - Clock.SYSTEM, openTelemetry.getMeterProvider().get(INSTRUMENTATION_NAME)); + return builder(openTelemetry).build(); + } + + /** + * Returns a new {@link OpenTelemetryMeterRegistryBuilder} configured with the given {@link + * OpenTelemetry}. + */ + public static OpenTelemetryMeterRegistryBuilder builder(OpenTelemetry openTelemetry) { + return new OpenTelemetryMeterRegistryBuilder(openTelemetry); } private final io.opentelemetry.api.metrics.Meter otelMeter; private final AsyncInstrumentRegistry asyncInstrumentRegistry; - private OpenTelemetryMeterRegistry(Clock clock, io.opentelemetry.api.metrics.Meter otelMeter) { + OpenTelemetryMeterRegistry(Clock clock, io.opentelemetry.api.metrics.Meter otelMeter) { super(clock); this.otelMeter = otelMeter; this.asyncInstrumentRegistry = new AsyncInstrumentRegistry(otelMeter); diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistryBuilder.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistryBuilder.java new file mode 100644 index 000000000000..25222879289b --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryMeterRegistryBuilder.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.MeterRegistry; +import io.opentelemetry.api.OpenTelemetry; + +/** A builder of {@link OpenTelemetryMeterRegistry}. */ +public final class OpenTelemetryMeterRegistryBuilder { + + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + private final OpenTelemetry openTelemetry; + + OpenTelemetryMeterRegistryBuilder(OpenTelemetry openTelemetry) { + this.openTelemetry = openTelemetry; + } + + /** + * Returns a new {@link OpenTelemetryMeterRegistry} with the settings of this {@link + * OpenTelemetryMeterRegistryBuilder}. + */ + public MeterRegistry build() { + return new OpenTelemetryMeterRegistry( + Clock.SYSTEM, openTelemetry.getMeterProvider().get(INSTRUMENTATION_NAME)); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java similarity index 94% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java index 1834b6c22739..bf97d103ff89 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/OpenTelemetryTimer.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.description; -import static io.opentelemetry.javaagent.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description; +import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes; import io.micrometer.core.instrument.AbstractTimer; import io.micrometer.core.instrument.Clock; diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/RemovableMeter.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/RemovableMeter.java similarity index 66% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/RemovableMeter.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/RemovableMeter.java index c60703b8c7a6..37fde71110b2 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/RemovableMeter.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/RemovableMeter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; interface RemovableMeter { diff --git a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java similarity index 88% rename from instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java rename to instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java index de9ae1d5178f..fbcbf4b143c0 100644 --- a/instrumentation/micrometer/micrometer-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java +++ b/instrumentation/micrometer/micrometer-1.5/library/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/UnsupportedReadLogger.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.micrometer.v1_5; +package io.opentelemetry.instrumentation.micrometer.v1_5; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/CounterTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/CounterTest.java new file mode 100644 index 000000000000..1700cb147165 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/CounterTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class CounterTest extends AbstractCounterTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/DistributionSummaryTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/DistributionSummaryTest.java new file mode 100644 index 000000000000..8e7da1e8eab2 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/DistributionSummaryTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class DistributionSummaryTest extends AbstractDistributionSummaryTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionCounterTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionCounterTest.java new file mode 100644 index 000000000000..c717489c66d5 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionCounterTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class FunctionCounterTest extends AbstractFunctionCounterTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionTimerTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionTimerTest.java new file mode 100644 index 000000000000..68179a731b96 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/FunctionTimerTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class FunctionTimerTest extends AbstractFunctionTimerTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/GaugeTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/GaugeTest.java new file mode 100644 index 000000000000..2139cfe5fa28 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/GaugeTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class GaugeTest extends AbstractGaugeTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/LongTaskTimerTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/LongTaskTimerTest.java new file mode 100644 index 000000000000..851d079e8a6b --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/LongTaskTimerTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class LongTaskTimerTest extends AbstractLongTaskTimerTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/MeterTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/MeterTest.java new file mode 100644 index 000000000000..c5b8d38e5e8a --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/MeterTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class MeterTest extends AbstractMeterTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/TimerTest.java b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/TimerTest.java new file mode 100644 index 000000000000..e4dc29ab925b --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/library/src/test/java/io/opentelemetry/instrumentation/micrometer/v1_5/TimerTest.java @@ -0,0 +1,38 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.RegisterExtension; + +class TimerTest extends AbstractTimerTest { + + @RegisterExtension + static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + static MeterRegistry otelMeterRegistry; + + @BeforeAll + public static void setUpRegistry() { + otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry()); + Metrics.addRegistry(otelMeterRegistry); + } + + @AfterAll + public static void tearDownRegistry() { + Metrics.removeRegistry(otelMeterRegistry); + } + + @Override + protected InstrumentationExtension testing() { + return testing; + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/build.gradle.kts b/instrumentation/micrometer/micrometer-1.5/testing/build.gradle.kts new file mode 100644 index 000000000000..86fabbe0e11a --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/build.gradle.kts @@ -0,0 +1,9 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + api(project(":testing-common")) + + api("io.micrometer:micrometer-core:1.5.0") +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractCounterTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractCounterTest.java new file mode 100644 index 000000000000..c2b40ec6c6e8 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractCounterTest.java @@ -0,0 +1,82 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractCounterTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testCounter() { + // given + Counter counter = + Counter.builder("testCounter") + .description("This is a test counter") + .tags("tag", "value") + .baseUnit("items") + .register(Metrics.globalRegistry); + + // when + counter.increment(); + counter.increment(2); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testCounter", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test counter") + .hasUnit("items") + .hasDoubleSum() + .isMonotonic() + .isCumulative() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(3) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing().clearData(); + + // when + Metrics.globalRegistry.remove(counter); + counter.increment(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testCounter", + metrics -> + metrics.allSatisfy( + metric -> + assertThat(metric) + .hasDoubleSum() + .points() + .noneSatisfy(point -> assertThat(point).hasValue(4)))); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractDistributionSummaryTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractDistributionSummaryTest.java new file mode 100644 index 000000000000..ee50adc114d0 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractDistributionSummaryTest.java @@ -0,0 +1,172 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.DistributionSummary; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractDistributionSummaryTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testDistributionSummary() { + // given + DistributionSummary summary = + DistributionSummary.builder("testSummary") + .description("This is a test distribution summary") + .baseUnit("things") + .scale(2.0) + .tags("tag", "value") + .register(Metrics.globalRegistry); + + // when + summary.record(21); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testSummary", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test distribution summary") + .hasUnit("things") + .hasDoubleHistogram() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasSum(42) + .hasCount(1) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing().clearData(); + + // when + Metrics.globalRegistry.remove(summary); + summary.record(6); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testSummary", + metrics -> + metrics.allSatisfy( + metric -> + assertThat(metric) + .hasDoubleHistogram() + .points() + .noneSatisfy(point -> assertThat(point).hasSum(54).hasCount(2)))); + } + + @Test + void testMicrometerHistogram() { + // given + DistributionSummary summary = + DistributionSummary.builder("testSummaryHistogram") + .description("This is a test distribution summary") + .baseUnit("things") + .tags("tag", "value") + .serviceLevelObjectives(1, 10, 100, 1000) + .distributionStatisticBufferLength(10) + .register(Metrics.globalRegistry); + + // when + summary.record(0.5); + summary.record(5); + summary.record(50); + summary.record(500); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testSummaryHistogram.histogram", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(1) + .attributes() + .containsEntry("le", "1")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(2) + .attributes() + .containsEntry("le", "10")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(3) + .attributes() + .containsEntry("le", "100")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(4) + .attributes() + .containsEntry("le", "1000")))); + } + + @Test + void testMicrometerPercentiles() { + // given + DistributionSummary summary = + DistributionSummary.builder("testSummaryPercentiles") + .description("This is a test distribution summary") + .baseUnit("things") + .tags("tag", "value") + .publishPercentiles(0.5, 0.95, 0.99) + .register(Metrics.globalRegistry); + + // when + summary.record(50); + summary.record(100); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testSummaryPercentiles.percentile", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> assertThat(point).attributes().containsEntry("phi", "0.5")) + .anySatisfy( + point -> + assertThat(point).attributes().containsEntry("phi", "0.95")) + .anySatisfy( + point -> + assertThat(point).attributes().containsEntry("phi", "0.99")))); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionCounterTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionCounterTest.java new file mode 100644 index 000000000000..4b7d7bdbd1ec --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionCounterTest.java @@ -0,0 +1,119 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.FunctionCounter; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.concurrent.atomic.AtomicLong; +import org.assertj.core.api.AbstractIterableAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractFunctionCounterTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testFunctionCounter() throws InterruptedException { + // when + AtomicLong num = new AtomicLong(12); + + FunctionCounter counter = + FunctionCounter.builder("testFunctionCounter", num, AtomicLong::get) + .description("This is a test function counter") + .tags("tag", "value") + .baseUnit("items") + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testFunctionCounter", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test function counter") + .hasUnit("items") + .hasDoubleSum() + .isMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + Metrics.globalRegistry.remove(counter); + Thread.sleep(10); // give time for any inflight metric export to be received + testing().clearData(); + + // then + Thread.sleep(100); // interval of the test metrics exporter + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testFunctionCounter", AbstractIterableAssert::isEmpty); + } + + @Test + void functionCountersWithSameNameAndDifferentTags() { + // when + AtomicLong num1 = new AtomicLong(12); + AtomicLong num2 = new AtomicLong(13); + + FunctionCounter.builder("testFunctionCounterWithTags", num1, AtomicLong::get) + .description("First description wins") + .tags("tag", "1") + .baseUnit("items") + .register(Metrics.globalRegistry); + FunctionCounter.builder("testFunctionCounterWithTags", num2, AtomicLong::get) + .description("ignored") + .tags("tag", "2") + .baseUnit("items") + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testFunctionCounterWithTags", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("First description wins") + .hasUnit("items") + .hasDoubleSum() + .isMonotonic() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(12) + .attributes() + .containsOnly(attributeEntry("tag", "1"))) + .anySatisfy( + point -> + assertThat(point) + .hasValue(13) + .attributes() + .containsOnly(attributeEntry("tag", "2"))))); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionTimerTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionTimerTest.java new file mode 100644 index 000000000000..153ce3c9a351 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractFunctionTimerTest.java @@ -0,0 +1,206 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.FunctionTimer; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.concurrent.TimeUnit; +import org.assertj.core.api.AbstractIterableAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractFunctionTimerTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testFunctionTimer() throws InterruptedException { + // given + MyTimer timerObj = new MyTimer(); + + FunctionTimer functionTimer = + FunctionTimer.builder( + "testFunctionTimer", + timerObj, + MyTimer::getCount, + MyTimer::getTotalTimeNanos, + TimeUnit.NANOSECONDS) + .description("This is a test function timer") + .tags("tag", "value") + .register(Metrics.globalRegistry); + + // when + timerObj.add(42, TimeUnit.SECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testFunctionTimer.count", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test function timer") + .hasUnit("1") + .hasLongSum() + .isMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(1) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testFunctionTimer.total_time", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test function timer") + .hasUnit("ms") + .hasDoubleSum() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(42_000) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + Metrics.globalRegistry.remove(functionTimer); + Thread.sleep(10); // give time for any inflight metric export to be received + testing().clearData(); + + // then + Thread.sleep(100); // interval of the test metrics exporter + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testFunctionTimer.count", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testFunctionTimer.total_time", AbstractIterableAssert::isEmpty); + } + + @Test + void testNanoPrecision() { + // given + MyTimer timerObj = new MyTimer(); + + FunctionTimer.builder( + "testNanoFunctionTimer", + timerObj, + MyTimer::getCount, + MyTimer::getTotalTimeNanos, + TimeUnit.NANOSECONDS) + .register(Metrics.globalRegistry); + + // when + timerObj.add(1_234_000, TimeUnit.NANOSECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testNanoFunctionTimer.total_time", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasDoubleSum() + .points() + .satisfiesExactly( + point -> assertThat(point).hasValue(1.234).attributes()))); + } + + @Test + void functionTimersWithSameNameAndDifferentTags() { + // given + MyTimer timerObj1 = new MyTimer(); + MyTimer timerObj2 = new MyTimer(); + + FunctionTimer.builder( + "testFunctionTimerWithTags", + timerObj1, + MyTimer::getCount, + MyTimer::getTotalTimeNanos, + TimeUnit.NANOSECONDS) + .tags("tag", "1") + .register(Metrics.globalRegistry); + + FunctionTimer.builder( + "testFunctionTimerWithTags", + timerObj2, + MyTimer::getCount, + MyTimer::getTotalTimeNanos, + TimeUnit.NANOSECONDS) + .tags("tag", "2") + .register(Metrics.globalRegistry); + + // when + timerObj1.add(12, TimeUnit.SECONDS); + timerObj2.add(42, TimeUnit.SECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testFunctionTimerWithTags.total_time", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasDoubleSum() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(12_000) + .attributes() + .containsOnly(attributeEntry("tag", "1"))) + .anySatisfy( + point -> + assertThat(point) + .hasValue(42_000) + .attributes() + .containsOnly(attributeEntry("tag", "2"))))); + } + + static class MyTimer { + int count = 0; + long totalTimeNanos = 0; + + void add(long time, TimeUnit unit) { + count++; + totalTimeNanos += unit.toNanos(time); + } + + public int getCount() { + return count; + } + + public double getTotalTimeNanos() { + return totalTimeNanos; + } + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractGaugeTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractGaugeTest.java new file mode 100644 index 000000000000..33aeeec21427 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractGaugeTest.java @@ -0,0 +1,147 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.test.utils.GcUtils; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.lang.ref.WeakReference; +import java.util.concurrent.atomic.AtomicLong; +import org.assertj.core.api.AbstractIterableAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractGaugeTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testGauge() throws InterruptedException { + // when + Gauge gauge = + Gauge.builder("testGauge", () -> 42) + .description("This is a test gauge") + .tags("tag", "value") + .baseUnit("items") + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testGauge", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test gauge") + .hasUnit("items") + .hasDoubleGauge() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(42) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + Metrics.globalRegistry.remove(gauge); + Thread.sleep(10); // give time for any inflight metric export to be received + testing().clearData(); + + // then + Thread.sleep(100); // interval of the test metrics exporter + testing() + .waitAndAssertMetrics(INSTRUMENTATION_NAME, "testGauge", AbstractIterableAssert::isEmpty); + } + + @Test + void gaugesWithSameNameAndDifferentTags() { + // when + Gauge.builder("testGaugeWithTags", () -> 12) + .description("First description wins") + .baseUnit("items") + .tags("tag", "1") + .register(Metrics.globalRegistry); + Gauge.builder("testGaugeWithTags", () -> 42) + .description("ignored") + .baseUnit("ignored") + .tags("tag", "2") + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testGaugeWithTags", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("First description wins") + .hasUnit("items") + .hasDoubleGauge() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(12) + .attributes() + .containsOnly(attributeEntry("tag", "1"))) + .anySatisfy( + point -> + assertThat(point) + .hasValue(42) + .attributes() + .containsOnly(attributeEntry("tag", "2"))))); + } + + @Test + void testWeakRefGauge() throws InterruptedException { + // when + AtomicLong num = new AtomicLong(42); + Gauge.builder("testWeakRefGauge", num, AtomicLong::get) + .strongReference(false) + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testWeakRefGauge", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .satisfiesExactly(point -> assertThat(point).hasValue(42)))); + testing().clearData(); + + // when + WeakReference numWeakRef = new WeakReference<>(num); + num = null; + GcUtils.awaitGc(numWeakRef); + + // then + Thread.sleep(100); // interval of the test metrics exporter + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testWeakRefGauge", AbstractIterableAssert::isEmpty); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractLongTaskTimerTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractLongTaskTimerTest.java new file mode 100644 index 000000000000..6f33b23880af --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractLongTaskTimerTest.java @@ -0,0 +1,221 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.LongTaskTimer; +import io.micrometer.core.instrument.Metrics; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractLongTaskTimerTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testLongTaskTimer() throws InterruptedException { + // given + LongTaskTimer timer = + LongTaskTimer.builder("testLongTaskTimer") + .description("This is a test long task timer") + .tags("tag", "value") + .register(Metrics.globalRegistry); + + // when + LongTaskTimer.Sample sample = timer.start(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimer.active", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test long task timer") + .hasUnit("tasks") + .hasLongSum() + .isNotMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(1) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + TimeUnit.MILLISECONDS.sleep(100); + sample.stop(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimer", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test long task timer") + .hasUnit("ms") + .hasDoubleHistogram() + .points() + .satisfiesExactly( + point -> + assertThat(point) + /* .hasSumGreaterThan(100) */ + .hasCount(1) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimer.active", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasLongSum() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(0) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing().clearData(); + + // when + Metrics.globalRegistry.remove(timer); + timer.start(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimer.active", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasLongSum() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(0) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + TimeUnit.MILLISECONDS.sleep(100); + sample.stop(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimer", + metrics -> + metrics.allSatisfy( + metric -> + assertThat(metric) + .hasDoubleHistogram() + .points() + .noneSatisfy( + point -> + assertThat(point) + /* .hasSumGreaterThan(200) */ + .hasCount(2)))); + } + + @Test + void testMicrometerHistogram() throws InterruptedException { + // given + LongTaskTimer timer = + LongTaskTimer.builder("testLongTaskTimerHistogram") + .description("This is a test timer") + .serviceLevelObjectives(Duration.ofMillis(100), Duration.ofMillis(1000)) + .distributionStatisticBufferLength(10) + .register(Metrics.globalRegistry); + + // when + LongTaskTimer.Sample sample1 = timer.start(); + // only active tasks count + timer.start().stop(); + TimeUnit.MILLISECONDS.sleep(100); + LongTaskTimer.Sample sample2 = timer.start(); + LongTaskTimer.Sample sample3 = timer.start(); + TimeUnit.MILLISECONDS.sleep(10); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimerHistogram.histogram", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(2) + .attributes() + .containsEntry("le", "100")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(3) + .attributes() + .containsEntry("le", "1000")))); + + // when + sample1.stop(); + sample2.stop(); + sample3.stop(); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testLongTaskTimerHistogram.histogram", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(0) + .attributes() + .containsEntry("le", "100")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(0) + .attributes() + .containsEntry("le", "1000")))); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractMeterTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractMeterTest.java new file mode 100644 index 000000000000..2a0ccdc088cc --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractMeterTest.java @@ -0,0 +1,238 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.Measurement; +import io.micrometer.core.instrument.Meter; +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Statistic; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import org.assertj.core.api.AbstractIterableAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public abstract class AbstractMeterTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testMeter() throws InterruptedException { + // given + AtomicReference number = new AtomicReference<>(12345.0); + + List measurements = + Arrays.asList( + new Measurement(number::get, Statistic.TOTAL), + new Measurement(number::get, Statistic.TOTAL_TIME), + new Measurement(number::get, Statistic.COUNT), + new Measurement(number::get, Statistic.ACTIVE_TASKS), + new Measurement(number::get, Statistic.DURATION), + new Measurement(number::get, Statistic.MAX), + new Measurement(number::get, Statistic.VALUE), + new Measurement(number::get, Statistic.UNKNOWN)); + + // when + Meter meter = + Meter.builder("testMeter", Meter.Type.OTHER, measurements) + .description("This is a test meter") + .baseUnit("things") + .tag("tag", "value") + .register(Metrics.globalRegistry); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.total", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleSum() + .isMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.total_time", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleSum() + .isMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.count", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleSum() + .isMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.active", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleSum() + .isNotMonotonic() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.duration", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleGauge() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.max", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleGauge() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.value", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleGauge() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testMeter.unknown", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test meter") + .hasUnit("things") + .hasDoubleGauge() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasValue(12345) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + + // when + Metrics.globalRegistry.remove(meter); + Thread.sleep(10); // give time for any inflight metric export to be received + testing().clearData(); + + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.total", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.total_time", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.count", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.active", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.duration", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.max", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.value", AbstractIterableAssert::isEmpty); + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, "testMeter.unknown", AbstractIterableAssert::isEmpty); + } +} diff --git a/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractTimerTest.java b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractTimerTest.java new file mode 100644 index 000000000000..c8115a698337 --- /dev/null +++ b/instrumentation/micrometer/micrometer-1.5/testing/src/main/java/io/opentelemetry/instrumentation/micrometer/v1_5/AbstractTimerTest.java @@ -0,0 +1,200 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.micrometer.v1_5; + +import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry; + +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Timer; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +@SuppressWarnings("PreferJavaTimeOverload") +public abstract class AbstractTimerTest { + + static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5"; + + protected abstract InstrumentationExtension testing(); + + @BeforeEach + void cleanupMeters() { + Metrics.globalRegistry.forEachMeter(Metrics.globalRegistry::remove); + } + + @Test + void testTimer() { + // given + Timer timer = + Timer.builder("testTimer") + .description("This is a test timer") + .tags("tag", "value") + .register(Metrics.globalRegistry); + + // when + timer.record(42, TimeUnit.SECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testTimer", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDescription("This is a test timer") + .hasUnit("ms") + .hasDoubleHistogram() + .points() + .satisfiesExactly( + point -> + assertThat(point) + .hasSum(42_000) + .hasCount(1) + .attributes() + .containsOnly(attributeEntry("tag", "value"))))); + testing().clearData(); + + // when + Metrics.globalRegistry.remove(timer); + timer.record(12, TimeUnit.SECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testTimer", + metrics -> + metrics.allSatisfy( + metric -> + assertThat(metric) + .hasDoubleHistogram() + .points() + .noneSatisfy(point -> assertThat(point).hasSum(54_000).hasCount(2)))); + } + + @Test + void testNanoPrecision() { + // given + Timer timer = Timer.builder("testNanoTimer").register(Metrics.globalRegistry); + + // when + timer.record(1_234_000, TimeUnit.NANOSECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testNanoTimer", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasUnit("ms") + .hasDoubleHistogram() + .points() + .satisfiesExactly( + point -> + assertThat(point).hasSum(1.234).hasCount(1).attributes()))); + } + + @Test + void testMicrometerHistogram() { + // given + Timer timer = + Timer.builder("testTimerHistogram") + .description("This is a test timer") + .tags("tag", "value") + .serviceLevelObjectives( + Duration.ofSeconds(1), + Duration.ofSeconds(10), + Duration.ofSeconds(100), + Duration.ofSeconds(1000)) + .distributionStatisticBufferLength(10) + .register(Metrics.globalRegistry); + + // when + timer.record(500, TimeUnit.MILLISECONDS); + timer.record(5, TimeUnit.SECONDS); + timer.record(50, TimeUnit.SECONDS); + timer.record(500, TimeUnit.SECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testTimerHistogram.histogram", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> + assertThat(point) + .hasValue(1) + .attributes() + .containsEntry("le", "1000")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(2) + .attributes() + .containsEntry("le", "10000")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(3) + .attributes() + .containsEntry("le", "100000")) + .anySatisfy( + point -> + assertThat(point) + .hasValue(4) + .attributes() + .containsEntry("le", "1000000")))); + } + + @Test + void testMicrometerPercentiles() { + // given + Timer timer = + Timer.builder("testTimerPercentiles") + .description("This is a test timer") + .tags("tag", "value") + .publishPercentiles(0.5, 0.95, 0.99) + .register(Metrics.globalRegistry); + + // when + timer.record(50, TimeUnit.MILLISECONDS); + timer.record(100, TimeUnit.MILLISECONDS); + + // then + testing() + .waitAndAssertMetrics( + INSTRUMENTATION_NAME, + "testTimerPercentiles.percentile", + metrics -> + metrics.anySatisfy( + metric -> + assertThat(metric) + .hasDoubleGauge() + .points() + .anySatisfy( + point -> assertThat(point).attributes().containsEntry("phi", "0.5")) + .anySatisfy( + point -> + assertThat(point).attributes().containsEntry("phi", "0.95")) + .anySatisfy( + point -> + assertThat(point).attributes().containsEntry("phi", "0.99")))); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index fa2c25933cb1..552aceab305d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -283,6 +283,8 @@ include(":instrumentation:logback:logback-mdc-1.0:library") include(":instrumentation:logback:logback-mdc-1.0:testing") include(":instrumentation:methods:javaagent") include(":instrumentation:micrometer:micrometer-1.5:javaagent") +include(":instrumentation:micrometer:micrometer-1.5:library") +include(":instrumentation:micrometer:micrometer-1.5:testing") include(":instrumentation:mongo:mongo-3.1:javaagent") include(":instrumentation:mongo:mongo-3.1:library") include(":instrumentation:mongo:mongo-3.1:testing") diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java index 69f90f930780..2f1ca9f66e0d 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java @@ -15,7 +15,10 @@ import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter; import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; @@ -23,6 +26,7 @@ import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import java.time.Duration; import java.util.Collections; import java.util.List; @@ -33,20 +37,30 @@ public final class LibraryTestRunner implements InstrumentationTestRunner { private static final OpenTelemetrySdk openTelemetry; - private static final InMemorySpanExporter testExporter; + private static final InMemorySpanExporter testSpanExporter; + private static final InMemoryMetricExporter testMetricExporter; private static boolean forceFlushCalled; static { GlobalOpenTelemetry.resetForTest(); - testExporter = InMemorySpanExporter.create(); + testSpanExporter = InMemorySpanExporter.create(); + testMetricExporter = InMemoryMetricExporter.create(); + openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider( SdkTracerProvider.builder() .addSpanProcessor(new FlushTrackingSpanProcessor()) .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) - .addSpanProcessor(SimpleSpanProcessor.create(testExporter)) + .addSpanProcessor(SimpleSpanProcessor.create(testSpanExporter)) + .build()) + .setMeterProvider( + SdkMeterProvider.builder() + .registerMetricReader( + PeriodicMetricReader.builder(testMetricExporter) + .setInterval(Duration.ofMillis(100)) + .newMetricReaderFactory()) .build()) .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) .buildAndRegisterGlobal(); @@ -78,7 +92,8 @@ public void afterTestClass() {} @Override public void clearAllExportedData() { - testExporter.reset(); + testSpanExporter.reset(); + testMetricExporter.reset(); forceFlushCalled = false; } @@ -93,13 +108,12 @@ public OpenTelemetrySdk getOpenTelemetrySdk() { @Override public List getExportedSpans() { - return testExporter.getFinishedSpanItems(); + return testSpanExporter.getFinishedSpanItems(); } @Override public List getExportedMetrics() { - // no metrics support yet - return Collections.emptyList(); + return testMetricExporter.getFinishedMetricItems(); } @Override