From 1b33b365aae536570d6a0ca986b07b2be962330f Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 10 Jul 2026 14:08:55 +0200 Subject: [PATCH 1/3] fix(testing): Fix span link matchers --- .../java/datadog/trace/agent/test/assertions/SpanMatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java index 22aacb5d0df..95265cd79d1 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java @@ -399,7 +399,7 @@ private void assertSpanLinks(List links) { .buildAndThrow(); } for (int i = 0; i < expectedLinkCount; i++) { - SpanLinkMatcher linkMatcher = this.linkMatchers[expectedLinkCount]; + SpanLinkMatcher linkMatcher = this.linkMatchers[i]; AgentSpanLink link = links.get(i); linkMatcher.assertLink(link); } From 7d177f6a2fb90c3e60c22eb669c2fd034b67e5bf Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 10 Jul 2026 14:54:48 +0200 Subject: [PATCH 2/3] fix(testing): Use constant rather than literal --- .../java/datadog/trace/agent/test/assertions/TagsMatcher.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/TagsMatcher.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/TagsMatcher.java index b9d439d0259..fd1b4e2e14d 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/TagsMatcher.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/TagsMatcher.java @@ -24,6 +24,7 @@ import static datadog.trace.api.DDTags.TRACER_HOST; import static datadog.trace.common.sampling.RateByServiceTraceSampler.SAMPLING_AGENT_RATE; import static datadog.trace.common.writer.ddagent.TraceMapper.SAMPLING_PRIORITY_KEY; +import static datadog.trace.core.DDSpanContext.SAMPLE_RATE_KEY; import java.util.HashMap; import java.util.Map; @@ -43,7 +44,7 @@ public static TagsMatcher defaultTags() { tagMatchers.put(LANGUAGE_TAG_KEY, any()); tagMatchers.put(SAMPLING_AGENT_RATE, any()); tagMatchers.put(SAMPLING_PRIORITY_KEY.toString(), any()); - tagMatchers.put("_sample_rate", any()); + tagMatchers.put(SAMPLE_RATE_KEY, any()); tagMatchers.put(PID_TAG, any()); tagMatchers.put(SCHEMA_VERSION_TAG_KEY, any()); tagMatchers.put(PROFILING_ENABLED, any()); From 0f26313f098b8330e5f7a68023da05915c08a2d7 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 10 Jul 2026 14:55:27 +0200 Subject: [PATCH 3/3] feat(testing): Add measured and top-level status matchers --- .../agent/test/assertions/SpanMatcher.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java index 95265cd79d1..74e24978e4c 100644 --- a/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java +++ b/dd-java-agent/instrumentation-testing/src/main/java/datadog/trace/agent/test/assertions/SpanMatcher.java @@ -45,6 +45,8 @@ * #durationLongerThan(Duration)} *
  • span type with {@link #type(String)} *
  • span error status with {@link #error()} and {@link #error(boolean)} + *
  • span measured status with {@link #measured()} and {@link #measured(boolean)} + *
  • span top-level status with {@link #topLevel()} and {@link #topLevel(boolean)} *
  • span tags with {@link #tags(TagsMatcher...)} *
  • span links with {@link #links(SpanLinkMatcher...)} * @@ -60,6 +62,8 @@ public final class SpanMatcher { private Matcher durationMatcher; private Matcher typeMatcher; private Matcher errorMatcher; + private Matcher measuredMatcher; + private Matcher topLevelMatcher; private TagsMatcher[] tagMatchers; private SpanLinkMatcher[] linkMatchers; @@ -300,6 +304,50 @@ public SpanMatcher error(boolean errored) { return this; } + /** + * Checks the span is measured. + * + * @return The current {@link SpanMatcher} instance updated with the specified measured + * constraint. + */ + public SpanMatcher measured() { + return measured(true); + } + + /** + * Checks the span measured status matches the given value. + * + * @param measured The expected measured status. + * @return The current {@link SpanMatcher} instance updated with the specified measured + * constraint. + */ + public SpanMatcher measured(boolean measured) { + this.measuredMatcher = measured ? isTrue() : isFalse(); + return this; + } + + /** + * Checks the span is a top-level span. + * + * @return The current {@link SpanMatcher} instance updated with the specified top-level + * constraint. + */ + public SpanMatcher topLevel() { + return topLevel(true); + } + + /** + * Checks the span top-level status matches the given value. + * + * @param topLevel The expected top-level status. + * @return The current {@link SpanMatcher} instance updated with the specified top-level + * constraint. + */ + public SpanMatcher topLevel(boolean topLevel) { + this.topLevelMatcher = topLevel ? isTrue() : isFalse(); + return this; + } + public SpanMatcher tags(TagsMatcher... matchers) { this.tagMatchers = matchers; return this; @@ -341,6 +389,8 @@ else if (this.parentIdMatcher == CHILD_OF_PREVIOUS_MATCHER) { assertValue(this.durationMatcher, ofNanos(span.getDurationNano()), "Unexpected duration"); assertValue(this.typeMatcher, span.getSpanType(), "Unexpected span type"); assertValue(this.errorMatcher, span.isError(), "Unexpected error status"); + assertValue(this.measuredMatcher, span.isMeasured(), "Unexpected measured status"); + assertValue(this.topLevelMatcher, span.isTopLevel(), "Unexpected top-level status"); assertSpanTags(span.getTags()); assertSpanLinks(spanLinks(span)); }