This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new d32ac001554d CAMEL-23993: Fix flaky SpanPropagationUpstreamTest - add
tie-breaking to SpanComparator (#24591)
d32ac001554d is described below
commit d32ac001554da63bff5d48853440b375307c779d
Author: Guillaume Nodet <[email protected]>
AuthorDate: Sun Jul 12 08:33:55 2026 +0200
CAMEL-23993: Fix flaky SpanPropagationUpstreamTest - add tie-breaking to
SpanComparator (#24591)
CAMEL-23993: Fix flaky SpanPropagationUpstreamTest - add tie-breaking to
SpanComparator
Co-authored-by: Claude Opus 4.6 <[email protected]>
---
.../micrometer/observability/CamelOpenTelemetryExtension.java | 10 +++++++---
.../camel/opentelemetry2/CamelOpenTelemetryExtension.java | 10 +++++++---
.../src/main/java/org/apache/camel/telemetrydev/DevTrace.java | 10 +++++++---
.../test/java/org/apache/camel/telemetry/mock/MockTrace.java | 8 +++++++-
4 files changed, 28 insertions(+), 10 deletions(-)
diff --git
a/components/camel-micrometer-observability/src/test/java/org/apache/camel/micrometer/observability/CamelOpenTelemetryExtension.java
b/components/camel-micrometer-observability/src/test/java/org/apache/camel/micrometer/observability/CamelOpenTelemetryExtension.java
index f212f37127b6..d49d08755c04 100644
---
a/components/camel-micrometer-observability/src/test/java/org/apache/camel/micrometer/observability/CamelOpenTelemetryExtension.java
+++
b/components/camel-micrometer-observability/src/test/java/org/apache/camel/micrometer/observability/CamelOpenTelemetryExtension.java
@@ -217,9 +217,13 @@ final class CamelOpenTelemetryExtension implements
BeforeEachCallback, AfterEach
class SpanComparator implements Comparator<SpanData> {
@Override
public int compare(SpanData a, SpanData b) {
- long nanosA = a.getStartEpochNanos();
- long nanosB = b.getStartEpochNanos();
- return Long.compare(nanosA, nanosB);
+ int cmp = Long.compare(a.getStartEpochNanos(),
b.getStartEpochNanos());
+ if (cmp != 0) {
+ return cmp;
+ }
+ // When start times tie, sort by end time descending so that parent
+ // spans (which end after their children) come first.
+ return Long.compare(b.getEndEpochNanos(), a.getEndEpochNanos());
}
}
}
diff --git
a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/CamelOpenTelemetryExtension.java
b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/CamelOpenTelemetryExtension.java
index 5d548203bd00..fae8e8f683b2 100644
---
a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/CamelOpenTelemetryExtension.java
+++
b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/CamelOpenTelemetryExtension.java
@@ -204,9 +204,13 @@ final class CamelOpenTelemetryExtension implements
BeforeEachCallback, AfterEach
class SpanComparator implements Comparator<SpanData> {
@Override
public int compare(SpanData a, SpanData b) {
- Long nanosA = a.getStartEpochNanos();
- Long nanosB = b.getStartEpochNanos();
- return Long.compare(nanosA, nanosB);
+ int cmp = Long.compare(a.getStartEpochNanos(),
b.getStartEpochNanos());
+ if (cmp != 0) {
+ return cmp;
+ }
+ // When start times tie, sort by end time descending so that parent
+ // spans (which end after their children) come first.
+ return Long.compare(b.getEndEpochNanos(), a.getEndEpochNanos());
}
}
}
diff --git
a/components/camel-telemetry-dev/src/main/java/org/apache/camel/telemetrydev/DevTrace.java
b/components/camel-telemetry-dev/src/main/java/org/apache/camel/telemetrydev/DevTrace.java
index 0029e12e7271..3e3f74aa8eaf 100644
---
a/components/camel-telemetry-dev/src/main/java/org/apache/camel/telemetrydev/DevTrace.java
+++
b/components/camel-telemetry-dev/src/main/java/org/apache/camel/telemetrydev/DevTrace.java
@@ -132,8 +132,12 @@ public class DevTrace implements Iterable<DevSpanAdapter> {
class SpanComparator implements Comparator<DevSpanAdapter> {
@Override
public int compare(DevSpanAdapter a, DevSpanAdapter b) {
- DevSpanAdapter msa = (DevSpanAdapter) a;
- DevSpanAdapter msb = (DevSpanAdapter) b;
- return (int) (Long.parseLong(msa.getTag("initTimestamp")) -
Long.parseLong(msb.getTag("initTimestamp")));
+ int cmp = Long.compare(Long.parseLong(a.getTag("initTimestamp")),
Long.parseLong(b.getTag("initTimestamp")));
+ if (cmp != 0) {
+ return cmp;
+ }
+ // When start times tie, sort by end time descending so that parent
+ // spans (which end after their children) come first.
+ return Long.compare(Long.parseLong(b.getTag("endTimestamp")),
Long.parseLong(a.getTag("endTimestamp")));
}
}
diff --git
a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTrace.java
b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTrace.java
index 6244157eab18..447185add0a9 100644
---
a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTrace.java
+++
b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTrace.java
@@ -52,6 +52,12 @@ class SpanComparator implements Comparator<Span> {
// cast to get timestamp without changing the Span interface
MockSpanAdapter msa = (MockSpanAdapter) a;
MockSpanAdapter msb = (MockSpanAdapter) b;
- return (int) (Long.parseLong(msa.getTag("initTimestamp")) -
Long.parseLong(msb.getTag("initTimestamp")));
+ int cmp = Long.compare(Long.parseLong(msa.getTag("initTimestamp")),
Long.parseLong(msb.getTag("initTimestamp")));
+ if (cmp != 0) {
+ return cmp;
+ }
+ // When start times tie, sort by end time descending so that parent
+ // spans (which end after their children) come first.
+ return Long.compare(Long.parseLong(msb.getTag("endTimestamp")),
Long.parseLong(msa.getTag("endTimestamp")));
}
}