Skip to content

Commit a99876a

Browse files
committed
fix: use proper remove method for spans + format
1 parent ee9b931 commit a99876a

7 files changed

Lines changed: 30 additions & 39 deletions

File tree

datadog-sidecar-ffi/src/span.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use libdd_trace_utils::span::v04::{
77
AttributeAnyValueBytes, AttributeArrayValueBytes, SpanBytes, SpanEventBytes, SpanLinkBytes,
88
VecMap,
99
};
10+
use libdd_trace_utils::span::vec_map::Tombstone;
1011
use std::borrow::Cow;
1112
use std::collections::HashMap;
1213
use std::ffi::{c_char, CString};
@@ -61,11 +62,17 @@ fn insert_vec_map<V>(map: &mut VecMap<BytesString, V>, key: CharSlice, value: V)
6162
}
6263

6364
#[inline]
64-
fn remove_vec_map<V>(map: &mut VecMap<BytesString, V>, key: CharSlice) {
65+
fn remove_vec_map_slow<V>(map: &mut VecMap<BytesString, V>, key: CharSlice) {
6566
let bytes_str_key = convert_char_slice_to_bytes_string(key);
6667
map.remove_slow(&bytes_str_key);
6768
}
6869

70+
#[inline]
71+
fn remove_vec_map<V: Tombstone>(map: &mut VecMap<BytesString, V>, key: CharSlice) {
72+
let bytes_str_key = convert_char_slice_to_bytes_string(key);
73+
map.remove_unset(&bytes_str_key);
74+
}
75+
6976
#[inline]
7077
fn exists_vec_map<V>(map: &VecMap<BytesString, V>, key: CharSlice) -> bool {
7178
let bytes_str_key = convert_char_slice_to_bytes_string(key);
@@ -385,7 +392,7 @@ pub extern "C" fn ddog_add_span_metrics(span: &mut SpanBytes, key: CharSlice, va
385392

386393
#[no_mangle]
387394
pub extern "C" fn ddog_del_span_metrics(span: &mut SpanBytes, key: CharSlice) {
388-
remove_vec_map(&mut span.metrics, key);
395+
remove_vec_map_slow(&mut span.metrics, key);
389396
}
390397

391398
#[no_mangle]
@@ -428,7 +435,7 @@ pub extern "C" fn ddog_add_span_meta_struct(span: &mut SpanBytes, key: CharSlice
428435

429436
#[no_mangle]
430437
pub extern "C" fn ddog_del_span_meta_struct(span: &mut SpanBytes, key: CharSlice) {
431-
remove_vec_map(&mut span.meta_struct, key);
438+
remove_vec_map_slow(&mut span.meta_struct, key);
432439
}
433440

434441
#[no_mangle]

libdd-trace-utils/src/msgpack_decoder/v05/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,10 @@ mod tests {
388388
assert_eq!(span.error, 1);
389389
assert_eq!(span.meta.len(), 3);
390390
assert_eq!(
391-
span.meta.get("_dd.sampling_rate_whatever").unwrap().as_str(),
391+
span.meta
392+
.get("_dd.sampling_rate_whatever")
393+
.unwrap()
394+
.as_str(),
392395
"value whatever"
393396
);
394397
assert_eq!(span.meta.get("").unwrap().as_str(), "item");

libdd-trace-utils/src/msgpack_encoder/v1/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,7 @@ where
122122
apm_mode = span.meta.get("_dd.apm_mode").map(|v| v.borrow());
123123
}
124124
if git_commit_sha.is_none() {
125-
git_commit_sha = span
126-
.meta
127-
.get("_dd.git.commit.sha")
128-
.map(|v| v.borrow());
125+
git_commit_sha = span.meta.get("_dd.git.commit.sha").map(|v| v.borrow());
129126
}
130127
if env.is_some()
131128
&& hostname.is_some()
@@ -183,8 +180,8 @@ where
183180

184181
for span in spans {
185182
// Root span: either no parent in this chunk, or tagged _dd.top_level=1 (remote parent).
186-
let is_root = span.parent_id == 0
187-
|| span.metrics.get("_dd.top_level").copied().unwrap_or(0.0) == 1.0;
183+
let is_root =
184+
span.parent_id == 0 || span.metrics.get("_dd.top_level").copied().unwrap_or(0.0) == 1.0;
188185

189186
if is_root {
190187
// Root span is authoritative: its values supersede any non-root fallback,

libdd-trace-utils/src/msgpack_encoder/v1/span_v04.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,7 @@ pub fn encode_span<W: RmpWrite, T: TraceData>(
263263
let version = span.meta.get("version").map(|v| v.borrow());
264264
let component = span.meta.get("component").map(|v| v.borrow());
265265
// span.kind is always emitted — defaults to Internal per OTEL spec.
266-
let kind = span_kind_from_str(
267-
span.meta
268-
.get("span.kind")
269-
.map(|v| v.borrow())
270-
.unwrap_or(""),
271-
);
266+
let kind = span_kind_from_str(span.meta.get("span.kind").map(|v| v.borrow()).unwrap_or(""));
272267

273268
let span_len = 3 // span_id, start, kind — always present
274269
+ (!span.service.borrow().is_empty()) as u32

libdd-trace-utils/src/otlp_encoder/mapper.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,7 @@ fn map_span<T: TraceData>(span: &Span<T>, resource_service: &str) -> OtlpSpan {
121121
.map(|v| tag_to_otlp_kind(v.borrow()))
122122
.unwrap_or_else(|| dd_type_to_otlp_kind(span.r#type.borrow()));
123123
let (attributes, dropped_attributes_count) = map_attributes(span, resource_service);
124-
let error_msg = span
125-
.meta
126-
.get("error.msg")
127-
.map(|v| v.borrow().to_string());
124+
let error_msg = span.meta.get("error.msg").map(|v| v.borrow().to_string());
128125
let status = if span.error != 0 {
129126
Status {
130127
message: error_msg,

libdd-trace-utils/src/span/trace_utils.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,13 @@ const TRACER_TOP_LEVEL_KEY: &str = "_dd.top_level";
1313
const MEASURED_KEY: &str = "_dd.measured";
1414
const PARTIAL_VERSION_KEY: &str = "_dd.partial_version";
1515

16-
fn set_top_level_span<T>(span: &mut Span<T>, is_top_level: bool)
16+
fn set_top_level_span<T>(span: &mut Span<T>)
1717
where
1818
T: TraceData,
1919
T::Text: std::borrow::Borrow<str>,
2020
{
21-
if is_top_level {
22-
span.metrics
23-
.insert(T::Text::from_static_str(TOP_LEVEL_KEY), 1.0);
24-
} else {
25-
span.metrics.remove_slow(TOP_LEVEL_KEY);
26-
}
21+
span.metrics
22+
.insert(T::Text::from_static_str(TOP_LEVEL_KEY), 1.0);
2723
}
2824

2925
/// Updates all the spans top-level attribute.
@@ -44,19 +40,19 @@ where
4440
for span_idx in 0..trace.len() {
4541
let parent_id = trace[span_idx].parent_id;
4642
if parent_id == 0 {
47-
set_top_level_span(&mut trace[span_idx], true);
43+
set_top_level_span(&mut trace[span_idx]);
4844
continue;
4945
}
5046
match span_id_idx.get(&parent_id).map(|i| &trace[*i].service) {
5147
Some(parent_span_service) => {
5248
if !(parent_span_service == &trace[span_idx].service) {
5349
// parent is not in the same service
54-
set_top_level_span(&mut trace[span_idx], true)
50+
set_top_level_span(&mut trace[span_idx])
5551
}
5652
}
5753
None => {
5854
// span has no parent in chunk
59-
set_top_level_span(&mut trace[span_idx], true)
55+
set_top_level_span(&mut trace[span_idx])
6056
}
6157
}
6258
}

libdd-trace-utils/src/trace_utils.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -424,19 +424,19 @@ pub fn compute_top_level_span(trace: &mut [pb::Span]) {
424424
}
425425
for span in trace.iter_mut() {
426426
if span.parent_id == 0 {
427-
set_top_level_span(span, true);
427+
set_top_level_span(span);
428428
continue;
429429
}
430430
match span_id_to_service.get(&span.parent_id) {
431431
Some(parent_span_service) => {
432432
if !parent_span_service.eq(&span.service) {
433433
// parent is not in the same service
434-
set_top_level_span(span, true)
434+
set_top_level_span(span)
435435
}
436436
}
437437
None => {
438438
// span has no parent in chunk
439-
set_top_level_span(span, true)
439+
set_top_level_span(span)
440440
}
441441
}
442442
}
@@ -450,12 +450,8 @@ pub fn has_top_level(span: &pb::Span) -> bool {
450450
|| span.metrics.get(TOP_LEVEL_KEY).is_some_and(|v| *v == 1.0)
451451
}
452452

453-
fn set_top_level_span(span: &mut pb::Span, is_top_level: bool) {
454-
if is_top_level {
455-
span.metrics.insert(TOP_LEVEL_KEY.to_string(), 1.0);
456-
} else {
457-
span.metrics.remove(TOP_LEVEL_KEY);
458-
}
453+
fn set_top_level_span(span: &mut pb::Span) {
454+
span.metrics.insert(TOP_LEVEL_KEY.to_string(), 1.0);
459455
}
460456

461457
pub fn set_serverless_root_span_tags(

0 commit comments

Comments
 (0)