use opentelemetry::global;
use opentelemetry_otlp::{Protocol, WithExportConfig};
use opentelemetry_sdk::Resource;
use opentelemetry_sdk::logs::SdkLoggerProvider;
use opentelemetry_sdk::metrics::SdkMeterProvider;
use opentelemetry_sdk::trace::SdkTracerProvider;
use tracing::warn;
fn service_resource() -> Resource {
Resource::builder()
.with_attribute(opentelemetry::KeyValue::new("service.name", "aptu-coder"))
.with_attribute(opentelemetry::KeyValue::new(
"service.version",
env!("CARGO_PKG_VERSION"),
))
.build()
}
pub fn init_otel() -> Option<SdkTracerProvider> {
let endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").ok()?;
let exporter = match opentelemetry_otlp::SpanExporter::builder()
.with_http()
.with_protocol(Protocol::HttpBinary)
.with_endpoint(&endpoint)
.build()
{
Ok(exp) => exp,
Err(e) => {
warn!("Failed to build OTLP exporter: {}", e);
return None;
}
};
let provider = SdkTracerProvider::builder()
.with_batch_exporter(exporter)
.with_resource(service_resource())
.build();
global::set_tracer_provider(provider.clone());
Some(provider)
}
pub fn init_log_appender() -> Option<SdkLoggerProvider> {
let endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").ok()?;
let exporter = match opentelemetry_otlp::LogExporter::builder()
.with_http()
.with_protocol(Protocol::HttpBinary)
.with_endpoint(&endpoint)
.build()
{
Ok(exp) => exp,
Err(e) => {
warn!("Failed to build OTLP log exporter: {}", e);
return None;
}
};
let provider = SdkLoggerProvider::builder()
.with_batch_exporter(exporter)
.with_resource(service_resource())
.build();
Some(provider)
}
pub fn init_meter() -> Option<SdkMeterProvider> {
let endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").ok()?;
let exporter = match opentelemetry_otlp::MetricExporter::builder()
.with_http()
.with_protocol(Protocol::HttpBinary)
.with_endpoint(&endpoint)
.build()
{
Ok(exp) => exp,
Err(e) => {
warn!("Failed to build OTLP metrics exporter: {}", e);
return None;
}
};
let provider = SdkMeterProvider::builder()
.with_reader(opentelemetry_sdk::metrics::PeriodicReader::builder(exporter).build())
.with_resource(service_resource())
.build();
global::set_meter_provider(provider.clone());
Some(provider)
}