From 585e4efaff5b8a277526a6a31c7a3314e20e9d57 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 24 Jun 2026 15:12:03 -0400 Subject: [PATCH 1/4] implement additional metric tags for trace stats --- Cargo.lock | 261 +++++++++++++++--- crates/datadog-agent-config/Cargo.toml | 4 +- crates/datadog-metrics-collector/Cargo.toml | 2 +- crates/datadog-serverless-compat/Cargo.toml | 2 +- crates/datadog-trace-agent/Cargo.toml | 18 +- crates/datadog-trace-agent/src/config.rs | 7 + .../src/stats_concentrator_service.rs | 13 +- .../src/trace_processor.rs | 1 + 8 files changed, 262 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 991ff1b..f2b08bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -298,6 +298,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -339,6 +345,16 @@ dependencies = [ "cc", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -448,7 +464,7 @@ dependencies = [ "dogstatsd", "figment", "libdd-trace-obfuscation", - "libdd-trace-utils 6.0.1", + "libdd-trace-utils 8.0.0", "log", "serde", "serde-aux", @@ -492,7 +508,7 @@ name = "datadog-metrics-collector" version = "0.1.0" dependencies = [ "dogstatsd", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "tokio", "tracing", "windows-sys 0.61.2", @@ -554,7 +570,7 @@ dependencies = [ "datadog-metrics-collector", "datadog-trace-agent", "dogstatsd", - "libdd-trace-utils 6.0.1", + "libdd-trace-utils 8.0.0", "reqwest", "serde_json", "tokio", @@ -580,12 +596,12 @@ dependencies = [ "hyper-util", "libdd-capabilities", "libdd-capabilities-impl", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "libdd-library-config", "libdd-trace-obfuscation", "libdd-trace-protobuf 3.0.2", - "libdd-trace-stats 4.0.0", - "libdd-trace-utils 6.0.1", + "libdd-trace-stats 5.0.0", + "libdd-trace-utils 8.0.0", "reqwest", "rmp-serde", "serde", @@ -1209,7 +1225,6 @@ dependencies = [ "hyper", "hyper-util", "rustls", - "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1406,6 +1421,50 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "jobserver" version = "0.1.34" @@ -1447,7 +1506,7 @@ checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libdd-capabilities" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "bytes", @@ -1458,13 +1517,13 @@ dependencies = [ [[package]] name = "libdd-capabilities-impl" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "bytes", "http", "http-body-util", "libdd-capabilities", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "tokio", ] @@ -1501,8 +1560,8 @@ dependencies = [ [[package]] name = "libdd-common" -version = "4.2.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "bytes", @@ -1524,6 +1583,7 @@ dependencies = [ "regex", "rustls", "rustls-native-certs", + "rustls-platform-verifier", "serde", "static_assertions", "thiserror 1.0.69", @@ -1575,7 +1635,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.0.1" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "prost 0.14.3", ] @@ -1597,7 +1657,7 @@ dependencies = [ [[package]] name = "libdd-library-config" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "libc", @@ -1614,14 +1674,14 @@ dependencies = [ [[package]] name = "libdd-shared-runtime" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "async-trait", "futures", "futures-util", "libdd-capabilities", "libdd-capabilities-impl", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "tokio", "tokio-util", "tracing", @@ -1665,7 +1725,7 @@ dependencies = [ [[package]] name = "libdd-tinybytes" version = "1.1.1" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "serde", ] @@ -1683,7 +1743,7 @@ dependencies = [ [[package]] name = "libdd-trace-normalization" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "libdd-trace-protobuf 3.0.2", @@ -1691,14 +1751,14 @@ dependencies = [ [[package]] name = "libdd-trace-obfuscation" -version = "3.1.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "fluent-uri", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "libdd-trace-protobuf 3.0.2", - "libdd-trace-utils 6.0.1", + "libdd-trace-utils 8.0.0", "log", "percent-encoding", "serde", @@ -1719,7 +1779,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "prost 0.14.3", "serde", @@ -1740,8 +1800,8 @@ dependencies = [ [[package]] name = "libdd-trace-stats" -version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "arc-swap", @@ -1750,12 +1810,12 @@ dependencies = [ "http", "libdd-capabilities", "libdd-capabilities-impl", - "libdd-common 4.2.0", - "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03)", + "libdd-common 5.0.0", + "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d)", "libdd-shared-runtime", "libdd-trace-obfuscation", "libdd-trace-protobuf 3.0.2", - "libdd-trace-utils 6.0.1", + "libdd-trace-utils 8.0.0", "rmp-serde", "serde", "tokio", @@ -1793,8 +1853,8 @@ dependencies = [ [[package]] name = "libdd-trace-utils" -version = "6.0.1" -source = "git+https://github.com/DataDog/libdatadog?rev=48da0d82cb32b43d4cdece35b794c9bcbc275a03#48da0d82cb32b43d4cdece35b794c9bcbc275a03" +version = "8.0.0" +source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" dependencies = [ "anyhow", "base64 0.22.1", @@ -1804,6 +1864,7 @@ dependencies = [ "flate2", "futures", "getrandom 0.2.17", + "hex", "http", "http-body", "http-body-util", @@ -1812,7 +1873,7 @@ dependencies = [ "indexmap", "libdd-capabilities", "libdd-capabilities-impl", - "libdd-common 4.2.0", + "libdd-common 5.0.0", "libdd-tinybytes 1.1.1", "libdd-trace-normalization 2.0.0", "libdd-trace-protobuf 3.0.2", @@ -1821,8 +1882,10 @@ dependencies = [ "rmp", "rmp-serde", "rmpv", + "rustc-hash", "serde", "serde_json", + "thin-vec", "tokio", "tracing", "urlencoding", @@ -2766,6 +2829,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.13" @@ -2802,6 +2892,15 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.29" @@ -3162,6 +3261,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "thin-vec" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" + [[package]] name = "thiserror" version = "1.0.69" @@ -3585,6 +3690,16 @@ dependencies = [ "libc", ] +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -3731,6 +3846,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -3761,6 +3885,15 @@ dependencies = [ "rustix 0.38.44", ] +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "windows" version = "0.48.0" @@ -3776,6 +3909,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -3812,6 +3954,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3860,6 +4017,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3878,6 +4041,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3896,6 +4065,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3926,6 +4101,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3944,6 +4125,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3962,6 +4149,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3980,6 +4173,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/crates/datadog-agent-config/Cargo.toml b/crates/datadog-agent-config/Cargo.toml index 62e7d64..be92cf6 100644 --- a/crates/datadog-agent-config/Cargo.toml +++ b/crates/datadog-agent-config/Cargo.toml @@ -6,8 +6,8 @@ license.workspace = true [dependencies] figment = { version = "0.10", default-features = false, features = ["yaml", "env"] } -libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03", default-features = false } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03", default-features = false } +libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } log = { version = "0.4", default-features = false } serde = { version = "1.0", default-features = false, features = ["derive"] } serde-aux = { version = "4.7", default-features = false } diff --git a/crates/datadog-metrics-collector/Cargo.toml b/crates/datadog-metrics-collector/Cargo.toml index c61d677..991a1c2 100644 --- a/crates/datadog-metrics-collector/Cargo.toml +++ b/crates/datadog-metrics-collector/Cargo.toml @@ -8,7 +8,7 @@ description = "Collector to read, compute, and submit enhanced metrics in Server [dependencies] dogstatsd = { path = "../dogstatsd", default-features = true } tracing = { version = "0.1", default-features = false } -libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03", default-features = false } +libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } [target.'cfg(windows)'.dependencies] windows-sys = { version = "0.61", features = ["Win32_System_JobObjects"], optional = true, default-features = false } diff --git a/crates/datadog-serverless-compat/Cargo.toml b/crates/datadog-serverless-compat/Cargo.toml index d51354a..7dd6a94 100644 --- a/crates/datadog-serverless-compat/Cargo.toml +++ b/crates/datadog-serverless-compat/Cargo.toml @@ -14,7 +14,7 @@ windows-enhanced-metrics = ["datadog-metrics-collector/windows-enhanced-metrics" datadog-logs-agent = { path = "../datadog-logs-agent" } datadog-metrics-collector = { path = "../datadog-metrics-collector" } datadog-trace-agent = { path = "../datadog-trace-agent" } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } datadog-fips = { path = "../datadog-fips", default-features = false } dogstatsd = { path = "../dogstatsd", default-features = true } reqwest = { version = "0.12.4", default-features = false } diff --git a/crates/datadog-trace-agent/Cargo.toml b/crates/datadog-trace-agent/Cargo.toml index e4a557c..18d4822 100644 --- a/crates/datadog-trace-agent/Cargo.toml +++ b/crates/datadog-trace-agent/Cargo.toml @@ -25,16 +25,16 @@ tracing = { version = "0.1", default-features = false } serde = { version = "1.0.145", features = ["derive"] } serde_json = "1.0" thiserror = { version = "1.0.58", default-features = false } -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-capabilities-impl = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-library-config = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03", features = [ +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-capabilities-impl = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", features = [ "mini_agent", ] } -libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" } +libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } datadog-fips = { path = "../datadog-fips" } reqwest = { version = "0.12.23", features = [ "json", @@ -49,6 +49,6 @@ serial_test = "2.0.0" duplicate = "2.0.1" temp-env = "0.3.6" tempfile = "3.3.0" -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "48da0d82cb32b43d4cdece35b794c9bcbc275a03", features = [ +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", features = [ "test-utils", ] } diff --git a/crates/datadog-trace-agent/src/config.rs b/crates/datadog-trace-agent/src/config.rs index 5be9fbe..7152e80 100644 --- a/crates/datadog-trace-agent/src/config.rs +++ b/crates/datadog-trace-agent/src/config.rs @@ -115,6 +115,7 @@ pub struct Config { pub proxy_url: Option, pub env: String, pub peer_tags: Vec, + pub additional_metric_tags: Vec, /// Whether the agent should compute trace stats pub agent_stats_computation_enabled: bool, } @@ -262,6 +263,11 @@ impl Config { tags, env: env::var("DD_ENV").unwrap_or_else(|_| "none".to_string()), peer_tags: peer_tag_keys()?, + additional_metric_tags: env::var("DD_TRACE_STATS_ADDITIONAL_TAGS") + .ok() + .filter(|s| !s.is_empty()) + .map(|s| s.split(',').map(str::to_owned).collect()) + .unwrap_or_default(), agent_stats_computation_enabled: env::var("DD_AGENT_STATS_COMPUTATION_ENABLED") .map(|val| val.to_lowercase() == "true") .unwrap_or(false), @@ -782,6 +788,7 @@ pub mod test_helpers { proxy_url: None, env: "none".to_string(), peer_tags: peer_tag_keys().unwrap(), + additional_metric_tags: vec![], agent_stats_computation_enabled: false, } } diff --git a/crates/datadog-trace-agent/src/stats_concentrator_service.rs b/crates/datadog-trace-agent/src/stats_concentrator_service.rs index 24eef1b..96afc18 100644 --- a/crates/datadog-trace-agent/src/stats_concentrator_service.rs +++ b/crates/datadog-trace-agent/src/stats_concentrator_service.rs @@ -81,7 +81,10 @@ impl StatsConcentratorService { (service, handle) } - fn new_span_concentrator(peer_tags: Vec) -> SpanConcentrator { + fn new_span_concentrator( + peer_tags: Vec, + additional_metric_tags: Vec, + ) -> SpanConcentrator { SpanConcentrator::new( Duration::from_nanos(BUCKET_DURATION_NS), SystemTime::now(), @@ -90,6 +93,7 @@ impl StatsConcentratorService { .map(|s| s.to_string()) .collect(), peer_tags, + additional_metric_tags, ) } @@ -106,7 +110,12 @@ impl StatsConcentratorService { let concentrator = self .concentrators .entry(Arc::clone(&metadata)) - .or_insert_with(|| Self::new_span_concentrator(config.peer_tags.clone())); + .or_insert_with(|| { + Self::new_span_concentrator( + config.peer_tags.clone(), + config.additional_metric_tags.clone(), + ) + }); for span in &chunk.spans { concentrator.add_span(span); diff --git a/crates/datadog-trace-agent/src/trace_processor.rs b/crates/datadog-trace-agent/src/trace_processor.rs index 041153a..4eb148a 100644 --- a/crates/datadog-trace-agent/src/trace_processor.rs +++ b/crates/datadog-trace-agent/src/trace_processor.rs @@ -285,6 +285,7 @@ mod tests { tags: Tags::from_env_string("env:test,service:my-service"), env: "test-env".to_string(), peer_tags: peer_tag_keys().unwrap(), + additional_metric_tags: vec![], agent_stats_computation_enabled: false, } } From bf96688e3dbd466347d59a8650c3e6d0755c8470 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Fri, 26 Jun 2026 14:37:48 -0400 Subject: [PATCH 2/4] update libdatadog rev --- Cargo.lock | 26 ++++++++++----------- crates/datadog-agent-config/Cargo.toml | 4 ++-- crates/datadog-metrics-collector/Cargo.toml | 2 +- crates/datadog-serverless-compat/Cargo.toml | 2 +- crates/datadog-trace-agent/Cargo.toml | 18 +++++++------- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2b08bd..f834e45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1506,7 +1506,7 @@ checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libdd-capabilities" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "bytes", @@ -1517,7 +1517,7 @@ dependencies = [ [[package]] name = "libdd-capabilities-impl" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "bytes", "http", @@ -1561,7 +1561,7 @@ dependencies = [ [[package]] name = "libdd-common" version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "bytes", @@ -1635,7 +1635,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.0.1" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "prost 0.14.3", ] @@ -1657,7 +1657,7 @@ dependencies = [ [[package]] name = "libdd-library-config" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "libc", @@ -1674,7 +1674,7 @@ dependencies = [ [[package]] name = "libdd-shared-runtime" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "async-trait", "futures", @@ -1725,7 +1725,7 @@ dependencies = [ [[package]] name = "libdd-tinybytes" version = "1.1.1" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "serde", ] @@ -1743,7 +1743,7 @@ dependencies = [ [[package]] name = "libdd-trace-normalization" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "libdd-trace-protobuf 3.0.2", @@ -1752,7 +1752,7 @@ dependencies = [ [[package]] name = "libdd-trace-obfuscation" version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "fluent-uri", @@ -1779,7 +1779,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "prost 0.14.3", "serde", @@ -1801,7 +1801,7 @@ dependencies = [ [[package]] name = "libdd-trace-stats" version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "arc-swap", @@ -1811,7 +1811,7 @@ dependencies = [ "libdd-capabilities", "libdd-capabilities-impl", "libdd-common 5.0.0", - "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d)", + "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4)", "libdd-shared-runtime", "libdd-trace-obfuscation", "libdd-trace-protobuf 3.0.2", @@ -1854,7 +1854,7 @@ dependencies = [ [[package]] name = "libdd-trace-utils" version = "8.0.0" -source = "git+https://github.com/DataDog/libdatadog?rev=b100350466504acbd12f8ca0da074464beda025d#b100350466504acbd12f8ca0da074464beda025d" +source = "git+https://github.com/DataDog/libdatadog?rev=fc99d327bb54ca04a7c28b67117f546b11ea48a4#fc99d327bb54ca04a7c28b67117f546b11ea48a4" dependencies = [ "anyhow", "base64 0.22.1", diff --git a/crates/datadog-agent-config/Cargo.toml b/crates/datadog-agent-config/Cargo.toml index be92cf6..538c881 100644 --- a/crates/datadog-agent-config/Cargo.toml +++ b/crates/datadog-agent-config/Cargo.toml @@ -6,8 +6,8 @@ license.workspace = true [dependencies] figment = { version = "0.10", default-features = false, features = ["yaml", "env"] } -libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } +libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", default-features = false } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", default-features = false } log = { version = "0.4", default-features = false } serde = { version = "1.0", default-features = false, features = ["derive"] } serde-aux = { version = "4.7", default-features = false } diff --git a/crates/datadog-metrics-collector/Cargo.toml b/crates/datadog-metrics-collector/Cargo.toml index 991a1c2..469947c 100644 --- a/crates/datadog-metrics-collector/Cargo.toml +++ b/crates/datadog-metrics-collector/Cargo.toml @@ -8,7 +8,7 @@ description = "Collector to read, compute, and submit enhanced metrics in Server [dependencies] dogstatsd = { path = "../dogstatsd", default-features = true } tracing = { version = "0.1", default-features = false } -libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", default-features = false } +libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", default-features = false } [target.'cfg(windows)'.dependencies] windows-sys = { version = "0.61", features = ["Win32_System_JobObjects"], optional = true, default-features = false } diff --git a/crates/datadog-serverless-compat/Cargo.toml b/crates/datadog-serverless-compat/Cargo.toml index 7dd6a94..410a121 100644 --- a/crates/datadog-serverless-compat/Cargo.toml +++ b/crates/datadog-serverless-compat/Cargo.toml @@ -14,7 +14,7 @@ windows-enhanced-metrics = ["datadog-metrics-collector/windows-enhanced-metrics" datadog-logs-agent = { path = "../datadog-logs-agent" } datadog-metrics-collector = { path = "../datadog-metrics-collector" } datadog-trace-agent = { path = "../datadog-trace-agent" } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } datadog-fips = { path = "../datadog-fips", default-features = false } dogstatsd = { path = "../dogstatsd", default-features = true } reqwest = { version = "0.12.4", default-features = false } diff --git a/crates/datadog-trace-agent/Cargo.toml b/crates/datadog-trace-agent/Cargo.toml index 18d4822..2923689 100644 --- a/crates/datadog-trace-agent/Cargo.toml +++ b/crates/datadog-trace-agent/Cargo.toml @@ -25,16 +25,16 @@ tracing = { version = "0.1", default-features = false } serde = { version = "1.0.145", features = ["derive"] } serde_json = "1.0" thiserror = { version = "1.0.58", default-features = false } -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-capabilities-impl = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-library-config = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", features = [ +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-capabilities-impl = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", features = [ "mini_agent", ] } -libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d" } +libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" } datadog-fips = { path = "../datadog-fips" } reqwest = { version = "0.12.23", features = [ "json", @@ -49,6 +49,6 @@ serial_test = "2.0.0" duplicate = "2.0.1" temp-env = "0.3.6" tempfile = "3.3.0" -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "b100350466504acbd12f8ca0da074464beda025d", features = [ +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", features = [ "test-utils", ] } From 4971f738f2f9a75678e1a0be63cb028fe8baa503 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Fri, 26 Jun 2026 14:39:06 -0400 Subject: [PATCH 3/4] add DD_TRACE_STATS_ADDITIONAL_TAGS_CARDINALITY_LIMIT --- crates/datadog-trace-agent/src/config.rs | 10 ++++++++++ .../src/stats_concentrator_service.rs | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/datadog-trace-agent/src/config.rs b/crates/datadog-trace-agent/src/config.rs index 7152e80..6363027 100644 --- a/crates/datadog-trace-agent/src/config.rs +++ b/crates/datadog-trace-agent/src/config.rs @@ -115,7 +115,10 @@ pub struct Config { pub proxy_url: Option, pub env: String, pub peer_tags: Vec, + /// Tag keys extracted from spans and used as additional aggregation dimensions in stats. pub additional_metric_tags: Vec, + /// Configures the per-bucket cardinality limit for additional_metric_tags stat entries. + pub additional_metric_tags_cardinality_limit: Option, /// Whether the agent should compute trace stats pub agent_stats_computation_enabled: bool, } @@ -268,6 +271,12 @@ impl Config { .filter(|s| !s.is_empty()) .map(|s| s.split(',').map(str::to_owned).collect()) .unwrap_or_default(), + additional_metric_tags_cardinality_limit: env::var( + "DD_TRACE_STATS_ADDITIONAL_TAGS_CARDINALITY_LIMIT", + ) + .ok() + .and_then(|s| s.parse::().ok()) + .filter(|&n| n > 0), agent_stats_computation_enabled: env::var("DD_AGENT_STATS_COMPUTATION_ENABLED") .map(|val| val.to_lowercase() == "true") .unwrap_or(false), @@ -789,6 +798,7 @@ pub mod test_helpers { env: "none".to_string(), peer_tags: peer_tag_keys().unwrap(), additional_metric_tags: vec![], + additional_metric_tags_cardinality_limit: None, agent_stats_computation_enabled: false, } } diff --git a/crates/datadog-trace-agent/src/stats_concentrator_service.rs b/crates/datadog-trace-agent/src/stats_concentrator_service.rs index 96afc18..a4fe00a 100644 --- a/crates/datadog-trace-agent/src/stats_concentrator_service.rs +++ b/crates/datadog-trace-agent/src/stats_concentrator_service.rs @@ -84,8 +84,9 @@ impl StatsConcentratorService { fn new_span_concentrator( peer_tags: Vec, additional_metric_tags: Vec, + additional_metric_tags_cardinality_limit: Option, ) -> SpanConcentrator { - SpanConcentrator::new( + let mut concentrator = SpanConcentrator::new( Duration::from_nanos(BUCKET_DURATION_NS), SystemTime::now(), SPAN_KINDS_STATS_COMPUTED @@ -94,7 +95,11 @@ impl StatsConcentratorService { .collect(), peer_tags, additional_metric_tags, - ) + ); + if let Some(limit) = additional_metric_tags_cardinality_limit { + concentrator.set_additional_metric_tags_cardinality_limit(limit); + } + concentrator } pub async fn run(mut self) { @@ -114,6 +119,7 @@ impl StatsConcentratorService { Self::new_span_concentrator( config.peer_tags.clone(), config.additional_metric_tags.clone(), + config.additional_metric_tags_cardinality_limit, ) }); From 6fae2577f752f416d15a9fd5e7ff73d8f19fcbc4 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Fri, 26 Jun 2026 15:05:04 -0400 Subject: [PATCH 4/4] add DD_TRACE_EXPERIMENTAL_FEATURES_ENABLED --- crates/datadog-trace-agent/src/config.rs | 78 ++++++++++++++++--- .../src/trace_processor.rs | 2 + 2 files changed, 69 insertions(+), 11 deletions(-) diff --git a/crates/datadog-trace-agent/src/config.rs b/crates/datadog-trace-agent/src/config.rs index 6363027..f9796df 100644 --- a/crates/datadog-trace-agent/src/config.rs +++ b/crates/datadog-trace-agent/src/config.rs @@ -115,9 +115,13 @@ pub struct Config { pub proxy_url: Option, pub env: String, pub peer_tags: Vec, + /// Gates additional_metric_tags and related config. + pub experimental_features_enabled: bool, /// Tag keys extracted from spans and used as additional aggregation dimensions in stats. + /// Only populated when experimental_features_enabled is true. pub additional_metric_tags: Vec, /// Configures the per-bucket cardinality limit for additional_metric_tags stat entries. + /// Only populated when experimental_features_enabled is true. pub additional_metric_tags_cardinality_limit: Option, /// Whether the agent should compute trace stats pub agent_stats_computation_enabled: bool, @@ -220,6 +224,10 @@ impl Config { Tags::new() }; + let experimental_features_enabled = env::var("DD_TRACE_EXPERIMENTAL_FEATURES_ENABLED") + .map(|val| val.to_lowercase() == "true") + .unwrap_or(false); + #[allow(clippy::unwrap_used)] Ok(Config { app_name: Some(app_name), @@ -266,17 +274,24 @@ impl Config { tags, env: env::var("DD_ENV").unwrap_or_else(|_| "none".to_string()), peer_tags: peer_tag_keys()?, - additional_metric_tags: env::var("DD_TRACE_STATS_ADDITIONAL_TAGS") - .ok() - .filter(|s| !s.is_empty()) - .map(|s| s.split(',').map(str::to_owned).collect()) - .unwrap_or_default(), - additional_metric_tags_cardinality_limit: env::var( - "DD_TRACE_STATS_ADDITIONAL_TAGS_CARDINALITY_LIMIT", - ) - .ok() - .and_then(|s| s.parse::().ok()) - .filter(|&n| n > 0), + experimental_features_enabled, + additional_metric_tags: if experimental_features_enabled { + env::var("DD_TRACE_STATS_ADDITIONAL_TAGS") + .ok() + .filter(|s| !s.is_empty()) + .map(|s| s.split(',').map(str::to_owned).collect()) + .unwrap_or_default() + } else { + vec![] + }, + additional_metric_tags_cardinality_limit: if experimental_features_enabled { + env::var("DD_TRACE_STATS_ADDITIONAL_TAGS_CARDINALITY_LIMIT") + .ok() + .and_then(|s| s.parse::().ok()) + .filter(|&n| n > 0) + } else { + None + }, agent_stats_computation_enabled: env::var("DD_AGENT_STATS_COMPUTATION_ENABLED") .map(|val| val.to_lowercase() == "true") .unwrap_or(false), @@ -760,6 +775,46 @@ mod tests { }, ); } + + #[test] + #[serial] + fn test_additional_metric_tags_gated_by_experimental_flag() { + let base_vars = [ + ("DD_API_KEY", Some("_not_a_real_key_")), + ("K_SERVICE", Some("function_name")), + ("FUNCTION_TARGET", Some("function_target")), + ("DD_TRACE_STATS_ADDITIONAL_TAGS", Some("region,tenant_id")), + ]; + + temp_env::with_vars( + base_vars + .iter() + .cloned() + .chain([("DD_TRACE_EXPERIMENTAL_FEATURES_ENABLED", Some("false"))]) + .collect::>(), + || { + let config = config::Config::new().unwrap(); + assert!(!config.experimental_features_enabled); + assert!(config.additional_metric_tags.is_empty()); + }, + ); + + temp_env::with_vars( + base_vars + .iter() + .cloned() + .chain([("DD_TRACE_EXPERIMENTAL_FEATURES_ENABLED", Some("true"))]) + .collect::>(), + || { + let config = config::Config::new().unwrap(); + assert!(config.experimental_features_enabled); + assert_eq!( + config.additional_metric_tags, + vec!["region".to_string(), "tenant_id".to_string()] + ); + }, + ); + } } /// Test helpers for creating Config instances in tests @@ -797,6 +852,7 @@ pub mod test_helpers { proxy_url: None, env: "none".to_string(), peer_tags: peer_tag_keys().unwrap(), + experimental_features_enabled: false, additional_metric_tags: vec![], additional_metric_tags_cardinality_limit: None, agent_stats_computation_enabled: false, diff --git a/crates/datadog-trace-agent/src/trace_processor.rs b/crates/datadog-trace-agent/src/trace_processor.rs index 4eb148a..857d6f1 100644 --- a/crates/datadog-trace-agent/src/trace_processor.rs +++ b/crates/datadog-trace-agent/src/trace_processor.rs @@ -285,7 +285,9 @@ mod tests { tags: Tags::from_env_string("env:test,service:my-service"), env: "test-env".to_string(), peer_tags: peer_tag_keys().unwrap(), + experimental_features_enabled: false, additional_metric_tags: vec![], + additional_metric_tags_cardinality_limit: None, agent_stats_computation_enabled: false, } }