Fixes gh-1809, if traceIdHigh is zero, brave returns a 16 digits long traceId instead of a 32 digits long one (#1810)

This commit is contained in:
Jonatan Ivanov
2020-12-16 23:26:17 -08:00
committed by GitHub
parent 78c543f5f1
commit d6f54ab4c1
2 changed files with 35 additions and 7 deletions

View File

@@ -140,7 +140,7 @@ class W3CPropagation extends Propagation.Factory implements Propagation<String>
chars[0] = VERSION.charAt(0);
chars[1] = VERSION.charAt(1);
chars[2] = TRACEPARENT_DELIMITER;
String traceId = context.traceIdString();
String traceId = padLeftWithZeros(context.traceIdString(), TRACE_ID_HEX_SIZE);
for (int i = 0; i < traceId.length(); i++) {
chars[TRACE_ID_OFFSET + i] = traceId.charAt(i);
}
@@ -157,6 +157,20 @@ class W3CPropagation extends Propagation.Factory implements Propagation<String>
};
}
private String padLeftWithZeros(String string, int length) {
if (string.length() >= length) {
return string;
}
else {
StringBuilder sb = new StringBuilder(length);
for (int i = string.length(); i < length; i++) {
sb.append('0');
}
return sb.append(string).toString();
}
}
void copyTraceFlagsHexTo(char[] dest, int destOffset, TraceContext context) {
dest[destOffset] = '0';
dest[destOffset + 1] = Boolean.TRUE.equals(context.sampled()) ? '1' : '0';
@@ -327,7 +341,6 @@ class W3CBaggagePropagator {
return built;
}
@SuppressWarnings("StringSplitter")
List<AbstractMap.SimpleEntry<BaggageField, String>> addBaggageToContext(String baggageHeader,
TraceContextOrSamplingFlags.Builder builder) {
List<AbstractMap.SimpleEntry<BaggageField, String>> pairs = new ArrayList<>();

View File

@@ -63,15 +63,19 @@ class W3CPropagationTest {
}
private TraceContext.Builder sampledTraceContext() {
return sampledTraceContext("ff00000000000000", "0000000000000041", "ff00000000000041");
}
private TraceContext.Builder sampledTraceContext(String traceIdHigh, String traceId, String spanId) {
return TraceContext.newBuilder().sampled(SAMPLED_TRACE_OPTIONS)
.spanId(BigendianEncoding.longFromBase16String("ff00000000000041"))
.traceIdHigh(BigendianEncoding.longFromBase16String("ff00000000000000"))
.traceId(BigendianEncoding.longFromBase16String("0000000000000041"));
.traceIdHigh(BigendianEncoding.longFromBase16String(traceIdHigh))
.traceId(BigendianEncoding.longFromBase16String(traceId))
.spanId(BigendianEncoding.longFromBase16String(spanId));
}
@Test
void inject_SampledContext() {
final Map<String, String> carrier = new LinkedHashMap<>();
Map<String, String> carrier = new LinkedHashMap<>();
TraceContext traceContext = sampledTraceContext().build();
w3CPropagation.injector((ignored, key, value) -> carrier.put(key, value)).inject(traceContext, carrier);
assertThat(carrier).containsExactly(entry(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED));
@@ -79,12 +83,23 @@ class W3CPropagationTest {
@Test
void inject_NotSampledContext() {
final Map<String, String> carrier = new LinkedHashMap<>();
Map<String, String> carrier = new LinkedHashMap<>();
TraceContext traceContext = notSampledTraceContext().build();
w3CPropagation.injector((ignored, key, value) -> carrier.put(key, value)).inject(traceContext, carrier);
assertThat(carrier).containsExactly(entry(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED));
}
/**
* see: gh-1809
*/
@Test
void inject_traceIdShouldBePaddedWithZeros() {
Map<String, String> carrier = new LinkedHashMap<>();
TraceContext traceContext = sampledTraceContext("0000000000000000", "123456789abcdef0", "123456789abcdef1").build();
w3CPropagation.injector((ignored, key, value) -> carrier.put(key, value)).inject(traceContext, carrier);
assertThat(carrier).containsExactly(entry(TRACE_PARENT, "00-0000000000000000123456789abcdef0-123456789abcdef1-01"));
}
@Test
void extract_Nothing() {
// Context remains untouched.