diff --git a/src/config.rs b/src/config.rs index 21d11b3..04989b1 100644 --- a/src/config.rs +++ b/src/config.rs @@ -25,7 +25,7 @@ pub enum AuthConfig { Static(StaticUserStoreConfig), } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct TracingConfig { pub opentelemetry: bool, } @@ -36,5 +36,6 @@ pub struct Config { pub auth: AuthConfig, pub http: HttpConfig, pub frontend: FrontendConfig, + #[serde(default)] pub tracing: TracingConfig, } diff --git a/src/main.rs b/src/main.rs index 9cc9cb1..f9676ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,30 +3,17 @@ use actix_web::HttpServer; use anyhow::Result; use app::make_app; use clap::Parser; -use config::{DataStoreConfig, SqliteDataStoreConfig, TracingConfig}; -use opentelemetry::global; -use opentelemetry::trace::TracerProvider; -use opentelemetry::KeyValue; -use opentelemetry_otlp::WithExportConfig; -use opentelemetry_sdk::propagation::TraceContextPropagator; -use opentelemetry_sdk::trace::{self, BatchConfig, Tracer}; -use opentelemetry_sdk::{runtime, Resource}; -use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, SERVICE_VERSION}; -use opentelemetry_semantic_conventions::SCHEMA_URL; +use config::{DataStoreConfig, SqliteDataStoreConfig}; use rustical_store::auth::StaticUserStore; use rustical_store::{AddressbookStore, CalendarStore}; use rustical_store_sqlite::{create_db_pool, SqliteStore}; +use setup_tracing::setup_tracing; use std::fs; use std::sync::Arc; -use std::time::Duration; -use tracing::level_filters::LevelFilter; -use tracing_opentelemetry::OpenTelemetryLayer; -use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::util::SubscriberInitExt; -use tracing_subscriber::EnvFilter; mod app; mod config; +mod setup_tracing; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] @@ -50,52 +37,6 @@ async fn get_data_stores( }) } -pub fn init_tracer() -> Tracer { - let otel_exporter = opentelemetry_otlp::new_exporter() - .tonic() - .with_timeout(Duration::from_secs(1)); - - let tracer_provider = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter(otel_exporter) - .with_trace_config( - trace::Config::default().with_resource(Resource::from_schema_url( - [ - KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")), - KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")), - ], - SCHEMA_URL, - )), - ) - .with_batch_config(BatchConfig::default()) - .install_batch(runtime::Tokio) - .expect("Failed to install tracer"); - - global::set_tracer_provider(tracer_provider.clone()); - tracer_provider.tracer("rustical") -} - -fn setup_tracing(config: &TracingConfig) { - let fmt_layer = tracing_subscriber::fmt::layer(); - let filter_layer = EnvFilter::builder() - .with_default_directive(LevelFilter::WARN.into()) - .from_env_lossy() - .add_directive("h2=warn".parse().unwrap()) - .add_directive("hyper_util=warn".parse().unwrap()) - .add_directive("tower=warn".parse().unwrap()); - - let registry = tracing_subscriber::registry() - .with(filter_layer) - .with(fmt_layer); - - if config.opentelemetry { - global::set_text_map_propagator(TraceContextPropagator::new()); - registry.with(OpenTelemetryLayer::new(init_tracer())).init(); - } else { - registry.init(); - } -} - #[tokio::main] async fn main() -> Result<()> { let args = Args::parse(); diff --git a/src/setup_tracing.rs b/src/setup_tracing.rs new file mode 100644 index 0000000..4e239b2 --- /dev/null +++ b/src/setup_tracing.rs @@ -0,0 +1,62 @@ +use crate::config::TracingConfig; +use opentelemetry::global; +use opentelemetry::trace::TracerProvider; +use opentelemetry::KeyValue; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::propagation::TraceContextPropagator; +use opentelemetry_sdk::trace::{self, BatchConfig, Tracer}; +use opentelemetry_sdk::{runtime, Resource}; +use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, SERVICE_VERSION}; +use opentelemetry_semantic_conventions::SCHEMA_URL; +use std::time::Duration; +use tracing::level_filters::LevelFilter; +use tracing_opentelemetry::OpenTelemetryLayer; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::EnvFilter; + +pub fn init_tracer() -> Tracer { + let otel_exporter = opentelemetry_otlp::new_exporter() + .tonic() + .with_timeout(Duration::from_secs(1)); + + let tracer_provider = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter(otel_exporter) + .with_trace_config( + trace::Config::default().with_resource(Resource::from_schema_url( + [ + KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")), + KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")), + ], + SCHEMA_URL, + )), + ) + .with_batch_config(BatchConfig::default()) + .install_batch(runtime::Tokio) + .expect("Failed to install tracer"); + + global::set_tracer_provider(tracer_provider.clone()); + tracer_provider.tracer("rustical") +} + +pub fn setup_tracing(config: &TracingConfig) { + let fmt_layer = tracing_subscriber::fmt::layer(); + let filter_layer = EnvFilter::builder() + .with_default_directive(LevelFilter::WARN.into()) + .from_env_lossy() + .add_directive("h2=warn".parse().unwrap()) + .add_directive("hyper_util=warn".parse().unwrap()) + .add_directive("tower=warn".parse().unwrap()); + + let registry = tracing_subscriber::registry() + .with(filter_layer) + .with(fmt_layer); + + if config.opentelemetry { + global::set_text_map_propagator(TraceContextPropagator::new()); + registry.with(OpenTelemetryLayer::new(init_tracer())).init(); + } else { + registry.init(); + } +}