diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java
index 4cb41c597f4..819ff2021be 100644
--- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java
+++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java
@@ -89,7 +89,7 @@ public void map(List extends CoreSpan>> trace, Writable writable) {
}
CoreSpan> firstSpan = trace.get(0);
- firstSpan.processTagsAndBaggage(spanMetadata, false, false);
+ firstSpan.processTagsAndBaggageWithStructuredLinks(spanMetadata);
Metadata firstSpanMeta = spanMetadata.metadata;
// encoded fields: 1..7, but skipping #5, as not required by tracers and set by the agent.
@@ -128,7 +128,7 @@ private void encodeSpans(Writable writable, int fieldId, List extends CoreSpan
Metadata meta = spanMetadata.metadata;
for (CoreSpan> span : spans) {
if (meta == null) {
- span.processTagsAndBaggage(spanMetadata, false, false);
+ span.processTagsAndBaggageWithStructuredLinks(spanMetadata);
meta = spanMetadata.metadata;
}
TagMap tags = meta.getTags();
diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java
index dd3b2bc6e06..da163c2f871 100644
--- a/dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java
+++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java
@@ -98,8 +98,17 @@ default String getSpanKindString() {
void processTagsAndBaggage(MetadataConsumer consumer);
- void processTagsAndBaggage(
- MetadataConsumer consumer, boolean injectLinksAsTags, boolean injectBaggageAsTags);
+ /**
+ * Variant of {@link #processTagsAndBaggage(MetadataConsumer)} for protocols that serialize span
+ * links as first-class structured data rather than tags. Baggage tag injection still follows the
+ * tracer configuration.
+ *
+ *
To simplify tests, by default delegating to {@link
+ * #processTagsAndBaggage(MetadataConsumer)}.
+ */
+ default void processTagsAndBaggageWithStructuredLinks(MetadataConsumer consumer) {
+ processTagsAndBaggage(consumer);
+ }
T setSamplingPriority(int samplingPriority, int samplingMechanism);
diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
index c9a15901c03..a288c405e6f 100644
--- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
+++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
@@ -781,10 +781,8 @@ public void processTagsAndBaggage(final MetadataConsumer consumer) {
}
@Override
- public void processTagsAndBaggage(
- final MetadataConsumer consumer, boolean injectLinksAsTags, boolean injectBaggageAsTags) {
- context.processTagsAndBaggage(
- consumer, longRunningVersion, this, injectLinksAsTags, injectBaggageAsTags);
+ public void processTagsAndBaggageWithStructuredLinks(final MetadataConsumer consumer) {
+ context.processTagsAndBaggageWithStructuredLinks(consumer, longRunningVersion, this);
}
@Override
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 520311a20c1..6120502ec09 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
@@ -1199,6 +1199,20 @@ void processTagsAndBaggage(
consumer, longRunningVersion, restrictedSpan, injectLinksAsTags, injectBaggageAsTags);
}
+ /**
+ * Serialize span links as first-class structured data rather than tags. While baggage tag
+ * injection keeps following the tracer configuration.
+ */
+ void processTagsAndBaggageWithStructuredLinks(
+ final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan) {
+ processTagsAndBaggage(
+ consumer,
+ longRunningVersion,
+ restrictedSpan,
+ false, // injectLinksAsTags
+ injectBaggageAsTags);
+ }
+
void processTagsAndBaggage(
final MetadataConsumer consumer,
int longRunningVersion,
diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SimpleSpan.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SimpleSpan.groovy
index f23045856ef..8cb37243790 100644
--- a/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SimpleSpan.groovy
+++ b/dd-trace-core/src/test/groovy/datadog/trace/common/metrics/SimpleSpan.groovy
@@ -245,9 +245,6 @@ class SimpleSpan implements CoreSpan {
@Override
void processTagsAndBaggage(MetadataConsumer consumer) {}
- @Override
- void processTagsAndBaggage(MetadataConsumer consumer, boolean injectLinksAsTags, boolean injectBaggageAsTags) {}
-
@Override
SimpleSpan setSamplingPriority(int samplingPriority, int samplingMechanism) {
return this
diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.groovy
index a1350a7538c..b9975dd3038 100644
--- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.groovy
+++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddagent/TraceMapperV1PayloadTest.groovy
@@ -1,14 +1,17 @@
package datadog.trace.common.writer.ddagent
import static datadog.trace.common.writer.TraceGenerator.generateRandomTraces
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.readAttributes
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.readFirstSpan
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.readStreamingString
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.skipChunkField
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.skipPayloadField
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.skipSpanField
+import static datadog.trace.common.writer.ddagent.V1PayloadReader.unpackUnsignedLong
import static org.junit.jupiter.api.Assertions.assertArrayEquals
import static org.junit.jupiter.api.Assertions.assertEquals
import static org.junit.jupiter.api.Assertions.assertNotNull
import static org.junit.jupiter.api.Assertions.assertTrue
-import static org.msgpack.core.MessageFormat.FIXSTR
-import static org.msgpack.core.MessageFormat.STR16
-import static org.msgpack.core.MessageFormat.STR32
-import static org.msgpack.core.MessageFormat.STR8
import datadog.communication.serialization.ByteBufferConsumer
import datadog.communication.serialization.FlushingBuffer
@@ -345,20 +348,20 @@ class TraceMapperV1PayloadTest extends DDSpecification {
stringTable.add("")
when:
- List