From 98d49554ce4643b4cb0a09a3a199b19a938f4863 Mon Sep 17 00:00:00 2001 From: Lambda Date: Fri, 7 Jun 2024 10:03:06 +0000 Subject: [PATCH] Move observability config to separate config section This renames: allow_prometheus -> observability.metrics.enable allow_jaeger -> observability.traces.enable tracing_flame -> observability.flame.enable log -> observability.logs.filter log_colors -> observability.logs.colors log_format -> observability.logs.format New config values in these sections will follow. --- src/config.rs | 61 ++++++++++++++++++++++++++++++++++++-------- src/main.rs | 2 +- src/observability.rs | 27 ++++++++++++-------- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/src/config.rs b/src/config.rs index 43dd487f..d0eb50d7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -58,23 +58,13 @@ pub(crate) struct Config { pub(crate) allow_unstable_room_versions: bool, #[serde(default = "default_default_room_version")] pub(crate) default_room_version: RoomVersionId, - #[serde(default = "false_fn")] - pub(crate) allow_jaeger: bool, - #[serde(default = "false_fn")] - pub(crate) allow_prometheus: bool, - #[serde(default = "false_fn")] - pub(crate) tracing_flame: bool, #[serde(default)] pub(crate) proxy: ProxyConfig, pub(crate) jwt_secret: Option, #[serde(default = "default_trusted_servers")] pub(crate) trusted_servers: Vec, - #[serde(default = "default_log")] - pub(crate) log: EnvFilterClone, - #[serde(default = "true_fn")] - pub(crate) log_colors: bool, #[serde(default)] - pub(crate) log_format: LogFormat, + pub(crate) observability: ObservabilityConfig, #[serde(default)] pub(crate) turn: TurnConfig, @@ -184,6 +174,55 @@ pub(crate) struct DatabaseConfig { pub(crate) rocksdb_max_open_files: i32, } +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub(crate) struct MetricsConfig { + pub(crate) enable: bool, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub(crate) struct OtelTraceConfig { + pub(crate) enable: bool, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub(crate) struct FlameConfig { + pub(crate) enable: bool, +} + +#[derive(Debug, Deserialize)] +#[serde(default)] +pub(crate) struct LogConfig { + pub(crate) filter: EnvFilterClone, + pub(crate) colors: bool, + pub(crate) format: LogFormat, +} + +impl Default for LogConfig { + fn default() -> Self { + Self { + filter: default_log(), + colors: true, + format: LogFormat::default(), + } + } +} + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub(crate) struct ObservabilityConfig { + /// Prometheus metrics + pub(crate) metrics: MetricsConfig, + /// OpenTelemetry traces + pub(crate) traces: OtelTraceConfig, + /// Folded inferno stack traces + pub(crate) flame: FlameConfig, + /// Logging to stdout + pub(crate) logs: LogConfig, +} + fn false_fn() -> bool { false } diff --git a/src/main.rs b/src/main.rs index 7d7f2448..f68264a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -442,7 +442,7 @@ fn routes(config: &Config) -> Router { .put(c2s::send_state_event_for_empty_key_route), ); - let router = if config.allow_prometheus { + let router = if config.observability.metrics.enable { router.route( "/metrics", get(|| async { observability::METRICS.export() }), diff --git a/src/observability.rs b/src/observability.rs index 0204de0e..3b3b1764 100644 --- a/src/observability.rs +++ b/src/observability.rs @@ -87,7 +87,9 @@ pub(crate) enum FoundIn { /// Initialize observability pub(crate) fn init(config: &Config) -> Result { let jaeger_layer = config - .allow_jaeger + .observability + .traces + .enable .then(|| { opentelemetry::global::set_text_map_propagator( opentelemetry_jaeger_propagator::Propagator::new(), @@ -102,36 +104,41 @@ pub(crate) fn init(config: &Config) -> Result { .install_batch(opentelemetry_sdk::runtime::Tokio)?; let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); - Ok::<_, error::Observability>( - telemetry.with_filter(EnvFilter::from(&config.log)), - ) + Ok::<_, error::Observability>(telemetry.with_filter( + EnvFilter::from(&config.observability.logs.filter), + )) }) .transpose()?; let (flame_layer, flame_guard) = config - .tracing_flame + .observability + .flame + .enable .then(|| { let (flame_layer, guard) = FlameLayer::with_file("./tracing.folded")?; let flame_layer = flame_layer.with_empty_samples(false); Ok::<_, error::Observability>(( - flame_layer.with_filter(EnvFilter::from(&config.log)), + flame_layer.with_filter(EnvFilter::from( + &config.observability.logs.filter, + )), guard, )) }) .transpose()? .unzip(); - let fmt_layer = - tracing_subscriber::fmt::Layer::new().with_ansi(config.log_colors); - let fmt_layer = match config.log_format { + let fmt_layer = tracing_subscriber::fmt::Layer::new() + .with_ansi(config.observability.logs.colors); + let fmt_layer = match config.observability.logs.format { LogFormat::Pretty => fmt_layer.pretty().boxed(), LogFormat::Full => fmt_layer.boxed(), LogFormat::Compact => fmt_layer.compact().boxed(), LogFormat::Json => fmt_layer.json().boxed(), }; - let fmt_layer = fmt_layer.with_filter(EnvFilter::from(&config.log)); + let fmt_layer = fmt_layer + .with_filter(EnvFilter::from(&config.observability.logs.filter)); let subscriber = Registry::default() .with(jaeger_layer)