Skip to content

Commit 5b52ea4

Browse files
committed
Fix potential corner-case where TagContext.getTags() may return an immutable EMPTY TagMap
1 parent de8a55a commit 5b52ea4

File tree

3 files changed

+11
-32
lines changed

3 files changed

+11
-32
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import datadog.context.propagation.Propagators;
1313
import datadog.trace.api.Config;
1414
import datadog.trace.api.DDTags;
15-
import datadog.trace.api.TagMap;
1615
import datadog.trace.api.function.TriConsumer;
1716
import datadog.trace.api.function.TriFunction;
1817
import datadog.trace.api.gateway.BlockResponseFunction;
@@ -663,18 +662,17 @@ private static void setBaggageTags(TagContext tagContext, Map<String, String> ba
663662
if (baggageTagKeys.isEmpty()) {
664663
return;
665664
}
666-
TagMap tags = tagContext.getTags();
667665
for (String key : baggageTagKeys) {
668666
if ("*".equals(key)) {
669667
// If the key is "*", we add all baggage items
670668
for (Map.Entry<String, String> entry : baggage.entrySet()) {
671-
tags.putIfAbsent("baggage." + entry.getKey(), entry.getValue());
669+
tagContext.putTagIfAbsent("baggage." + entry.getKey(), entry.getValue());
672670
}
673671
break;
674672
}
675673
String value = baggage.get(key);
676674
if (value != null) {
677-
tags.putIfAbsent("baggage." + key, value);
675+
tagContext.putTagIfAbsent("baggage." + key, value);
678676
}
679677
}
680678
}

dd-trace-core/src/test/groovy/datadog/trace/core/CoreTracerTest.groovy

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import static datadog.trace.api.config.TracerConfig.HEADER_TAGS
3838
import static datadog.trace.api.config.TracerConfig.PRIORITY_SAMPLING
3939
import static datadog.trace.api.config.TracerConfig.SERVICE_MAPPING
4040
import static datadog.trace.api.config.TracerConfig.SPAN_TAGS
41-
import static datadog.trace.api.config.TracerConfig.TRACE_BAGGAGE_TAG_KEYS
4241
import static datadog.trace.api.config.TracerConfig.WRITER_TYPE
4342

4443
@Timeout(10)
@@ -640,33 +639,6 @@ class CoreTracerTest extends DDCoreSpecification {
640639
"service" | "env" | "service" | "env_1"
641640
"service" | "env" | "service_2" | "env_2"
642641
}
643-
644-
def "test mapBaggageTags default"() {
645-
when:
646-
def tags = CoreTracer.mapBaggageTags(["user.id": "doggo", "account.id": "test", "session.id":"1234", "region":"us-east-1"])
647-
then:
648-
tags == ["baggage.user.id": "doggo", "baggage.account.id": "test", "baggage.session.id": "1234"]
649-
}
650-
651-
def "test mapBaggageTags with different configurations"() {
652-
setup:
653-
injectSysConfig(TRACE_BAGGAGE_TAG_KEYS, baggageTagKeysConfig)
654-
655-
when:
656-
def tags = CoreTracer.mapBaggageTags(["user.id": "doggo", "foo": "bar", "language":"en"])
657-
658-
then:
659-
tags == expectedTags
660-
661-
where:
662-
baggageTagKeysConfig | expectedTags
663-
"*" | ["baggage.user.id": "doggo", "baggage.foo": "bar", "baggage.language": "en"]
664-
" " | [:]
665-
"system.id" | [:]
666-
"user.id" | ["baggage.user.id": "doggo"]
667-
"foo" | ["baggage.foo": "bar"]
668-
"user.id,foo" | ["baggage.user.id": "doggo", "baggage.foo": "bar"]
669-
}
670642
}
671643

672644
class WriterWithExplicitFlush implements datadog.trace.common.writer.Writer {

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/TagContext.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,15 @@ public void putTag(final String key, final String value) {
175175
this.tags.set(key, value);
176176
}
177177

178+
public void putTagIfAbsent(final String key, final String value) {
179+
if (this.tags == null) {
180+
this.tags = TagMap.create(4);
181+
}
182+
if (!this.tags.containsKey(key)) {
183+
this.tags.set(key, value);
184+
}
185+
}
186+
178187
@Override
179188
public final int getSamplingPriority() {
180189
return samplingPriority;

0 commit comments

Comments
 (0)