fix: only connect OTLP metrics when OTEL_EXPORTER_OTLP_ENDPOINT is set

When unset, use a no-op meter provider instead of defaulting to
http://localhost:4317 and spamming connection errors every 5s.
This commit is contained in:
asepharyana
2026-07-22 13:03:03 +07:00
parent 1b195ac3f6
commit 562ada69ec
+29 -26
View File
@@ -36,41 +36,44 @@ pub fn init_otel_metrics() {
return;
}
let otel_endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT")
.unwrap_or_else(|_| "http://localhost:4317".into());
let otel_endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT");
let service_name = std::env::var("OTEL_SERVICE_NAME").unwrap_or_else(|_| "scraper-api".into());
let export_interval_ms: u64 = std::env::var("OTEL_METRICS_EXPORT_INTERVAL")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(5000);
// Build the gRPC OTLP exporter
let exporter = opentelemetry_otlp::MetricExporter::builder()
.with_tonic()
.with_endpoint(otel_endpoint.clone())
.build()
.expect("Failed to create OTLP metric exporter");
let m = if let Ok(endpoint) = otel_endpoint {
let export_interval_ms: u64 = std::env::var("OTEL_METRICS_EXPORT_INTERVAL")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(5000);
let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio)
.with_interval(std::time::Duration::from_millis(export_interval_ms))
.build();
// Build the gRPC OTLP exporter
let exporter = opentelemetry_otlp::MetricExporter::builder()
.with_tonic()
.with_endpoint(endpoint.clone())
.build()
.expect("Failed to create OTLP metric exporter");
let resource = Resource::new(vec![KeyValue::new("service.name", service_name.clone())]);
let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio)
.with_interval(std::time::Duration::from_millis(export_interval_ms))
.build();
let provider = MeterProviderBuilder::default()
.with_resource(resource)
.with_reader(reader)
.build();
let resource = Resource::new(vec![KeyValue::new("service.name", service_name.clone())]);
// Keep a handle so we can shut it down later
let _ = PROVIDER.set(provider.clone());
let provider = MeterProviderBuilder::default()
.with_resource(resource)
.with_reader(reader)
.build();
global::set_meter_provider(provider);
let _ = PROVIDER.set(provider.clone());
global::set_meter_provider(provider);
tracing::info!(otel_endpoint = %endpoint, service_name, "OTel metrics initialized");
global::meter("scraper-http-server")
} else {
tracing::info!("OTEL_EXPORTER_OTLP_ENDPOINT not set — metrics disabled");
global::meter("scraper-http-server")
};
let m = global::meter("scraper-http-server");
let _ = METER.set(m);
tracing::info!(otel_endpoint, service_name, "OTel metrics initialized");
}
/// Shut down the global MeterProvider, flushing pending exports.