Skip to main content

apollo_opentelemetry/config/
mod.rs

1//! Top-level OpenTelemetry configuration.
2
3mod attribute_limits;
4pub(crate) mod exporters;
5pub(crate) mod logs;
6pub(crate) mod metrics;
7pub(crate) mod processor;
8pub(crate) mod propagator;
9mod resource;
10pub(crate) mod traces;
11
12pub(crate) use processor::BatchProcessorConfig;
13pub(crate) use processor::RateLimitedProcessorConfig;
14
15use attribute_limits::AttributeLimitsConfig;
16pub(crate) use exporters::LogExporter;
17pub(crate) use exporters::MetricExporter;
18pub(crate) use exporters::SpanExporter;
19pub(crate) use logs::LogRecordProcessor;
20use logs::LoggerProviderConfig;
21use metrics::MeterProviderConfig;
22pub(crate) use metrics::MetricReader;
23use propagator::PropagatorConfig;
24use resource::ResourceConfig;
25pub(crate) use traces::SpanProcessor;
26use traces::TracerProviderConfig;
27
28use apollo_configuration::configuration;
29
30/// Top-level OpenTelemetry configuration.
31///
32/// This structure follows the OTel declarative configuration standard with
33/// first-class enum variants for exporters.
34#[configuration]
35pub struct OpenTelemetryConfig {
36    /// Schema version (e.g., "1.0-rc.1").
37    pub(crate) file_format: Option<String>,
38
39    /// When true, the SDK is disabled.
40    pub(crate) disabled: Option<bool>,
41
42    /// Internal SDK logger severity threshold.
43    pub(crate) log_level: Option<LogLevel>,
44
45    /// Global attribute constraints.
46    pub(crate) attribute_limits: AttributeLimitsConfig,
47
48    /// Service identity attributes.
49    pub(crate) resource: ResourceConfig,
50
51    /// Context propagation configuration.
52    pub(crate) propagator: PropagatorConfig,
53
54    /// Span collection and export.
55    pub(crate) tracer_provider: TracerProviderConfig,
56
57    /// Metric collection and export.
58    pub(crate) meter_provider: MeterProviderConfig,
59
60    /// Log collection and export.
61    pub(crate) logger_provider: LoggerProviderConfig,
62}
63
64/// Log level for SDK internal logging.
65#[configuration]
66#[derive(Copy, PartialEq, Eq)]
67pub(crate) enum LogLevel {
68    Trace,
69    Debug,
70    Info,
71    Warn,
72    Error,
73}
74
75#[cfg(test)]
76mod tests {
77    use apollo_configuration::parse_yaml;
78
79    use super::*;
80
81    #[test]
82    fn parse_minimal_config() {
83        let config: OpenTelemetryConfig = parse_yaml("{}", &Default::default()).unwrap();
84        assert!(config.disabled.is_none());
85    }
86
87    #[test]
88    fn parse_disabled_config() {
89        let config: OpenTelemetryConfig = parse_yaml(
90            indoc::indoc! {"
91                disabled: true
92            "},
93            &Default::default(),
94        )
95        .unwrap();
96        assert_eq!(config.disabled, Some(true));
97    }
98
99    #[test]
100    fn parse_full_config() {
101        let config: OpenTelemetryConfig = parse_yaml(
102            indoc::indoc! {"
103                file_format: '1.0-rc.1'
104                disabled: false
105                log_level: info
106
107                attribute_limits:
108                  attribute_count_limit: 128
109                  attribute_value_length_limit: 1024
110
111                resource:
112                  attributes:
113                    - name: service.name
114                      value: my-service
115
116                propagator:
117                  composite:
118                    - tracecontext
119                    - baggage
120
121                tracer_provider:
122                  processors:
123                    - batch:
124                        exporter:
125                          console: {}
126                  sampler: always_on
127                  limits:
128                    attribute_count_limit: 128
129
130                meter_provider:
131                  readers:
132                    - periodic:
133                        exporter:
134                          console: {}
135
136                logger_provider:
137                  processors:
138                    - batch:
139                        exporter:
140                          console: {}
141            "},
142            &Default::default(),
143        )
144        .unwrap();
145
146        assert_eq!(config.file_format, Some("1.0-rc.1".to_string()));
147        assert_eq!(config.disabled, Some(false));
148        assert!(config.log_level.is_some());
149    }
150
151    #[test]
152    fn json_schema() {
153        insta::assert_json_snapshot!(apollo_configuration::export_json_schema::<
154            OpenTelemetryConfig,
155        >());
156    }
157}