From 674c1a4adad3809dd2102c03b6860eaab92fb7f4 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Mon, 24 Feb 2025 10:32:04 +0100 Subject: [PATCH] Upgrade OpenTelemetry to 0.28 --- Cargo.lock | 65 ++++++++++------------ Cargo.toml | 26 +++++---- crates/cli/src/main.rs | 4 +- crates/cli/src/telemetry.rs | 71 +++++++++++++------------ crates/config/src/sections/telemetry.rs | 1 + docs/config.schema.json | 4 +- 6 files changed, 86 insertions(+), 85 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 294e47878..5a32e7ff2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4013,45 +4013,47 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "opentelemetry" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" +checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" dependencies = [ "futures-core", "futures-sink", "js-sys", "pin-project-lite", - "thiserror 1.0.69", + "thiserror 2.0.11", "tracing", ] [[package]] name = "opentelemetry-http" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a8a7f5f6ba7c1b286c2fbca0454eaba116f63bbe69ed250b642d36fbb04d80" +checksum = "a8863faf2910030d139fb48715ad5ff2f35029fc5f244f6d5f689ddcf4d26253" dependencies = [ "async-trait", "bytes", "http", "opentelemetry", "reqwest", + "tracing", ] [[package]] name = "opentelemetry-jaeger-propagator" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e33208695c9d3049c848d2abf32f7336ec05cb5c02af1b710e89a99500edeb0" +checksum = "a88c979089b36a225d73f855da60323f6212f6a459fce324a1f1f3f024d8c1a6" dependencies = [ "opentelemetry", + "tracing", ] [[package]] name = "opentelemetry-otlp" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" +checksum = "5bef114c6d41bea83d6dc60eb41720eedd0261a67af57b66dd2b84ac46c01d91" dependencies = [ "async-trait", "futures-core", @@ -4061,14 +4063,14 @@ dependencies = [ "opentelemetry-proto", "opentelemetry_sdk", "prost", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] name = "opentelemetry-prometheus" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b834e966ea5e2d03dfe5f2253f03d22cce21403ee940265070eeee96cee0bcc" +checksum = "765a76ba13ec77043903322f85dc5434d7d01a37e75536d0f871ed7b9b5bbf0d" dependencies = [ "once_cell", "opentelemetry", @@ -4080,9 +4082,9 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" +checksum = "56f8870d3024727e99212eb3bb1762ec16e255e3e6f58eeb3dc8db1aa226746d" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -4092,9 +4094,9 @@ dependencies = [ [[package]] name = "opentelemetry-resource-detectors" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6e83d3dca8fe93cfac95cd07313721c9e6e9f8655e7b06d061d4924df1a0cd" +checksum = "b0cd3cf373f6f7f3a8f25a189acf1300c8b87e85f7959b45ba83c01e305f5cc3" dependencies = [ "opentelemetry", "opentelemetry-semantic-conventions", @@ -4103,32 +4105,30 @@ dependencies = [ [[package]] name = "opentelemetry-semantic-conventions" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1b6902ff63b32ef6c489e8048c5e253e2e4a803ea3ea7e783914536eb15c52" +checksum = "2fb3a2f78c2d55362cd6c313b8abedfbc0142ab3c2676822068fd2ab7d51f9b7" [[package]] name = "opentelemetry-stdout" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc8a298402aa5c260be90d10dc54b5a7d4e1025c354848f8e2c976d761351049" +checksum = "5eb0e5a5132e4b80bf037a78e3e12c8402535199f5de490d0c38f7eac71bc831" dependencies = [ "async-trait", "chrono", "futures-util", "opentelemetry", "opentelemetry_sdk", - "ordered-float", "serde", - "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] name = "opentelemetry_sdk" -version = "0.27.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" +checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" dependencies = [ "async-trait", "futures-channel", @@ -4139,21 +4139,12 @@ dependencies = [ "percent-encoding", "rand", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", ] -[[package]] -name = "ordered-float" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" -dependencies = [ - "num-traits", -] - [[package]] name = "os_info" version = "3.9.2" @@ -6512,9 +6503,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" +checksum = "721f2d2569dce9f3dfbbddee5906941e953bfcdf736a62da3377f5751650cc36" dependencies = [ "js-sys", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 6bb1dbb46..5bd8153fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -363,41 +363,45 @@ version = "0.3.19" # OpenTelemetry [workspace.dependencies.opentelemetry] -version = "0.27.1" +version = "0.28.0" features = ["trace", "metrics"] [workspace.dependencies.opentelemetry-http] -version = "0.27.0" +version = "0.28.0" features = ["reqwest"] [workspace.dependencies.opentelemetry-jaeger-propagator] -version = "0.27.0" +version = "0.28.0" [workspace.dependencies.opentelemetry-otlp] -version = "0.27.0" +version = "0.28.0" default-features = false features = ["trace", "metrics", "http-proto"] [workspace.dependencies.opentelemetry-prometheus] -version = "0.27.0" +version = "0.28.0" [workspace.dependencies.opentelemetry-resource-detectors] -version = "0.6.0" +version = "0.7.0" [workspace.dependencies.opentelemetry-semantic-conventions] -version = "0.27.0" +version = "0.28.0" features = ["semconv_experimental"] [workspace.dependencies.opentelemetry-stdout] -version = "0.27.0" +version = "0.28.0" features = ["trace", "metrics"] [workspace.dependencies.opentelemetry_sdk] -version = "0.27.1" -features = ["rt-tokio"] +version = "0.28.0" +features = [ + "experimental_trace_batch_span_processor_with_async_runtime", + "experimental_metrics_periodicreader_with_async_runtime", + "rt-tokio", +] [workspace.dependencies.tracing-opentelemetry] -version = "0.28.0" +version = "0.29.0" default-features = false [workspace.dependencies.prometheus] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 42efbd92c..a43a792bc 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -55,7 +55,9 @@ async fn main() -> anyhow::Result { // chance to shutdown the telemetry exporters regardless of if there was an // error or not let res = try_main().await; - self::telemetry::shutdown(); + if let Err(err) = self::telemetry::shutdown() { + eprintln!("Failed to shutdown telemetry exporters: {err}"); + } res } diff --git a/crates/cli/src/telemetry.rs b/crates/cli/src/telemetry.rs index f328d0a17..2401e4e47 100644 --- a/crates/cli/src/telemetry.rs +++ b/crates/cli/src/telemetry.rs @@ -4,10 +4,7 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -use std::{ - sync::{LazyLock, OnceLock}, - time::Duration, -}; +use std::sync::{LazyLock, OnceLock}; use anyhow::Context as _; use bytes::Bytes; @@ -27,9 +24,11 @@ use opentelemetry_otlp::{WithExportConfig, WithHttpConfig}; use opentelemetry_prometheus::PrometheusExporter; use opentelemetry_sdk::{ Resource, - metrics::{ManualReader, PeriodicReader, SdkMeterProvider}, + metrics::{ManualReader, SdkMeterProvider, periodic_reader_with_async_runtime::PeriodicReader}, propagation::{BaggagePropagator, TraceContextPropagator}, - trace::{Sampler, Tracer, TracerProvider}, + trace::{ + Sampler, SdkTracerProvider, Tracer, span_processor_with_async_runtime::BatchSpanProcessor, + }, }; use opentelemetry_semantic_conventions as semcov; use prometheus::Registry; @@ -47,6 +46,7 @@ pub static METER: LazyLock = pub static TRACER: OnceLock = OnceLock::new(); static METER_PROVIDER: OnceLock = OnceLock::new(); +static TRACER_PROVIDER: OnceLock = OnceLock::new(); static PROMETHEUS_REGISTRY: OnceLock = OnceLock::new(); pub fn setup(config: &TelemetryConfig) -> anyhow::Result<()> { @@ -63,12 +63,16 @@ pub fn setup(config: &TelemetryConfig) -> anyhow::Result<()> { Ok(()) } -pub fn shutdown() { - opentelemetry::global::shutdown_tracer_provider(); +pub fn shutdown() -> opentelemetry_sdk::error::OTelSdkResult { + if let Some(tracer_provider) = TRACER_PROVIDER.get() { + tracer_provider.shutdown()?; + } if let Some(meter_provider) = METER_PROVIDER.get() { - meter_provider.shutdown().unwrap(); + meter_provider.shutdown()?; } + + Ok(()) } fn match_propagator(propagator: Propagator) -> Box { @@ -86,14 +90,14 @@ fn propagator(propagators: &[Propagator]) -> TextMapCompositePropagator { TextMapCompositePropagator::new(propagators) } -fn stdout_tracer_provider() -> TracerProvider { +fn stdout_tracer_provider() -> SdkTracerProvider { let exporter = opentelemetry_stdout::SpanExporter::default(); - TracerProvider::builder() + SdkTracerProvider::builder() .with_simple_exporter(exporter) .build() } -fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result { +fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result { let mut exporter = opentelemetry_otlp::SpanExporter::builder() .with_http() .with_http_client(mas_http::reqwest_client()); @@ -104,8 +108,11 @@ fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result anyhow::Result<()> { TracingExporterKind::Stdout => stdout_tracer_provider(), TracingExporterKind::Otlp => otlp_tracer_provider(config.endpoint.as_ref())?, }; + TRACER_PROVIDER + .set(tracer_provider.clone()) + .map_err(|_| anyhow::anyhow!("TRACER_PROVIDER was set twice"))?; let tracer = tracer_provider.tracer_with_scope(SCOPE.clone()); TRACER @@ -232,25 +242,20 @@ fn init_meter(config: &MetricsConfig) -> anyhow::Result<()> { } fn resource() -> Resource { - let resource = Resource::new([ - KeyValue::new(semcov::resource::SERVICE_NAME, env!("CARGO_PKG_NAME")), - KeyValue::new(semcov::resource::SERVICE_VERSION, crate::VERSION), - KeyValue::new(semcov::resource::PROCESS_RUNTIME_NAME, "rust"), - KeyValue::new( - semcov::resource::PROCESS_RUNTIME_VERSION, - env!("VERGEN_RUSTC_SEMVER"), - ), - ]); - - let detected = Resource::from_detectors( - Duration::from_secs(5), - vec![ - Box::new(opentelemetry_sdk::resource::EnvResourceDetector::new()), + Resource::builder() + .with_service_name(env!("CARGO_PKG_NAME")) + .with_detectors(&[ + Box::new(opentelemetry_resource_detectors::HostResourceDetector::default()), Box::new(opentelemetry_resource_detectors::OsResourceDetector), Box::new(opentelemetry_resource_detectors::ProcessResourceDetector), - Box::new(opentelemetry_sdk::resource::TelemetryResourceDetector), - ], - ); - - resource.merge(&detected) + ]) + .with_attributes([ + KeyValue::new(semcov::resource::SERVICE_VERSION, crate::VERSION), + KeyValue::new(semcov::resource::PROCESS_RUNTIME_NAME, "rust"), + KeyValue::new( + semcov::resource::PROCESS_RUNTIME_VERSION, + env!("VERGEN_RUSTC_SEMVER"), + ), + ]) + .build() } diff --git a/crates/config/src/sections/telemetry.rs b/crates/config/src/sections/telemetry.rs index e170347aa..f4d73c29d 100644 --- a/crates/config/src/sections/telemetry.rs +++ b/crates/config/src/sections/telemetry.rs @@ -59,6 +59,7 @@ pub struct TracingConfig { pub endpoint: Option, /// List of propagation formats to use for incoming and outgoing requests + #[serde(default)] pub propagators: Vec, } diff --git a/docs/config.schema.json b/docs/config.schema.json index 04d8a1bba..ce5c12aa3 100644 --- a/docs/config.schema.json +++ b/docs/config.schema.json @@ -1190,9 +1190,6 @@ "TracingConfig": { "description": "Configuration related to exporting traces", "type": "object", - "required": [ - "propagators" - ], "properties": { "exporter": { "description": "Exporter to use when exporting traces", @@ -1211,6 +1208,7 @@ }, "propagators": { "description": "List of propagation formats to use for incoming and outgoing requests", + "default": [], "type": "array", "items": { "$ref": "#/definitions/Propagator"