1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-07-07 22:41:18 +03:00

Properly propagate trace contexts

This also fixes a long-running issue where the OTEL context was not properly set in the tracing spans.
This commit is contained in:
Quentin Gliech
2023-04-03 11:14:24 +02:00
parent 1f748f7d1e
commit f4fff72b22
6 changed files with 215 additions and 102 deletions

View File

@ -22,8 +22,7 @@ use clap::Parser;
use mas_config::TelemetryConfig;
use sentry_tracing::EventFilter;
use tracing_subscriber::{
filter::LevelFilter, layer::SubscriberExt, reload, util::SubscriberInitExt, EnvFilter, Layer,
Registry,
filter::LevelFilter, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer, Registry,
};
mod commands;
@ -59,33 +58,6 @@ async fn try_main() -> anyhow::Result<()> {
.or_else(|_| EnvFilter::try_new("info"))
.context("could not setup logging filter")?;
// Don't fill the telemetry layer for now, we want to configure it based on the
// app config, so we need to delay that a bit
let (telemetry_layer, telemetry_handle) = reload::Layer::new(None);
// We only want "INFO" level spans to go through OpenTelemetry
let telemetry_layer = telemetry_layer.with_filter(LevelFilter::INFO);
// Don't fill the Sentry layer for now, we want to configure it based on the
// app config, so we need to delay that a bit
let (sentry_layer, sentry_handle) = reload::Layer::new(None);
let subscriber = Registry::default()
.with(sentry_layer)
.with(telemetry_layer)
.with(filter_layer)
.with(fmt_layer);
subscriber
.try_init()
.context("could not initialize logging")?;
// Now that logging is set up, we can log stuff, like if the .env file was
// loaded or not
match dotenv_path {
Ok(Some(path)) => tracing::info!(?path, "Loaded environment variables from file"),
Ok(None) => {}
Err(err) => tracing::warn!(%err, "failed to load .env file"),
}
// Parse the CLI arguments
let opts = self::commands::Options::parse();
@ -104,8 +76,9 @@ async fn try_main() -> anyhow::Result<()> {
..Default::default()
},
));
if sentry.is_enabled() {
let layer = sentry_tracing::layer().event_filter(|md| {
let sentry_layer = sentry.is_enabled().then(|| {
sentry_tracing::layer().event_filter(|md| {
// All the spans in the handlers module send their data to Sentry themselves, so
// we only create breadcrumbs for them, instead of full events
if md.target().starts_with("mas_handlers::") {
@ -113,22 +86,35 @@ async fn try_main() -> anyhow::Result<()> {
} else {
sentry_tracing::default_event_filter(md)
}
});
})
});
sentry_handle.reload(layer)?;
}
// Setup OpenTelemtry tracing and metrics
// Setup OpenTelemetry tracing and metrics
let (tracer, _meter) = telemetry::setup(&telemetry_config)
.await
.context("failed to setup opentelemetry")?;
if let Some(tracer) = tracer {
// Now we can swap out the actual opentelemetry tracing layer
telemetry_handle.reload(
tracing_opentelemetry::layer()
.with_tracer(tracer)
.with_tracked_inactivity(false),
)?;
.context("failed to setup OpenTelemetry")?;
let telemetry_layer = tracer.map(|tracer| {
tracing_opentelemetry::layer()
.with_tracer(tracer)
.with_tracked_inactivity(false)
.with_filter(LevelFilter::INFO)
});
let subscriber = Registry::default()
.with(sentry_layer)
.with(telemetry_layer)
.with(filter_layer)
.with(fmt_layer);
subscriber
.try_init()
.context("could not initialize logging")?;
// Log about the .env loading
match dotenv_path {
Ok(Some(path)) => tracing::info!(?path, "Loaded environment variables from .env file"),
Ok(None) => {}
Err(e) => tracing::warn!(?e, "Failed to load .env file"),
}
// And run the command