11package 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+
36import datadog .context .Context ;
47import datadog .context .propagation .CarrierSetter ;
58import datadog .context .propagation .CarrierVisitor ;
69import datadog .context .propagation .Propagator ;
710import datadog .trace .api .TraceConfig ;
11+ import datadog .trace .api .datastreams .DataStreamsContext ;
812import datadog .trace .api .time .TimeSource ;
913import datadog .trace .bootstrap .instrumentation .api .AgentSpan ;
1014import datadog .trace .bootstrap .instrumentation .api .AgentSpanContext ;
1115import datadog .trace .bootstrap .instrumentation .api .PathwayContext ;
1216import datadog .trace .bootstrap .instrumentation .api .TagContext ;
17+ import java .io .IOException ;
1318import java .util .function .Supplier ;
1419import javax .annotation .Nullable ;
1520import javax .annotation .ParametersAreNonnullByDefault ;
1621
1722// TODO Javadoc
1823@ ParametersAreNonnullByDefault
19- public class DataStreamPropagator implements Propagator {
24+ public class DataStreamsPropagator implements Propagator {
25+ private final DataStreamsMonitoring dataStreamsMonitoring ;
2026 private final Supplier <TraceConfig > traceConfigSupplier ;
2127 private final TimeSource timeSource ;
2228 private final long hashOfKnownTags ;
2329 private final String serviceNameOverride ;
2430
25- public DataStreamPropagator (
31+ public DataStreamsPropagator (
32+ DataStreamsMonitoring dataStreamsMonitoring ,
2633 Supplier <TraceConfig > traceConfigSupplier ,
2734 TimeSource timeSource ,
2835 long hashOfKnownTags ,
2936 String serviceNameOverride ) {
37+ this .dataStreamsMonitoring = dataStreamsMonitoring ;
3038 this .traceConfigSupplier = traceConfigSupplier ;
3139 this .timeSource = timeSource ;
3240 this .hashOfKnownTags = hashOfKnownTags ;
@@ -35,12 +43,49 @@ public DataStreamPropagator(
3543
3644 @ Override
3745 public <C > void inject (Context context , C carrier , CarrierSetter <C > setter ) {
38- // TODO Still in CorePropagation, not migrated yet
46+ // TODO Pathway context needs to be stored into its own context element instead of span context
47+ AgentSpan span = AgentSpan .fromContext (context );
48+ DataStreamsContext dsmContext = DataStreamsContext .fromContext (context );
49+ PathwayContext pathwayContext ;
50+ if (span == null
51+ || dsmContext == null
52+ || (pathwayContext = span .context ().getPathwayContext ()) == null
53+ || (span .traceConfig () != null && !span .traceConfig ().isDataStreamsEnabled ())) {
54+ return ;
55+ }
56+
57+ // TODO Allow set checkpoint to use DsmContext as parameter?
58+ pathwayContext .setCheckpoint (
59+ dsmContext .sortedTags (),
60+ dsmContext .sendCheckpoint () ? dataStreamsMonitoring ::add : pathwayContext ::saveStats ,
61+ dsmContext .defaultTimestamp (),
62+ dsmContext .payloadSizeBytes ());
63+
64+ boolean injected = injectPathwayContext (pathwayContext , carrier , setter );
65+
66+ if (injected && pathwayContext .getHash () != 0 ) {
67+ span .setTag (PATHWAY_HASH , Long .toUnsignedString (pathwayContext .getHash ()));
68+ }
69+ }
70+
71+ private <C > boolean injectPathwayContext (
72+ PathwayContext pathwayContext , C carrier , CarrierSetter <C > setter ) {
73+ try {
74+ String encodedContext = pathwayContext .encode ();
75+ if (encodedContext != null ) {
76+ // LOGGER.debug("Injecting pathway context {}", pathwayContext);
77+ setter .set (carrier , PROPAGATION_KEY_BASE64 , encodedContext );
78+ return true ;
79+ }
80+ } catch (IOException e ) {
81+ // LOGGER.debug("Unable to set encode pathway context", e);
82+ }
83+ return false ;
3984 }
4085
4186 @ Override
4287 public <C > Context extract (Context context , C carrier , CarrierVisitor <C > visitor ) {
43- // TODO Pathway context needs to be stored into its own context element
88+ // TODO Pathway context needs to be stored into its own context element instead of span context
4489 // Get span context to store pathway context into
4590 TagContext spanContext = getSpanContextOrNull (context );
4691 PathwayContext pathwayContext ;
0 commit comments