Repository: DataDog/libdatadog
Pull request #998: chore: normalize duration so we don't fail parsing spans into protobuf
Author: login: astuyve
Created: 2025-04-03T17:48:18Z | Merged: 2025-04-08T01:49:26Z

# What does this PR do?
Fixes a customer issue where they lose a span because the duration was negative for some reason. This causes an error like this today:
"from request body: Error deserializing trace from request body: invalid value: integer `18226454927103518912`, expected i64"

# Motivation
Got the error, found it was due to a negative duration. We do the same thing in the [go agent](https://github.com/DataDog/datadog-agent/blob/ae608447325e9983ab3256455e995f3a8474873b/pkg/trace/agent/normalizer.go#L146-L155)

# Additional Notes

Anything else we should know when reviewing?

# How to test the change?

Describe here in detail how the change can be validated.



Diff:
diff --git a/trace-protobuf/build.rs b/trace-protobuf/build.rs
index e34fd50652..ea4d0bb061 100644
--- a/trace-protobuf/build.rs
+++ b/trace-protobuf/build.rs
@@ -26,7 +26,6 @@ fn main() -> Result<()> {
 
     Ok(())
 }
-
 #[cfg(feature = "generate-protobuf")]
 fn generate_protobuf() {
     let mut config = prost_build::Config::new();
@@ -61,20 +60,60 @@ fn generate_protobuf() {
 
     config.type_attribute("Span", "#[derive(Deserialize, Serialize)]");
     config.field_attribute(
-        ".pb.Span",
-        "#[serde(default)] #[serde(deserialize_with = \"deserialize_null_into_default\")]",
+        ".pb.Span.service",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.name",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.resource",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.traceID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.spanID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.parentID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.start",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.duration",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_duration\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.meta",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.metrics",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.type",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
     );
     config.field_attribute(
         ".pb.Span.meta_struct",
-        "#[serde(skip_serializing_if = \"::std::collections::HashMap::is_empty\")]",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")] #[serde(skip_serializing_if = \"::std::collections::HashMap::is_empty\")]",
     );
     config.field_attribute(
         ".pb.Span.spanLinks",
-        "#[serde(skip_serializing_if = \"::prost::alloc::vec::Vec::is_empty\")]",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")] #[serde(skip_serializing_if = \"::prost::alloc::vec::Vec::is_empty\")]",
     );
     config.field_attribute(
         ".pb.Span.error",
-        "#[serde(skip_serializing_if = \"is_default\")]",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")] #[serde(skip_serializing_if = \"crate::serializers::is_default\")]",
     );
 
     config.type_attribute("StatsPayload", "#[derive(Deserialize, Serialize)]");
@@ -187,38 +226,15 @@ fn generate_protobuf() {
 "
     .as_bytes();
 
-    let null_deser = &[
-        license,
-        "use serde::{Deserialize, Deserializer, Serialize};
-
-fn deserialize_null_into_default<'de, D, T>(deserializer: D) -> Result<T, D::Error>
-where
-    T: Default + Deserialize<'de>,
-    D: Deserializer<'de>,
-{
-    let opt = Option::deserialize(deserializer)?;
-    Ok(opt.unwrap_or_default())
-}
-
-pub fn is_default<T: Default + PartialEq>(t: &T) -> bool {
-    t == &T::default()
-}
-
-"
-        .as_bytes(),
-    ]
-    .concat();
-
     let serde_uses = &[
         license,
         "use serde::{Deserialize, Serialize};
-
 "
         .as_bytes(),
     ]
     .concat();
 
-    prepend_to_file(null_deser, &output_path.join("pb.rs"));
+    prepend_to_file(serde_uses, &output_path.join("pb.rs"));
     prepend_to_file(serde_uses, &output_path.join("remoteconfig.rs"));
 }
 
diff --git a/trace-protobuf/src/lib.rs b/trace-protobuf/src/lib.rs
index 6b8e63f1e9..0887fb1a37 100644
--- a/trace-protobuf/src/lib.rs
+++ b/trace-protobuf/src/lib.rs
@@ -5,6 +5,7 @@
 pub mod pb;
 pub mod remoteconfig;
 mod serde;
+mod serializers;
 
 #[cfg(test)]
 mod pb_test;
diff --git a/trace-protobuf/src/pb.rs b/trace-protobuf/src/pb.rs
index e97840206b..af002b3270 100644
--- a/trace-protobuf/src/pb.rs
+++ b/trace-protobuf/src/pb.rs
@@ -1,21 +1,7 @@
 // Copyright 2023-Present Datadog, Inc. https://www.datadoghq.com/
 // SPDX-License-Identifier: Apache-2.0
 
-use serde::{Deserialize, Deserializer, Serialize};
-
-fn deserialize_null_into_default<'de, D, T>(deserializer: D) -> Result<T, D::Error>
-where
-    T: Default + Deserialize<'de>,
-    D: Deserializer<'de>,
-{
-    let opt = Option::deserialize(deserializer)?;
-    Ok(opt.unwrap_or_default())
-}
-
-pub fn is_default<T: Default + PartialEq>(t: &T) -> bool {
-    t == &T::default()
-}
-
+use serde::{Deserialize, Serialize};
 #[derive(Deserialize, Serialize)]
 #[allow(clippy::derive_partial_eq_without_eq)]
 #[derive(Clone, PartialEq, ::prost::Message)]
@@ -66,62 +52,62 @@ pub struct Span {
     /// @gotags: json:"service" msg:"service"
     #[prost(string, tag = "1")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub service: ::prost::alloc::string::String,
     /// name is the operation name of this span.
     /// @gotags: json:"name" msg:"name"
     #[prost(string, tag = "2")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub name: ::prost::alloc::string::String,
     /// resource is the resource name of this span, also sometimes called the endpoint (for web spans).
     /// @gotags: json:"resource" msg:"resource"
     #[prost(string, tag = "3")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub resource: ::prost::alloc::string::String,
     /// traceID is the ID of the trace to which this span belongs.
     /// @gotags: json:"trace_id" msg:"trace_id"
     #[prost(uint64, tag = "4")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub trace_id: u64,
     /// spanID is the ID of this span.
     /// @gotags: json:"span_id" msg:"span_id"
     #[prost(uint64, tag = "5")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub span_id: u64,
     /// parentID is the ID of this span's parent, or zero if this span has no parent.
     /// @gotags: json:"parent_id" msg:"parent_id"
     #[prost(uint64, tag = "6")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub parent_id: u64,
     /// start is the number of nanoseconds between the Unix epoch and the beginning of this span.
     /// @gotags: json:"start" msg:"start"
     #[prost(int64, tag = "7")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub start: i64,
     /// duration is the time length of this span in nanoseconds.
     /// @gotags: json:"duration" msg:"duration"
     #[prost(int64, tag = "8")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_duration")]
     pub duration: i64,
     /// error is 1 if there is an error associated with this span, or 0 if there is not.
     /// @gotags: json:"error" msg:"error"
     #[prost(int32, tag = "9")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
-    #[serde(skip_serializing_if = "is_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
+    #[serde(skip_serializing_if = "crate::serializers::is_default")]
     pub error: i32,
     /// meta is a mapping from tag name to tag value for string-valued tags.
     /// @gotags: json:"meta,omitempty" msg:"meta,omitempty"
     #[prost(map = "string, string", tag = "10")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub meta: ::std::collections::HashMap<
         ::prost::alloc::string::String,
         ::prost::alloc::string::String,
@@ -130,19 +116,19 @@ pub struct Span {
     /// @gotags: json:"metrics,omitempty" msg:"metrics,omitempty"
     #[prost(map = "string, double", tag = "11")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub metrics: ::std::collections::HashMap<::prost::alloc::string::String, f64>,
     /// type is the type of the service with which this span is associated.  Example values: web, db, lambda.
     /// @gotags: json:"type" msg:"type"
     #[prost(string, tag = "12")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub r#type: ::prost::alloc::string::String,
     /// meta_struct is a registry of structured "other" data used by, e.g., AppSec.
     /// @gotags: json:"meta_struct,omitempty" msg:"meta_struct,omitempty"
     #[prost(map = "string, bytes", tag = "13")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     #[serde(skip_serializing_if = "::std::collections::HashMap::is_empty")]
     pub meta_struct: ::std::collections::HashMap<
         ::prost::alloc::string::String,
@@ -152,7 +138,7 @@ pub struct Span {
     /// @gotags: json:"span_links,omitempty" msg:"span_links,omitempty"
     #[prost(message, repeated, tag = "14")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     #[serde(skip_serializing_if = "::prost::alloc::vec::Vec::is_empty")]
     pub span_links: ::prost::alloc::vec::Vec<SpanLink>,
 }
diff --git a/trace-protobuf/src/pb_test.rs b/trace-protobuf/src/pb_test.rs
index e851b49548..3278019249 100644
--- a/trace-protobuf/src/pb_test.rs
+++ b/trace-protobuf/src/pb_test.rs
@@ -3,7 +3,8 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::pb::{is_default, Span};
+    use crate::pb::Span;
+    use crate::serializers::is_default;
 
     #[test]
     fn test_is_default() {
diff --git a/trace-protobuf/src/remoteconfig.rs b/trace-protobuf/src/remoteconfig.rs
index d7c7b05d78..0f0d021d5e 100644
--- a/trace-protobuf/src/remoteconfig.rs
+++ b/trace-protobuf/src/remoteconfig.rs
@@ -2,7 +2,6 @@
 // SPDX-License-Identifier: Apache-2.0
 
 use serde::{Deserialize, Serialize};
-
 #[derive(Deserialize, Serialize)]
 #[allow(clippy::derive_partial_eq_without_eq)]
 #[derive(Clone, PartialEq, ::prost::Message)]
diff --git a/trace-protobuf/src/serializers.rs b/trace-protobuf/src/serializers.rs
new file mode 100644
index 0000000000..a90652635a
--- /dev/null
+++ b/trace-protobuf/src/serializers.rs
@@ -0,0 +1,33 @@
+// Copyright 2023-Present Datadog, Inc. https://www.datadoghq.com/
+// SPDX-License-Identifier: Apache-2.0
+
+use serde::{Deserialize, Deserializer};
+
+pub fn deserialize_null_into_default<'de, D, T>(deserializer: D) -> Result<T, D::Error>
+where
+    T: Default + Deserialize<'de>,
+    D: Deserializer<'de>,
+{
+    let opt = Option::deserialize(deserializer)?;
+    Ok(opt.unwrap_or_default())
+}
+
+pub fn is_default<T: Default + PartialEq>(t: &T) -> bool {
+    t == &T::default()
+}
+
+pub fn deserialize_duration<'de, D>(deserializer: D) -> Result<i64, D::Error>
+where
+    D: Deserializer<'de>,
+{
+    let value: Result<i64, D::Error> = Deserialize::deserialize(deserializer);
+    match value {
+        Ok(v) => {
+            if v < 0 {
+                return Ok(0);
+            }
+            Ok(v)
+        }
+        Err(_) => Ok(0),
+    }
+}


Reviews:
user: login: paullegranddc
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T18:03:40Z
user: login: astuyve
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T18:11:44Z
user: login: astuyve
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T18:12:10Z
user: login: astuyve
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T19:35:32Z
user: login: astuyve
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T19:45:57Z
user: login: duncanista
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T01:47:33Z
user: login: duncanista
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T01:48:49Z
user: login: duncanista
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T01:49:24Z

Review comments:
diff_hunk: @@ -13,6 +13,7 @@ bench = false
 prost = "0.11.6"
 serde = { version = "1.0.145", features = ["derive"] }
 serde_bytes = "0.11.9"
+tracing = { version = "0.1", default-features = false }
path: trace-protobuf/Cargo.toml
user: login: paullegranddc
body: Can you add this as an optional dependency please?
We depend transitively on this crate in dd-rs and would like to not add this dependency to our users
created_at: 2025-04-03T17:50:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -58,6 +59,28 @@ pub struct SpanLink {
     #[serde(default)]
     pub flags: u32,
 }
+fn deserialize_duration<'de, D>(
path: trace-protobuf/src/pb.rs
user: login: paullegranddc
body: I believe this file is actually automatically generated from the proto definitions in `src/pb`

It's committed to source so we don't require a protoc toolchain when compiling  libdatadog but the file is regenerated when enabling the `generate-protobuf` feature on the crate.

Serde annotations on fields are added in the build script https://github.com/DataDog/libdatadog/blob/main/trace-protobuf/build.rs#L63-L66 and for instance the `deserialize_null_into_default` function in this file is also [managed from the build script](https://github.com/DataDog/libdatadog/blob/9b6500ca977561f17f5b3b2024805ec3484f2cd8/trace-protobuf/build.rs#L221C21-L221C31).

This is honestly pretty ugly so since tou are touching this file I'd prefer
1. if you moved all preprended functions (`deserialize_null_into_default`, `is_default`, `deserialize_duration`) to their own file instead of being added in the build script
2. use them in annotations with `crate::<function name>`
3. add the new annotation for duration in the build script like we do for span.[error](https://github.com/DataDog/libdatadog/blob/main/trace-protobuf/build.rs#L75-L78) for instance 

created_at: 2025-04-03T18:03:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -58,6 +59,28 @@ pub struct SpanLink {
     #[serde(default)]
     pub flags: u32,
 }
+fn deserialize_duration<'de, D>(
path: trace-protobuf/src/pb.rs
user: login: astuyve
body: haha yeah just realized this was generated by build.rs.

I've done 2 and 3 but happy to also do 1. Thanks Paul!
created_at: 2025-04-03T18:11:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -13,6 +13,7 @@ bench = false
 prost = "0.11.6"
 serde = { version = "1.0.145", features = ["derive"] }
 serde_bytes = "0.11.9"
+tracing = { version = "0.1", default-features = false }
path: trace-protobuf/Cargo.toml
user: login: astuyve
body: I can just remove it. The only case we'll set it to 0 is if it's malformed anyway, not sure we even need a log for it.
created_at: 2025-04-03T18:12:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,83 +52,66 @@ pub struct Span {
     /// @gotags: json:"service" msg:"service"
     #[prost(string, tag = "1")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub service: ::prost::alloc::string::String,
     /// name is the operation name of this span.
     /// @gotags: json:"name" msg:"name"
     #[prost(string, tag = "2")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub name: ::prost::alloc::string::String,
     /// resource is the resource name of this span, also sometimes called the endpoint (for web spans).
     /// @gotags: json:"resource" msg:"resource"
     #[prost(string, tag = "3")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub resource: ::prost::alloc::string::String,
     /// traceID is the ID of the trace to which this span belongs.
     /// @gotags: json:"trace_id" msg:"trace_id"
     #[prost(uint64, tag = "4")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub trace_id: u64,
     /// spanID is the ID of this span.
     /// @gotags: json:"span_id" msg:"span_id"
     #[prost(uint64, tag = "5")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub span_id: u64,
     /// parentID is the ID of this span's parent, or zero if this span has no parent.
     /// @gotags: json:"parent_id" msg:"parent_id"
     #[prost(uint64, tag = "6")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub parent_id: u64,
     /// start is the number of nanoseconds between the Unix epoch and the beginning of this span.
     /// @gotags: json:"start" msg:"start"
     #[prost(int64, tag = "7")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub start: i64,
     /// duration is the time length of this span in nanoseconds.
     /// @gotags: json:"duration" msg:"duration"
     #[prost(int64, tag = "8")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_duration")]
     pub duration: i64,
     /// error is 1 if there is an error associated with this span, or 0 if there is not.
     /// @gotags: json:"error" msg:"error"
     #[prost(int32, tag = "9")]
-    #[serde(default)]
path: trace-protobuf/src/pb.rs
user: login: astuyve
body: whoops
created_at: 2025-04-03T19:35:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -66,62 +52,56 @@ pub struct Span {
     /// @gotags: json:"service" msg:"service"
     #[prost(string, tag = "1")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub service: ::prost::alloc::string::String,
     /// name is the operation name of this span.
     /// @gotags: json:"name" msg:"name"
     #[prost(string, tag = "2")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub name: ::prost::alloc::string::String,
     /// resource is the resource name of this span, also sometimes called the endpoint (for web spans).
     /// @gotags: json:"resource" msg:"resource"
     #[prost(string, tag = "3")]
     #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
+    #[serde(deserialize_with = "crate::serializers::deserialize_null_into_default")]
     pub resource: ::prost::alloc::string::String,
     /// traceID is the ID of the trace to which this span belongs.
     /// @gotags: json:"trace_id" msg:"trace_id"
     #[prost(uint64, tag = "4")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub trace_id: u64,
     /// spanID is the ID of this span.
     /// @gotags: json:"span_id" msg:"span_id"
     #[prost(uint64, tag = "5")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub span_id: u64,
     /// parentID is the ID of this span's parent, or zero if this span has no parent.
     /// @gotags: json:"parent_id" msg:"parent_id"
     #[prost(uint64, tag = "6")]
-    #[serde(default)]
-    #[serde(deserialize_with = "deserialize_null_into_default")]
     pub parent_id: u64,
path: trace-protobuf/src/pb.rs
user: login: astuyve
body: still figureing out why default and the deserialize_with macro are missing here
created_at: 2025-04-03T19:45:57Z
author_association: CONTRIBUTOR
path: trace-protobuf/src/serializers.rs
user: login: duncanista
body: `serializer.rs` but it's mean for deserializing?
Should we change the name of it?
created_at: 2025-04-08T01:47:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -61,20 +60,60 @@ fn generate_protobuf() {
 
     config.type_attribute("Span", "#[derive(Deserialize, Serialize)]");
     config.field_attribute(
-        ".pb.Span",
-        "#[serde(default)] #[serde(deserialize_with = \"deserialize_null_into_default\")]",
+        ".pb.Span.service",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.name",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.resource",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.traceID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.spanID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.parentID",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.start",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.duration",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_duration\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.meta",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.metrics",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
+    );
+    config.field_attribute(
+        ".pb.Span.type",
+        "#[serde(default)] #[serde(deserialize_with = \"crate::serializers::deserialize_null_into_default\")]",
path: trace-protobuf/build.rs
user: login: duncanista
body: I know we are only targeting duration, does it make sense to then apply it to everything if we weren't doing it before?

Or is this mainly because we might reject when any of these fields are empty?
created_at: 2025-04-08T01:48:49Z
author_association: CONTRIBUTOR

PR comments:
user: login: r1viollet
created_at: 2025-04-03T17:50:45Z
body: # Artifact Size Benchmark Report
<details >
<summary>aarch64-alpine-linux-musl</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /aarch64-alpine-linux-musl/lib/libdatadog_profiling.so.debug|23.99 MB|23.99 MB|0% (0 B) 👌 |
| /aarch64-alpine-linux-musl/lib/libdatadog_profiling.so|7.78 MB|7.78 MB|0% (0 B) 👌 |
| /aarch64-alpine-linux-musl/lib/libdatadog_profiling.a|77.63 MB|77.63 MB|-0% (-8 B) 👌 |
</details>
<details >
<summary>aarch64-unknown-linux-gnu</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so.debug|22.56 MB|22.56 MB|-0% (-8 B) 👌 |
| /aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so|7.71 MB|7.71 MB|0% (0 B) 👌 |
| /aarch64-unknown-linux-gnu/lib/libdatadog_profiling.a|71.86 MB|71.86 MB|-0% (-8 B) 👌 |
</details>
<details >
<summary>libdatadog-x64-windows</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.dll|16.85 MB|16.85 MB|0% (0 B) 👌 |
| /libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.lib|61.83 KB|61.83 KB|0% (0 B) 👌 |
| /libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.pdb|113.05 MB|113.04 MB|-0% (-8.00 KB) 👌 |
| /libdatadog-x64-windows/debug/static/datadog_profiling_ffi.lib|630.61 MB|630.61 MB|0% (0 B) 👌 |
| /libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.dll|5.04 MB|5.04 MB|0% (0 B) 👌 |
| /libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.lib|61.83 KB|61.83 KB|0% (0 B) 👌 |
| /libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.pdb|16.06 MB|16.06 MB|0% (0 B) 👌 |
| /libdatadog-x64-windows/release/static/datadog_profiling_ffi.lib|26.71 MB|26.71 MB|0% (0 B) 👌 |
</details>
<details >
<summary>libdatadog-x86-windows</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.dll|14.25 MB|14.25 MB|0% (0 B) 👌 |
| /libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.lib|62.78 KB|62.78 KB|0% (0 B) 👌 |
| /libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.pdb|115.02 MB|115.02 MB|0% (0 B) 👌 |
| /libdatadog-x86-windows/debug/static/datadog_profiling_ffi.lib|622.55 MB|622.55 MB|0% (0 B) 👌 |
| /libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.dll|3.81 MB|3.81 MB|0% (0 B) 👌 |
| /libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.lib|62.78 KB|62.78 KB|0% (0 B) 👌 |
| /libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.pdb|16.68 MB|16.68 MB|0% (0 B) 👌 |
| /libdatadog-x86-windows/release/static/datadog_profiling_ffi.lib|24.61 MB|24.61 MB|0% (0 B) 👌 |
</details>
<details >
<summary>x86_64-alpine-linux-musl</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /x86_64-alpine-linux-musl/lib/libdatadog_profiling.a|66.92 MB|66.92 MB|0% (0 B) 👌 |
| /x86_64-alpine-linux-musl/lib/libdatadog_profiling.so|8.25 MB|8.25 MB|0% (0 B) 👌 |
| /x86_64-alpine-linux-musl/lib/libdatadog_profiling.so.debug|23.15 MB|23.15 MB|0% (0 B) 👌 |
</details>
<details >
<summary>x86_64-unknown-linux-gnu</summary>

| Artifact | Baseline | Commit | Change |
|----------|-----------|-------------|------------|
| /x86_64-unknown-linux-gnu/lib/libdatadog_profiling.a|67.84 MB|67.84 MB|-0% (-8 B) 👌 |
| /x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so|8.13 MB|8.13 MB|0% (0 B) 👌 |
| /x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so.debug|20.77 MB|20.77 MB|-0% (-8 B) 👌 |
</details>

author_association: CONTRIBUTOR
user: login: pr-commenter[bot]
created_at: 2025-04-03T18:01:42Z
body: ## Benchmarks


## Comparison

Benchmark execution time: 2025-04-08 01:23:06

Comparing candidate commit 2793895f in PR branch `aj/span-links-v05-string-compression-fix` with baseline commit 4bbc310a in branch `main`.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 52 metrics, 2 unstable metrics.


## Candidate

<details><summary>Candidate benchmark details</summary>

### Group 1

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario               |metric        |min    |mean ± sd        |median ± mad     |p75    |p95    |p99    |max    |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|-----------------------|--------------|-------|-----------------|-----------------|-------|-------|-------|-------|--------------------|--------|--------|-----|-------|----|-----------|
|tags/replace_trace_tags|execution_time|2.315µs|2.391µs ± 0.021µs|2.388µs ± 0.011µs|2.404µs|2.424µs|2.428µs|2.433µs|1.90%               |-1.114  |2.308   |0.90%|0.002µs|1   |200        |


|scenario               |metric        |95% CI mean                             |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|-----------------------|--------------|----------------------------------------|-------------------|------------------------|---------------|
|tags/replace_trace_tags|execution_time|[2.388µs; 2.394µs] or [-0.124%; +0.124%]|None               |None                    |None           |


### Group 2

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                |metric        |min     |mean ± sd         |median ± mad      |p75     |p95     |p99     |max     |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|------------------------|--------------|--------|------------------|------------------|--------|--------|--------|--------|--------------------|--------|--------|-----|-------|----|-----------|
|sql/obfuscate_sql_string|execution_time|68.190µs|68.412µs ± 0.267µs|68.367µs ± 0.062µs|68.469µs|68.592µs|68.641µs|71.886µs|5.15%               |11.155  |142.707 |0.39%|0.019µs|1   |200        |


|scenario                |metric        |95% CI mean                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|------------------------|--------------|------------------------------------------|-------------------|------------------------|---------------|
|sql/obfuscate_sql_string|execution_time|[68.375µs; 68.449µs] or [-0.054%; +0.054%]|None               |None                    |None           |


### Group 3

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                                                                               |metric        |min             |mean ± sd                       |median ± mad                    |p75             |p95             |p99             |max             |peak_to_median_ratio|skewness|kurtosis|cv   |sem         |runs|sample_size|
|-------------------------------------------------------------------------------------------------------|--------------|----------------|--------------------------------|--------------------------------|----------------|----------------|----------------|----------------|--------------------|--------|--------|-----|------------|----|-----------|
|normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...|execution_time|504.127µs       |505.622µs ± 0.611µs             |505.641µs ± 0.286µs             |505.912µs       |506.306µs       |506.668µs       |511.234µs       |1.11%               |3.733   |34.047  |0.12%|0.043µs     |1   |200        |
|normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...|throughput    |1956052.287op/s |1977763.930op/s ± 2379.500op/s  |1977687.293op/s ± 1119.070op/s  |1979046.896op/s |1980766.646op/s |1982533.108op/s |1983627.797op/s |0.30%               |-3.654  |33.153  |0.12%|168.256op/s |1   |200        |
|normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて                                     |execution_time|453.902µs       |455.505µs ± 0.582µs             |455.515µs ± 0.343µs             |455.827µs       |456.464µs       |456.782µs       |457.105µs       |0.35%               |-0.006  |-0.035  |0.13%|0.041µs     |1   |200        |
|normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて                                     |throughput    |2187682.125op/s |2195371.560op/s ± 2807.111op/s  |2195315.701op/s ± 1655.167op/s  |2197062.259op/s |2200226.811op/s |2201693.871op/s |2203119.463op/s |0.36%               |0.014   |-0.035  |0.13%|198.493op/s |1   |200        |
|normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters      |execution_time|176.629µs       |177.275µs ± 0.225µs             |177.284µs ± 0.133µs             |177.414µs       |177.596µs       |177.850µs       |178.045µs       |0.43%               |0.080   |0.993   |0.13%|0.016µs     |1   |200        |
|normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters      |throughput    |5616564.537op/s |5640951.375op/s ± 7167.556op/s  |5640668.505op/s ± 4219.669op/s  |5644942.804op/s |5653350.943op/s |5658383.871op/s |5661596.960op/s |0.37%               |-0.069  |0.984   |0.13%|506.823op/s |1   |200        |
|normalization/normalize_service/normalize_service/[empty string]                                       |execution_time|37.508µs        |37.612µs ± 0.046µs              |37.603µs ± 0.025µs              |37.636µs        |37.695µs        |37.769µs        |37.828µs        |0.60%               |1.172   |2.736   |0.12%|0.003µs     |1   |200        |
|normalization/normalize_service/normalize_service/[empty string]                                       |throughput    |26435128.791op/s|26587022.128op/s ± 32759.653op/s|26593498.987op/s ± 18021.741op/s|26606650.881op/s|26629531.766op/s|26650011.725op/s|26660926.785op/s|0.25%               |-1.159  |2.688   |0.12%|2316.457op/s|1   |200        |
|normalization/normalize_service/normalize_service/test_ASCII                                           |execution_time|48.097µs        |48.318µs ± 0.208µs              |48.276µs ± 0.176µs              |48.536µs        |48.621µs        |48.668µs        |48.774µs        |1.03%               |0.244   |-1.563  |0.43%|0.015µs     |1   |200        |
|normalization/normalize_service/normalize_service/test_ASCII                                           |throughput    |20502800.773op/s|20696398.403op/s ± 88881.614op/s|20714191.167op/s ± 75604.013op/s|20788885.668op/s|20790405.762op/s|20791089.723op/s|20791365.049op/s|0.37%               |-0.239  |-1.569  |0.43%|6284.879op/s|1   |200        |


|scenario                                                                                               |metric        |95% CI mean                                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|-------------------------------------------------------------------------------------------------------|--------------|----------------------------------------------------------|-------------------|------------------------|---------------|
|normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...|execution_time|[505.538µs; 505.707µs] or [-0.017%; +0.017%]              |None               |None                    |None           |
|normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...|throughput    |[1977434.154op/s; 1978093.706op/s] or [-0.017%; +0.017%]  |None               |None                    |None           |
|normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて                                     |execution_time|[455.424µs; 455.585µs] or [-0.018%; +0.018%]              |None               |None                    |None           |
|normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて                                     |throughput    |[2194982.521op/s; 2195760.598op/s] or [-0.018%; +0.018%]  |None               |None                    |None           |
|normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters      |execution_time|[177.244µs; 177.307µs] or [-0.018%; +0.018%]              |None               |None                    |None           |
|normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters      |throughput    |[5639958.020op/s; 5641944.729op/s] or [-0.018%; +0.018%]  |None               |None                    |None           |
|normalization/normalize_service/normalize_service/[empty string]                                       |execution_time|[37.606µs; 37.619µs] or [-0.017%; +0.017%]                |None               |None                    |None           |
|normalization/normalize_service/normalize_service/[empty string]                                       |throughput    |[26582481.955op/s; 26591562.301op/s] or [-0.017%; +0.017%]|None               |None                    |None           |
|normalization/normalize_service/normalize_service/test_ASCII                                           |execution_time|[48.290µs; 48.347µs] or [-0.060%; +0.060%]                |None               |None                    |None           |
|normalization/normalize_service/normalize_service/test_ASCII                                           |throughput    |[20684080.266op/s; 20708716.540op/s] or [-0.060%; +0.060%]|None               |None                    |None           |


### Group 4

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                                                                               |metric        |min             |mean ± sd                        |median ± mad                     |p75             |p95             |p99             |max             |peak_to_median_ratio|skewness|kurtosis|cv   |sem          |runs|sample_size|
|-------------------------------------------------------------------------------------------------------|--------------|----------------|---------------------------------|---------------------------------|----------------|----------------|----------------|----------------|--------------------|--------|--------|-----|-------------|----|-----------|
|normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo...|execution_time|208.716µs       |209.117µs ± 0.167µs              |209.122µs ± 0.095µs              |209.216µs       |209.421µs       |209.483µs       |209.579µs       |0.22%               |0.043   |0.143   |0.08%|0.012µs      |1   |200        |
|normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo...|throughput    |4771472.954op/s |4782018.671op/s ± 3817.052op/s   |4781898.601op/s ± 2174.544op/s   |4784241.188op/s |4788793.712op/s |4790431.656op/s |4791193.148op/s |0.19%               |-0.038  |0.141   |0.08%|269.906op/s  |1   |200        |
|normalization/normalize_name/normalize_name/bad-name                                                   |execution_time|18.611µs        |18.672µs ± 0.049µs               |18.665µs ± 0.010µs               |18.679µs        |18.716µs        |18.772µs        |19.265µs        |3.21%               |9.111   |106.986 |0.26%|0.003µs      |1   |200        |
|normalization/normalize_name/normalize_name/bad-name                                                   |throughput    |51908860.359op/s|53556296.304op/s ± 136795.493op/s|53575470.254op/s ± 28338.381op/s |53600810.464op/s|53667736.129op/s|53728586.802op/s|53730807.743op/s|0.29%               |-8.909  |103.650 |0.25%|9672.902op/s |1   |200        |
|normalization/normalize_name/normalize_name/good                                                       |execution_time|10.845µs        |10.957µs ± 0.037µs               |10.962µs ± 0.024µs               |10.986µs        |11.006µs        |11.021µs        |11.033µs        |0.65%               |-0.924  |1.008   |0.34%|0.003µs      |1   |200        |
|normalization/normalize_name/normalize_name/good                                                       |throughput    |90640718.321op/s|91263059.495op/s ± 311555.274op/s|91226181.697op/s ± 199456.249op/s|91422608.735op/s|91881782.511op/s|92194560.972op/s|92208914.190op/s|1.08%               |0.946   |1.059   |0.34%|22030.285op/s|1   |200        |


|scenario                                                                                               |metric        |95% CI mean                                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|-------------------------------------------------------------------------------------------------------|--------------|----------------------------------------------------------|-------------------|------------------------|---------------|
|normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo...|execution_time|[209.094µs; 209.140µs] or [-0.011%; +0.011%]              |None               |None                    |None           |
|normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo...|throughput    |[4781489.664op/s; 4782547.678op/s] or [-0.011%; +0.011%]  |None               |None                    |None           |
|normalization/normalize_name/normalize_name/bad-name                                                   |execution_time|[18.665µs; 18.679µs] or [-0.036%; +0.036%]                |None               |None                    |None           |
|normalization/normalize_name/normalize_name/bad-name                                                   |throughput    |[53537337.765op/s; 53575254.844op/s] or [-0.035%; +0.035%]|None               |None                    |None           |
|normalization/normalize_name/normalize_name/good                                                       |execution_time|[10.952µs; 10.963µs] or [-0.047%; +0.047%]                |None               |None                    |None           |
|normalization/normalize_name/normalize_name/good                                                       |throughput    |[91219880.931op/s; 91306238.060op/s] or [-0.047%; +0.047%]|None               |None                    |None           |


### Group 5

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                                                    |metric        |min     |mean ± sd         |median ± mad      |p75     |p95     |p99     |max     |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|----------------------------------------------------------------------------|--------------|--------|------------------|------------------|--------|--------|--------|--------|--------------------|--------|--------|-----|-------|----|-----------|
|benching deserializing traces from msgpack to their internal representation |execution_time|54.215ms|54.416ms ± 0.224ms|54.339ms ± 0.062ms|54.427ms|54.951ms|55.211ms|55.405ms|1.96%               |2.353   |5.344   |0.41%|0.016ms|1   |200        |


|scenario                                                                    |metric        |95% CI mean                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|----------------------------------------------------------------------------|--------------|------------------------------------------|-------------------|------------------------|---------------|
|benching deserializing traces from msgpack to their internal representation |execution_time|[54.385ms; 54.447ms] or [-0.057%; +0.057%]|None               |None                    |None           |


### Group 6

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                     |metric        |min    |mean ± sd        |median ± mad     |p75    |p95    |p99    |max    |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|---------------------------------------------|--------------|-------|-----------------|-----------------|-------|-------|-------|-------|--------------------|--------|--------|-----|-------|----|-----------|
|ip_address/quantize_peer_ip_address_benchmark|execution_time|4.918µs|4.993µs ± 0.040µs|4.987µs ± 0.033µs|5.032µs|5.049µs|5.072µs|5.075µs|1.77%               |0.140   |-1.172  |0.80%|0.003µs|1   |200        |


|scenario                                     |metric        |95% CI mean                             |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|---------------------------------------------|--------------|----------------------------------------|-------------------|------------------------|---------------|
|ip_address/quantize_peer_ip_address_benchmark|execution_time|[4.987µs; 4.998µs] or [-0.111%; +0.111%]|None               |None                    |None           |


### Group 7

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                      |metric        |min      |mean ± sd          |median ± mad       |p75      |p95      |p99      |max      |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|----------------------------------------------|--------------|---------|-------------------|-------------------|---------|---------|---------|---------|--------------------|--------|--------|-----|-------|----|-----------|
|benching string interning on wordpress profile|execution_time|146.786µs|147.607µs ± 0.360µs|147.580µs ± 0.193µs|147.790µs|148.094µs|149.009µs|149.418µs|1.25%               |1.239   |5.124   |0.24%|0.025µs|1   |200        |


|scenario                                      |metric        |95% CI mean                                 |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|----------------------------------------------|--------------|--------------------------------------------|-------------------|------------------------|---------------|
|benching string interning on wordpress profile|execution_time|[147.557µs; 147.657µs] or [-0.034%; +0.034%]|None               |None                    |None           |


### Group 8

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                |metric        |min      |mean ± sd           |median ± mad       |p75      |p95      |p99      |max      |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|----------------------------------------|--------------|---------|--------------------|-------------------|---------|---------|---------|---------|--------------------|--------|--------|-----|-------|----|-----------|
|normalization/normalize_trace/test_trace|execution_time|245.723ns|255.177ns ± 12.142ns|250.223ns ± 2.892ns|254.808ns|284.950ns|287.542ns|288.862ns|15.44%              |1.683   |1.409   |4.75%|0.859ns|1   |200        |


|scenario                                |metric        |95% CI mean                                 |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|----------------------------------------|--------------|--------------------------------------------|-------------------|------------------------|---------------|
|normalization/normalize_trace/test_trace|execution_time|[253.495ns; 256.860ns] or [-0.659%; +0.659%]|None               |None                    |None           |


### Group 9

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                                                  |metric        |min              |mean ± sd                          |median ± mad                       |p75              |p95              |p99              |max              |peak_to_median_ratio|skewness|kurtosis|cv   |sem           |runs|sample_size|
|----------------------------------------------------------|--------------|-----------------|-----------------------------------|-----------------------------------|-----------------|-----------------|-----------------|-----------------|--------------------|--------|--------|-----|--------------|----|-----------|
|credit_card/is_card_number/                               |execution_time|3.894µs          |3.913µs ± 0.003µs                  |3.913µs ± 0.001µs                  |3.915µs          |3.916µs          |3.919µs          |3.920µs          |0.17%               |-1.611  |8.620   |0.07%|0.000µs       |1   |200        |
|credit_card/is_card_number/                               |throughput    |255109831.969op/s|255563898.407op/s ± 185824.451op/s |255531760.244op/s ± 88773.244op/s  |255660029.006op/s|255867117.595op/s|255934462.065op/s|256804619.107op/s|0.50%               |1.628   |8.754   |0.07%|13139.773op/s |1   |200        |
|credit_card/is_card_number/  3782-8224-6310-005           |execution_time|81.974µs         |82.356µs ± 0.250µs                 |82.295µs ± 0.149µs                 |82.482µs         |82.823µs         |83.286µs         |83.426µs         |1.37%               |1.376   |2.527   |0.30%|0.018µs       |1   |200        |
|credit_card/is_card_number/  3782-8224-6310-005           |throughput    |11986686.132op/s |12142570.601op/s ± 36731.829op/s   |12151471.278op/s ± 21966.743op/s   |12170249.827op/s |12184368.615op/s |12192138.947op/s |12198965.528op/s |0.39%               |-1.352  |2.420   |0.30%|2597.333op/s  |1   |200        |
|credit_card/is_card_number/  378282246310005              |execution_time|76.466µs         |77.113µs ± 0.348µs                 |77.047µs ± 0.217µs                 |77.290µs         |77.690µs         |78.107µs         |78.692µs         |2.13%               |1.056   |1.903   |0.45%|0.025µs       |1   |200        |
|credit_card/is_card_number/  378282246310005              |throughput    |12707798.160op/s |12968324.692op/s ± 58324.039op/s   |12979098.464op/s ± 36546.022op/s   |13010032.441op/s |13043963.320op/s |13062808.092op/s |13077743.260op/s |0.76%               |-1.019  |1.758   |0.45%|4124.132op/s  |1   |200        |
|credit_card/is_card_number/37828224631                    |execution_time|3.895µs          |3.914µs ± 0.003µs                  |3.914µs ± 0.001µs                  |3.915µs          |3.917µs          |3.919µs          |3.920µs          |0.16%               |-1.893  |11.084  |0.07%|0.000µs       |1   |200        |
|credit_card/is_card_number/37828224631                    |throughput    |255083066.727op/s|255516663.373op/s ± 176838.827op/s |255493165.558op/s ± 71669.355op/s  |255566319.460op/s|255812766.938op/s|255972235.504op/s|256753754.257op/s|0.49%               |1.913   |11.239  |0.07%|12504.393op/s |1   |200        |
|credit_card/is_card_number/378282246310005                |execution_time|72.878µs         |73.827µs ± 0.425µs                 |73.819µs ± 0.300µs                 |74.135µs         |74.464µs         |74.929µs         |75.066µs         |1.69%               |0.245   |-0.008  |0.57%|0.030µs       |1   |200        |
|credit_card/is_card_number/378282246310005                |throughput    |13321569.865op/s |13545648.562op/s ± 77894.725op/s   |13546718.094op/s ± 55320.852op/s   |13596248.130op/s |13677589.511op/s |13701359.936op/s |13721510.839op/s |1.29%               |-0.212  |-0.042  |0.57%|5507.989op/s  |1   |200        |
|credit_card/is_card_number/37828224631000521389798        |execution_time|51.834µs         |52.123µs ± 0.082µs                 |52.134µs ± 0.053µs                 |52.181µs         |52.246µs         |52.280µs         |52.320µs         |0.36%               |-0.525  |0.455   |0.16%|0.006µs       |1   |200        |
|credit_card/is_card_number/37828224631000521389798        |throughput    |19113035.688op/s |19185503.627op/s ± 30357.926op/s   |19181242.691op/s ± 19500.592op/s   |19204954.404op/s |19236121.406op/s |19264907.593op/s |19292191.596op/s |0.58%               |0.535   |0.473   |0.16%|2146.630op/s  |1   |200        |
|credit_card/is_card_number/x371413321323331               |execution_time|6.441µs          |6.607µs ± 0.063µs                  |6.597µs ± 0.043µs                  |6.654µs          |6.711µs          |6.744µs          |6.756µs          |2.41%               |0.033   |-0.370  |0.95%|0.004µs       |1   |200        |
|credit_card/is_card_number/x371413321323331               |throughput    |148014450.668op/s|151376981.020op/s ± 1437446.663op/s|151575721.780op/s ± 999478.219op/s |152530091.643op/s|153689750.800op/s|154412133.590op/s|155260696.965op/s|2.43%               |0.014   |-0.353  |0.95%|101642.828op/s|1   |200        |
|credit_card/is_card_number_no_luhn/                       |execution_time|3.896µs          |3.914µs ± 0.003µs                  |3.914µs ± 0.001µs                  |3.915µs          |3.919µs          |3.923µs          |3.929µs          |0.38%               |0.010   |8.683   |0.08%|0.000µs       |1   |200        |
|credit_card/is_card_number_no_luhn/                       |throughput    |254535463.315op/s|255485126.425op/s ± 199215.611op/s |255504177.495op/s ± 63928.047op/s  |255560612.588op/s|255759781.643op/s|255923693.999op/s|256659304.412op/s|0.45%               |0.015   |8.740   |0.08%|14086.671op/s |1   |200        |
|credit_card/is_card_number_no_luhn/  3782-8224-6310-005   |execution_time|63.818µs         |63.956µs ± 0.075µs                 |63.935µs ± 0.040µs                 |63.998µs         |64.112µs         |64.172µs         |64.220µs         |0.45%               |0.957   |0.792   |0.12%|0.005µs       |1   |200        |
|credit_card/is_card_number_no_luhn/  3782-8224-6310-005   |throughput    |15571548.737op/s |15635690.508op/s ± 18199.255op/s   |15640900.078op/s ± 9833.761op/s    |15648418.119op/s |15657976.344op/s |15666699.725op/s |15669572.823op/s |0.18%               |-0.951  |0.776   |0.12%|1286.882op/s  |1   |200        |
|credit_card/is_card_number_no_luhn/  378282246310005      |execution_time|57.414µs         |57.556µs ± 0.097µs                 |57.535µs ± 0.038µs                 |57.586µs         |57.702µs         |57.919µs         |58.254µs         |1.25%               |2.885   |14.537  |0.17%|0.007µs       |1   |200        |
|credit_card/is_card_number_no_luhn/  378282246310005      |throughput    |17166196.405op/s |17374454.628op/s ± 29220.736op/s   |17380752.559op/s ± 11618.278op/s   |17390599.511op/s |17406758.786op/s |17414822.853op/s |17417459.261op/s |0.21%               |-2.843  |14.164  |0.17%|2066.218op/s  |1   |200        |
|credit_card/is_card_number_no_luhn/37828224631            |execution_time|3.895µs          |3.914µs ± 0.003µs                  |3.914µs ± 0.001µs                  |3.915µs          |3.919µs          |3.922µs          |3.926µs          |0.30%               |-0.481  |5.252   |0.09%|0.000µs       |1   |200        |
|credit_card/is_card_number_no_luhn/37828224631            |throughput    |254724262.730op/s|255508159.652op/s ± 218527.509op/s |255497611.102op/s ± 91934.696op/s  |255584393.972op/s|255841900.900op/s|255986551.597op/s|256728316.631op/s|0.48%               |0.499   |5.311   |0.09%|15452.228op/s |1   |200        |
|credit_card/is_card_number_no_luhn/378282246310005        |execution_time|54.573µs         |54.740µs ± 0.192µs                 |54.671µs ± 0.030µs                 |54.717µs         |55.138µs         |55.449µs         |55.903µs         |2.25%               |2.691   |8.679   |0.35%|0.014µs       |1   |200        |
|credit_card/is_card_number_no_luhn/378282246310005        |throughput    |17888264.038op/s |18268479.127op/s ± 63477.827op/s   |18291095.897op/s ± 10084.530op/s   |18299481.667op/s |18311685.328op/s |18322265.603op/s |18324076.003op/s |0.18%               |-2.656  |8.365   |0.35%|4488.560op/s  |1   |200        |
|credit_card/is_card_number_no_luhn/37828224631000521389798|execution_time|51.942µs         |52.115µs ± 0.072µs                 |52.115µs ± 0.049µs                 |52.168µs         |52.226µs         |52.247µs         |52.286µs         |0.33%               |-0.119  |-0.640  |0.14%|0.005µs       |1   |200        |
|credit_card/is_card_number_no_luhn/37828224631000521389798|throughput    |19125679.522op/s |19188234.106op/s ± 26336.522op/s   |19188502.254op/s ± 18102.309op/s   |19205520.627op/s |19230105.696op/s |19245240.403op/s |19252364.506op/s |0.33%               |0.124   |-0.638  |0.14%|1862.273op/s  |1   |200        |
|credit_card/is_card_number_no_luhn/x371413321323331       |execution_time|6.465µs          |6.639µs ± 0.070µs                  |6.634µs ± 0.049µs                  |6.686µs          |6.755µs          |6.774µs          |6.785µs          |2.26%               |-0.088  |-0.683  |1.05%|0.005µs       |1   |200        |
|credit_card/is_card_number_no_luhn/x371413321323331       |throughput    |147391824.022op/s|150645090.445op/s ± 1584086.192op/s|150728215.311op/s ± 1105862.696op/s|151745961.716op/s|153430512.393op/s|153785494.143op/s|154673127.200op/s|2.62%               |0.130   |-0.664  |1.05%|112011.809op/s|1   |200        |


|scenario                                                  |metric        |95% CI mean                                                 |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|----------------------------------------------------------|--------------|------------------------------------------------------------|-------------------|------------------------|---------------|
|credit_card/is_card_number/                               |execution_time|[3.913µs; 3.913µs] or [-0.010%; +0.010%]                    |None               |None                    |None           |
|credit_card/is_card_number/                               |throughput    |[255538144.926op/s; 255589651.889op/s] or [-0.010%; +0.010%]|None               |None                    |None           |
|credit_card/is_card_number/  3782-8224-6310-005           |execution_time|[82.321µs; 82.390µs] or [-0.042%; +0.042%]                  |None               |None                    |None           |
|credit_card/is_card_number/  3782-8224-6310-005           |throughput    |[12137479.923op/s; 12147661.279op/s] or [-0.042%; +0.042%]  |None               |None                    |None           |
|credit_card/is_card_number/  378282246310005              |execution_time|[77.064µs; 77.161µs] or [-0.063%; +0.063%]                  |None               |None                    |None           |
|credit_card/is_card_number/  378282246310005              |throughput    |[12960241.542op/s; 12976407.843op/s] or [-0.062%; +0.062%]  |None               |None                    |None           |
|credit_card/is_card_number/37828224631                    |execution_time|[3.913µs; 3.914µs] or [-0.010%; +0.010%]                    |None               |None                    |None           |
|credit_card/is_card_number/37828224631                    |throughput    |[255492155.212op/s; 255541171.533op/s] or [-0.010%; +0.010%]|None               |None                    |None           |
|credit_card/is_card_number/378282246310005                |execution_time|[73.768µs; 73.886µs] or [-0.080%; +0.080%]                  |None               |None                    |None           |
|credit_card/is_card_number/378282246310005                |throughput    |[13534853.103op/s; 13556444.022op/s] or [-0.080%; +0.080%]  |None               |None                    |None           |
|credit_card/is_card_number/37828224631000521389798        |execution_time|[52.111µs; 52.134µs] or [-0.022%; +0.022%]                  |None               |None                    |None           |
|credit_card/is_card_number/37828224631000521389798        |throughput    |[19181296.310op/s; 19189710.943op/s] or [-0.022%; +0.022%]  |None               |None                    |None           |
|credit_card/is_card_number/x371413321323331               |execution_time|[6.598µs; 6.615µs] or [-0.132%; +0.132%]                    |None               |None                    |None           |
|credit_card/is_card_number/x371413321323331               |throughput    |[151177764.737op/s; 151576197.303op/s] or [-0.132%; +0.132%]|None               |None                    |None           |
|credit_card/is_card_number_no_luhn/                       |execution_time|[3.914µs; 3.915µs] or [-0.011%; +0.011%]                    |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/                       |throughput    |[255457517.057op/s; 255512735.792op/s] or [-0.011%; +0.011%]|None               |None                    |None           |
|credit_card/is_card_number_no_luhn/  3782-8224-6310-005   |execution_time|[63.946µs; 63.967µs] or [-0.016%; +0.016%]                  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/  3782-8224-6310-005   |throughput    |[15633168.266op/s; 15638212.749op/s] or [-0.016%; +0.016%]  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/  378282246310005      |execution_time|[57.542µs; 57.569µs] or [-0.023%; +0.023%]                  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/  378282246310005      |throughput    |[17370404.915op/s; 17378504.341op/s] or [-0.023%; +0.023%]  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/37828224631            |execution_time|[3.913µs; 3.914µs] or [-0.012%; +0.012%]                    |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/37828224631            |throughput    |[255477873.841op/s; 255538445.463op/s] or [-0.012%; +0.012%]|None               |None                    |None           |
|credit_card/is_card_number_no_luhn/378282246310005        |execution_time|[54.713µs; 54.766µs] or [-0.049%; +0.049%]                  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/378282246310005        |throughput    |[18259681.711op/s; 18277276.543op/s] or [-0.048%; +0.048%]  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/37828224631000521389798|execution_time|[52.105µs; 52.125µs] or [-0.019%; +0.019%]                  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/37828224631000521389798|throughput    |[19184584.118op/s; 19191884.095op/s] or [-0.019%; +0.019%]  |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/x371413321323331       |execution_time|[6.629µs; 6.649µs] or [-0.146%; +0.146%]                    |None               |None                    |None           |
|credit_card/is_card_number_no_luhn/x371413321323331       |throughput    |[150425551.334op/s; 150864629.556op/s] or [-0.146%; +0.146%]|None               |None                    |None           |


### Group 10

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario            |metric        |min    |mean ± sd        |median ± mad     |p75    |p95    |p99     |max     |peak_to_median_ratio|skewness|kurtosis|cv    |sem    |runs|sample_size|
|--------------------|--------------|-------|-----------------|-----------------|-------|-------|--------|--------|--------------------|--------|--------|------|-------|----|-----------|
|write only interface|execution_time|1.193µs|3.235µs ± 1.483µs|3.036µs ± 0.022µs|3.053µs|3.706µs|13.938µs|16.197µs|433.58%             |7.468   |57.079  |45.73%|0.105µs|1   |200        |


|scenario            |metric        |95% CI mean                             |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|--------------------|--------------|----------------------------------------|-------------------|------------------------|---------------|
|write only interface|execution_time|[3.030µs; 3.441µs] or [-6.353%; +6.353%]|None               |None                    |None           |


### Group 11

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                    |metric        |min     |mean ± sd         |median ± mad      |p75     |p95     |p99     |max     |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|----------------------------|--------------|--------|------------------|------------------|--------|--------|--------|--------|--------------------|--------|--------|-----|-------|----|-----------|
|redis/obfuscate_redis_string|execution_time|32.906µs|33.872µs ± 1.254µs|33.097µs ± 0.100µs|35.390µs|36.004µs|36.093µs|36.252µs|9.53%               |0.923   |-1.075  |3.69%|0.089µs|1   |200        |


|scenario                    |metric        |95% CI mean                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|----------------------------|--------------|------------------------------------------|-------------------|------------------------|---------------|
|redis/obfuscate_redis_string|execution_time|[33.698µs; 34.045µs] or [-0.513%; +0.513%]|None               |None                    |None           |


### Group 12

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario                              |metric        |min    |mean ± sd        |median ± mad     |p75    |p95    |p99    |max    |peak_to_median_ratio|skewness|kurtosis|cv   |sem    |runs|sample_size|
|--------------------------------------|--------------|-------|-----------------|-----------------|-------|-------|-------|-------|--------------------|--------|--------|-----|-------|----|-----------|
|concentrator/add_spans_to_concentrator|execution_time|5.976ms|5.991ms ± 0.007ms|5.990ms ± 0.003ms|5.994ms|5.999ms|6.008ms|6.046ms|0.93%               |3.270   |22.564  |0.11%|0.000ms|1   |200        |


|scenario                              |metric        |95% CI mean                             |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|--------------------------------------|--------------|----------------------------------------|-------------------|------------------------|---------------|
|concentrator/add_spans_to_concentrator|execution_time|[5.990ms; 5.992ms] or [-0.016%; +0.016%]|None               |None                    |None           |


### Group 13

|cpu_model                                     |git_commit_sha|git_commit_date|git_branch                              |
|----------------------------------------------|--------------|---------------|----------------------------------------|
|Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz|2793895f      |1744074672     |aj/span-links-v05-string-compression-fix|


|scenario         |metric        |min     |mean ± sd          |median ± mad      |p75     |p95     |p99     |max     |peak_to_median_ratio|skewness|kurtosis|cv    |sem    |runs|sample_size|
|-----------------|--------------|--------|-------------------|------------------|--------|--------|--------|--------|--------------------|--------|--------|------|-------|----|-----------|
|two way interface|execution_time|17.838µs|25.987µs ± 11.041µs|18.017µs ± 0.072µs|35.245µs|43.844µs|52.845µs|95.489µs|430.01%             |1.962   |7.592   |42.38%|0.781µs|1   |200        |


|scenario         |metric        |95% CI mean                               |Shapiro-Wilk pvalue|Ljung-Box pvalue (lag=1)|Dip test pvalue|
|-----------------|--------------|------------------------------------------|-------------------|------------------------|---------------|
|two way interface|execution_time|[24.456µs; 27.517µs] or [-5.888%; +5.888%]|None               |None                    |None           |





</details>

## Baseline

Omitted due to size.

author_association: NONE
user: login: codecov-commenter
created_at: 2025-04-03T18:02:07Z
body: ## [Codecov](https://app.codecov.io/gh/DataDog/libdatadog/pull/998?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) Report
Attention: Patch coverage is `91.66667%` with `2 lines` in your changes missing coverage. Please review.
> Project coverage is 71.45%. Comparing base [(`4bbc310`)](https://app.codecov.io/gh/DataDog/libdatadog/commit/4bbc310a25916918e0e058ca907452bbe30cd1e2?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) to head [(`2793895`)](https://app.codecov.io/gh/DataDog/libdatadog/commit/2793895f5e81229ce30e7d173d12f0e24fa84df3?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #998      +/-   ##
==========================================
- Coverage   71.47%   71.45%   -0.02%     
==========================================
  Files         336      337       +1     
  Lines       50496    50509      +13     
==========================================
+ Hits        36091    36093       +2     
- Misses      14405    14416      +11     
```

| [Components](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=components&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | Coverage Δ | |
|---|---|---|
| [crashtracker](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `42.66% <ø> (-0.06%)` | :arrow_down: |
| [crashtracker-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `6.30% <ø> (ø)` | |
| [datadog-alloc](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `98.73% <ø> (ø)` | |
| [data-pipeline](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `90.74% <ø> (ø)` | |
| [data-pipeline-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `90.35% <ø> (ø)` | |
| [ddcommon](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `79.95% <ø> (ø)` | |
| [ddcommon-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `66.37% <ø> (ø)` | |
| [ddtelemetry](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `60.28% <ø> (ø)` | |
| [ddtelemetry-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `21.43% <ø> (ø)` | |
| [dogstatsd-client](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `82.57% <ø> (ø)` | |
| [ipc](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `82.42% <ø> (ø)` | |
| [profiling](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `77.58% <ø> (ø)` | |
| [profiling-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `62.28% <ø> (ø)` | |
| [serverless](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `0.00% <ø> (ø)` | |
| [sidecar](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `40.95% <ø> (ø)` | |
| [sidecar-ffi](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `0.58% <ø> (ø)` | |
| [spawn-worker](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `54.37% <ø> (ø)` | |
| [tinybytes](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `91.59% <ø> (ø)` | |
| [trace-mini-agent](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `73.82% <ø> (ø)` | |
| [trace-normalization](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `98.24% <ø> (ø)` | |
| [trace-obfuscation](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `96.00% <ø> (ø)` | |
| [trace-protobuf](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `78.50% <91.66%> (+0.36%)` | :arrow_up: |
| [trace-utils](https://app.codecov.io/gh/DataDog/libdatadog/pull/998/components?src=pr&el=component&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=DataDog) | `93.05% <ø> (ø)` | |

</details>
<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE