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) {