Skip to main content

github_mcp/core/
otel.rs

1// GitHub v3 REST API MCP server — generated by mcpify. Do not hand-edit.
2//
3// Named `otel.rs` rather than `tracing.rs` (the name
4// `targets::typescript`'s equivalent file uses) to avoid shadowing the
5// `tracing` crate this whole project logs through.
6
7use opentelemetry::trace::TracerProvider as _;
8use opentelemetry_sdk::Resource;
9use opentelemetry_sdk::trace::SdkTracerProvider;
10use tracing_subscriber::Layer;
11
12use super::logger::BoxedLayer;
13
14/// Builds the OpenTelemetry tracing bridge layer — REQ-2.3.2 — exported via
15/// OTLP. Unlike `targets::typescript`'s `tracing.ts` (separate Jaeger trace
16/// and Prometheus metrics exporters), this target exports over the single
17/// OTLP wire protocol, which modern Jaeger/Prometheus deployments both
18/// ingest via a collector; a deliberate simplification given this crate's
19/// toolchain already includes `opentelemetry-otlp` and adding
20/// exporter-specific crates for each backend isn't otherwise warranted.
21///
22/// Returns the layer (for `logger::init_logging` to compose into the one
23/// global subscriber `tracing` allows) alongside the `SdkTracerProvider`
24/// handle `shutdown_tracing` needs.
25pub fn build_layer(service_name: &str) -> anyhow::Result<(BoxedLayer, SdkTracerProvider)> {
26    // `.with_http()` rather than `.with_tonic()`: OTLP/HTTP is enabled by
27    // `opentelemetry-otlp`'s default features, so this needs no extra
28    // feature-flag wiring in Cargo.toml — gRPC would require opting into
29    // the `grpc-tonic` feature for no benefit here.
30    let exporter = opentelemetry_otlp::SpanExporter::builder()
31        .with_http()
32        .build()?;
33
34    let provider = SdkTracerProvider::builder()
35        .with_batch_exporter(exporter)
36        .with_resource(
37            Resource::builder()
38                .with_service_name(service_name.to_string())
39                .build(),
40        )
41        .build();
42
43    let tracer = provider.tracer(service_name.to_string());
44    let layer = tracing_opentelemetry::layer().with_tracer(tracer).boxed();
45
46    Ok((layer, provider))
47}
48
49pub fn shutdown_tracing(provider: SdkTracerProvider) {
50    if let Err(err) = provider.shutdown() {
51        tracing::error!(error = %err, "failed to shut down OpenTelemetry tracer provider");
52    }
53}