Skip to content

Commit 8ce37eb

Browse files
authored
feat(agent-config): add logs_enabled master toggle (#138)
* feat(agent-config): add logs_enabled master toggle Adds the canonical dd-agent.yaml top-level `logs_enabled: bool` field to the upstream `Config` struct, sourced from `DD_LOGS_ENABLED` (env) and `logs_enabled` (datadog.yaml). Matches dd-agent's pkg/config/config_template.yaml documentation and defaults to `false`. Currently the lambda extension carries this as a source-side alias on its `LambdaConfigSource` that OR-merges into a separate `serverless_logs_enabled` field. Pushing `logs_enabled` upstream means consumers (lambda extension and any future embedder) have a real resolved config field for the canonical dd-agent toggle, instead of synthesizing one. * test(agent-config): give logs_enabled an invalid type in fallback test Address Copilot review: in the yaml broken-fallback test, every non-string field is set to an invalid type (e.g. [1, 2, 3]) to exercise graceful fallback to defaults. logs_enabled was inadvertently set to a valid boolean (true), which defeated the test's intent for this new field. Set it to [1, 2, 3] and assert the resolved value stays at the default (false). Now the test fails if graceful-fallback handling for logs_enabled ever regresses.
1 parent f76e911 commit 8ce37eb

3 files changed

Lines changed: 55 additions & 0 deletions

File tree

crates/datadog-agent-config/src/lib.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ pub struct Config<E: ConfigExtension = NoExtension> {
7474
pub tags: HashMap<String, String>,
7575

7676
// Logs
77+
/// Master toggle for log collection. Sourced from `DD_LOGS_ENABLED` /
78+
/// `logs_enabled` in datadog.yaml. Defaults to `false` to match the
79+
/// dd-agent default; consumers that want a different default should
80+
/// override post-build or in their `ConfigExtension`.
81+
pub logs_enabled: bool,
7782
pub logs_config_logs_dd_url: String,
7883
pub logs_config_processing_rules: Option<Vec<ProcessingRule>>,
7984
pub logs_config_use_compression: bool,
@@ -189,6 +194,7 @@ impl<E: ConfigExtension> Default for Config<E> {
189194
compression_level: 3,
190195

191196
// Logs
197+
logs_enabled: false,
192198
logs_config_logs_dd_url: String::default(),
193199
logs_config_processing_rules: None,
194200
logs_config_use_compression: true,

crates/datadog-agent-config/src/sources/env.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ pub struct EnvConfig {
134134
pub compression_level: Option<i32>,
135135

136136
// Logs
137+
/// @env `DD_LOGS_ENABLED`
138+
///
139+
/// Master toggle for log collection. Default `false`.
140+
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
141+
pub logs_enabled: Option<bool>,
137142
/// @env `DD_LOGS_CONFIG_LOGS_DD_URL`
138143
///
139144
/// Define the endpoint and port to hit when using a proxy for logs.
@@ -403,6 +408,7 @@ fn merge_config<E: ConfigExtension>(config: &mut Config<E>, env_config: &EnvConf
403408
merge_option_to_value!(config, env_config, compression_level);
404409

405410
// Logs
411+
merge_option_to_value!(config, env_config, logs_enabled);
406412
merge_string!(config, env_config, logs_config_logs_dd_url);
407413
merge_option!(config, env_config, logs_config_processing_rules);
408414
merge_option_to_value!(config, env_config, logs_config_use_compression);
@@ -628,6 +634,7 @@ mod tests {
628634
),
629635
// Bool
630636
("DD_SKIP_SSL_VALIDATION", "not_a_bool"),
637+
("DD_LOGS_ENABLED", "not_a_bool"),
631638
("DD_LOGS_CONFIG_USE_COMPRESSION", "not_a_bool"),
632639
(
633640
"DD_APM_CONFIG_OBFUSCATION_HTTP_REMOVE_QUERY_STRING",
@@ -846,6 +853,7 @@ mod tests {
846853
jail.set_env("DD_COMPRESSION_LEVEL", "4");
847854

848855
// Logs
856+
jail.set_env("DD_LOGS_ENABLED", "true");
849857
jail.set_env("DD_LOGS_CONFIG_LOGS_DD_URL", "https://logs.datadoghq.com");
850858
jail.set_env(
851859
"DD_LOGS_CONFIG_PROCESSING_RULES",
@@ -991,6 +999,7 @@ mod tests {
991999
("team".to_string(), "test-team".to_string()),
9921000
("project".to_string(), "test-project".to_string()),
9931001
]),
1002+
logs_enabled: true,
9941003
logs_config_logs_dd_url: "https://logs.datadoghq.com".to_string(),
9951004
logs_config_processing_rules: Some(vec![ProcessingRule {
9961005
kind: Kind::ExcludeAtMatch,
@@ -1122,6 +1131,37 @@ mod tests {
11221131
});
11231132
}
11241133

1134+
#[test]
1135+
fn test_logs_enabled_from_env() {
1136+
figment::Jail::expect_with(|jail| {
1137+
jail.clear_env();
1138+
jail.set_env("DD_LOGS_ENABLED", "true");
1139+
1140+
let mut config: Config = Config::default();
1141+
EnvConfigSource
1142+
.load(&mut config)
1143+
.expect("Failed to load config");
1144+
1145+
assert!(config.logs_enabled);
1146+
Ok(())
1147+
});
1148+
}
1149+
1150+
#[test]
1151+
fn test_logs_enabled_defaults_false_when_unset() {
1152+
figment::Jail::expect_with(|jail| {
1153+
jail.clear_env();
1154+
1155+
let mut config: Config = Config::default();
1156+
EnvConfigSource
1157+
.load(&mut config)
1158+
.expect("Failed to load config");
1159+
1160+
assert!(!config.logs_enabled);
1161+
Ok(())
1162+
});
1163+
}
1164+
11251165
#[test]
11261166
fn test_dd_org_uuid_from_env() {
11271167
figment::Jail::expect_with(|jail| {

crates/datadog-agent-config/src/sources/yaml.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ pub struct YamlConfig {
7272
pub tags: HashMap<String, String>,
7373

7474
// Logs
75+
/// YAML key: `logs_enabled`. Master toggle for log collection; matches
76+
/// dd-agent's top-level `logs_enabled` (default `false`).
77+
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
78+
pub logs_enabled: Option<bool>,
7579
#[serde(deserialize_with = "deserialize_with_default")]
7680
pub logs_config: LogsConfig,
7781

@@ -438,6 +442,7 @@ fn merge_config<E: ConfigExtension>(config: &mut Config<E>, yaml_config: &YamlCo
438442
merge_string!(config, yaml_config, dd_url);
439443

440444
// Logs
445+
merge_option_to_value!(config, yaml_config, logs_enabled);
441446
merge_string!(
442447
config,
443448
logs_config_logs_dd_url,
@@ -777,6 +782,7 @@ version: "v1.0.0"
777782
tags: 12345
778783
779784
# Logs (nested)
785+
logs_enabled: [1, 2, 3]
780786
logs_config:
781787
logs_dd_url: "https://custom-logs.example.com"
782788
processing_rules: 12345
@@ -867,6 +873,7 @@ otlp_config:
867873
expected.api_key = "test-api-key-12345".to_string();
868874
expected.dd_org_uuid = "00000000-0000-0000-0000-000000000001".to_string();
869875
expected.dd_url = "https://custom-metrics.example.com".to_string();
876+
// logs_enabled was given an invalid type above → must stay at default (false)
870877
expected.logs_config_logs_dd_url = "https://custom-logs.example.com".to_string();
871878
expected.apm_dd_url = "https://custom-apm.example.com".to_string();
872879
// Option<String> fields
@@ -934,6 +941,7 @@ tags:
934941
- "project:test-project"
935942
936943
# Logs
944+
logs_enabled: true
937945
logs_config:
938946
logs_dd_url: "https://logs.datadoghq.com"
939947
processing_rules:
@@ -1060,6 +1068,7 @@ otlp_config:
10601068
("team".to_string(), "test-team".to_string()),
10611069
("project".to_string(), "test-project".to_string()),
10621070
]),
1071+
logs_enabled: true,
10631072
logs_config_logs_dd_url: "https://logs.datadoghq.com".to_string(),
10641073
logs_config_processing_rules: Some(vec![ProcessingRule {
10651074
name: "test-exclude".to_string(),

0 commit comments

Comments
 (0)