diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpan.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpan.java index e523b4ce7a..d95a159e8b 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpan.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpan.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.ref.WeakReference; +import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -419,7 +420,7 @@ public class DDSpan implements Span, MutableSpan { public void serialize( final String value, final JsonGenerator gen, final SerializerProvider provider) throws IOException { - gen.writeNumber(value); + gen.writeNumber(new BigInteger(value)); } } } diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/DDSpanSerializationTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/DDSpanSerializationTest.groovy index 2d94496fb6..2387133046 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/DDSpanSerializationTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/DDSpanSerializationTest.groovy @@ -5,6 +5,10 @@ import com.google.common.collect.Maps import datadog.trace.api.DDTags import datadog.trace.api.sampling.PrioritySampling import datadog.trace.common.writer.ListWriter +import org.msgpack.core.MessagePack +import org.msgpack.core.buffer.ArrayBufferInput +import org.msgpack.jackson.dataformat.MessagePackFactory +import org.msgpack.value.ValueType import spock.lang.Specification class DDSpanSerializationTest extends Specification { @@ -72,4 +76,51 @@ class DDSpanSerializationTest extends Specification { PrioritySampling.SAMPLER_KEEP | _ PrioritySampling.UNSET | _ } + + def "serialize trace/span with id #value as int"() { + setup: + def objectMapper = new ObjectMapper(new MessagePackFactory()) + def writer = new ListWriter() + def tracer = new DDTracer(writer) + def context = new DDSpanContext( + value.toString(), + value.toString(), + "0", + "fakeService", + "fakeOperation", + "fakeResource", + PrioritySampling.UNSET, + Collections.emptyMap(), + false, + "fakeType", + Collections.emptyMap(), + new PendingTrace(tracer, "1", [:]), + tracer) + def span = new DDSpan(0, context) + byte[] bytes = objectMapper.writeValueAsBytes(span) + def unpacker = MessagePack.newDefaultUnpacker(new ArrayBufferInput(bytes)) + int size = unpacker.unpackMapHeader() + + expect: + for (int i = 0; i < size; i++) { + String key = unpacker.unpackString() + + switch (key) { + case "trace_id": + case "span_id": + assert unpacker.nextFormat.valueType == ValueType.INTEGER + assert unpacker.unpackBigInteger() == value + break + default: + unpacker.unpackValue() + } + } + + where: + value | _ + BigInteger.ZERO | _ + BigInteger.ONE | _ + BigInteger.valueOf(Long.MAX_VALUE).subtract(BigInteger.ONE) | _ + BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE) | _ + } }