Skip to content

Commit 6684d49

Browse files
authored
Merge branch 'main' into 3415-appender-tracing-with-scope
2 parents 0745773 + bb02477 commit 6684d49

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

opentelemetry-sdk/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
- Fix ObservableCounter and ObservableUpDownCounter now correctly report only data points from the current measurement cycle, removing stale attribute combinations that are no longer observed. [#3248][3248]
2626
- Fix panic when `SpanProcessor::on_end` calls `Context::current()` ([#3262][3262]).
2727
- Updated `SpanProcessor::on_end` documentation to clarify that `Context::current()` returns the parent context, not the span's context
28+
- Fix `traceparent` headers with unknown flags (e.g. W3C random-trace-id flag `0x02`) being incorrectly rejected. Unknown flags are now accepted and zeroed out as required by the W3C trace-context spec. [#3435][3435]
2829

2930
[3227]: https://github.com/open-telemetry/opentelemetry-rust/pull/3227
3031
[3277]: https://github.com/open-telemetry/opentelemetry-rust/pull/3277
@@ -33,6 +34,7 @@
3334
[3248]: https://github.com/open-telemetry/opentelemetry-rust/pull/3248
3435
[3262]: https://github.com/open-telemetry/opentelemetry-rust/pull/3262
3536
[3407]: https://github.com/open-telemetry/opentelemetry-rust/pull/3407
37+
[3435]: https://github.com/open-telemetry/opentelemetry-rust/issues/3435
3638

3739
- "spec_unstable_logs_enabled" feature flag is removed. The capability (and the
3840
backing specification) is now stable and is enabled by default.

opentelemetry-sdk/src/propagation/trace_context.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,17 @@ impl TraceContextPropagator {
9090
// Parse span id section
9191
let span_id = SpanId::from_hex(parts[2]).map_err(|_| ())?;
9292

93-
// Parse trace flags section
94-
let opts = u8::from_str_radix(parts[3], 16).map_err(|_| ())?;
95-
96-
// Ensure opts are valid for version 0
97-
if version == 0 && opts > 2 {
93+
// Ensure trace flags are lowercase
94+
if parts[3].chars().any(|c| c.is_ascii_uppercase()) {
9895
return Err(());
9996
}
10097

98+
// Parse trace flags section
99+
let opts = u8::from_str_radix(parts[3], 16).map_err(|_| ())?;
100+
101101
// Build trace flags clearing all flags other than the trace-context
102-
// supported sampling bit.
102+
// supported sampling bit. Unknown flags are accepted but zeroed out,
103+
// as required by https://www.w3.org/TR/trace-context/#other-flags
103104
let trace_flags = TraceFlags::new(opts) & TraceFlags::SAMPLED;
104105

105106
let trace_state = match extractor.get(TRACESTATE_HEADER) {
@@ -166,6 +167,8 @@ mod tests {
166167
vec![
167168
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::default(), true, TraceState::from_str("foo=bar").unwrap())),
168169
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::SAMPLED, true, TraceState::from_str("foo=bar").unwrap())),
170+
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-03", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::SAMPLED, true, TraceState::from_str("foo=bar").unwrap())),
171+
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-09", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::SAMPLED, true, TraceState::from_str("foo=bar").unwrap())),
169172
("02-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::SAMPLED, true, TraceState::from_str("foo=bar").unwrap())),
170173
("02-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-09", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::SAMPLED, true, TraceState::from_str("foo=bar").unwrap())),
171174
("02-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-08", "foo=bar", SpanContext::new(TraceId::from(0x4bf9_2f35_77b3_4da6_a3ce_929d_0e0e_4736), SpanId::from(0x00f0_67aa_0ba9_02b7), TraceFlags::default(), true, TraceState::from_str("foo=bar").unwrap())),
@@ -191,7 +194,6 @@ mod tests {
191194
("00-ab000000000000000000000000000000-CD00000000000000-01", "upper case span ID"),
192195
("00-ab000000000000000000000000000000-cd00000000000000-A1", "upper case trace flag"),
193196
("00-00000000000000000000000000000000-0000000000000000-01", "zero trace ID and span ID"),
194-
("00-ab000000000000000000000000000000-cd00000000000000-09", "trace-flag unused bits set"),
195197
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7", "missing options"),
196198
("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-", "empty options"),
197199
]

0 commit comments

Comments
 (0)