Skip to content

Commit b999d0f

Browse files
authored
Check known W3C propagation tags first when parsing (#8597)
This avoids triggering a misleading log message from TagKey, for example: DEBUG d.t.core.propagation.ptags.TagKey - Invalid header h: W3C s: dd=p:456789abcdef0123 b: 3 e: 4 This is not an invalid header, it's just that TagKey rejected the 'p:' last parent trace-id because it didn't start with the 't.' prefix for custom tags. The code then falls back to checking known W3C propagation tags 's:', 'o:', and 'p:' - if we check for those first we can avoid the misleading message.
1 parent 9bd19d3 commit b999d0f

File tree

1 file changed

+37
-37
lines changed

1 file changed

+37
-37
lines changed

dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java

+37-37
Original file line numberDiff line numberDiff line change
@@ -129,47 +129,47 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) {
129129
if (tagValueEndsAt == ddMemberValueEnd) {
130130
tagValueEndsAt = stripTrailingOWC(value, tagValuePos, tagValueEndsAt);
131131
}
132-
TagKey tagKey = TagKey.from(Encoding.W3C, value, tagPos, tagKeyEndsAt);
133-
if (tagKey != null) {
134-
TagValue tagValue = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
135-
if (!tagKey.equals(UPSTREAM_SERVICES_DEPRECATED_TAG)) {
136-
if (!validateTagValue(tagKey, tagValue)) {
137-
log.warn(
138-
"Invalid datadog tags header value: '{}' invalid tag value at {}",
139-
value,
140-
tagValuePos);
141-
if (tagKey.equals(TRACE_ID_TAG)) {
142-
return tagsFactory.createInvalid(PROPAGATION_ERROR_MALFORMED_TID + tagValue);
132+
int keyLength = tagKeyEndsAt - tagPos;
133+
char c = value.charAt(tagPos);
134+
if (keyLength == 1 && c == 's') {
135+
samplingPriority = validateSamplingPriority(value, tagValuePos, tagValueEndsAt);
136+
} else if (keyLength == 1 && c == 'o') {
137+
origin = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
138+
} else if (keyLength == 1 && c == 'p') {
139+
lastParentId = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
140+
} else {
141+
TagKey tagKey = TagKey.from(Encoding.W3C, value, tagPos, tagKeyEndsAt);
142+
if (tagKey != null) {
143+
TagValue tagValue = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
144+
if (!tagKey.equals(UPSTREAM_SERVICES_DEPRECATED_TAG)) {
145+
if (!validateTagValue(tagKey, tagValue)) {
146+
log.warn(
147+
"Invalid datadog tags header value: '{}' invalid tag value at {}",
148+
value,
149+
tagValuePos);
150+
if (tagKey.equals(TRACE_ID_TAG)) {
151+
return tagsFactory.createInvalid(PROPAGATION_ERROR_MALFORMED_TID + tagValue);
152+
}
153+
// TODO drop parts?
154+
return empty(tagsFactory, value, firstMemberStart, ddMemberStart, ddMemberValueEnd);
143155
}
144-
// TODO drop parts?
145-
return empty(tagsFactory, value, firstMemberStart, ddMemberStart, ddMemberValueEnd);
146-
}
147-
if (tagKey.equals(DECISION_MAKER_TAG)) {
148-
decisionMakerTagValue = tagValue;
149-
} else if (tagKey.equals(TRACE_ID_TAG)) {
150-
traceIdTagValue = tagValue;
151-
} else if (tagKey.equals(TRACE_SOURCE_TAG)) {
152-
traceSource = ProductTraceSource.parseBitfieldHex(tagValue.toString());
153-
} else {
154-
if (tagPairs == null) {
155-
// This is roughly the size of a two element linked list but can hold six
156-
tagPairs = new ArrayList<>(6);
156+
if (tagKey.equals(DECISION_MAKER_TAG)) {
157+
decisionMakerTagValue = tagValue;
158+
} else if (tagKey.equals(TRACE_ID_TAG)) {
159+
traceIdTagValue = tagValue;
160+
} else if (tagKey.equals(TRACE_SOURCE_TAG)) {
161+
traceSource = ProductTraceSource.parseBitfieldHex(tagValue.toString());
162+
} else {
163+
if (tagPairs == null) {
164+
// This is roughly the size of a two element linked list but can hold six
165+
tagPairs = new ArrayList<>(6);
166+
}
167+
tagPairs.add(tagKey);
168+
tagPairs.add(tagValue);
157169
}
158-
tagPairs.add(tagKey);
159-
tagPairs.add(tagValue);
160170
}
161-
}
162-
} else {
163-
// This was not a propagating tag, so check if we know it
164-
int keyLength = tagKeyEndsAt - tagPos;
165-
char c = value.charAt(tagPos);
166-
if (keyLength == 1 && c == 's') {
167-
samplingPriority = validateSamplingPriority(value, tagValuePos, tagValueEndsAt);
168-
} else if (keyLength == 1 && c == 'o') {
169-
origin = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
170-
} else if (keyLength == 1 && c == 'p') {
171-
lastParentId = TagValue.from(Encoding.W3C, value, tagValuePos, tagValueEndsAt);
172171
} else {
172+
// Not a propagating tag and not a known tag
173173
if (maxUnknownSize != 0) {
174174
maxUnknownSize++; // delimiter
175175
}

0 commit comments

Comments
 (0)