Skip to content

Commit f042b57

Browse files
committed
feat(dsm): Implement DSM context injection
1 parent 7ed51cc commit f042b57

File tree

3 files changed

+96
-3
lines changed

3 files changed

+96
-3
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package datadog.trace.core.datastreams;
2+
3+
import datadog.context.Context;
4+
import datadog.context.ContextKey;
5+
import datadog.context.ImplicitContextKeyed;
6+
import java.util.LinkedHashMap;
7+
8+
public class DataStreamContext implements ImplicitContextKeyed {
9+
private static final ContextKey<DataStreamContext> CONTEXT_KEY =
10+
ContextKey.named("dsm-context-key");
11+
12+
final LinkedHashMap<String, String> sortedTags;
13+
final long defaultTimestamp;
14+
final long payloadSizeBytes;
15+
final boolean sendCheckpoint;
16+
17+
public static DataStreamContext fromContext(Context context) {
18+
return context.get(CONTEXT_KEY);
19+
}
20+
21+
public static DataStreamContext fromTags(LinkedHashMap<String, String> sortedTags) {
22+
return new DataStreamContext(sortedTags, 0, 0, true);
23+
}
24+
25+
public static DataStreamContext fromTagsWithoutCheckpoint(
26+
LinkedHashMap<String, String> sortedTags) {
27+
return new DataStreamContext(sortedTags, 0, 0, false);
28+
}
29+
30+
// That's basically a record for now
31+
private DataStreamContext(
32+
LinkedHashMap<String, String> sortedTags,
33+
long defaultTimestamp,
34+
long payloadSizeBytes,
35+
boolean sendCheckpoint) {
36+
this.sortedTags = sortedTags;
37+
this.defaultTimestamp = defaultTimestamp;
38+
this.payloadSizeBytes = payloadSizeBytes;
39+
this.sendCheckpoint = sendCheckpoint;
40+
}
41+
42+
@Override
43+
public Context storeInto(Context context) {
44+
return context.with(CONTEXT_KEY, this);
45+
}
46+
}

dd-trace-core/src/main/java/datadog/trace/core/datastreams/DataStreamPropagator.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package datadog.trace.core.datastreams;
22

3+
import static datadog.trace.api.DDTags.PATHWAY_HASH;
4+
import static datadog.trace.bootstrap.instrumentation.api.PathwayContext.PROPAGATION_KEY_BASE64;
5+
36
import datadog.context.Context;
47
import datadog.context.propagation.CarrierSetter;
58
import datadog.context.propagation.CarrierVisitor;
@@ -10,23 +13,27 @@
1013
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
1114
import datadog.trace.bootstrap.instrumentation.api.PathwayContext;
1215
import datadog.trace.bootstrap.instrumentation.api.TagContext;
16+
import java.io.IOException;
1317
import java.util.function.Supplier;
1418
import javax.annotation.Nullable;
1519
import javax.annotation.ParametersAreNonnullByDefault;
1620

1721
// TODO Javadoc
1822
@ParametersAreNonnullByDefault
1923
public class DataStreamPropagator implements Propagator {
24+
private final DataStreamsMonitoring dataStreamsMonitoring;
2025
private final Supplier<TraceConfig> traceConfigSupplier;
2126
private final TimeSource timeSource;
2227
private final long hashOfKnownTags;
2328
private final String serviceNameOverride;
2429

2530
public DataStreamPropagator(
31+
DataStreamsMonitoring dataStreamsMonitoring,
2632
Supplier<TraceConfig> traceConfigSupplier,
2733
TimeSource timeSource,
2834
long hashOfKnownTags,
2935
String serviceNameOverride) {
36+
this.dataStreamsMonitoring = dataStreamsMonitoring;
3037
this.traceConfigSupplier = traceConfigSupplier;
3138
this.timeSource = timeSource;
3239
this.hashOfKnownTags = hashOfKnownTags;
@@ -35,12 +42,48 @@ public DataStreamPropagator(
3542

3643
@Override
3744
public <C> void inject(Context context, C carrier, CarrierSetter<C> setter) {
38-
// TODO Still in CorePropagation, not migrated yet
45+
// TODO Pathway context needs to be stored into its own context element instead of span context
46+
AgentSpan span = AgentSpan.fromContext(context);
47+
DataStreamContext dsmContext = DataStreamContext.fromContext(context);
48+
PathwayContext pathwayContext;
49+
if (span == null
50+
|| (pathwayContext = span.context().getPathwayContext()) == null
51+
|| dsmContext == null) {
52+
return;
53+
}
54+
55+
// TODO Allow set checkpoint to use DsmContext as parameter?
56+
pathwayContext.setCheckpoint(
57+
dsmContext.sortedTags,
58+
dsmContext.sendCheckpoint ? dataStreamsMonitoring::add : pathwayContext::saveStats,
59+
dsmContext.defaultTimestamp,
60+
dsmContext.payloadSizeBytes);
61+
62+
boolean injected = injectPathwayContext(pathwayContext, carrier, setter);
63+
64+
if (injected && pathwayContext.getHash() != 0) {
65+
span.setTag(PATHWAY_HASH, Long.toUnsignedString(pathwayContext.getHash()));
66+
}
67+
}
68+
69+
private <C> boolean injectPathwayContext(
70+
PathwayContext pathwayContext, C carrier, CarrierSetter<C> setter) {
71+
try {
72+
String encodedContext = pathwayContext.encode();
73+
if (encodedContext != null) {
74+
// LOGGER.debug("Injecting pathway context {}", pathwayContext);
75+
setter.set(carrier, PROPAGATION_KEY_BASE64, encodedContext);
76+
return true;
77+
}
78+
} catch (IOException e) {
79+
// LOGGER.debug("Unable to set encode pathway context", e);
80+
}
81+
return false;
3982
}
4083

4184
@Override
4285
public <C> Context extract(Context context, C carrier, CarrierVisitor<C> visitor) {
43-
// TODO Pathway context needs to be stored into its own context element
86+
// TODO Pathway context needs to be stored into its own context element instead of span context
4487
// Get span context to store pathway context into
4588
TagContext spanContext = getSpanContextOrNull(context);
4689
PathwayContext pathwayContext;

dd-trace-core/src/main/java/datadog/trace/core/datastreams/DefaultDataStreamsMonitoring.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,11 @@ public PathwayContext newPathwayContext() {
204204
@Override
205205
public Propagator propagator() {
206206
return new DataStreamPropagator(
207-
this.traceConfigSupplier, this.timeSource, this.hashOfKnownTags, getThreadServiceName());
207+
this,
208+
this.traceConfigSupplier,
209+
this.timeSource,
210+
this.hashOfKnownTags,
211+
getThreadServiceName());
208212
}
209213

210214
@Override

0 commit comments

Comments
 (0)