1+ package datadog.trace.core.baggage
2+
3+ import datadog.context.Context
4+ import datadog.trace.api.Config
5+ import datadog.trace.api.metrics.BaggageMetrics
6+ import datadog.trace.api.telemetry.CoreMetricCollector
7+ import spock.lang.Specification
8+
9+ class BaggagePropagatorTelemetryTest extends Specification {
10+
11+ def " should directly increment baggage metrics" () {
12+ given :
13+ def baggageMetrics = BaggageMetrics . getInstance()
14+ def collector = CoreMetricCollector . getInstance()
15+
16+ when :
17+ baggageMetrics. onBaggageInjected()
18+ collector. prepareMetrics()
19+ def metrics = collector. drain()
20+
21+ then :
22+ def baggageMetric = metrics. find { it. metricName == " context_header_style.injected" }
23+ baggageMetric != null
24+ baggageMetric. value >= 1
25+ baggageMetric. tags. contains(" header_style:baggage" )
26+ }
27+
28+ def " should increment telemetry counter when baggage is successfully extracted" () {
29+ given :
30+ def config = Mock (Config ) {
31+ isBaggageExtract() >> true
32+ isBaggageInject() >> true
33+ getBaggageMaxItems() >> 64
34+ getBaggageMaxBytes() >> 8192
35+ }
36+ def propagator = new BaggagePropagator (config)
37+ def context = Context . root()
38+ def carrier = [" baggage" : " key1=value1,key2=value2" ]
39+ def visitor = { map , consumer ->
40+ map. each { k , v -> consumer. accept(k, v) }
41+ }
42+ def collector = CoreMetricCollector . getInstance()
43+
44+ when :
45+ propagator. extract(context, carrier, visitor)
46+ collector. prepareMetrics()
47+ def metrics = collector. drain()
48+
49+ then :
50+ def baggageMetric = metrics. find { it. metricName == " context_header_style.extracted" }
51+ baggageMetric != null
52+ baggageMetric. value >= 1
53+ baggageMetric. tags. contains(" header_style:baggage" )
54+ }
55+
56+ def " should directly increment all baggage metrics" () {
57+ given :
58+ def baggageMetrics = BaggageMetrics . getInstance()
59+ def collector = CoreMetricCollector . getInstance()
60+
61+ when :
62+ baggageMetrics. onBaggageInjected()
63+ baggageMetrics. onBaggageMalformed()
64+ baggageMetrics. onBaggageTruncatedByByteLimit()
65+ baggageMetrics. onBaggageTruncatedByItemLimit()
66+ collector. prepareMetrics()
67+ def metrics = collector. drain()
68+
69+ then :
70+ def injectedMetric = metrics. find { it. metricName == " context_header_style.injected" }
71+ injectedMetric != null
72+ injectedMetric. value == 1
73+ injectedMetric. tags. contains(" header_style:baggage" )
74+
75+ def malformedMetric = metrics. find { it. metricName == " context_header_style.malformed" }
76+ malformedMetric != null
77+ malformedMetric. value == 1
78+ malformedMetric. tags. contains(" header_style:baggage" )
79+
80+ def bytesTruncatedMetric = metrics. find {
81+ it. metricName == " context_header_style.truncated" &&
82+ it. tags. contains(" truncation_reason:baggage_byte_count_exceeded" )
83+ }
84+ bytesTruncatedMetric != null
85+ bytesTruncatedMetric. value == 1
86+
87+ def itemsTruncatedMetric = metrics. find {
88+ it. metricName == " context_header_style.truncated" &&
89+ it. tags. contains(" truncation_reason:baggage_item_count_exceeded" )
90+ }
91+ itemsTruncatedMetric != null
92+ itemsTruncatedMetric. value == 1
93+ }
94+
95+ def " should not increment telemetry counter when baggage extraction fails" () {
96+ given :
97+ def config = Mock (Config ) {
98+ isBaggageExtract() >> true
99+ isBaggageInject() >> true
100+ getBaggageMaxItems() >> 64
101+ getBaggageMaxBytes() >> 8192
102+ }
103+ def propagator = new BaggagePropagator (config)
104+ def context = Context . root()
105+ def carrier = [:] // No baggage header
106+ def visitor = { map , consumer ->
107+ map. each { k , v -> consumer. accept(k, v) }
108+ }
109+ def collector = CoreMetricCollector . getInstance()
110+
111+ when :
112+ propagator. extract(context, carrier, visitor)
113+ collector. prepareMetrics()
114+ def metrics = collector. drain()
115+
116+ then :
117+ def foundMetrics = metrics. findAll { it. metricName. startsWith(" context_header_style." ) }
118+ foundMetrics. isEmpty() // No extraction occurred, so no metrics should be created
119+ }
120+ }
0 commit comments