From 3047d44f5b65159463489d9a36097c3983f6967b Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Tue, 3 Feb 2026 13:07:39 -0500 Subject: [PATCH 1/5] Adding primitive versions of setMetric Adding primitive versions of setMetric to take advantage of TagMap, primitive versions already exist on AgentSpan/DDSpan --- .../datadog/trace/core/DDSpanContext.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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 96d6292c6ae..83dcc2f94ea 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 @@ -751,6 +751,30 @@ public void setMetric(final CharSequence key, final Number value) { } } + public void setMetric(final CharSequence key, final int value) { + synchronized (unsafeTags) { + unsafeTags.set(key.toString(), value); + } + } + + public void setMetric(final CharSequence key, final long value) { + synchronized (unsafeTags) { + unsafeTags.set(key.toString(), value); + } + } + + public void setMetric(final CharSequence key, final float value) { + synchronized (unsafeTags) { + unsafeTags.set(key.toString(), value); + } + } + + public void setMetric(final CharSequence key, final double value) { + synchronized (unsafeTags) { + unsafeTags.set(key.toString(), value); + } + } + /** * Sets a tag to the span. Tags are not propagated to the children. * From 1748c18ff84598be801d1e7f06a336825e7e46d4 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Tue, 3 Feb 2026 13:49:24 -0500 Subject: [PATCH 2/5] Adding tests --- .../java/datadog/trace/core/SpanTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java diff --git a/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java new file mode 100644 index 00000000000..e854838c1cd --- /dev/null +++ b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java @@ -0,0 +1,50 @@ +package datadog.trace.core; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import org.junit.jupiter.api.Test; + +public class SpanTest { + static final CoreTracer TRACER = CoreTracer.builder().build(); + + @Test + public void setMetric_int() { + int expected = 2; + + AgentSpan span = TRACER.startSpan("foo", "foo"); + span.setMetric("int", expected); + + assertEquals(Integer.valueOf(expected), span.getTag("int")); + } + + @Test + public void setMetric_long() { + long expected = 20L; + + AgentSpan span = TRACER.startSpan("foo", "foo"); + span.setMetric("long", expected); + + assertEquals(Long.valueOf(expected), span.getTag("long")); + } + + @Test + public void setMetric_float() { + float expected = 2.718F; + + AgentSpan span = TRACER.startSpan("foo", "foo"); + span.setMetric("float", expected); + + assertEquals(Float.valueOf(expected), span.getTag("float")); + } + + @Test + public void setMetric_double() { + double expected = 3.1415D; + + AgentSpan span = TRACER.startSpan("foo", "foo"); + span.setMetric("double", expected); + + assertEquals(Double.valueOf(expected), span.getTag("double")); + } +} From eb07a055eba7658e9c522257606999dccf1a51b8 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Thu, 19 Feb 2026 14:38:33 -0500 Subject: [PATCH 3/5] Adding float support --- .../agent/test/TrackingSpanDecorator.groovy | 7 +++- .../opentelemetry/OtelSpan.java | 5 +++ .../instrumentation/opentracing31/OTSpan.java | 6 ++++ .../instrumentation/opentracing32/OTSpan.java | 6 ++++ .../trace/api/interceptor/MutableSpan.java | 2 ++ .../java/datadog/trace/core/SpanTest.java | 33 ++++++++++++++----- .../main/java/datadog/opentracing/OTSpan.java | 6 ++++ .../instrumentation/api/AgentSpan.java | 5 ++- .../instrumentation/api/ImmutableSpan.java | 5 +++ 9 files changed, 65 insertions(+), 10 deletions(-) diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy index 7db4f70a272..69ff376eae6 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy @@ -178,7 +178,12 @@ class TrackingSpanDecorator implements AgentSpan { AgentSpan setMetric(CharSequence key, int value) { return delegate.setMetric(key, value) } - + + @Override + AgentSpan setMetric(CharSequence key, float value) { + return delegate.setMetric(key, value) + } + @Override AgentSpan setMetric(CharSequence key, long value) { return delegate.setMetric(key, value) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java index a23fdd7a431..d433646177a 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java @@ -213,6 +213,11 @@ public MutableSpan setMetric(final CharSequence metric, final int value) { public MutableSpan setMetric(final CharSequence metric, final long value) { return delegate.setMetric(metric, value); } + + @Override + public MutableSpan setMetric(final CharSequence metric, final float value) { + return delegate.setMetric(metric, value); + } @Override public MutableSpan setMetric(final CharSequence metric, final double value) { diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTSpan.java b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTSpan.java index 265bd567ac1..9f11f1b21af 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTSpan.java +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTSpan.java @@ -62,6 +62,12 @@ public OTSpan setMetric(final CharSequence metric, final long value) { return this; } + @Override + public OTSpan setMetric(final CharSequence metric, final float value) { + delegate.setMetric(metric, value); + return this; + } + @Override public OTSpan setMetric(final CharSequence metric, final double value) { delegate.setMetric(metric, value); diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTSpan.java b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTSpan.java index c833ff64edb..84a8f1ceb24 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTSpan.java +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTSpan.java @@ -63,6 +63,12 @@ public OTSpan setMetric(final CharSequence metric, final long value) { return this; } + @Override + public OTSpan setMetric(final CharSequence metric, final float value) { + delegate.setMetric(metric, value); + return this; + } + @Override public OTSpan setMetric(final CharSequence metric, final double value) { delegate.setMetric(metric, value); diff --git a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java index fe39a22249f..ed0ed4cb11b 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java @@ -58,6 +58,8 @@ default Object getTag(String key) { MutableSpan setMetric(final CharSequence metric, final int value); MutableSpan setMetric(final CharSequence metric, final long value); + + MutableSpan setMetric(final CharSequence metric, final float value); MutableSpan setMetric(final CharSequence metric, final double value); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java index 9ff33865625..7788470b074 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java @@ -1,54 +1,71 @@ package datadog.trace.core; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import datadog.trace.api.TagMap; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.DisplayName; public class SpanTest { static final CoreTracer TRACER = CoreTracer.builder().build(); @Test - public void setMetric_int() { + @DisplayName("setMetric: int") + public void setMetricInt() { int expected = 2; AgentSpan span = TRACER.startSpan("foo", "foo"); span.setMetric("int", expected); - assertEquals(Integer.valueOf(expected), span.getTag("int")); + Object value = span.getTag("int"); + assertInstanceOf(Integer.class, value); + assertEquals(Integer.valueOf(expected), value); } @Test - public void setMetric_long() { + @DisplayName("setMetric: long") + public void setMetricLong() { long expected = 20L; AgentSpan span = TRACER.startSpan("foo", "foo"); span.setMetric("long", expected); - assertEquals(Long.valueOf(expected), span.getTag("long")); + Object value = span.getTag("long"); + assertInstanceOf(Long.class, value); + assertEquals(Long.valueOf(expected), value); } @Test - public void setMetric_float() { + @DisplayName("setMetric: float") + public void setMetricFloat() { float expected = 2.718F; AgentSpan span = TRACER.startSpan("foo", "foo"); span.setMetric("float", expected); - assertEquals(Float.valueOf(expected), span.getTag("float")); + Object value = span.getTag("float"); + assertInstanceOf(Float.class, value); + assertEquals(Float.valueOf(expected), value); } @Test - public void setMetric_double() { + @DisplayName("setMetric: double") + public void setMetricDouble() { double expected = 3.1415D; AgentSpan span = TRACER.startSpan("foo", "foo"); span.setMetric("double", expected); - assertEquals(Double.valueOf(expected), span.getTag("double")); + Object value = span.getTag("double"); + assertInstanceOf(Double.class, value); + assertEquals(Double.valueOf(expected), value); + } + + @Test @DisplayName("setTag: TagMap.Entry") public void setTagEntry() { AgentSpan span = TRACER.startSpan("foo", "foo"); diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java b/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java index 6252ee6e712..3f25002a8cc 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java @@ -62,6 +62,12 @@ public OTSpan setMetric(final CharSequence metric, final long value) { return this; } + @Override + public OTSpan setMetric(final CharSequence metric, final float value) { + delegate.setMetric(metric, value); + return this; + } + @Override public OTSpan setMetric(final CharSequence metric, final double value) { delegate.setMetric(metric, value); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java index 18ba85b0454..1fccf82b2de 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java @@ -91,7 +91,10 @@ default boolean isValid() { @Override AgentSpan setMetric(CharSequence key, long value); - + + @Override + AgentSpan setMetric(CharSequence key, float value); + @Override AgentSpan setMetric(CharSequence key, double value); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java index 1f857a6e7df..3018d601c47 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java @@ -76,6 +76,11 @@ public AgentSpan setMetric(CharSequence key, int value) { public AgentSpan setMetric(CharSequence key, long value) { return this; } + + @Override + public AgentSpan setMetric(CharSequence key, float value) { + return this; + } @Override public AgentSpan setMetric(CharSequence key, double value) { From 74f79df3f50f5b1948d62f4f149b4eb609cd0b42 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Thu, 19 Feb 2026 14:39:46 -0500 Subject: [PATCH 4/5] Adding cast to Number Apparently, Groovy does double dynamic dispatch which caused this test to fail now that there are primitive overrides. Adding an explicit cast, so the test only calls setMetric(CharSeq, Number) which still functions the same as it did previously. --- .../src/test/groovy/datadog/trace/core/DDSpanContextTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1cdaa33d668..3915fdf63f1 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 @@ -130,7 +130,7 @@ class DDSpanContextTest extends DDCoreSpecification { def context = span.context() when: - context.setMetric("test", value) + context.setMetric("test", (Number)value) then: type.isInstance(context.getTag("test")) From ed8eb942e9c7a6dcdf1f09e9fcf7c2d9ed78f777 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Thu, 19 Feb 2026 15:01:06 -0500 Subject: [PATCH 5/5] spotless --- .../datadog/trace/agent/test/TrackingSpanDecorator.groovy | 4 ++-- .../datadog/trace/instrumentation/opentelemetry/OtelSpan.java | 2 +- .../main/java/datadog/trace/api/interceptor/MutableSpan.java | 2 +- .../src/main/java/datadog/trace/core/DDSpanContext.java | 2 +- dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java | 4 +--- dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java | 2 +- .../trace/bootstrap/instrumentation/api/AgentSpan.java | 4 ++-- .../trace/bootstrap/instrumentation/api/ImmutableSpan.java | 2 +- 8 files changed, 10 insertions(+), 12 deletions(-) diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy index 69ff376eae6..af967aff6e2 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy @@ -178,12 +178,12 @@ class TrackingSpanDecorator implements AgentSpan { AgentSpan setMetric(CharSequence key, int value) { return delegate.setMetric(key, value) } - + @Override AgentSpan setMetric(CharSequence key, float value) { return delegate.setMetric(key, value) } - + @Override AgentSpan setMetric(CharSequence key, long value) { return delegate.setMetric(key, value) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java index d433646177a..57be53ede95 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelSpan.java @@ -213,7 +213,7 @@ public MutableSpan setMetric(final CharSequence metric, final int value) { public MutableSpan setMetric(final CharSequence metric, final long value) { return delegate.setMetric(metric, value); } - + @Override public MutableSpan setMetric(final CharSequence metric, final float value) { return delegate.setMetric(metric, value); diff --git a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java index ed0ed4cb11b..e5ef4cef73c 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/interceptor/MutableSpan.java @@ -58,7 +58,7 @@ default Object getTag(String key) { MutableSpan setMetric(final CharSequence metric, final int value); MutableSpan setMetric(final CharSequence metric, final long value); - + MutableSpan setMetric(final CharSequence metric, final float value); MutableSpan setMetric(final CharSequence metric, final double value); 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 396b621f672..1869718d71f 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 @@ -774,7 +774,7 @@ public void setMetric(final CharSequence key, final double value) { unsafeTags.set(key.toString(), value); } } - + public void setMetric(final TagMap.EntryReader entry) { if (entry == null) { return; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java index 7788470b074..7b3a631eaa9 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/SpanTest.java @@ -5,10 +5,8 @@ import datadog.trace.api.TagMap; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.DisplayName; public class SpanTest { static final CoreTracer TRACER = CoreTracer.builder().build(); @@ -64,7 +62,7 @@ public void setMetricDouble() { assertInstanceOf(Double.class, value); assertEquals(Double.valueOf(expected), value); } - + @Test @DisplayName("setTag: TagMap.Entry") public void setTagEntry() { diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java b/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java index 3f25002a8cc..053dfa50eec 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/OTSpan.java @@ -67,7 +67,7 @@ public OTSpan setMetric(final CharSequence metric, final float value) { delegate.setMetric(metric, value); return this; } - + @Override public OTSpan setMetric(final CharSequence metric, final double value) { delegate.setMetric(metric, value); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java index 1fccf82b2de..f86687a2554 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java @@ -91,10 +91,10 @@ default boolean isValid() { @Override AgentSpan setMetric(CharSequence key, long value); - + @Override AgentSpan setMetric(CharSequence key, float value); - + @Override AgentSpan setMetric(CharSequence key, double value); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java index 3018d601c47..c71f8b59023 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java @@ -76,7 +76,7 @@ public AgentSpan setMetric(CharSequence key, int value) { public AgentSpan setMetric(CharSequence key, long value) { return this; } - + @Override public AgentSpan setMetric(CharSequence key, float value) { return this;