This is an automated email from the ASF dual-hosted git repository.

oscerd pushed a commit to branch camel-4.22.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-4.22.x by this push:
     new 9ef382044f47 [backport camel-4.22.x] CAMEL-24957: Fix flaky test 
MessageHistoryExceptionRouteTest (#27013)
9ef382044f47 is described below

commit 9ef382044f47495506c495b1f8f16d68e95b459a
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Sep 28 20:40:07 2026 +0200

    [backport camel-4.22.x] CAMEL-24957: Fix flaky test 
MessageHistoryExceptionRouteTest (#27013)
    
    Two distinct failure modes were addressed:
    
    1. Race condition ("expected: <5> but was: <4>"): metric recording via
       nodeProcessingDone() happens asynchronously on seda threads, and
       MockEndpoint.assertIsSatisfied() does not wait for metrics to be flushed.
       Wrap all metric count assertions in a single await().untilAsserted()
       block, in MessageHistoryExceptionRouteTest and MessageHistoryTest.
    
    2. Cleanup failure on rerun (ConditionTimeoutException): the otelExtension
       field in AbstractOpenTelemetryTestSupport was missing @RegisterExtension,
       so the SDK was neither reset nor reinitialized on a test retry.
    
    Backport of #26855 (cherry picked from commits 
36503c9233604fc98b0011bc76b15bf4bb96d463
    and d9e938afdd59). Unblocks core backports to camel-4.22.x, whose CI runs
    camel-opentelemetry-metrics as a dependent.
    
    Co-authored-by: Torsten Mielke <[email protected]>
    Co-authored-by: Claude Sonnet 4.5 <[email protected]>
    Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../metrics/AbstractOpenTelemetryTestSupport.java      |  2 ++
 .../MessageHistoryExceptionRouteTest.java              | 17 ++++++++++-------
 .../metrics/messagehistory/MessageHistoryTest.java     | 18 ++++++++++++------
 3 files changed, 24 insertions(+), 13 deletions(-)

diff --git 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryTestSupport.java
 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryTestSupport.java
index 0cd1b0060392..632284b3c5b3 100644
--- 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryTestSupport.java
+++ 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/AbstractOpenTelemetryTestSupport.java
@@ -26,6 +26,7 @@ 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.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static 
org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants.ROUTE_ID_ATTRIBUTE;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -34,6 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class AbstractOpenTelemetryTestSupport extends CamelTestSupport {
 
+    @RegisterExtension
     public final CamelOpenTelemetryExtension otelExtension = 
CamelOpenTelemetryExtension.create();
 
     protected List<MetricData> getMetricData(String metricName) {
diff --git 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryExceptionRouteTest.java
 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryExceptionRouteTest.java
index b58bcbeb45c0..fde1f5982a62 100644
--- 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryExceptionRouteTest.java
+++ 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryExceptionRouteTest.java
@@ -61,13 +61,16 @@ public class MessageHistoryExceptionRouteTest extends 
AbstractOpenTelemetryTestS
 
         MockEndpoint.assertIsSatisfied(context);
 
-        // there should be 3 names for the message history (foo, bar, 
exception)
-        assertEquals(3, 
getAllPointData(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME).size());
-        assertEquals(5, getPointData("route1", "foo").getCount());
-        assertEquals(5, getPointData("route2", "bar").getCount());
-        // exception process node
-        await().atMost(5, TimeUnit.SECONDS)
-                .untilAsserted(() -> assertEquals(5, getPointData("route2", 
"process1").getCount()));
+        // Metric recording via nodeProcessingDone() happens asynchronously on 
seda threads,
+        // so all metric assertions need to be wrapped in await() to avoid a 
race with mock receipt.
+        await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+            // there should be 3 names for the message history (foo, bar, 
process1)
+            assertEquals(3, 
getAllPointData(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME).size());
+            assertEquals(5, getPointData("route1", "foo").getCount());
+            assertEquals(5, getPointData("route2", "bar").getCount());
+            // exception process node
+            assertEquals(5, getPointData("route2", "process1").getCount());
+        });
     }
 
     private HistogramPointData getPointData(String routeId, String nodeId) {
diff --git 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryTest.java
 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryTest.java
index c821e7ad0e8d..400af4c070e3 100644
--- 
a/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryTest.java
+++ 
b/components/camel-opentelemetry-metrics/src/test/java/org/apache/camel/opentelemetry/metrics/messagehistory/MessageHistoryTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.opentelemetry.metrics.messagehistory;
 
+import java.util.concurrent.TimeUnit;
+
 import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.sdk.metrics.data.HistogramPointData;
 import io.opentelemetry.sdk.metrics.data.PointData;
@@ -26,6 +28,7 @@ import 
org.apache.camel.opentelemetry.metrics.AbstractOpenTelemetryTestSupport;
 import org.junit.jupiter.api.Test;
 
 import static 
org.apache.camel.opentelemetry.metrics.OpenTelemetryConstants.DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME;
+import static org.awaitility.Awaitility.await;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -58,12 +61,15 @@ public class MessageHistoryTest extends 
AbstractOpenTelemetryTestSupport {
 
         MockEndpoint.assertIsSatisfied(context);
 
-        // there should be 3 names
-        assertEquals(3, 
getAllPointData(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME).size());
-
-        assertEquals(count / 2, getPointData("route1", "foo").getCount());
-        assertEquals(count / 2, getPointData("route2", "bar").getCount());
-        assertEquals(count / 2, getPointData("route2", "baz").getCount());
+        // Metric recording via nodeProcessingDone() happens asynchronously on 
seda threads,
+        // so all metric assertions need to be wrapped in await() to avoid a 
race with mock receipt.
+        await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
+            // there should be 3 names
+            assertEquals(3, 
getAllPointData(DEFAULT_CAMEL_MESSAGE_HISTORY_METER_NAME).size());
+            assertEquals(count / 2, getPointData("route1", "foo").getCount());
+            assertEquals(count / 2, getPointData("route2", "bar").getCount());
+            assertEquals(count / 2, getPointData("route2", "baz").getCount());
+        });
     }
 
     private HistogramPointData getPointData(String routeId, String nodeId) {

Reply via email to