tracing_kickstart/
conf.rs1use opentelemetry::{Key, Value};
2use secrecy::SecretString;
3use serde::{Deserialize, Serialize};
4use std::time::Duration;
5
6pub struct TracingConfigBuilder {
9 inner: TracingConfig,
10 runtime: TracingConfigOverride,
11}
12impl TracingConfigBuilder {
13 pub fn new(runtime_config: &TracingConfigOverride) -> Self {
14 Self {
15 inner: TracingConfig {
16 filter: None,
17 filter_append: runtime_config.filter_append.clone(),
18 log_file_path: None,
19 ansi_output: true,
20 ansi_sanitization: true,
21 deployment_env: runtime_config.deployment_env.clone(),
22 custom_resource_attrs: None,
23 metrics_interval: None,
24 otel_config: runtime_config.otel_config.clone(),
25 },
26 runtime: runtime_config.clone(),
27 }
28 }
29
30 pub fn build(self) -> TracingConfig {
31 let (mut config, runtime) = (self.inner, self.runtime);
33 config.filter = runtime.filter.or(config.filter);
34 config.log_file_path = runtime.log_file_path.or(config.log_file_path);
35 config.ansi_output = runtime.ansi_output.unwrap_or(config.ansi_output);
36 config.ansi_sanitization = runtime.ansi_sanitization.unwrap_or(config.ansi_sanitization);
37 config.metrics_interval = runtime.metrics_interval.or(config.metrics_interval);
38
39 config
40 }
41
42 pub fn log_file_path(mut self, path: Option<String>) -> Self {
44 self.inner.log_file_path = path;
45 self
46 }
47 pub fn ansi_output(mut self, val: bool) -> Self {
51 self.inner.ansi_output = val;
52 self
53 }
54 pub fn ansi_sanitization(mut self, val: bool) -> Self {
58 self.inner.ansi_sanitization = val;
59 self
60 }
61 pub fn filter(mut self, filter: Option<String>) -> Self {
67 self.inner.filter = filter;
68 self
69 }
70
71 pub fn metrics_interval(mut self, interval: Option<u64>) -> Self {
73 self.inner.metrics_interval = interval;
74 self
75 }
76
77 pub fn custom_resource_attrs(mut self, attrs: Option<Vec<(Key, Value)>>) -> Self {
81 self.inner.custom_resource_attrs = attrs;
82 self
83 }
84}
85
86#[derive(Debug, Clone, Serialize)]
89pub struct TracingConfig {
90 pub(crate) filter: Option<String>,
95
96 pub(crate) filter_append: Option<String>,
98
99 pub(crate) log_file_path: Option<String>,
101
102 pub(crate) ansi_output: bool,
104
105 pub(crate) ansi_sanitization: bool,
107
108 pub(crate) deployment_env: Option<String>,
110
111 #[serde(skip_serializing)]
115 pub(crate) custom_resource_attrs: Option<Vec<(Key, Value)>>,
116
117 pub(crate) metrics_interval: Option<u64>,
119
120 pub(crate) otel_config: Option<TracingOtelConfig>,
121}
122impl TracingConfig {
123 pub fn builder(runtime_config: &TracingConfigOverride) -> TracingConfigBuilder {
124 TracingConfigBuilder::new(runtime_config)
125 }
126 pub fn metrics_interval_duration(&self) -> Option<Duration> {
127 self.metrics_interval.map(Duration::from_secs)
128 }
129 pub fn log_file_path(&self) -> Option<&str> {
130 self.log_file_path.as_deref()
131 }
132 pub fn otel_config(&self) -> &Option<TracingOtelConfig> {
133 &self.otel_config
134 }
135}
136
137#[derive(Debug, Clone, Default, Serialize, Deserialize)]
143pub struct TracingConfigOverride {
144 #[serde(flatten)]
147 pub(crate) otel_config: Option<TracingOtelConfig>,
148
149 pub(crate) filter_append: Option<String>,
155
156 pub(crate) deployment_env: Option<String>,
160
161 pub(crate) filter: Option<String>,
164
165 pub(crate) log_file_path: Option<String>,
166
167 pub(crate) ansi_output: Option<bool>,
168
169 pub(crate) ansi_sanitization: Option<bool>,
170
171 pub(crate) metrics_interval: Option<u64>,
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct TracingOtelConfig {
178 pub collector_url: String,
179
180 #[serde(default, skip_serializing)]
181 pub collector_auth_header: Option<SecretString>,
182}