diff --git a/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/OpenTelemetryMetric.java b/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/OpenTelemetryMetric.java deleted file mode 100644 index b58aacd..0000000 --- a/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/OpenTelemetryMetric.java +++ /dev/null @@ -1,9 +0,0 @@ -package be.orbinson.aem.opentelemetry.metrics.api; - -import io.opentelemetry.api.metrics.Meter; -import org.osgi.annotation.versioning.ConsumerType; - -@ConsumerType -public interface OpenTelemetryMetric { - void build(Meter meter); -} diff --git a/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/package-info.java b/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/package-info.java deleted file mode 100644 index ad0e189..0000000 --- a/api/src/main/java/be/orbinson/aem/opentelemetry/metrics/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@Version("1.0.0") -package be.orbinson.aem.opentelemetry.metrics.api; - -import org.osgi.annotation.versioning.Version; diff --git a/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/OpenTelemetryConfig.java b/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/OpenTelemetryConfig.java index bd7d4ca..1cce989 100644 --- a/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/OpenTelemetryConfig.java +++ b/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/OpenTelemetryConfig.java @@ -15,4 +15,6 @@ public interface OpenTelemetryConfig { String[] loggerNames(); boolean traceComponents(); + + boolean exportMetrics(); } diff --git a/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/package-info.java b/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/package-info.java index d26ac05..f14702e 100644 --- a/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/package-info.java +++ b/api/src/main/java/be/orbinson/aem/opentelemetry/services/api/package-info.java @@ -1,4 +1,4 @@ -@Version("1.0.0") +@Version("1.1.0") package be.orbinson.aem.opentelemetry.services.api; import org.osgi.annotation.versioning.Version; diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/ContextPropagator.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagator.java similarity index 96% rename from core/src/main/java/be/orbinson/aem/opentelemetry/core/ContextPropagator.java rename to core/src/main/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagator.java index 716f0cd..1227fe7 100644 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/ContextPropagator.java +++ b/core/src/main/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagator.java @@ -1,4 +1,4 @@ -package be.orbinson.aem.opentelemetry.core; +package be.orbinson.aem.opentelemetry.core.context; import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapSetter; diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilter.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilter.java index f432ff5..7eb0136 100644 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilter.java +++ b/core/src/main/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilter.java @@ -1,6 +1,6 @@ package be.orbinson.aem.opentelemetry.core.filters; -import be.orbinson.aem.opentelemetry.core.ContextPropagator; +import be.orbinson.aem.opentelemetry.core.context.ContextPropagator; import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryConfig; import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryFactory; import io.opentelemetry.api.OpenTelemetry; diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessor.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessor.java similarity index 93% rename from core/src/main/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessor.java rename to core/src/main/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessor.java index 20ec315..14089e9 100644 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessor.java +++ b/core/src/main/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessor.java @@ -1,4 +1,4 @@ -package be.orbinson.aem.opentelemetry.core.services; +package be.orbinson.aem.opentelemetry.core.logs; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.context.Context; diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueGauage.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueGauage.java deleted file mode 100644 index 8fc0313..0000000 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueGauage.java +++ /dev/null @@ -1,41 +0,0 @@ -package be.orbinson.aem.opentelemetry.core.metrics; - -import be.orbinson.aem.opentelemetry.metrics.api.OpenTelemetryMetric; -import io.opentelemetry.api.metrics.Meter; -import org.apache.sling.distribution.agent.spi.DistributionAgent; -import org.apache.sling.distribution.queue.spi.DistributionQueue; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; -import org.osgi.service.component.annotations.ReferenceCardinality; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Component(service = OpenTelemetryMetric.class) -public class DistributionQueueGauage implements OpenTelemetryMetric { - - private static final Logger LOG = LoggerFactory.getLogger(DistributionQueueGauage.class); - - @Reference(cardinality = ReferenceCardinality.OPTIONAL) - DistributionAgent distributionAgent; - - @Override - public void build(Meter meter) { - meter.gaugeBuilder("distribution.queue.size") - .setDescription("The size of the distribution queue") - .setUnit("items") - .buildWithCallback(measurement -> { - int size = 0; - if (distributionAgent != null) { - DistributionQueue distributionQueue = distributionAgent.getQueue("main"); - if (distributionQueue != null) { - size = distributionQueue.getStatus().getItemsCount(); - } else { - LOG.warn("Distribution queue 'main' is not available"); - } - } else { - LOG.warn("Distribution agent is not available"); - } - measurement.record(size); - }); - } -} diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauage.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauage.java new file mode 100644 index 0000000..f801f46 --- /dev/null +++ b/core/src/main/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauage.java @@ -0,0 +1,56 @@ +package be.orbinson.aem.opentelemetry.core.metrics; + +import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryConfig; +import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryFactory; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; +import org.apache.sling.distribution.agent.spi.DistributionAgent; +import org.apache.sling.distribution.queue.spi.DistributionQueue; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Component +public class DistributionQueueSizeGauage { + + private static final Logger LOG = LoggerFactory.getLogger(DistributionQueueSizeGauage.class); + + @Reference + OpenTelemetryFactory openTelemetryFactory; + + @Reference + OpenTelemetryConfig openTelemetryConfig; + + @Reference + DistributionAgent distributionAgent; + + @Activate + public void activate() { + if (openTelemetryConfig.exportMetrics()) { + OpenTelemetry openTelemetry = openTelemetryFactory.get(); + + openTelemetry.getMeter(openTelemetryConfig.instrumentationScopeName()) + .gaugeBuilder("distribution.queue.size") + .setDescription("The size of the distribution queue") + .setUnit("items") + .buildWithCallback(this::callback); + } + } + + public void callback(ObservableDoubleMeasurement measurement) { + int size = 0; + if (distributionAgent != null) { + DistributionQueue distributionQueue = distributionAgent.getQueue("main"); + if (distributionQueue != null) { + size = distributionQueue.getStatus().getItemsCount(); + } else { + LOG.warn("Distribution queue 'main' is not available"); + } + } else { + LOG.warn("Distribution agent is not available"); + } + measurement.record(size); + } +} diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/MetricsProvider.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/MetricsProvider.java deleted file mode 100644 index bf4b30e..0000000 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/MetricsProvider.java +++ /dev/null @@ -1,57 +0,0 @@ -package be.orbinson.aem.opentelemetry.core.services; - -import be.orbinson.aem.opentelemetry.metrics.api.OpenTelemetryMetric; -import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryConfig; -import be.orbinson.aem.opentelemetry.services.api.OpenTelemetryFactory; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.metrics.Meter; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.List; - -@Component -public class MetricsProvider { - - private static final Logger LOG = LoggerFactory.getLogger(MetricsProvider.class); - private final List metrics = new ArrayList<>(); - - @Reference - private OpenTelemetryFactory openTelemetryFactory; - - @Reference - private OpenTelemetryConfig openTelemetryConfig; - - @Reference( - bind = "addMetric", - unbind = "removeMetric" - ) - void addMetric(OpenTelemetryMetric metric) { - LOG.debug("Add metric: {}", metric); - metrics.add(metric); - } - - void removeMetric(OpenTelemetryMetric metric) { - LOG.debug("Remove metric: {}", metric); - metrics.remove(metric); - } - - public List getMetrics() { - return List.copyOf(metrics); - } - - @Activate - protected void activate() { - OpenTelemetry openTelemetry = openTelemetryFactory.get(); - Meter meter = openTelemetry.getMeter(openTelemetryConfig.instrumentationScopeName()); - - for (OpenTelemetryMetric metric : metrics) { - LOG.debug("Build metric: {}", metric); - metric.build(meter); - } - } -} diff --git a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryConfigImpl.java b/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryConfigImpl.java index 6c482ca..8200fe5 100644 --- a/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryConfigImpl.java +++ b/core/src/main/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryConfigImpl.java @@ -12,7 +12,7 @@ @Component @Designate(ocd = OpenTelemetryConfigImpl.Config.class) public class OpenTelemetryConfigImpl implements OpenTelemetryConfig { - + @ObjectClassDefinition(name = "OpenTelemetry Configuration") @interface Config { @AttributeDefinition(description = "Enable telemetry") @@ -29,6 +29,9 @@ public class OpenTelemetryConfigImpl implements OpenTelemetryConfig { @AttributeDefinition(description = "Trace components as a separate span") boolean traceComponents() default false; + + @AttributeDefinition(description = "Export metrics") + boolean exportMetrics() default false; @AttributeDefinition(description = "Use the global opentelemetry instead of creating one with the SDK") boolean useGlobalOpenTelemetry() default false; @@ -39,6 +42,7 @@ public class OpenTelemetryConfigImpl implements OpenTelemetryConfig { private String instrumentationScopeName; private String[] loggerNames; private boolean traceComponents; + private boolean exportMetrics; private boolean useGlobalOpenTelemetry; @Activate @@ -48,6 +52,7 @@ protected void activate(Config config) { this.instrumentationScopeName = config.instrumentationScopeName(); this.loggerNames = config.loggerNames(); this.traceComponents = config.traceComponents(); + this.exportMetrics = config.exportMetrics(); this.useGlobalOpenTelemetry = config.useGlobalOpenTelemetry(); } @@ -76,6 +81,11 @@ public boolean traceComponents() { return traceComponents; } + @Override + public boolean exportMetrics() { + return exportMetrics; + } + @Override public boolean useGlobalOpenTelemetry() { return useGlobalOpenTelemetry; diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/ContextPropagatorTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagatorTest.java similarity index 95% rename from core/src/test/java/be/orbinson/aem/opentelemetry/core/ContextPropagatorTest.java rename to core/src/test/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagatorTest.java index f83be84..0e8e9de 100644 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/ContextPropagatorTest.java +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/context/ContextPropagatorTest.java @@ -1,6 +1,5 @@ -package be.orbinson.aem.opentelemetry.core; +package be.orbinson.aem.opentelemetry.core.context; -import be.orbinson.aem.opentelemetry.core.ContextPropagator; import io.wcm.testing.mock.aem.junit5.AemContext; import io.wcm.testing.mock.aem.junit5.AemContextExtension; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryComponentFilterTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryComponentFilterTest.java index 2e50ca7..59520c2 100644 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryComponentFilterTest.java +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryComponentFilterTest.java @@ -1,21 +1,15 @@ package be.orbinson.aem.opentelemetry.core.filters; -import be.orbinson.aem.opentelemetry.core.filters.OpenTelemetryComponentFilter; -import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryConfigImpl; import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryFactoryImpl; -import io.wcm.testing.mock.aem.junit5.AemContext; -import io.wcm.testing.mock.aem.junit5.AemContextExtension; +import be.orbinson.aem.util.OpenTelemetryTest; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.ServletResolver; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import javax.servlet.FilterChain; import javax.servlet.Servlet; @@ -23,28 +17,22 @@ import javax.servlet.ServletException; import java.io.IOException; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +class OpenTelemetryComponentFilterTest extends OpenTelemetryTest { -@ExtendWith({AemContextExtension.class, MockitoExtension.class}) -class OpenTelemetryComponentFilterTest { @Mock private FilterChain filterChain; private OpenTelemetryComponentFilter filter; - private final AemContext context = new AemContext(); - @Mock private ServletResolver servletResolver; - // Disable exporting - @BeforeAll - static void beforeAll() { - System.setProperty("otel.metrics.exporter", "none"); - System.setProperty("otel.traces.exporter", "none"); - System.setProperty("otel.logs.exporter", "none"); - } - @BeforeEach void setUp() { servletResolver = context.registerService(ServletResolver.class, servletResolver); @@ -52,8 +40,7 @@ void setUp() { @Test void defaultConfig() throws ServletException, IOException { - context.registerInjectActivateService(new OpenTelemetryConfigImpl()); - context.registerInjectActivateService(new OpenTelemetryFactoryImpl()); + registerInjectActivateOpenTelemetryService(); filter = context.registerInjectActivateService(new OpenTelemetryComponentFilter()); SlingHttpServletRequest request = spy(new MockSlingHttpServletRequest( @@ -69,11 +56,10 @@ void defaultConfig() throws ServletException, IOException { @Test void enabledWithoutComponents() throws ServletException, IOException { - context.registerInjectActivateService(new OpenTelemetryConfigImpl(), + registerInjectActivateOpenTelemetryService( "enabled", true, "endpoint", "http://collector:4318" ); - context.registerInjectActivateService(new OpenTelemetryFactoryImpl()); filter = context.registerInjectActivateService(new OpenTelemetryComponentFilter()); SlingHttpServletRequest request = spy(new MockSlingHttpServletRequest( @@ -89,7 +75,7 @@ void enabledWithoutComponents() throws ServletException, IOException { @Test void configEnabled() throws ServletException, IOException { - context.registerInjectActivateService(new OpenTelemetryConfigImpl(), + registerInjectActivateOpenTelemetryService( "enabled", true, "traceComponents", true ); diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilterTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilterTest.java index 4f4ccd6..0847713 100644 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilterTest.java +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/filters/OpenTelemetryRequestFilterTest.java @@ -1,48 +1,34 @@ package be.orbinson.aem.opentelemetry.core.filters; -import be.orbinson.aem.opentelemetry.core.filters.OpenTelemetryRequestFilter; -import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryConfigImpl; import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryFactoryImpl; -import io.wcm.testing.mock.aem.junit5.AemContext; -import io.wcm.testing.mock.aem.junit5.AemContextExtension; +import be.orbinson.aem.util.OpenTelemetryTest; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.testing.mock.sling.servlet.MockRequestPathInfo; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import javax.servlet.FilterChain; import javax.servlet.ServletException; import java.io.IOException; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +class OpenTelemetryRequestFilterTest extends OpenTelemetryTest { -@ExtendWith({AemContextExtension.class, MockitoExtension.class}) -class OpenTelemetryRequestFilterTest { @Mock private FilterChain filterChain; private OpenTelemetryRequestFilter filter; - private final AemContext context = new AemContext(); - - // Disable exporting - @BeforeAll - static void beforeAll() { - System.setProperty("otel.metrics.exporter", "none"); - System.setProperty("otel.traces.exporter", "none"); - System.setProperty("otel.logs.exporter", "none"); - } - @Test void defaultConfig() throws ServletException, IOException { - context.registerInjectActivateService(new OpenTelemetryConfigImpl()); - context.registerInjectActivateService(new OpenTelemetryFactoryImpl()); + registerInjectActivateOpenTelemetryService(); filter = context.registerInjectActivateService(new OpenTelemetryRequestFilter()); SlingHttpServletRequest request = spy(new MockSlingHttpServletRequest( @@ -58,7 +44,7 @@ void defaultConfig() throws ServletException, IOException { @Test void configEnabled() throws ServletException, IOException { - context.registerInjectActivateService(new OpenTelemetryConfigImpl(), + registerInjectActivateOpenTelemetryService( "enabled", true ); context.registerInjectActivateService(new OpenTelemetryFactoryImpl()); diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessorTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessorTest.java similarity index 90% rename from core/src/test/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessorTest.java rename to core/src/test/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessorTest.java index e297d7a..3859276 100644 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/AttributeLogRecordProcessorTest.java +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/logs/AttributeLogRecordProcessorTest.java @@ -1,6 +1,5 @@ -package be.orbinson.aem.opentelemetry.core.services; +package be.orbinson.aem.opentelemetry.core.logs; -import be.orbinson.aem.opentelemetry.core.services.AttributeLogRecordProcessor; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.ReadWriteLogRecord; diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauageTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauageTest.java new file mode 100644 index 0000000..f97e2fe --- /dev/null +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/metrics/DistributionQueueSizeGauageTest.java @@ -0,0 +1,31 @@ +package be.orbinson.aem.opentelemetry.core.metrics; + +import be.orbinson.aem.mocks.MockDistributionAgent; +import be.orbinson.aem.util.OpenTelemetryTest; +import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Spy; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.verify; + +class DistributionQueueSizeGauageTest extends OpenTelemetryTest { + @Spy + ObservableDoubleMeasurement observableDoubleMeasurement; + + @Test + void testActivateWhenConfigIsEnabled() { + registerInjectActivateOpenTelemetryService( + "enabled", true, + "exportMetrics", true + ); + context.registerInjectActivateService(MockDistributionAgent.class); + DistributionQueueSizeGauage distributionQueueSizeGauage = context.registerInjectActivateService(DistributionQueueSizeGauage.class); + + distributionQueueSizeGauage.callback(observableDoubleMeasurement); + + assertNotNull(distributionQueueSizeGauage); + verify(observableDoubleMeasurement).record(1.0); + } +} diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/MetricsProviderTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/MetricsProviderTest.java deleted file mode 100644 index 406489b..0000000 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/MetricsProviderTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package be.orbinson.aem.opentelemetry.core.services; - -import be.orbinson.aem.mocks.MockDistributionAgent; -import be.orbinson.aem.opentelemetry.core.metrics.DistributionQueueGauage; -import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryConfigImpl; -import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryFactoryImpl; -import io.wcm.testing.mock.aem.junit5.AemContext; -import io.wcm.testing.mock.aem.junit5.AemContextExtension; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@ExtendWith({AemContextExtension.class, MockitoExtension.class}) -class MetricsProviderTest { - - private final AemContext context = new AemContext(); - - @Spy - private MetricsProvider metricsProvider; - - private DistributionQueueGauage distributionQueueGauage; - - @Test - void testMetricsProviderBindsToService() { - context.registerInjectActivateService( - OpenTelemetryConfigImpl.class, - "enabled", true - ); - context.registerInjectActivateService( - OpenTelemetryFactoryImpl.class, - "enabled", true - ); - context.registerInjectActivateService(MockDistributionAgent.class); - distributionQueueGauage = context.registerInjectActivateService(DistributionQueueGauage.class); - metricsProvider = context.registerInjectActivateService(MetricsProvider.class); - - assertNotNull(metricsProvider); - assertEquals(1, metricsProvider.getMetrics().size()); - } - -} diff --git a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryFactoryImplTest.java b/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryFactoryImplTest.java index cc6aa24..f6f960a 100644 --- a/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryFactoryImplTest.java +++ b/core/src/test/java/be/orbinson/aem/opentelemetry/core/services/impl/OpenTelemetryFactoryImplTest.java @@ -1,49 +1,27 @@ package be.orbinson.aem.opentelemetry.core.services.impl; +import be.orbinson.aem.util.OpenTelemetryTest; import io.opentelemetry.api.OpenTelemetry; -import io.wcm.testing.mock.aem.junit5.AemContext; -import io.wcm.testing.mock.aem.junit5.AemContextExtension; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@ExtendWith({AemContextExtension.class, MockitoExtension.class}) -class OpenTelemetryFactoryImplTest { - - private final AemContext context = new AemContext(); - - @Spy - private OpenTelemetryFactoryImpl openTelemetryFactory; - - // Disable exporting - @BeforeAll - static void beforeAll() { - System.setProperty("otel.metrics.exporter", "none"); - System.setProperty("otel.traces.exporter", "none"); - System.setProperty("otel.logs.exporter", "none"); - } - +class OpenTelemetryFactoryImplTest extends OpenTelemetryTest { @Test void testActivateWhenConfigIsEnabled() { - context.registerInjectActivateService( - OpenTelemetryConfigImpl.class, + registerInjectActivateOpenTelemetryService( "enabled", true, "enableLogAppender", true ); - openTelemetryFactory = context.registerInjectActivateService(OpenTelemetryFactoryImpl.class); assertNotNull(openTelemetryFactory.get()); } @Test void testActivateWhenConfigIsDisabled() { - context.registerInjectActivateService(OpenTelemetryConfigImpl.class); + registerInjectActivateOpenTelemetryService(); openTelemetryFactory = context.registerInjectActivateService(OpenTelemetryFactoryImpl.class); assertEquals(OpenTelemetry.noop(), openTelemetryFactory.get()); diff --git a/core/src/test/java/be/orbinson/aem/util/OpenTelemetryTest.java b/core/src/test/java/be/orbinson/aem/util/OpenTelemetryTest.java new file mode 100644 index 0000000..e27c0cc --- /dev/null +++ b/core/src/test/java/be/orbinson/aem/util/OpenTelemetryTest.java @@ -0,0 +1,29 @@ +package be.orbinson.aem.util; + +import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryConfigImpl; +import be.orbinson.aem.opentelemetry.core.services.impl.OpenTelemetryFactoryImpl; +import io.wcm.testing.mock.aem.junit5.AemContext; +import io.wcm.testing.mock.aem.junit5.AemContextExtension; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith({AemContextExtension.class, MockitoExtension.class}) +public class OpenTelemetryTest { + + public final AemContext context = new AemContext(); + + public OpenTelemetryFactoryImpl openTelemetryFactory; + + @BeforeAll + static void beforeAll() { + System.setProperty("otel.metrics.exporter", "none"); + System.setProperty("otel.traces.exporter", "none"); + System.setProperty("otel.logs.exporter", "none"); + } + + public void registerInjectActivateOpenTelemetryService(Object... config) { + context.registerInjectActivateService(OpenTelemetryConfigImpl.class, config); + openTelemetryFactory = context.registerInjectActivateService(OpenTelemetryFactoryImpl.class); + } +}