use opentelemetry::{Key, Value};
use secrecy::SecretString;
use serde::{Deserialize, Serialize};
use std::time::Duration;
pub struct TracingConfigBuilder {
inner: TracingConfig,
runtime: TracingConfigOverride,
}
impl TracingConfigBuilder {
pub fn new(runtime_config: &TracingConfigOverride) -> Self {
Self {
inner: TracingConfig {
filter: None,
filter_append: runtime_config.filter_append.clone(),
log_file_path: None,
ansi_output: true,
ansi_sanitization: true,
deployment_env: runtime_config.deployment_env.clone(),
custom_resource_attrs: None,
metrics_interval: None,
otel_config: runtime_config.otel_config.clone(),
},
runtime: runtime_config.clone(),
}
}
pub fn build(self) -> TracingConfig {
let (mut config, runtime) = (self.inner, self.runtime);
config.filter = runtime.filter.or(config.filter);
config.log_file_path = runtime.log_file_path.or(config.log_file_path);
config.ansi_output = runtime.ansi_output.unwrap_or(config.ansi_output);
config.ansi_sanitization = runtime.ansi_sanitization.unwrap_or(config.ansi_sanitization);
config.metrics_interval = runtime.metrics_interval.or(config.metrics_interval);
config
}
pub fn log_file_path(mut self, path: Option<String>) -> Self {
self.inner.log_file_path = path;
self
}
pub fn ansi_output(mut self, val: bool) -> Self {
self.inner.ansi_output = val;
self
}
pub fn ansi_sanitization(mut self, val: bool) -> Self {
self.inner.ansi_sanitization = val;
self
}
pub fn filter(mut self, filter: Option<String>) -> Self {
self.inner.filter = filter;
self
}
pub fn metrics_interval(mut self, interval: Option<u64>) -> Self {
self.inner.metrics_interval = interval;
self
}
pub fn custom_resource_attrs(mut self, attrs: Option<Vec<(Key, Value)>>) -> Self {
self.inner.custom_resource_attrs = attrs;
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct TracingConfig {
pub(crate) filter: Option<String>,
pub(crate) filter_append: Option<String>,
pub(crate) log_file_path: Option<String>,
pub(crate) ansi_output: bool,
pub(crate) ansi_sanitization: bool,
pub(crate) deployment_env: Option<String>,
#[serde(skip_serializing)]
pub(crate) custom_resource_attrs: Option<Vec<(Key, Value)>>,
pub(crate) metrics_interval: Option<u64>,
pub(crate) otel_config: Option<TracingOtelConfig>,
}
impl TracingConfig {
pub fn builder(runtime_config: &TracingConfigOverride) -> TracingConfigBuilder {
TracingConfigBuilder::new(runtime_config)
}
pub fn metrics_interval_duration(&self) -> Option<Duration> {
self.metrics_interval.map(Duration::from_secs)
}
pub fn log_file_path(&self) -> Option<&str> {
self.log_file_path.as_deref()
}
pub fn otel_config(&self) -> &Option<TracingOtelConfig> {
&self.otel_config
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TracingConfigOverride {
#[serde(flatten)]
pub(crate) otel_config: Option<TracingOtelConfig>,
pub(crate) filter_append: Option<String>,
pub(crate) deployment_env: Option<String>,
pub(crate) filter: Option<String>,
pub(crate) log_file_path: Option<String>,
pub(crate) ansi_output: Option<bool>,
pub(crate) ansi_sanitization: Option<bool>,
pub(crate) metrics_interval: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TracingOtelConfig {
pub collector_url: String,
#[serde(default, skip_serializing)]
pub collector_auth_header: Option<SecretString>,
}