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}