diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java index 48d688be700..100c53dbba6 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/SerializingMetricWriter.java @@ -36,6 +36,10 @@ public final class SerializingMetricWriter implements MetricWriter { private static final byte[] SPAN_KIND = "SpanKind".getBytes(ISO_8859_1); private static final byte[] PEER_TAGS = "PeerTags".getBytes(ISO_8859_1); + // Constant declared here for compile-time folding + public static final int TRISTATE_TRUE = TriState.TRUE.serialValue; + public static final int TRISTATE_FALSE = TriState.FALSE.serialValue; + private final WellKnownTags wellKnownTags; private final WritableFormatter writer; private final Sink sink; @@ -118,7 +122,7 @@ public void add(MetricKey key, AggregateMetric aggregate) { writer.writeBoolean(key.isSynthetics()); writer.writeUTF8(IS_TRACE_ROOT); - writer.writeInt(key.isTraceRoot() ? 1 : 2); // tristate (0 unknown, 1 true, 2 false) + writer.writeInt(key.isTraceRoot() ? TRISTATE_TRUE : TRISTATE_FALSE); writer.writeUTF8(SPAN_KIND); writer.writeUTF8(key.getSpanKind()); diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/TriState.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/TriState.java new file mode 100644 index 00000000000..037f5919f78 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/TriState.java @@ -0,0 +1,16 @@ +package datadog.trace.common.metrics; + +/** + * TriState is used to represent a three-valued logic: true, false, and unknown. The "integer" + * values are used for metrics serialization. + */ +public enum TriState { + UNKNOWN(0), + TRUE(1), + FALSE(2); + public final int serialValue; + + TriState(int serialValue) { + this.serialValue = serialValue; + } +} diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SerializingMetricWriterTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SerializingMetricWriterTest.groovy index bcc87fd66a7..64874c62ab7 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SerializingMetricWriterTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SerializingMetricWriterTest.groovy @@ -17,7 +17,6 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS import static java.util.concurrent.TimeUnit.SECONDS class SerializingMetricWriterTest extends DDSpecification { - def "should produce correct message #iterationIndex with process tags enabled #withProcessTags" () { setup: if (withProcessTags) { @@ -177,7 +176,7 @@ class SerializingMetricWriterTest extends DDSpecification { assert unpacker.unpackBoolean() == key.isSynthetics() ++elementCount assert unpacker.unpackString() == "IsTraceRoot" - assert unpacker.unpackInt() == (key.isTraceRoot() ? 1 : 2) + assert unpacker.unpackInt() == (key.isTraceRoot() ? TriState.TRUE.serialValue : TriState.FALSE.serialValue) ++elementCount assert unpacker.unpackString() == "SpanKind" assert unpacker.unpackString() == key.getSpanKind() as String