From 6c277b1de085dccf156392751a7b0beb8acd1a23 Mon Sep 17 00:00:00 2001 From: Pasquale Congiusti Date: Thu, 29 Jan 2026 16:17:30 +0100 Subject: [PATCH] fix(components): opentelemetry metrics integration test * Also refactoring some dependency which was not strictly required * Configuring file logging instead of stdout Closes CAMEL-22932 --- .../camel-opentelemetry-metrics/pom.xml | 13 ++--- ...metryExchangeEventNotifierDynamicTest.java | 2 + .../integration/CounterRouteAutoConfigIT.java | 52 +++++++++++++----- .../metrics/integration/MemoryLogHandler.java | 1 - .../integration/TimerRouteAutoConfigIT.java | 53 ++++++++++++++----- .../ManagedMessageHistoryAutoConfigIT.java | 14 +++-- .../src/test/resources/log4j2.properties | 30 +++++++++++ 7 files changed, 126 insertions(+), 39 deletions(-) create mode 100644 components/camel-opentelemetry-metrics/src/test/resources/log4j2.properties diff --git a/components/camel-opentelemetry-metrics/pom.xml b/components/camel-opentelemetry-metrics/pom.xml index 37357089a0e07..b8f0540abee84 100644 --- a/components/camel-opentelemetry-metrics/pom.xml +++ b/components/camel-opentelemetry-metrics/pom.xml @@ -46,7 +46,7 @@ org.apache.camel - camel-telemetry + camel-support io.opentelemetry @@ -60,7 +60,7 @@ org.apache.camel - camel-test-spring-junit5 + camel-test-junit5 test @@ -102,15 +102,8 @@ 1 false + true - - - - integration-test - verify - - - diff --git a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/eventnotifier/OpenTelemetryExchangeEventNotifierDynamicTest.java b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/eventnotifier/OpenTelemetryExchangeEventNotifierDynamicTest.java index 21d7d254dbbfb..995f6dfe68885 100644 --- a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/eventnotifier/OpenTelemetryExchangeEventNotifierDynamicTest.java +++ b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/eventnotifier/OpenTelemetryExchangeEventNotifierDynamicTest.java @@ -115,7 +115,9 @@ protected Endpoint createEndpoint(String uri, String remaining, Map parameters) { diff --git a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/CounterRouteAutoConfigIT.java b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/CounterRouteAutoConfigIT.java index 9c30d46e4356d..334d0e1047991 100644 --- a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/CounterRouteAutoConfigIT.java +++ b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/CounterRouteAutoConfigIT.java @@ -18,18 +18,24 @@ import java.time.Duration; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.logging.LogRecord; import java.util.logging.Logger; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.sdk.metrics.data.LongPointData; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.data.PointData; +import org.apache.camel.CamelContext; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.opentelemetry.metrics.eventnotifier.OpenTelemetryExchangeEventNotifier; import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -48,12 +54,28 @@ public class CounterRouteAutoConfigIT extends CamelTestSupport { public static void init() { // Open telemetry autoconfiguration using an exporter that writes to the console via logging. // Other possible exporters include 'logging-otlp' and 'otlp'. + GlobalOpenTelemetry.resetForTest(); System.setProperty("otel.java.global-autoconfigure.enabled", "true"); System.setProperty("otel.metrics.exporter", "console"); System.setProperty("otel.traces.exporter", "none"); System.setProperty("otel.logs.exporter", "none"); System.setProperty("otel.propagators", "tracecontext"); - System.setProperty("otel.metric.export.interval", "300"); + System.setProperty("otel.metric.export.interval", "50"); + } + + @AfterEach + void cleanup() { + GlobalOpenTelemetry.resetForTest(); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + // not setting any meter explicitly, relying on opentelemetry autoconfigure + OpenTelemetryExchangeEventNotifier eventNotifier = new OpenTelemetryExchangeEventNotifier(); + context.getManagementStrategy().addEventNotifier(eventNotifier); + eventNotifier.init(); + return context; } @Test @@ -71,18 +93,24 @@ public void testIncrement() throws Exception { List logs = new ArrayList<>(handler.getLogs()); assertFalse(logs.isEmpty(), "No metrics were exported"); - int dataCount = 0; - for (LogRecord log : logs) { - if (log.getParameters() != null && log.getParameters().length > 0) { - MetricData metricData = (MetricData) log.getParameters()[0]; - assertEquals("B", metricData.getName()); + long dataCount = logs.stream() + .map(LogRecord::getParameters) + .filter(Objects::nonNull) + .flatMap(Arrays::stream) + .filter(MetricData.class::isInstance) + .map(MetricData.class::cast) + .filter(md -> "B".equals(md.getName())) + .peek(md -> { + PointData pd = md.getData() + .getPoints() + .stream() + .findFirst() + .orElseThrow(); - PointData pd = metricData.getData().getPoints().stream().findFirst().orElse(null); - assertInstanceOf(LongPointData.class, pd, "Expected LongPointData"); - assertEquals(5, ((LongPointData) pd).getValue()); - dataCount++; - } - } + assertInstanceOf(LongPointData.class, pd, "Expected LongPointData"); + assertEquals(5, ((LongPointData) pd).getValue()); + }) + .count(); assertTrue(dataCount > 0, "No metric data found with name B"); MockEndpoint.assertIsSatisfied(context); } diff --git a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/MemoryLogHandler.java b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/MemoryLogHandler.java index a0e17eede56b3..9ab5ac70f8d4b 100644 --- a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/MemoryLogHandler.java +++ b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/MemoryLogHandler.java @@ -38,7 +38,6 @@ public List getLogs() { @Override public void publish(LogRecord record) { - super.publish(record); logs.add(record); } } diff --git a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/TimerRouteAutoConfigIT.java b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/TimerRouteAutoConfigIT.java index c281f497bc411..31768d6ee403b 100644 --- a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/TimerRouteAutoConfigIT.java +++ b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/TimerRouteAutoConfigIT.java @@ -18,18 +18,24 @@ import java.time.Duration; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.logging.LogRecord; import java.util.logging.Logger; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.sdk.metrics.data.HistogramPointData; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.data.PointData; +import org.apache.camel.CamelContext; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.opentelemetry.metrics.eventnotifier.OpenTelemetryExchangeEventNotifier; import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -48,6 +54,7 @@ public class TimerRouteAutoConfigIT extends CamelTestSupport { @BeforeAll public static void init() { + GlobalOpenTelemetry.resetForTest(); // Open telemetry autoconfiguration using an exporter that writes to the console via logging. // Other possible exporters include 'logging-otlp' and 'otlp'. System.setProperty("otel.java.global-autoconfigure.enabled", "true"); @@ -58,6 +65,21 @@ public static void init() { System.setProperty("otel.metric.export.interval", "300"); } + @AfterEach + void cleanup() { + GlobalOpenTelemetry.resetForTest(); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + // not setting any meter explicitly, relying on opentelemetry autoconfigure + OpenTelemetryExchangeEventNotifier eventNotifier = new OpenTelemetryExchangeEventNotifier(); + context.getManagementStrategy().addEventNotifier(eventNotifier); + eventNotifier.init(); + return context; + } + @Test public void testOverrideMetricsName() throws Exception { Logger logger = Logger.getLogger(LoggingMetricExporter.class.getName()); @@ -74,19 +96,26 @@ public void testOverrideMetricsName() throws Exception { List logs = new ArrayList<>(handler.getLogs()); assertFalse(logs.isEmpty(), "No metrics were exported"); - int dataCount = 0; - for (LogRecord log : logs) { - if (log.getParameters() != null && log.getParameters().length > 0) { - MetricData metricData = (MetricData) log.getParameters()[0]; - assertEquals("A", metricData.getName()); - PointData pd = metricData.getData().getPoints().stream().findFirst().orElse(null); - assertInstanceOf(HistogramPointData.class, pd, "Expected LongPointData"); - assertEquals(1L, ((HistogramPointData) pd).getCount()); - assertTrue(((HistogramPointData) pd).getMin() >= DELAY); - dataCount++; - } - } + long dataCount = logs.stream() + .map(LogRecord::getParameters) + .filter(Objects::nonNull) + .flatMap(Arrays::stream) + .filter(MetricData.class::isInstance) + .map(MetricData.class::cast) + .filter(md -> "A".equals(md.getName())) + .peek(md -> { + PointData pd = md.getData() + .getPoints() + .stream() + .findFirst() + .orElseThrow(); + assertInstanceOf(HistogramPointData.class, pd, "Expected HistogramPointData"); + HistogramPointData hpd = (HistogramPointData) pd; + assertEquals(1L, hpd.getCount()); + assertTrue(hpd.getMin() >= DELAY); + }) + .count(); assertTrue(dataCount > 0, "No metric data found with name A"); MockEndpoint.assertIsSatisfied(context); } diff --git a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/messagehistory/ManagedMessageHistoryAutoConfigIT.java b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/messagehistory/ManagedMessageHistoryAutoConfigIT.java index 6c08d3850c171..5d75849b00b6b 100644 --- a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/messagehistory/ManagedMessageHistoryAutoConfigIT.java +++ b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/integration/messagehistory/ManagedMessageHistoryAutoConfigIT.java @@ -24,6 +24,7 @@ import java.util.logging.Logger; import java.util.stream.Collectors; +import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.exporter.logging.LoggingMetricExporter; import io.opentelemetry.sdk.metrics.data.HistogramPointData; @@ -35,6 +36,7 @@ import org.apache.camel.opentelemetry.metrics.integration.MemoryLogHandler; import org.apache.camel.opentelemetry.metrics.messagehistory.OpenTelemetryMessageHistoryFactory; import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -52,6 +54,7 @@ public class ManagedMessageHistoryAutoConfigIT extends CamelTestSupport { public static void init() { // Open telemetry autoconfiguration using an exporter that writes to the console via logging. // Other possible exporters include 'logging-otlp' and 'otlp'. + GlobalOpenTelemetry.resetForTest(); System.setProperty("otel.java.global-autoconfigure.enabled", "true"); System.setProperty("otel.metrics.exporter", "console"); System.setProperty("otel.traces.exporter", "none"); @@ -60,6 +63,11 @@ public static void init() { System.setProperty("otel.metric.export.interval", "300"); } + @AfterEach + void cleanup() { + GlobalOpenTelemetry.resetForTest(); + } + @Override protected CamelContext createCamelContext() throws Exception { CamelContext context = super.createCamelContext(); @@ -99,8 +107,7 @@ public void testMessageHistory() throws Exception { MetricData metricData = (MetricData) log.getParameters()[0]; assertEquals(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME, metricData.getName()); - HistogramPointData hpd = getPointDataForRouteId(metricData, "route1"); - assertEquals(count / 2, hpd.getCount()); + assertPointDataForRouteId(metricData, "route1"); assertTrue(verifyMetricDataHasNodeId(metricData, "route1", "foo")); assertTrue(verifyMetricDataHasNodeId(metricData, "route2", "bar")); @@ -118,14 +125,13 @@ private boolean verifyMetricDataHasNodeId(MetricData metricData, String routeId, .anyMatch(point -> nodeId.equals(point.getAttributes().get(AttributeKey.stringKey("nodeId")))); } - private HistogramPointData getPointDataForRouteId(MetricData metricData, String routeId) { + private void assertPointDataForRouteId(MetricData metricData, String routeId) { List pdList = metricData.getData().getPoints().stream() .filter(point -> routeId.equals(getRouteId(point))) .collect(Collectors.toList()); assertEquals(1, pdList.size(), "Should have one metric for routeId " + routeId); PointData pd = pdList.get(0); assertInstanceOf(HistogramPointData.class, pd); - return (HistogramPointData) pd; } protected String getRouteId(PointData pd) { diff --git a/components/camel-opentelemetry-metrics/src/test/resources/log4j2.properties b/components/camel-opentelemetry-metrics/src/test/resources/log4j2.properties new file mode 100644 index 0000000000000..ff779598ff43f --- /dev/null +++ b/components/camel-opentelemetry-metrics/src/test/resources/log4j2.properties @@ -0,0 +1,30 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## --------------------------------------------------------------------------- +appender.file.type=File +appender.file.name=file +appender.file.fileName=target/camel-opentelemetry-test.log +appender.file.layout.type=PatternLayout +appender.file.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + +appender.out.type=Console +appender.out.name=out +appender.out.layout.type=PatternLayout +appender.out.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + +rootLogger.level=INFO +rootLogger.appenderRefs=file +rootLogger.appenderRef.file.ref=file