diff --git a/.changesets/fix_telemetry_fix_downstream_traces.md b/.changesets/fix_telemetry_fix_downstream_traces.md new file mode 100644 index 00000000..d5a8febf --- /dev/null +++ b/.changesets/fix_telemetry_fix_downstream_traces.md @@ -0,0 +1,3 @@ +### fix: Include the cargo feature and TraceContextPropagator to send otel headers downstream - @swcollard PR #307 + +Inside the reqwest middleware, if the global text_map_propagator is not set, it will no op and not send the traceparent and tracestate headers to the Router. Adding this is needed to correlate traces from the mcp server to the router or other downstream APIs \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 2d5885a7..1e4402e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2929,9 +2929,11 @@ dependencies = [ "getrandom 0.2.16", "http", "matchit", + "opentelemetry", "reqwest", "reqwest-middleware", "tracing", + "tracing-opentelemetry", ] [[package]] diff --git a/crates/apollo-mcp-server/Cargo.toml b/crates/apollo-mcp-server/Cargo.toml index 3d520c3b..ecea5f1d 100644 --- a/crates/apollo-mcp-server/Cargo.toml +++ b/crates/apollo-mcp-server/Cargo.toml @@ -35,7 +35,7 @@ opentelemetry-stdout = "0.30.0" opentelemetry_sdk = "0.30.0" regex = "1.11.1" reqwest-middleware = "0.4.2" -reqwest-tracing = "0.5.8" +reqwest-tracing = { version = "0.5.8", features = ["opentelemetry_0_30"] } reqwest.workspace = true rmcp = { version = "0.2", features = [ "server", diff --git a/crates/apollo-mcp-server/src/runtime/trace.rs b/crates/apollo-mcp-server/src/runtime/trace.rs index 1bf56420..0e50ab64 100644 --- a/crates/apollo-mcp-server/src/runtime/trace.rs +++ b/crates/apollo-mcp-server/src/runtime/trace.rs @@ -2,6 +2,7 @@ use opentelemetry::{KeyValue, global, trace::TracerProvider as _}; use opentelemetry_sdk::{ Resource, metrics::{MeterProviderBuilder, PeriodicReader, SdkMeterProvider}, + propagation::TraceContextPropagator, trace::{RandomIdGenerator, SdkTracerProvider}, }; @@ -65,6 +66,8 @@ fn init_tracer_provider() -> Result { .with_batch_exporter(exporter) .build(); + // Set the global propagator (usually early in main()) + global::set_text_map_propagator(TraceContextPropagator::new()); global::set_tracer_provider(trace_provider.clone()); Ok(trace_provider)