From 17c3f1d699c93a540f6fa28b1f0fd413e71bed80 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Mon, 20 Apr 2026 16:36:29 -0400 Subject: [PATCH 1/3] check for empty value in header datadog-client-computed-stats --- libdd-trace-utils/src/tracer_header_tags.rs | 44 ++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/libdd-trace-utils/src/tracer_header_tags.rs b/libdd-trace-utils/src/tracer_header_tags.rs index 45d30fa0e4..b30d97d3ab 100644 --- a/libdd-trace-utils/src/tracer_header_tags.rs +++ b/libdd-trace-utils/src/tracer_header_tags.rs @@ -133,8 +133,8 @@ impl<'a> From<&'a HeaderMap> for TracerHeaderTags<'a> { if headers.get("datadog-client-computed-top-level").is_some() { tags.client_computed_top_level = true; } - if headers.get("datadog-client-computed-stats").is_some() { - tags.client_computed_stats = true; + if let Some(v) = headers.get("datadog-client-computed-stats") { + tags.client_computed_stats = !is_header_empty(v.to_str().unwrap_or_default()); } if let Some(count) = headers.get("datadog-client-dropped-p0-traces") { tags.dropped_p0_traces = count @@ -150,6 +150,10 @@ impl<'a> From<&'a HeaderMap> for TracerHeaderTags<'a> { } } +fn is_header_empty(value: &str) -> bool { + value.is_empty() +} + #[cfg(test)] mod tests { use super::*; @@ -262,4 +266,40 @@ mod tests { assert_eq!(tags.dropped_p0_traces, 12); assert_eq!(tags.dropped_p0_spans, 0); } + + #[test] + fn test_is_header_empty() { + // Empty string is true + assert!(is_header_empty("")); + + // Truthy and arbitrary non-empty values are false + for val in &["1", "t", "T", "TRUE", "True", "true"] { + assert!( + !is_header_empty(val), + "expected is_header_empty({val:?}) to be false" + ); + } + } + + #[test] + fn test_header_map_to_tags_computed_stats_empty_string() { + let val = ""; + let mut header_map = HeaderMap::new(); + header_map.insert("datadog-client-computed-stats", val.parse().unwrap()); + let tags: TracerHeaderTags = (&header_map).into(); + assert!( + !tags.client_computed_stats, + "expected client_computed_stats=false for datadog-client-computed-stats header value {val:?}" + ); + } + + #[test] + fn test_header_map_to_tags_computed_stats_not_set() { + let header_map = HeaderMap::new(); + let tags: TracerHeaderTags = (&header_map).into(); + assert!( + !tags.client_computed_stats, + "expected client_computed_stats=false when datadog-client-computed-stats header is not set" + ); + } } From dd9f5ac9998a842cd92a54ffd7bbd7f8a4728a8a Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 22 Apr 2026 09:54:08 -0400 Subject: [PATCH 2/3] remove is_header_empty --- libdd-trace-utils/src/tracer_header_tags.rs | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/libdd-trace-utils/src/tracer_header_tags.rs b/libdd-trace-utils/src/tracer_header_tags.rs index b30d97d3ab..d76767d59e 100644 --- a/libdd-trace-utils/src/tracer_header_tags.rs +++ b/libdd-trace-utils/src/tracer_header_tags.rs @@ -134,7 +134,7 @@ impl<'a> From<&'a HeaderMap> for TracerHeaderTags<'a> { tags.client_computed_top_level = true; } if let Some(v) = headers.get("datadog-client-computed-stats") { - tags.client_computed_stats = !is_header_empty(v.to_str().unwrap_or_default()); + tags.client_computed_stats = !v.to_str().unwrap_or_default().is_empty(); } if let Some(count) = headers.get("datadog-client-dropped-p0-traces") { tags.dropped_p0_traces = count @@ -150,10 +150,6 @@ impl<'a> From<&'a HeaderMap> for TracerHeaderTags<'a> { } } -fn is_header_empty(value: &str) -> bool { - value.is_empty() -} - #[cfg(test)] mod tests { use super::*; @@ -267,20 +263,6 @@ mod tests { assert_eq!(tags.dropped_p0_spans, 0); } - #[test] - fn test_is_header_empty() { - // Empty string is true - assert!(is_header_empty("")); - - // Truthy and arbitrary non-empty values are false - for val in &["1", "t", "T", "TRUE", "True", "true"] { - assert!( - !is_header_empty(val), - "expected is_header_empty({val:?}) to be false" - ); - } - } - #[test] fn test_header_map_to_tags_computed_stats_empty_string() { let val = ""; From 9da57c8085b653fae3cf52b0c4ae3f08fdba3640 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 22 Apr 2026 09:56:45 -0400 Subject: [PATCH 3/3] update struct doc for TracerHeaderTags --- libdd-trace-utils/src/tracer_header_tags.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libdd-trace-utils/src/tracer_header_tags.rs b/libdd-trace-utils/src/tracer_header_tags.rs index d76767d59e..b4a2cda896 100644 --- a/libdd-trace-utils/src/tracer_header_tags.rs +++ b/libdd-trace-utils/src/tracer_header_tags.rs @@ -27,11 +27,11 @@ pub struct TracerHeaderTags<'a> { pub lang_vendor: &'a str, pub tracer_version: &'a str, pub container_id: &'a str, - // specifies that the client has marked top-level spans, when set. Any non-empty value will - // mean 'yes'. + // specifies that the client has marked top-level spans, when set. If the header is present + // this value will resolve to 'true' pub client_computed_top_level: bool, - // specifies whether the client has computed stats so that the agent doesn't have to. Any - // non-empty value will mean 'yes'. + // specifies whether the client has computed stats so that the agent doesn't have to. If the + // header is present and is non-empty this value will resolve to 'true' pub client_computed_stats: bool, // number of trace chunks dropped in the tracer pub dropped_p0_traces: usize,