saluki_components/
config.rs1use figment::{
3 providers::Serialized,
4 value::{Dict, Map},
5 Error, Metadata, Profile, Provider,
6};
7
8pub const KEY_ALIASES: &[(&str, &str)] = &[
15 ("proxy.http", "proxy_http"),
19 ("proxy.https", "proxy_https"),
20 ("proxy.no_proxy", "proxy_no_proxy"),
21 ("apm_config.enable_rare_sampler", "apm_enable_rare_sampler"),
22 (
23 "apm_config.error_tracking_standalone.enabled",
24 "apm_error_tracking_standalone_enabled",
25 ),
26];
27
28const ENV_REMAPPINGS: &[(&str, &str)] = &[("http_proxy", "proxy_http"), ("https_proxy", "proxy_https")];
32
33pub struct DatadogRemapper {
46 values: serde_json::Map<String, serde_json::Value>,
47}
48
49impl DatadogRemapper {
50 pub fn new() -> Self {
52 let mut values = serde_json::Map::new();
53
54 for (env_key, env_value) in std::env::vars() {
55 let lower = env_key.to_lowercase();
56 for &(from, to) in ENV_REMAPPINGS {
57 if lower == from && !values.contains_key(to) {
58 values.insert(to.to_string(), serde_json::Value::String(env_value.clone()));
59 }
60 }
61 }
62
63 Self { values }
64 }
65}
66
67impl Default for DatadogRemapper {
68 fn default() -> Self {
69 Self::new()
70 }
71}
72
73impl Provider for DatadogRemapper {
74 fn metadata(&self) -> Metadata {
75 Metadata::named("Datadog config remapper")
76 }
77
78 fn data(&self) -> Result<Map<Profile, Dict>, Error> {
79 if self.values.is_empty() {
80 return Ok(Map::new());
81 }
82 Serialized::defaults(serde_json::Value::Object(self.values.clone())).data()
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 static ENV_MUTEX: std::sync::Mutex<()> = std::sync::Mutex::new(());
91
92 #[test]
93 fn env_var_remapped_case_insensitively() {
94 let _guard = ENV_MUTEX.lock().unwrap();
95
96 std::env::set_var("HTTP_PROXY", "http://proxy.example.com");
97 let remapper = DatadogRemapper::new();
98 std::env::remove_var("HTTP_PROXY");
99
100 assert_eq!(
101 remapper.values.get("proxy_http").and_then(|v| v.as_str()),
102 Some("http://proxy.example.com"),
103 );
104 }
105
106 #[test]
107 fn env_var_not_remapped_when_absent() {
108 let _guard = ENV_MUTEX.lock().unwrap();
109
110 std::env::remove_var("HTTP_PROXY");
111 std::env::remove_var("http_proxy");
112 std::env::remove_var("HTTPS_PROXY");
113 std::env::remove_var("https_proxy");
114
115 let remapper = DatadogRemapper::new();
116
117 assert!(remapper.values.get("proxy_http").is_none());
118 assert!(remapper.values.get("proxy_https").is_none());
119 }
120}