Skip to content

Commit 361b6f0

Browse files
mhlidddevflow.devflow-routing-intake
andauthored
Introducing Tags/OTLP Resource Attributes for OTLP Adoption Metrics (#12516)
introducing new tags/otlp resource attributes for otlp adoption metrics Merge branch 'master' into mhlidd/otlp_adoption_metrics update tests to include SDK_OTLP_EXPORT replace span tag w/ OtlpResourceAttribute, payload tags, and chunk tags remove _dd.sdk.otlp_export from DDTags reset mapper upon buffer overflow migrate OTLP Export marker to Metadata and add keys for OTLP Resource Attributes extract repeated test condition to helper function Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent 5129467 commit 361b6f0

23 files changed

Lines changed: 459 additions & 98 deletions

File tree

‎communication/src/main/java/datadog/communication/serialization/msgpack/MsgPackWriter.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ public <T> boolean format(T message, Mapper<T> mapper) {
101101
}
102102
}
103103
buffer.reset();
104+
// the buffer is now empty, so drop any mapper state from the rejected message
105+
mapper.reset();
104106
return false;
105107
}
106108
}

‎communication/src/test/java/datadog/communication/serialization/msgpack/MsgPackWriterTest.java‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import datadog.communication.serialization.Mapper;
1515
import datadog.communication.serialization.MessageFormatter;
1616
import datadog.communication.serialization.StreamingBuffer;
17+
import datadog.communication.serialization.Writable;
1718
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
1819
import datadog.trace.util.stacktrace.StackTraceEvent;
1920
import datadog.trace.util.stacktrace.StackTraceFrame;
@@ -65,6 +66,38 @@ public void testInsertAfterOverflow() {
6566
packer.format("abcdefghijklmnopqrstuvwxy", mapper), "data fits in buffer after overflow");
6667
}
6768

69+
@Test
70+
public void testMapperResetWhenOversizedMessageRejectedFromEmptyBuffer() {
71+
CountingResetMapper mapper = new CountingResetMapper();
72+
MessageFormatter packer = new MsgPackWriter(newBuffer(2 + 25, (messageCount, buffer) -> {}));
73+
assertFalse(packer.format("abcdefghijklmnopqrstuvwxyz", mapper));
74+
assertEquals(1, mapper.resets);
75+
}
76+
77+
@Test
78+
public void testMapperResetWhenOversizedMessageRejectedAfterFlush() {
79+
CountingResetMapper mapper = new CountingResetMapper();
80+
MessageFormatter packer = new MsgPackWriter(newBuffer(2 + 25, (messageCount, buffer) -> {}));
81+
assertTrue(packer.format("abc", mapper));
82+
assertFalse(packer.format("abcdefghijklmnopqrstuvwxyz", mapper));
83+
// once before the retry, once after the retry is rejected
84+
assertEquals(2, mapper.resets);
85+
}
86+
87+
private static final class CountingResetMapper implements Mapper<String> {
88+
int resets;
89+
90+
@Override
91+
public void map(String data, Writable writable) {
92+
writable.writeString(data, null);
93+
}
94+
95+
@Override
96+
public void reset() {
97+
resets++;
98+
}
99+
}
100+
68101
@Test
69102
public void testFlushOfOverflow() {
70103
final List<String> flushed = new ArrayList<>();

‎dd-trace-api/src/main/java/datadog/trace/api/DDTags.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,5 @@ public class DDTags {
105105
public static final String PROCESS_TAGS = "_dd.tags.process";
106106
public static final String DD_INTEGRATION = "_dd.integration";
107107
public static final String DD_SVC_SRC = "_dd.svc_src";
108+
public static final String SDK_OTLP_EXPORT = "_dd.sdk.otlp_export";
108109
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ public interface TraceMapper extends RemoteMapper {
1212
UTF8BytesString.create(DDSpanContext.PRIORITY_SAMPLING_KEY);
1313
static final UTF8BytesString ORIGIN_KEY = UTF8BytesString.create(DDTags.ORIGIN_KEY);
1414
static final UTF8BytesString PROCESS_TAGS_KEY = UTF8BytesString.create(DDTags.PROCESS_TAGS);
15+
static final UTF8BytesString SDK_OTLP_EXPORT_KEY = UTF8BytesString.create(DDTags.SDK_OTLP_EXPORT);
1516
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,14 @@ public void accept(Metadata metadata) {
101101
final boolean writeSamplingPriority =
102102
firstSpanInTrace || lastSpanInTrace || metadata.topLevel();
103103
final UTF8BytesString processTags = firstSpanInPayload ? metadata.processTags() : null;
104+
final UTF8BytesString otlpExport = firstSpanInPayload ? metadata.otlpExportMarker() : null;
104105
int metaSize =
105106
metadata.getBaggage().size()
106107
+ tags.size()
107108
+ (UNSET_STATUS == metadata.getHttpStatusCode() ? 0 : 1)
108109
+ (null == metadata.getOrigin() ? 0 : 1)
109110
+ (null == processTags ? 0 : 1)
111+
+ (null == otlpExport ? 0 : 1)
110112
+ 1;
111113
int metricsSize =
112114
(writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0)
@@ -206,6 +208,10 @@ public void accept(Metadata metadata) {
206208
writable.writeUTF8(PROCESS_TAGS_KEY);
207209
writable.writeUTF8(processTags);
208210
}
211+
if (otlpExport != null) {
212+
writable.writeUTF8(SDK_OTLP_EXPORT_KEY);
213+
writable.writeUTF8(otlpExport);
214+
}
209215

210216
tags.forEach(
211217
writable,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public final class TraceMapperV0_5 implements TraceMapper {
3535
private final GrowableBuffer dictionary;
3636

3737
private final MetaWriter metaWriter = new MetaWriter();
38+
3839
private final int size;
3940
private boolean firstSpanWritten;
4041

@@ -220,6 +221,7 @@ public void accept(Metadata metadata) {
220221
final boolean writeSamplingPriority =
221222
firstSpanInTrace || lastSpanInTrace || metadata.topLevel();
222223
final UTF8BytesString processTags = firstSpanInPayload ? metadata.processTags() : null;
224+
final UTF8BytesString otlpExport = firstSpanInPayload ? metadata.otlpExportMarker() : null;
223225

224226
TagMap tags = metadata.getTags();
225227

@@ -229,6 +231,7 @@ public void accept(Metadata metadata) {
229231
+ (UNSET_STATUS == metadata.getHttpStatusCode() ? 0 : 1)
230232
+ (null == metadata.getOrigin() ? 0 : 1)
231233
+ (null == processTags ? 0 : 1)
234+
+ (null == otlpExport ? 0 : 1)
232235
+ 1;
233236
int metricsSize =
234237
(writeSamplingPriority && metadata.hasSamplingPriority() ? 1 : 0)
@@ -272,6 +275,10 @@ public void accept(Metadata metadata) {
272275
writeDictionaryEncoded(writable, PROCESS_TAGS_KEY);
273276
writeDictionaryEncoded(writable, processTags);
274277
}
278+
if (null != otlpExport) {
279+
writeDictionaryEncoded(writable, SDK_OTLP_EXPORT_KEY);
280+
writeDictionaryEncoded(writable, otlpExport);
281+
}
275282

276283
for (TagMap.EntryReader entry : tags) {
277284
if (entry.isNumber()) continue;

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,11 @@ private ByteBuffer buildHeader() {
665665

666666
// attributes = 10, a collection of key to value pairs common in all `chunks`
667667
CharSequence processTags = ProcessTags.getTagsForSerialization();
668-
Map<String, Object> tags =
669-
processTags != null ? singletonMap(DDTags.PROCESS_TAGS, processTags) : emptyMap();
668+
Map<String, Object> tags = new HashMap<>(4);
669+
tags.put(DDTags.SDK_OTLP_EXPORT, String.valueOf(cfg.isOtlpTracesExportEnabled()));
670+
if (processTags != null) {
671+
tags.put(DDTags.PROCESS_TAGS, processTags);
672+
}
670673
encodeAttributes(headerWriter, 10, tags);
671674

672675
// chunks = 11, a list of trace `chunks`, value is written by PayloadV1

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ public class DDSpanContext
7171
public static final String SPAN_SAMPLING_RULE_RATE_TAG = "_dd.span_sampling.rule_rate";
7272
public static final String SPAN_SAMPLING_MAX_PER_SECOND_TAG = "_dd.span_sampling.max_per_second";
7373

74+
private static final UTF8BytesString OTLP_EXPORT_TRUE = UTF8BytesString.create("true");
75+
private static final UTF8BytesString OTLP_EXPORT_FALSE = UTF8BytesString.create("false");
76+
7477
private static final DDCache<String, UTF8BytesString> THREAD_NAMES =
7578
DDCaches.newFixedSizeCache(256);
7679

@@ -1416,6 +1419,7 @@ void processTagsAndBaggage(
14161419
getOrigin(),
14171420
longRunningVersion,
14181421
ProcessTags.getTagsForSerialization(),
1422+
Config.get().isOtlpTracesExportEnabled() ? OTLP_EXPORT_TRUE : OTLP_EXPORT_FALSE,
14191423
restrictedSpan.getLinks()));
14201424
}
14211425
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public final class Metadata {
2323
private final CharSequence origin;
2424
private final int longRunningVersion;
2525
private final UTF8BytesString processTags;
26+
private final UTF8BytesString otlpExportMarker;
2627
private final List<? extends AgentSpanLink> spanLinks;
2728

2829
public Metadata(
@@ -37,6 +38,7 @@ public Metadata(
3738
CharSequence origin,
3839
int longRunningVersion,
3940
UTF8BytesString processTags,
41+
UTF8BytesString otlpExportMarker,
4042
List<? extends AgentSpanLink> spanLinks) {
4143
this.threadId = threadId;
4244
this.threadName = threadName;
@@ -49,6 +51,7 @@ public Metadata(
4951
this.origin = origin;
5052
this.longRunningVersion = longRunningVersion;
5153
this.processTags = processTags;
54+
this.otlpExportMarker = otlpExportMarker;
5255
this.spanLinks = spanLinks == null ? emptyList() : spanLinks;
5356
}
5457

@@ -121,6 +124,10 @@ public UTF8BytesString processTags() {
121124
return processTags;
122125
}
123126

127+
public UTF8BytesString otlpExportMarker() {
128+
return otlpExportMarker;
129+
}
130+
124131
public List<? extends AgentSpanLink> getSpanLinks() {
125132
return spanLinks;
126133
}

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.core.otlp.common;
22

33
import static datadog.communication.ddagent.TracerVersion.TRACER_VERSION;
4+
import static datadog.trace.api.DDTags.SDK_OTLP_EXPORT;
45
import static java.util.Arrays.asList;
56

67
import datadog.trace.api.Config;
@@ -23,6 +24,8 @@ private OtlpResourceAttributes() {}
2324
/** Marks that the Agent should not recompute trace metrics from the exported spans. */
2425
private static final String STATS_COMPUTED_KEY = "_dd.stats_computed";
2526

27+
private static final String SDK_SEMANTICS_KEY = "datadog.sdk.semantics";
28+
2629
private static final Set<String> IGNORED_GLOBAL_TAGS =
2730
new HashSet<>(
2831
asList(
@@ -34,7 +37,9 @@ private OtlpResourceAttributes() {}
3437
"service.version",
3538
"telemetry.sdk.name",
3639
"telemetry.sdk.version",
37-
"telemetry.sdk.language"));
40+
"telemetry.sdk.language",
41+
SDK_SEMANTICS_KEY,
42+
SDK_OTLP_EXPORT));
3843

3944
/**
4045
* {@code value} is a {@link String}, except {@code datadog.process_tags}: a {@code List<String>}.
@@ -81,10 +86,15 @@ static void visitResourceAttributes(
8186
/**
8287
* Builds the extra resource attributes for the OTLP trace export: the {@code _dd.stats_computed}
8388
* marker when the SDK is computing OTLP span metrics, so a downstream Agent does not recompute
84-
* them from the exported spans.
89+
* them from the exported spans; {@code datadog.sdk.semantics}, recording whether the SDK applied
90+
* Datadog or OTel semantics; and {@code _dd.sdk.otlp_export}, which is always {@code "true"} here
91+
* because reaching this encoder means the payload is leaving over OTLP.
8592
*/
8693
static Map<String, Object> traceResourceAttributes(Config config) {
8794
Map<String, Object> attributes = new LinkedHashMap<>();
95+
attributes.put(
96+
"datadog.sdk.semantics", config.isTraceOtelSemanticsEnabled() ? "otel" : "datadog");
97+
attributes.put(SDK_OTLP_EXPORT, "true");
8898
if (config.isOtelTracesSpanMetricsEnabled()) {
8999
attributes.put(STATS_COMPUTED_KEY, "true");
90100
}

0 commit comments

Comments
 (0)