Skip to content
Open
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
172 changes: 171 additions & 1 deletion bottlecap/src/config/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,11 @@ pub struct EnvConfig {
/// Enable logs for AWS Lambda. Default is `true`.
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
pub serverless_logs_enabled: Option<bool>,
/// @env `DD_LOGS_ENABLED`
///
/// Enable logs for AWS Lambda. Alias for `DD_SERVERLESS_LOGS_ENABLED`. Default is `true`.
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
pub logs_enabled: Option<bool>,
/// @env `DD_SERVERLESS_FLUSH_STRATEGY`
///
/// The flush strategy to use for AWS Lambda.
Expand Down Expand Up @@ -609,7 +614,13 @@ fn merge_config(config: &mut Config, env_config: &EnvConfig) {
// AWS Lambda
merge_string!(config, env_config, api_key_secret_arn);
merge_string!(config, env_config, kms_api_key);
merge_option_to_value!(config, env_config, serverless_logs_enabled);

// Handle serverless_logs_enabled with OR logic: if either DD_LOGS_ENABLED or DD_SERVERLESS_LOGS_ENABLED is true, enable logs
if env_config.serverless_logs_enabled.is_some() || env_config.logs_enabled.is_some() {
config.serverless_logs_enabled = env_config.serverless_logs_enabled.unwrap_or(false)
|| env_config.logs_enabled.unwrap_or(false);
}

merge_option_to_value!(config, env_config, serverless_flush_strategy);
merge_option_to_value!(config, env_config, enhanced_metrics);
merge_option_to_value!(config, env_config, lambda_proc_enhanced_metrics);
Expand Down Expand Up @@ -974,4 +985,163 @@ mod tests {
Ok(())
});
}

#[test]
fn test_dd_logs_enabled_true() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "true");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_dd_logs_enabled_false() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "false");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(!config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_dd_serverless_logs_enabled_true() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_dd_serverless_logs_enabled_false() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(!config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_both_logs_enabled_true() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "true");
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_both_logs_enabled_false() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "false");
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

assert!(!config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_logs_enabled_true_serverless_logs_enabled_false() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "true");
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "false");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

// OR logic: if either is true, logs are enabled
assert!(config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_logs_enabled_false_serverless_logs_enabled_true() {
figment::Jail::expect_with(|jail| {
jail.clear_env();
jail.set_env("DD_LOGS_ENABLED", "false");
jail.set_env("DD_SERVERLESS_LOGS_ENABLED", "true");

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

// OR logic: if either is true, logs are enabled
assert!(config.serverless_logs_enabled);
Ok(())
});
}

#[test]
fn test_neither_logs_enabled_set_uses_default() {
figment::Jail::expect_with(|jail| {
jail.clear_env();

let mut config = Config::default();
let env_config_source = EnvConfigSource;
env_config_source
.load(&mut config)
.expect("Failed to load config");

// Default value is true
assert!(config.serverless_logs_enabled);
Ok(())
});
}
}
10 changes: 9 additions & 1 deletion bottlecap/src/config/yaml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ pub struct YamlConfig {
pub kms_api_key: Option<String>,
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
pub serverless_logs_enabled: Option<bool>,
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
pub logs_enabled: Option<bool>,
pub serverless_flush_strategy: Option<FlushStrategy>,
#[serde(deserialize_with = "deserialize_optional_bool_from_anything")]
pub enhanced_metrics: Option<bool>,
Expand Down Expand Up @@ -671,7 +673,13 @@ fn merge_config(config: &mut Config, yaml_config: &YamlConfig) {
// AWS Lambda
merge_string!(config, yaml_config, api_key_secret_arn);
merge_string!(config, yaml_config, kms_api_key);
merge_option_to_value!(config, yaml_config, serverless_logs_enabled);

// Handle serverless_logs_enabled with OR logic: if either logs_enabled or serverless_logs_enabled is true, enable logs
if yaml_config.serverless_logs_enabled.is_some() || yaml_config.logs_enabled.is_some() {
config.serverless_logs_enabled = yaml_config.serverless_logs_enabled.unwrap_or(false)
|| yaml_config.logs_enabled.unwrap_or(false);
}

merge_option_to_value!(config, yaml_config, serverless_flush_strategy);
merge_option_to_value!(config, yaml_config, enhanced_metrics);
merge_option_to_value!(config, yaml_config, lambda_proc_enhanced_metrics);
Expand Down
Loading