use opentelemetry::trace::TracerProvider as _;
use opentelemetry_otlp::SpanExporter;
use opentelemetry_sdk::trace::SdkTracerProvider;
pub struct OtelGuard {
provider: SdkTracerProvider,
}
impl Drop for OtelGuard {
fn drop(&mut self) {
if let Err(e) = self.provider.shutdown() {
eprintln!("otel: tracer provider shutdown error: {e}");
}
}
}
pub fn init_otel() -> (OtelGuard, opentelemetry_sdk::trace::Tracer) {
let exporter = SpanExporter::builder()
.with_http()
.build()
.expect("failed to create OTLP span exporter");
let provider = SdkTracerProvider::builder()
.with_batch_exporter(exporter)
.build();
opentelemetry::global::set_tracer_provider(provider.clone());
let tracer = provider.tracer("anyllm-proxy");
let guard = OtelGuard { provider };
(guard, tracer)
}