diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index b28247c6914..5b534dff790 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -5,6 +5,7 @@ import static datadog.trace.api.cache.RadixTreeCache.HTTP_STATUSES; import static datadog.trace.bootstrap.instrumentation.api.ErrorPriorities.UNSET; +import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.Functions; @@ -892,9 +893,9 @@ public String toString() { .append("DDSpan [ t_id=") .append(traceId) .append(", s_id=") - .append(spanId) + .append(DDSpanId.toString(spanId)) .append(", p_id=") - .append(parentId) + .append(DDSpanId.toString(parentId)) .append(" ] trace=") .append(getServiceName()) .append('/') diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanContextTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanContextTest.groovy index c880c17d94c..1cdaa33d668 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanContextTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanContextTest.groovy @@ -19,7 +19,7 @@ import static datadog.trace.core.DDSpanContext.SPAN_SAMPLING_MAX_PER_SECOND_TAG class DDSpanContextTest extends DDCoreSpecification { def writer - def tracer + CoreTracer tracer def profilingContextIntegration def setup() { @@ -289,6 +289,29 @@ class DDSpanContextTest extends DDCoreSpecification { "_dd.${tag}.json" } + def "Span IDs printed as unsigned long"() { + setup: + def parent = tracer.buildSpan("fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanId(-987654321) + .start() + + def span = tracer.buildSpan("fakeOperation") + .withServiceName("fakeService") + .withResourceName("fakeResource") + .withSpanId(-123456789) + .asChildOf(parent.context()) + .start() + + def context = span.context() as DDSpanContext + + expect: + // even though span ID and parent ID are setup as negative numbers, they should be printed as their unsigned value + // asserting there is no negative sign after ids is the best I can do. + context.toString().contains("id=-") == false + } + static void assertTagmap(Map source, Map comparison, boolean removeThread = false) { def sourceWithoutCommonTags = new HashMap(source) sourceWithoutCommonTags.remove("runtime-id")