Skip to content

Commit 5dedfa1

Browse files
feat: Add support for DD_LOGS_ENABLED as alias for DD_SERVERLESS_LOGS_ENABLED (#928)
https://datadoghq.atlassian.net/browse/SVLS-7818 ## Overview Add DD_LOGS_ENABLED environment variable and YAML config option as an alias for DD_SERVERLESS_LOGS_ENABLED. Both variables now use OR logic, meaning logs are enabled if either variable is set to true. Changes: - Add logs_enabled field to EnvConfig and YamlConfig structs - Implement OR logic in merge_config functions: logs are enabled if either DD_LOGS_ENABLED or DD_SERVERLESS_LOGS_ENABLED is true - Add comprehensive test coverage with 9 test cases covering all combinations of the two variables - Maintain backward compatibility with existing configurations - Default value remains true when neither variable is set ## Testing Set DD_LOGS_ENABLED and DD_SERVERLESS_LOGS_ENABLED to false and expect: - [Log can be found in AWS console](https://us-east-1.console.aws.amazon.com/cloudwatch/home?region=us-east-1#logsV2:log-groups/log-group/$252Faws$252Flambda$252Fltn-fullinstrument-bn-cold-node22-lambda/log-events/2025$252F11$252F13$252F$255B$2524LATEST$255D455478dcbc944055b5be933e2e099f6a$3FfilterPattern$3DREPORT+RequestId) - [Log could NOT be found in DD console](https://ddserverless.datadoghq.com/logs?query=source%3Alambda%20%40lambda.arn%3A%22arn%3Aaws%3Alambda%3Aus-east-1%3A425362996713%3Afunction%3Altn-fullinstrument-bn-cold-node22-lambda%22%20AND%20%22REPORT%20RequestId%22&agg_m=count&agg_m_source=base&agg_t=count&clustering_pattern_field_path=message&cols=host%2Cservice%2C%40lambda.request_id&fromUser=true&messageDisplay=inline&refresh_mode=paused&storage=hot&stream_sort=desc&viz=stream&from_ts=1763063694206&to_ts=1763065424700&live=false) Otherwise the log should be available in DD console.
1 parent 3c44ef6 commit 5dedfa1

2 files changed

Lines changed: 180 additions & 1 deletion

File tree

env.rs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,11 @@ pub struct EnvConfig {
367367
/// Enable logs for AWS Lambda. Default is `true`.
368368
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
369369
pub serverless_logs_enabled: Option<bool>,
370+
/// @env `DD_LOGS_ENABLED`
371+
///
372+
/// Enable logs for AWS Lambda. Alias for `DD_SERVERLESS_LOGS_ENABLED`. Default is `true`.
373+
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
374+
pub logs_enabled: Option<bool>,
370375
/// @env `DD_SERVERLESS_FLUSH_STRATEGY`
371376
///
372377
/// The flush strategy to use for AWS Lambda.
@@ -616,6 +621,13 @@ fn merge_config(config: &mut Config, env_config: &EnvConfig) {
616621
merge_string!(config, env_config, kms_api_key);
617622
merge_string!(config, env_config, api_key_ssm_arn);
618623
merge_option_to_value!(config, env_config, serverless_logs_enabled);
624+
625+
// Handle serverless_logs_enabled with OR logic: if either DD_LOGS_ENABLED or DD_SERVERLESS_LOGS_ENABLED is true, enable logs
626+
if env_config.serverless_logs_enabled.is_some() || env_config.logs_enabled.is_some() {
627+
config.serverless_logs_enabled = env_config.serverless_logs_enabled.unwrap_or(false)
628+
|| env_config.logs_enabled.unwrap_or(false);
629+
}
630+
619631
merge_option_to_value!(config, env_config, serverless_flush_strategy);
620632
merge_option_to_value!(config, env_config, enhanced_metrics);
621633
merge_option_to_value!(config, env_config, lambda_proc_enhanced_metrics);
@@ -981,4 +993,163 @@ mod tests {
981993
Ok(())
982994
});
983995
}
996+
997+
#[test]
998+
fn test_dd_logs_enabled_true() {
999+
figment::Jail::expect_with(|jail| {
1000+
jail.clear_env();
1001+
jail.set_env("DD_LOGS_ENABLED", "true");
1002+
1003+
let mut config = Config::default();
1004+
let env_config_source = EnvConfigSource;
1005+
env_config_source
1006+
.load(&mut config)
1007+
.expect("Failed to load config");
1008+
1009+
assert!(config.serverless_logs_enabled);
1010+
Ok(())
1011+
});
1012+
}
1013+
1014+
#[test]
1015+
fn test_dd_logs_enabled_false() {
1016+
figment::Jail::expect_with(|jail| {
1017+
jail.clear_env();
1018+
jail.set_env("DD_LOGS_ENABLED", "false");
1019+
1020+
let mut config = Config::default();
1021+
let env_config_source = EnvConfigSource;
1022+
env_config_source
1023+
.load(&mut config)
1024+
.expect("Failed to load config");
1025+
1026+
assert!(!config.serverless_logs_enabled);
1027+
Ok(())
1028+
});
1029+
}
1030+
1031+
#[test]
1032+
fn test_dd_serverless_logs_enabled_true() {
1033+
figment::Jail::expect_with(|jail| {
1034+
jail.clear_env();
1035+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");
1036+
1037+
let mut config = Config::default();
1038+
let env_config_source = EnvConfigSource;
1039+
env_config_source
1040+
.load(&mut config)
1041+
.expect("Failed to load config");
1042+
1043+
assert!(config.serverless_logs_enabled);
1044+
Ok(())
1045+
});
1046+
}
1047+
1048+
#[test]
1049+
fn test_dd_serverless_logs_enabled_false() {
1050+
figment::Jail::expect_with(|jail| {
1051+
jail.clear_env();
1052+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");
1053+
1054+
let mut config = Config::default();
1055+
let env_config_source = EnvConfigSource;
1056+
env_config_source
1057+
.load(&mut config)
1058+
.expect("Failed to load config");
1059+
1060+
assert!(!config.serverless_logs_enabled);
1061+
Ok(())
1062+
});
1063+
}
1064+
1065+
#[test]
1066+
fn test_both_logs_enabled_true() {
1067+
figment::Jail::expect_with(|jail| {
1068+
jail.clear_env();
1069+
jail.set_env("DD_LOGS_ENABLED", "true");
1070+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");
1071+
1072+
let mut config = Config::default();
1073+
let env_config_source = EnvConfigSource;
1074+
env_config_source
1075+
.load(&mut config)
1076+
.expect("Failed to load config");
1077+
1078+
assert!(config.serverless_logs_enabled);
1079+
Ok(())
1080+
});
1081+
}
1082+
1083+
#[test]
1084+
fn test_both_logs_enabled_false() {
1085+
figment::Jail::expect_with(|jail| {
1086+
jail.clear_env();
1087+
jail.set_env("DD_LOGS_ENABLED", "false");
1088+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");
1089+
1090+
let mut config = Config::default();
1091+
let env_config_source = EnvConfigSource;
1092+
env_config_source
1093+
.load(&mut config)
1094+
.expect("Failed to load config");
1095+
1096+
assert!(!config.serverless_logs_enabled);
1097+
Ok(())
1098+
});
1099+
}
1100+
1101+
#[test]
1102+
fn test_logs_enabled_true_serverless_logs_enabled_false() {
1103+
figment::Jail::expect_with(|jail| {
1104+
jail.clear_env();
1105+
jail.set_env("DD_LOGS_ENABLED", "true");
1106+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");
1107+
1108+
let mut config = Config::default();
1109+
let env_config_source = EnvConfigSource;
1110+
env_config_source
1111+
.load(&mut config)
1112+
.expect("Failed to load config");
1113+
1114+
// OR logic: if either is true, logs are enabled
1115+
assert!(config.serverless_logs_enabled);
1116+
Ok(())
1117+
});
1118+
}
1119+
1120+
#[test]
1121+
fn test_logs_enabled_false_serverless_logs_enabled_true() {
1122+
figment::Jail::expect_with(|jail| {
1123+
jail.clear_env();
1124+
jail.set_env("DD_LOGS_ENABLED", "false");
1125+
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");
1126+
1127+
let mut config = Config::default();
1128+
let env_config_source = EnvConfigSource;
1129+
env_config_source
1130+
.load(&mut config)
1131+
.expect("Failed to load config");
1132+
1133+
// OR logic: if either is true, logs are enabled
1134+
assert!(config.serverless_logs_enabled);
1135+
Ok(())
1136+
});
1137+
}
1138+
1139+
#[test]
1140+
fn test_neither_logs_enabled_set_uses_default() {
1141+
figment::Jail::expect_with(|jail| {
1142+
jail.clear_env();
1143+
1144+
let mut config = Config::default();
1145+
let env_config_source = EnvConfigSource;
1146+
env_config_source
1147+
.load(&mut config)
1148+
.expect("Failed to load config");
1149+
1150+
// Default value is true
1151+
assert!(config.serverless_logs_enabled);
1152+
Ok(())
1153+
});
1154+
}
9841155
}

yaml.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ pub struct YamlConfig {
101101
pub kms_api_key: Option<String>,
102102
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
103103
pub serverless_logs_enabled: Option<bool>,
104+
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
105+
pub logs_enabled: Option<bool>,
104106
pub serverless_flush_strategy: Option<FlushStrategy>,
105107
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
106108
pub enhanced_metrics: Option<bool>,
@@ -671,7 +673,13 @@ fn merge_config(config: &mut Config, yaml_config: &YamlConfig) {
671673
// AWS Lambda
672674
merge_string!(config, yaml_config, api_key_secret_arn);
673675
merge_string!(config, yaml_config, kms_api_key);
674-
merge_option_to_value!(config, yaml_config, serverless_logs_enabled);
676+
677+
// Handle serverless_logs_enabled with OR logic: if either logs_enabled or serverless_logs_enabled is true, enable logs
678+
if yaml_config.serverless_logs_enabled.is_some() || yaml_config.logs_enabled.is_some() {
679+
config.serverless_logs_enabled = yaml_config.serverless_logs_enabled.unwrap_or(false)
680+
|| yaml_config.logs_enabled.unwrap_or(false);
681+
}
682+
675683
merge_option_to_value!(config, yaml_config, serverless_flush_strategy);
676684
merge_option_to_value!(config, yaml_config, enhanced_metrics);
677685
merge_option_to_value!(config, yaml_config, lambda_proc_enhanced_metrics);

0 commit comments

Comments
 (0)