Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static datadog.json.JsonMapper.toJson;
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
import static datadog.trace.api.civisibility.CIConstants.MAX_META_STRING_VALUE_LENGTH;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static datadog.trace.util.Strings.truncate;

import datadog.communication.serialization.GrowableBuffer;
Expand Down Expand Up @@ -222,7 +223,7 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
writable.writeUTF8(ERROR);
writable.writeInt(span.getError());
/* 7 (meta), 8 (metrics) */
span.processTagsAndBaggage(metaWriter.withWritable(writable));
span.processTagsAndBaggage(metaWriter.withWritable(writable), OWN_PROPAGATION_TAGS);
}
eventCount += trace.size();
serializationTimeMillis += (int) (System.currentTimeMillis() - serializationStartTimestamp);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static datadog.json.JsonMapper.toJson;
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
import static datadog.trace.api.civisibility.CIConstants.MAX_META_STRING_VALUE_LENGTH;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static datadog.trace.util.Strings.truncate;

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

span.processTagsAndBaggage(new JsonMetaWriter(w));
span.processTagsAndBaggage(new JsonMetaWriter(w), OWN_PROPAGATION_TAGS);

w.endObject(); // content
w.endObject(); // event
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package datadog.trace.common.writer;

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

add(trace);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;

import datadog.communication.serialization.Codec;
import datadog.communication.serialization.GenerationalUtf8Cache;
Expand Down Expand Up @@ -367,7 +368,7 @@ public void map(List<? extends CoreSpan<?>> trace, final Writable writable) {
metaWriter
.withWritable(writable)
.forSpan(i == 0, i == trace.size() - 1, !firstSpanWritten),
i == 0);
i == 0 ? ROOT_PROPAGATION_TAGS : 0);
if (!metaStruct.isEmpty()) {
/* 13 */
metaStructWriter.withWritable(writable).write(metaStruct);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;

import datadog.communication.serialization.GrowableBuffer;
import datadog.communication.serialization.Mapper;
Expand Down Expand Up @@ -85,7 +86,7 @@ public void map(final List<? extends CoreSpan<?>> trace, final Writable writable
metaWriter
.withWritable(writable)
.forSpan(i == 0, i == trace.size() - 1, !firstSpanWritten),
i == 0);
i == 0 ? ROOT_PROPAGATION_TAGS : 0);
/* 12 */
writeDictionaryEncoded(writable, span.getType());
firstSpanWritten = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import static datadog.communication.http.OkHttpUtils.msgpackRequestBodyOf;
import static datadog.trace.api.DDTags.SPAN_EVENTS;
import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS;
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
import static datadog.trace.core.CoreSpan.STRUCTURED_EVENTS;
import static datadog.trace.core.CoreSpan.STRUCTURED_LINKS;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;

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

/** Span links and events are encoded natively rather than as tags. */
private static final int STRUCTURED_LINKS_AND_EVENTS = STRUCTURED_LINKS | STRUCTURED_EVENTS;

// Attribute value types (from V1 spec)
static final int VALUE_TYPE_STRING = 1;
static final int VALUE_TYPE_BOOLEAN = 2;
Expand Down Expand Up @@ -92,7 +98,8 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable) {
}

CoreSpan<?> firstSpan = trace.get(0);
firstSpan.processTagsAndBaggageWithStructuredLinksAndEvents(spanMetadata, true);
firstSpan.processTagsAndBaggage(
spanMetadata, STRUCTURED_LINKS_AND_EVENTS | ROOT_PROPAGATION_TAGS);
Metadata firstSpanMeta = spanMetadata.metadata;

// encoded fields: 1..7, but skipping #5, as not required by tracers and set by the agent.
Expand Down Expand Up @@ -132,7 +139,8 @@ private void encodeSpans(Writable writable, int fieldId, List<? extends CoreSpan
for (int i = 0; i < spans.size(); i++) {
CoreSpan<?> span = spans.get(i);
if (meta == null) {
span.processTagsAndBaggageWithStructuredLinksAndEvents(spanMetadata, i == 0);
span.processTagsAndBaggage(
spanMetadata, STRUCTURED_LINKS_AND_EVENTS | (i == 0 ? ROOT_PROPAGATION_TAGS : 0));
meta = spanMetadata.metadata;
}
TagMap tags = meta.getTags();
Expand Down
38 changes: 20 additions & 18 deletions dd-trace-core/src/main/java/datadog/trace/core/CoreSpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,32 +92,34 @@ default String getSpanKindString() {
/**
* Runs early {@link datadog.trace.core.tagprocessor.TagsPostProcessor} like base service and peer
* service computation. Such tags are needed before span serialization so they can’t be processed
* lazily as part of the {@link #processTagsAndBaggage(MetadataConsumer)} API.
* lazily as part of the {@link #processTagsAndBaggage(MetadataConsumer, int)} API.
*/
void processServiceTags();

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

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

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

default void processTagsAndBaggageWithStructuredLinksAndEvents(
MetadataConsumer consumer, boolean firstInChunk) {
processTagsAndBaggageWithStructuredLinksAndEvents(consumer);
}
/** Serializes the local root span context propagation tags, as for the first span of a chunk. */
int ROOT_PROPAGATION_TAGS = 1 << 3;

/**
* Processes the span tags and baggage, and hands the resulting {@link Metadata} to the consumer.
*
* @param consumer The consumer of the span metadata.
* @param options A combination of {@link #STRUCTURED_LINKS}, {@link #STRUCTURED_EVENTS}, and
* either {@link #OWN_PROPAGATION_TAGS} (the default option) or {@link
* #ROOT_PROPAGATION_TAGS}.
*/
void processTagsAndBaggage(MetadataConsumer consumer, int options);

T setSamplingPriority(int samplingPriority, int samplingMechanism);

Expand Down
21 changes: 2 additions & 19 deletions dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
Original file line number Diff line number Diff line change
Expand Up @@ -806,25 +806,8 @@ public void processServiceTags() {
}

@Override
public void processTagsAndBaggage(final MetadataConsumer consumer) {
context.processTagsAndBaggage(consumer, longRunningVersion, this);
}

@Override
public void processTagsAndBaggage(final MetadataConsumer consumer, final boolean firstInChunk) {
context.processTagsAndBaggage(consumer, longRunningVersion, this, firstInChunk);
}

@Override
public void processTagsAndBaggageWithStructuredLinksAndEvents(final MetadataConsumer consumer) {
context.processTagsAndBaggageWithStructuredLinksAndEvents(consumer, longRunningVersion, this);
}

@Override
public void processTagsAndBaggageWithStructuredLinksAndEvents(
final MetadataConsumer consumer, final boolean firstInChunk) {
context.processTagsAndBaggageWithStructuredLinksAndEvents(
consumer, longRunningVersion, this, firstInChunk);
public void processTagsAndBaggage(final MetadataConsumer consumer, final int options) {
context.processTagsAndBaggage(consumer, longRunningVersion, this, options);
}

@Override
Expand Down
86 changes: 22 additions & 64 deletions dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
import static datadog.trace.api.DDTags.SPAN_LINKS;
import static datadog.trace.bootstrap.instrumentation.api.ErrorPriorities.UNSET;
import static datadog.trace.bootstrap.instrumentation.api.ServiceNameSources.MANUAL;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static datadog.trace.core.CoreSpan.ROOT_PROPAGATION_TAGS;
import static datadog.trace.core.CoreSpan.STRUCTURED_EVENTS;
import static datadog.trace.core.CoreSpan.STRUCTURED_LINKS;

import datadog.trace.api.Config;
import datadog.trace.api.DDSpanId;
Expand Down Expand Up @@ -1324,72 +1328,26 @@ void earlyProcessTags(AppendableSpanLinks links) {
}
}

void processTagsAndBaggage(
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan) {
processTagsAndBaggage(
consumer,
longRunningVersion,
restrictedSpan,
injectLinksAsTags,
true, // injectEventsAsTags
injectBaggageAsTags,
propagationTags);
}

void processTagsAndBaggage(
final MetadataConsumer consumer,
int longRunningVersion,
DDSpan restrictedSpan,
boolean firstInChunk) {
processTagsAndBaggage(
consumer,
longRunningVersion,
restrictedSpan,
injectLinksAsTags,
true, // injectEventsAsTags
injectBaggageAsTags,
firstInChunk ? getPropagationTags() : null);
}

/**
* Serialize span links and span events as first-class structured data rather than tags. While
* baggage tag injection keeps following the tracer configuration.
* Processes the span tags and baggage, and hands the resulting {@link Metadata} to the consumer.
*
* @param consumer The consumer of the span metadata.
* @param longRunningVersion The long-running version of the span.
* @param restrictedSpan The span to read links and events from.
* @param options The {@link CoreSpan} options describing what the serialization protocol needs.
*/
void processTagsAndBaggageWithStructuredLinksAndEvents(
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan) {
processTagsAndBaggage(
consumer,
longRunningVersion,
restrictedSpan,
false, // injectLinksAsTags
false, // injectEventsAsTags
injectBaggageAsTags,
propagationTags);
}

void processTagsAndBaggageWithStructuredLinksAndEvents(
final MetadataConsumer consumer,
int longRunningVersion,
DDSpan restrictedSpan,
boolean firstInChunk) {
processTagsAndBaggage(
consumer,
longRunningVersion,
restrictedSpan,
false, // injectLinksAsTags
false, // injectEventsAsTags
injectBaggageAsTags,
firstInChunk ? getPropagationTags() : null);
}

void processTagsAndBaggage(
final MetadataConsumer consumer,
int longRunningVersion,
DDSpan restrictedSpan,
boolean injectLinksAsTags,
boolean injectEventsAsTags,
boolean injectBaggageAsTags,
PropagationTags serializedPropagationTags) {
final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan, int options) {
boolean injectLinksAsTags = this.injectLinksAsTags && (options & STRUCTURED_LINKS) == 0;
boolean injectEventsAsTags = (options & STRUCTURED_EVENTS) == 0;
PropagationTags serializedPropagationTags;
if ((options & ROOT_PROPAGATION_TAGS) != 0) {
serializedPropagationTags = getPropagationTags();
} else if ((options & OWN_PROPAGATION_TAGS) != 0) {
serializedPropagationTags = this.propagationTags;
} else {
serializedPropagationTags = null;
}
// NOTE: The span is passed for the sole purpose of allowing updating & reading of the span
// links and events
// This is a compromise to avoid...
Expand Down Expand Up @@ -1418,7 +1376,7 @@ void processTagsAndBaggage(

// Baggage
Map<String, String> baggageItemsWithPropagationTags;
if (injectBaggageAsTags) {
if (this.injectBaggageAsTags) {
baggageItemsWithPropagationTags = new HashMap<>(baggageItems);
if (w3cBaggage != null) {
injectW3CBaggageTags(baggageItemsWithPropagationTags);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static datadog.trace.common.writer.ddagent.TraceMapper.SAMPLING_PRIORITY_KEY;
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_ID;
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_NAME;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static datadog.trace.core.otlp.common.OtlpCommonJson.hexSpanId;
import static datadog.trace.core.otlp.common.OtlpCommonJson.hexTraceId;
import static datadog.trace.core.otlp.common.OtlpCommonJson.writeAttribute;
Expand Down Expand Up @@ -112,7 +113,7 @@ public static void writeSpan(
if (span.getSpanType() != null) {
writeSpanTag(writer, SPAN_TYPE, span.getSpanType());
}
span.processTagsAndBaggage(metaWriter);
span.processTagsAndBaggage(metaWriter, OWN_PROPAGATION_TAGS);
writer.endArray();

if (!links.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static datadog.trace.common.writer.ddagent.TraceMapper.SAMPLING_PRIORITY_KEY;
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_ID;
import static datadog.trace.common.writer.ddagent.TraceMapper.THREAD_NAME;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static datadog.trace.core.otlp.common.OtlpCommonProto.I32_WIRE_TYPE;
import static datadog.trace.core.otlp.common.OtlpCommonProto.I64_WIRE_TYPE;
import static datadog.trace.core.otlp.common.OtlpCommonProto.LEN_WIRE_TYPE;
Expand Down Expand Up @@ -159,7 +160,7 @@ public static int recordSpanMessage(
writeSpanTag(buf, SPAN_TYPE, span.getSpanType());
}

span.processTagsAndBaggage(metaWriter);
span.processTagsAndBaggage(metaWriter, OWN_PROPAGATION_TAGS);

if (span.isError()) {
int stateSize = 2;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package datadog.trace.llmobs.writer.ddintake;

import static datadog.communication.http.OkHttpUtils.gzippedMsgpackRequestBodyOf;
import static datadog.trace.core.CoreSpan.OWN_PROPAGATION_TAGS;
import static java.util.concurrent.TimeUnit.MINUTES;

import datadog.communication.EvpProxy;
Expand Down Expand Up @@ -281,7 +282,8 @@ public void map(List<? extends CoreSpan<?>> trace, Writable writable, boolean re
}

/* 10 (metrics), 11 (tags), 12 meta — shift down 1 if session_id absent */
span.processTagsAndBaggage(metaWriter.withWritable(writable, getErrorsMap(span)));
span.processTagsAndBaggage(
metaWriter.withWritable(writable, getErrorsMap(span)), OWN_PROPAGATION_TAGS);
}

// Increase only after all spans have been written. This way, if it rolls back because of a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ public CharSequence getType() {
public void processServiceTags() {}

@Override
public void processTagsAndBaggage(MetadataConsumer consumer) {}
public void processTagsAndBaggage(MetadataConsumer consumer, int options) {}

@Override
public SimpleSpan setSamplingPriority(int samplingPriority, int samplingMechanism) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
Expand Down Expand Up @@ -324,7 +325,7 @@ private static CoreSpan<?> mockSpan(CharSequence type, Map<String, Object> tags)
return null;
})
.when(span)
.processTagsAndBaggage(any(MetadataConsumer.class));
.processTagsAndBaggage(any(MetadataConsumer.class), anyInt());

return span;
}
Expand Down
Loading
Loading