Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
261 changes: 230 additions & 31 deletions Cargo.lock

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions crates/datadog-agent-config/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "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 }
Expand Down
2 changes: 1 addition & 1 deletion crates/datadog-metrics-collector/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", default-features = false }

[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.61", features = ["Win32_System_JobObjects"], optional = true, default-features = false }
Expand Down
2 changes: 1 addition & 1 deletion crates/datadog-serverless-compat/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" }
datadog-fips = { path = "../datadog-fips", default-features = false }
dogstatsd = { path = "../dogstatsd", default-features = true }
reqwest = { version = "0.12.4", default-features = false }
Expand Down
18 changes: 9 additions & 9 deletions crates/datadog-trace-agent/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "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 = "48da0d82cb32b43d4cdece35b794c9bcbc275a03" }
libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "fc99d327bb54ca04a7c28b67117f546b11ea48a4" }
datadog-fips = { path = "../datadog-fips" }
reqwest = { version = "0.12.23", features = [
"json",
Expand All @@ -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 = "fc99d327bb54ca04a7c28b67117f546b11ea48a4", features = [
"test-utils",
] }
73 changes: 73 additions & 0 deletions crates/datadog-trace-agent/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,14 @@ pub struct Config {
pub proxy_url: Option<String>,
pub env: String,
pub peer_tags: Vec<String>,
/// 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<String>,
/// 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<usize>,
/// Whether the agent should compute trace stats
pub agent_stats_computation_enabled: bool,
}
Expand Down Expand Up @@ -216,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),
Expand Down Expand Up @@ -262,6 +274,24 @@ impl Config {
tags,
env: env::var("DD_ENV").unwrap_or_else(|_| "none".to_string()),
peer_tags: peer_tag_keys()?,
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::<usize>().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),
Expand Down Expand Up @@ -745,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::<Vec<_>>(),
|| {
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::<Vec<_>>(),
|| {
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
Expand Down Expand Up @@ -782,6 +852,9 @@ 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,
}
}
Expand Down
23 changes: 19 additions & 4 deletions crates/datadog-trace-agent/src/stats_concentrator_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,25 @@ impl StatsConcentratorService {
(service, handle)
}

fn new_span_concentrator(peer_tags: Vec<String>) -> SpanConcentrator {
SpanConcentrator::new(
fn new_span_concentrator(
peer_tags: Vec<String>,
additional_metric_tags: Vec<String>,
additional_metric_tags_cardinality_limit: Option<usize>,
) -> SpanConcentrator {
let mut concentrator = SpanConcentrator::new(
Duration::from_nanos(BUCKET_DURATION_NS),
SystemTime::now(),
SPAN_KINDS_STATS_COMPUTED
.iter()
.map(|s| s.to_string())
.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) {
Expand All @@ -106,7 +115,13 @@ 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(),
config.additional_metric_tags_cardinality_limit,
)
});

for span in &chunk.spans {
concentrator.add_span(span);
Expand Down
3 changes: 3 additions & 0 deletions crates/datadog-trace-agent/src/trace_processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +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,
}
}
Expand Down