saluki_components/config/
mrf.rs

1//! Multi-region failover configuration.
2
3use agent_data_plane_config::domains::multi_region_failover;
4
5/// Multi-region failover configuration shared by signal-specific pipelines.
6#[derive(Debug, Eq, PartialEq)]
7pub struct MrfConfiguration {
8    enabled: bool,
9    api_key: Option<String>,
10    metrics_endpoint: Option<String>,
11}
12
13impl MrfConfiguration {
14    /// Creates a new `MrfConfiguration` from the resolved multi-region failover configuration.
15    pub fn from_configuration(mrf: &multi_region_failover::Domain) -> Self {
16        Self {
17            enabled: mrf.enabled,
18            api_key: mrf.api_key.clone(),
19            metrics_endpoint: mrf.metrics_endpoint_url(),
20        }
21    }
22
23    /// Returns whether multi-region failover is enabled for this process.
24    pub const fn is_enabled(&self) -> bool {
25        self.enabled
26    }
27
28    /// Returns the failover-region API key.
29    pub fn api_key(&self) -> Option<&str> {
30        self.api_key.as_deref()
31    }
32
33    /// Returns the failover-region metrics endpoint URL.
34    pub fn metrics_endpoint_url(&self) -> Option<&str> {
35        self.metrics_endpoint.as_deref()
36    }
37
38    /// Returns the endpoint and API key override for the failover-region metrics forwarder.
39    pub fn metrics_endpoint_override(&self) -> Option<(String, String)> {
40        if !self.enabled {
41            return None;
42        }
43
44        Some((self.metrics_endpoint.clone()?, self.api_key.clone()?))
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use agent_data_plane_config::domains::multi_region_failover::MetricMirroring;
51
52    use super::*;
53
54    fn mrf_config(mrf: multi_region_failover::Domain) -> MrfConfiguration {
55        MrfConfiguration::from_configuration(&mrf)
56    }
57
58    #[test]
59    fn carries_the_resolved_multi_region_failover_configuration() {
60        let config = mrf_config(multi_region_failover::Domain {
61            enabled: true,
62            api_key: Some("mrf-api-key".to_string()),
63            site: Some("datadoghq.eu".to_string()),
64            ..Default::default()
65        });
66
67        assert!(config.is_enabled());
68        assert_eq!(Some("mrf-api-key"), config.api_key());
69        assert_eq!(Some("https://app.mrf.datadoghq.eu"), config.metrics_endpoint_url());
70    }
71
72    #[test]
73    fn metrics_endpoint_override_requires_api_key_and_endpoint() {
74        let missing_api_key = mrf_config(multi_region_failover::Domain {
75            enabled: true,
76            site: Some("datadoghq.eu".to_string()),
77            ..Default::default()
78        });
79        assert_eq!(None, missing_api_key.metrics_endpoint_override());
80
81        let missing_endpoint = mrf_config(multi_region_failover::Domain {
82            enabled: true,
83            api_key: Some("mrf-api-key".to_string()),
84            ..Default::default()
85        });
86        assert_eq!(None, missing_endpoint.metrics_endpoint_override());
87
88        let ready = mrf_config(multi_region_failover::Domain {
89            enabled: true,
90            api_key: Some("mrf-api-key".to_string()),
91            dd_url: Some("https://mrf.example.com".to_string()),
92            ..Default::default()
93        });
94        assert_eq!(
95            Some(("https://mrf.example.com".to_string(), "mrf-api-key".to_string())),
96            ready.metrics_endpoint_override()
97        );
98    }
99
100    #[test]
101    fn metrics_endpoint_override_does_not_require_failover_metrics() {
102        // The endpoint override is what wires the failover forwarder, and it is deliberately independent of
103        // `failover_metrics`: that setting can turn metric mirroring on later, without a restart.
104        let config = mrf_config(multi_region_failover::Domain {
105            enabled: true,
106            metric_mirroring: MetricMirroring {
107                enabled: false,
108                allowlist: Vec::new(),
109            },
110            api_key: Some("mrf-api-key".to_string()),
111            dd_url: Some("https://mrf.example.com".to_string()),
112            ..Default::default()
113        });
114
115        assert_eq!(
116            Some(("https://mrf.example.com".to_string(), "mrf-api-key".to_string())),
117            config.metrics_endpoint_override()
118        );
119    }
120
121    #[test]
122    fn metrics_endpoint_override_is_none_when_disabled() {
123        // Even with a fully-populated endpoint and API key, `metrics_endpoint_override` short-circuits to `None`
124        // when multi-region failover is disabled (the `if !self.enabled` guard at the top of the method).
125        let config = mrf_config(multi_region_failover::Domain {
126            enabled: false,
127            api_key: Some("mrf-api-key".to_string()),
128            dd_url: Some("https://mrf.example.com".to_string()),
129            ..Default::default()
130        });
131
132        assert!(!config.is_enabled());
133        assert_eq!(None, config.metrics_endpoint_override());
134
135        // The endpoint itself still resolves; only the override is gated on `enabled`, which confirms the `None`
136        // above comes from the disabled short-circuit rather than a missing endpoint or API key.
137        assert_eq!(Some("https://mrf.example.com"), config.metrics_endpoint_url());
138        assert_eq!(Some("mrf-api-key"), config.api_key());
139    }
140}