Skip to content

Commit 3bf09db

Browse files
committed
feat(core): Improve tag processing API
1 parent 100acde commit 3bf09db

18 files changed

Lines changed: 80 additions & 118 deletions

File tree

‎dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static datadog.json.JsonMapper.toJson;
66
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
77
import static datadog.trace.api.civisibility.CIConstants.MAX_META_STRING_VALUE_LENGTH;
8+
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
89
import static datadog.trace.util.Strings.truncate;
910

1011
import datadog.communication.serialization.GrowableBuffer;
@@ -222,7 +223,7 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
222223
writable.writeUTF8(ERROR);
223224
writable.writeInt(span.getError());
224225
/* 7 (meta), 8 (metrics) */
225-
span.processTagsAndBaggage(metaWriter.withWritable(writable));
226+
span.processTagsAndBaggage(metaWriter.withWritable(writable), OWN_PROPAGATION_TAGS);
226227
}
227228
eventCount += trace.size();
228229
serializationTimeMillis += (int) (System.currentTimeMillis() - serializationStartTimestamp);

‎dd-trace-core/src/main/java/datadog/trace/common/writer/FileBasedPayloadDispatcher.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static datadog.json.JsonMapper.toJson;
44
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
55
import static datadog.trace.api.civisibility.CIConstants.MAX_META_STRING_VALUE_LENGTH;
6+
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
67
import static datadog.trace.util.Strings.truncate;
78

89
import datadog.json.JsonWriter;
@@ -270,7 +271,7 @@ private String serializeTestEvent(CoreSpan<?> span) {
270271
w.name("duration").value(span.getDurationNano());
271272
w.name("error").value(span.getError());
272273

273-
span.processTagsAndBaggage(new JsonMetaWriter(w));
274+
span.processTagsAndBaggage(new JsonMetaWriter(w), OWN_PROPAGATION_TAGS);
274275

275276
w.endObject(); // content
276277
w.endObject(); // event

‎dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.common.writer;
22

3+
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
34
import static java.util.concurrent.TimeUnit.MILLISECONDS;
45
import static java.util.concurrent.TimeUnit.NANOSECONDS;
56
import static java.util.concurrent.TimeUnit.SECONDS;
@@ -46,7 +47,7 @@ public void write(List<DDSpan> trace) {
4647
for (DDSpan span : trace) {
4748
// This is needed to properly do all delayed processing to make this writer even
4849
// remotely realistic so the test actually test something
49-
span.processTagsAndBaggage(metadataConsumer);
50+
span.processTagsAndBaggage(metadataConsumer, OWN_PROPAGATION_TAGS);
5051
}
5152

5253
add(trace);

‎dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_4.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
44
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
5+
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
56

67
import datadog.communication.serialization.Codec;
78
import datadog.communication.serialization.GenerationalUtf8Cache;
@@ -367,7 +368,7 @@ public void map(List<? extends CoreSpan<?>> trace, final Writable writable) {
367368
metaWriter
368369
.withWritable(writable)
369370
.forSpan(i == 0, i == trace.size() - 1, !firstSpanWritten),
370-
i == 0);
371+
i == 0 ? ROOT_PROPAGATION_TAGS : 0);
371372
if (!metaStruct.isEmpty()) {
372373
/* 13 */
373374
metaStructWriter.withWritable(writable).write(metaStruct);

‎dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV0_5.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
44
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
5+
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
56

67
import datadog.communication.serialization.GrowableBuffer;
78
import datadog.communication.serialization.Mapper;
@@ -85,7 +86,7 @@ public void map(final List<? extends CoreSpan<?>> trace, final Writable writable
8586
metaWriter
8687
.withWritable(writable)
8788
.forSpan(i == 0, i == trace.size() - 1, !firstSpanWritten),
88-
i == 0);
89+
i == 0 ? ROOT_PROPAGATION_TAGS : 0);
8990
/* 12 */
9091
writeDictionaryEncoded(writable, span.getType());
9192
firstSpanWritten = true;

‎dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapperV1.java‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
44
import static datadog.trace.api.DDTags.SPAN_EVENTS;
55
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
6+
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
7+
import static datadog.trace.core.CoreSpan.STRUCTURED_EVENTS;
8+
import static datadog.trace.core.CoreSpan.STRUCTURED_LINKS;
69
import static java.util.Collections.emptyMap;
710
import static java.util.Collections.singletonMap;
811

@@ -44,6 +47,9 @@
4447
public final class TraceMapperV1 implements TraceMapper {
4548
private static final Logger log = LoggerFactory.getLogger(TraceMapperV1.class);
4649

50+
/** Span links and events are encoded natively rather than as tags. */
51+
private static final int STRUCTURED_LINKS_AND_EVENTS = STRUCTURED_LINKS | STRUCTURED_EVENTS;
52+
4753
// Attribute value types (from V1 spec)
4854
static final int VALUE_TYPE_STRING = 1;
4955
static final int VALUE_TYPE_BOOLEAN = 2;
@@ -92,7 +98,8 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
9298
}
9399

94100
CoreSpan<?> firstSpan = trace.get(0);
95-
firstSpan.processTagsAndBaggageWithStructuredLinksAndEvents(spanMetadata, true);
101+
firstSpan.processTagsAndBaggage(
102+
spanMetadata, STRUCTURED_LINKS_AND_EVENTS | ROOT_PROPAGATION_TAGS);
96103
Metadata firstSpanMeta = spanMetadata.metadata;
97104

98105
// encoded fields: 1..7, but skipping #5, as not required by tracers and set by the agent.
@@ -132,7 +139,8 @@ private void encodeSpans(Writable writable, int fieldId, List<? extends CoreSpan
132139
for (int i = 0; i < spans.size(); i++) {
133140
CoreSpan<?> span = spans.get(i);
134141
if (meta == null) {
135-
span.processTagsAndBaggageWithStructuredLinksAndEvents(spanMetadata, i == 0);
142+
span.processTagsAndBaggage(
143+
spanMetadata, STRUCTURED_LINKS_AND_EVENTS | (i == 0 ? ROOT_PROPAGATION_TAGS : 0));
136144
meta = spanMetadata.metadata;
137145
}
138146
TagMap tags = meta.getTags();

‎dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java‎

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -92,32 +92,34 @@ default String getSpanKindString() {
9292
/**
9393
* Runs early {@link datadog.trace.core.tagprocessor.TagsPostProcessor} like base service and peer
9494
* service computation. Such tags are needed before span serialization so they can’t be processed
95-
* lazily as part of the {@link #processTagsAndBaggage(MetadataConsumer)} API.
95+
* lazily as part of the {@link #processTagsAndBaggage(MetadataConsumer, int)} API.
9696
*/
9797
void processServiceTags();
9898

99-
void processTagsAndBaggage(MetadataConsumer consumer);
99+
/** The serialization protocol encodes span links natively, so they are not added as a tag. */
100+
int STRUCTURED_LINKS = 1;
100101

101-
default void processTagsAndBaggage(MetadataConsumer consumer, boolean firstInChunk) {
102-
processTagsAndBaggage(consumer);
103-
}
102+
/** The serialization protocol encodes span events natively, so they are not added as a tag. */
103+
int STRUCTURED_EVENTS = 1 << 1;
104104

105105
/**
106-
* Variant of {@link #processTagsAndBaggage(MetadataConsumer)} for protocols that serialize span
107-
* links and span events as first-class structured data rather than tags. Baggage tag injection
108-
* still follows the tracer configuration.
109-
*
110-
* <p>To simplify tests, by default delegating to {@link
111-
* #processTagsAndBaggage(MetadataConsumer)}.
106+
* Serializes the span context own propagation tags. This is the default option, for tag-based
107+
* protocols that serialize each span independently.
112108
*/
113-
default void processTagsAndBaggageWithStructuredLinksAndEvents(MetadataConsumer consumer) {
114-
processTagsAndBaggage(consumer);
115-
}
109+
int OWN_PROPAGATION_TAGS = 1 << 2;
116110

117-
default void processTagsAndBaggageWithStructuredLinksAndEvents(
118-
MetadataConsumer consumer, boolean firstInChunk) {
119-
processTagsAndBaggageWithStructuredLinksAndEvents(consumer);
120-
}
111+
/** Serializes the local root span context propagation tags, as for the first span of a chunk. */
112+
int ROOT_PROPAGATION_TAGS = 1 << 3;
113+
114+
/**
115+
* Processes the span tags and baggage, and hands the resulting {@link Metadata} to the consumer.
116+
*
117+
* @param consumer The consumer of the span metadata.
118+
* @param options A combination of {@link #STRUCTURED_LINKS}, {@link #STRUCTURED_EVENTS}, and
119+
* either {@link #OWN_PROPAGATION_TAGS} (the default option) or {@link
120+
* #ROOT_PROPAGATION_TAGS}.
121+
*/
122+
void processTagsAndBaggage(MetadataConsumer consumer, int options);
121123

122124
T setSamplingPriority(int samplingPriority, int samplingMechanism);
123125

‎dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java‎

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -806,25 +806,8 @@ public void processServiceTags() {
806806
}
807807

808808
@Override
809-
public void processTagsAndBaggage(final MetadataConsumer consumer) {
810-
context.processTagsAndBaggage(consumer, longRunningVersion, this);
811-
}
812-
813-
@Override
814-
public void processTagsAndBaggage(final MetadataConsumer consumer, final boolean firstInChunk) {
815-
context.processTagsAndBaggage(consumer, longRunningVersion, this, firstInChunk);
816-
}
817-
818-
@Override
819-
public void processTagsAndBaggageWithStructuredLinksAndEvents(final MetadataConsumer consumer) {
820-
context.processTagsAndBaggageWithStructuredLinksAndEvents(consumer, longRunningVersion, this);
821-
}
822-
823-
@Override
824-
public void processTagsAndBaggageWithStructuredLinksAndEvents(
825-
final MetadataConsumer consumer, final boolean firstInChunk) {
826-
context.processTagsAndBaggageWithStructuredLinksAndEvents(
827-
consumer, longRunningVersion, this, firstInChunk);
809+
public void processTagsAndBaggage(final MetadataConsumer consumer, final int options) {
810+
context.processTagsAndBaggage(consumer, longRunningVersion, this, options);
828811
}
829812

830813
@Override

‎dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java‎

Lines changed: 22 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import static datadog.trace.api.DDTags.SPAN_LINKS;
66
import static datadog.trace.bootstrap.instrumentation.api.ErrorPriorities.UNSET;
77
import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MANUAL;
8+
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
9+
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
10+
import static datadog.trace.core.CoreSpan.STRUCTURED_EVENTS;
11+
import static datadog.trace.core.CoreSpan.STRUCTURED_LINKS;
812

913
import datadog.trace.api.Config;
1014
import datadog.trace.api.DDSpanId;
@@ -1324,72 +1328,26 @@ void earlyProcessTags(AppendableSpanLinks links) {
13241328
}
13251329
}
13261330

1327-
void processTagsAndBaggage(
1328-
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan) {
1329-
processTagsAndBaggage(
1330-
consumer,
1331-
longRunningVersion,
1332-
restrictedSpan,
1333-
injectLinksAsTags,
1334-
true, // injectEventsAsTags
1335-
injectBaggageAsTags,
1336-
propagationTags);
1337-
}
1338-
1339-
void processTagsAndBaggage(
1340-
final MetadataConsumer consumer,
1341-
int longRunningVersion,
1342-
DDSpan restrictedSpan,
1343-
boolean firstInChunk) {
1344-
processTagsAndBaggage(
1345-
consumer,
1346-
longRunningVersion,
1347-
restrictedSpan,
1348-
injectLinksAsTags,
1349-
true, // injectEventsAsTags
1350-
injectBaggageAsTags,
1351-
firstInChunk ? getPropagationTags() : null);
1352-
}
1353-
13541331
/**
1355-
* Serialize span links and span events as first-class structured data rather than tags. While
1356-
* baggage tag injection keeps following the tracer configuration.
1332+
* Processes the span tags and baggage, and hands the resulting {@link Metadata} to the consumer.
1333+
*
1334+
* @param consumer The consumer of the span metadata.
1335+
* @param longRunningVersion The long-running version of the span.
1336+
* @param restrictedSpan The span to read links and events from.
1337+
* @param options The {@link CoreSpan} options describing what the serialization protocol needs.
13571338
*/
1358-
void processTagsAndBaggageWithStructuredLinksAndEvents(
1359-
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan) {
1360-
processTagsAndBaggage(
1361-
consumer,
1362-
longRunningVersion,
1363-
restrictedSpan,
1364-
false, // injectLinksAsTags
1365-
false, // injectEventsAsTags
1366-
injectBaggageAsTags,
1367-
propagationTags);
1368-
}
1369-
1370-
void processTagsAndBaggageWithStructuredLinksAndEvents(
1371-
final MetadataConsumer consumer,
1372-
int longRunningVersion,
1373-
DDSpan restrictedSpan,
1374-
boolean firstInChunk) {
1375-
processTagsAndBaggage(
1376-
consumer,
1377-
longRunningVersion,
1378-
restrictedSpan,
1379-
false, // injectLinksAsTags
1380-
false, // injectEventsAsTags
1381-
injectBaggageAsTags,
1382-
firstInChunk ? getPropagationTags() : null);
1383-
}
1384-
13851339
void processTagsAndBaggage(
1386-
final MetadataConsumer consumer,
1387-
int longRunningVersion,
1388-
DDSpan restrictedSpan,
1389-
boolean injectLinksAsTags,
1390-
boolean injectEventsAsTags,
1391-
boolean injectBaggageAsTags,
1392-
PropagationTags serializedPropagationTags) {
1340+
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan, int options) {
1341+
boolean injectLinksAsTags = this.injectLinksAsTags && (options & STRUCTURED_LINKS) == 0;
1342+
boolean injectEventsAsTags = (options & STRUCTURED_EVENTS) == 0;
1343+
PropagationTags serializedPropagationTags;
1344+
if ((options & ROOT_PROPAGATION_TAGS) != 0) {
1345+
serializedPropagationTags = getPropagationTags();
1346+
} else if ((options & OWN_PROPAGATION_TAGS) != 0) {
1347+
serializedPropagationTags = this.propagationTags;
1348+
} else {
1349+
serializedPropagationTags = null;
1350+
}
13931351
// NOTE: The span is passed for the sole purpose of allowing updating & reading of the span
13941352
// links and events
13951353
// This is a compromise to avoid...
@@ -1418,7 +1376,7 @@ void processTagsAndBaggage(
14181376

14191377
// Baggage
14201378
Map<String, String> baggageItemsWithPropagationTags;
1421-
if (injectBaggageAsTags) {
1379+
if (this.injectBaggageAsTags) {
14221380
baggageItemsWithPropagationTags = new HashMap<>(baggageItems);
14231381
if (w3cBaggage != null) {
14241382
injectW3CBaggageTags(baggageItemsWithPropagationTags);

‎dd-trace-core/src/main/java/datadog/trace/core/otlp/trace/OtlpTraceJson.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static datadog.trace.common.writer.ddagent.TraceMapper.SAMPLING_PRIORITY_KEY;
1515
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_ID;
1616
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_NAME;
17+
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
1718
import static datadog.trace.core.otlp.common.OtlpCommonJson.hexSpanId;
1819
import static datadog.trace.core.otlp.common.OtlpCommonJson.hexTraceId;
1920
import static datadog.trace.core.otlp.common.OtlpCommonJson.writeAttribute;
@@ -112,7 +113,7 @@ public static void writeSpan(
112113
if (span.getSpanType() != null) {
113114
writeSpanTag(writer, SPAN_TYPE, span.getSpanType());
114115
}
115-
span.processTagsAndBaggage(metaWriter);
116+
span.processTagsAndBaggage(metaWriter, OWN_PROPAGATION_TAGS);
116117
writer.endArray();
117118

118119
if (!links.isEmpty()) {

0 commit comments

Comments
 (0)