mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-14 07:02:24 +00:00
tracing setup
This commit is contained in:
@@ -25,7 +25,7 @@ pub enum AuthConfig {
|
|||||||
Static(StaticUserStoreConfig),
|
Static(StaticUserStoreConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
#[derive(Debug, Deserialize, Serialize, Default)]
|
||||||
pub struct TracingConfig {
|
pub struct TracingConfig {
|
||||||
pub opentelemetry: bool,
|
pub opentelemetry: bool,
|
||||||
}
|
}
|
||||||
@@ -36,5 +36,6 @@ pub struct Config {
|
|||||||
pub auth: AuthConfig,
|
pub auth: AuthConfig,
|
||||||
pub http: HttpConfig,
|
pub http: HttpConfig,
|
||||||
pub frontend: FrontendConfig,
|
pub frontend: FrontendConfig,
|
||||||
|
#[serde(default)]
|
||||||
pub tracing: TracingConfig,
|
pub tracing: TracingConfig,
|
||||||
}
|
}
|
||||||
|
|||||||
65
src/main.rs
65
src/main.rs
@@ -3,30 +3,17 @@ use actix_web::HttpServer;
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use app::make_app;
|
use app::make_app;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use config::{DataStoreConfig, SqliteDataStoreConfig, TracingConfig};
|
use config::{DataStoreConfig, SqliteDataStoreConfig};
|
||||||
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 rustical_store::auth::StaticUserStore;
|
use rustical_store::auth::StaticUserStore;
|
||||||
use rustical_store::{AddressbookStore, CalendarStore};
|
use rustical_store::{AddressbookStore, CalendarStore};
|
||||||
use rustical_store_sqlite::{create_db_pool, SqliteStore};
|
use rustical_store_sqlite::{create_db_pool, SqliteStore};
|
||||||
|
use setup_tracing::setup_tracing;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::sync::Arc;
|
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 app;
|
||||||
mod config;
|
mod config;
|
||||||
|
mod setup_tracing;
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[command(author, version, about, long_about = None)]
|
#[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]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|||||||
62
src/setup_tracing.rs
Normal file
62
src/setup_tracing.rs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user