tracing setup

This commit is contained in:
Lennart
2024-10-31 13:55:17 +01:00
parent 25ea348e9e
commit 9be551b7d4
3 changed files with 67 additions and 63 deletions

View File

@@ -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,
}

View File

@@ -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();

62
src/setup_tracing.rs Normal file
View File

@@ -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();
}
}