Skip to content

Commit 2022fe0

Browse files
authored
feat(remote config): Support ApmTracingMulticonfig in dynamic config (#1845)
Simple addition with priority support. Clone so that we now can clone the active config vs the received configs. Co-authored-by: bob.weinand <bob.weinand@datadoghq.com>
1 parent 4be1fcc commit 2022fe0

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

datadog-remote-config/src/config/dynamic.rs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,43 @@ use std::collections::HashMap;
77
#[derive(Debug, Deserialize)]
88
#[cfg_attr(feature = "test", derive(Default, Serialize))]
99
pub struct DynamicConfigTarget {
10-
pub service: String,
11-
pub env: String,
10+
#[serde(default)]
11+
pub service: Option<String>,
12+
#[serde(default)]
13+
pub env: Option<String>,
1214
}
1315

1416
#[derive(Debug, Deserialize)]
1517
#[cfg_attr(feature = "test", derive(Serialize))]
1618
pub struct DynamicConfigFile {
1719
pub action: String,
18-
pub service_target: DynamicConfigTarget,
20+
#[serde(default)]
21+
pub service_target: Option<DynamicConfigTarget>,
1922
pub lib_config: DynamicConfig,
2023
}
2124

22-
#[derive(Debug, Deserialize)]
25+
impl DynamicConfigFile {
26+
/// Returns the priority of this config for merge ordering.
27+
/// Lower value = higher priority.
28+
/// 0 = service+env specific, 1 = service only, 2 = env only,
29+
/// 3 = reserved (k8s cluster), 4 = org-level (wildcard/absent)
30+
pub fn priority(&self) -> u8 {
31+
fn is_specific(s: &Option<String>) -> bool {
32+
s.as_deref().is_some_and(|v| v != "*")
33+
}
34+
match &self.service_target {
35+
None => 4,
36+
Some(t) => match (is_specific(&t.service), is_specific(&t.env)) {
37+
(true, true) => 0,
38+
(true, false) => 1,
39+
(false, true) => 2,
40+
(false, false) => 4,
41+
},
42+
}
43+
}
44+
}
45+
46+
#[derive(Debug, Clone, Deserialize)]
2347
#[cfg_attr(feature = "test", derive(Serialize))]
2448
pub(crate) struct TracingHeaderTag {
2549
pub header: String,
@@ -33,14 +57,14 @@ pub enum TracingSamplingRuleProvenance {
3357
Dynamic,
3458
}
3559

36-
#[derive(Debug, Deserialize)]
60+
#[derive(Debug, Clone, Deserialize)]
3761
#[cfg_attr(feature = "test", derive(Serialize))]
3862
pub struct TracingSamplingRuleTag {
3963
pub key: String,
4064
pub value_glob: String,
4165
}
4266

43-
#[derive(Debug, Deserialize)]
67+
#[derive(Debug, Clone, Deserialize)]
4468
#[cfg_attr(feature = "test", derive(Serialize))]
4569
pub struct TracingSamplingRule {
4670
pub service: String,
@@ -102,6 +126,7 @@ impl From<DynamicConfig> for Vec<Configs> {
102126
}
103127
}
104128

129+
#[derive(Clone)]
105130
pub enum Configs {
106131
TracingHeaderTags(HashMap<String, String>),
107132
TracingSampleRate(f64),
@@ -125,7 +150,7 @@ pub mod tests {
125150
pub fn dummy_dynamic_config(enabled: bool) -> DynamicConfigFile {
126151
DynamicConfigFile {
127152
action: "".to_string(),
128-
service_target: DynamicConfigTarget::default(),
153+
service_target: None,
129154
lib_config: DynamicConfig {
130155
tracing_enabled: Some(enabled),
131156
..DynamicConfig::default()

datadog-remote-config/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,6 @@ pub enum RemoteConfigCapabilities {
8282
ApmTracingEnableLiveDebugging = 41,
8383
AsmDdMulticonfig = 42,
8484
AsmTraceTaggingRules = 43,
85+
ApmTracingMulticonfig = 45,
8586
FfeFlagConfigurationRules = 46,
8687
}

0 commit comments

Comments
 (0)