diff --git a/Cargo.lock b/Cargo.lock index eee83318..d49de9f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1180,9 +1180,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4939f9ed1444bd8c896d37f3090012fa6e7834fe84ef8c9daa166109515732f9" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" @@ -2825,7 +2825,7 @@ dependencies = [ "mas-templates", "mas-tower", "oauth2-types", - "opentelemetry 0.20.0", + "opentelemetry", "opentelemetry-http", "opentelemetry-jaeger", "opentelemetry-otlp", @@ -2833,6 +2833,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry-stdout", "opentelemetry-zipkin", + "opentelemetry_sdk", "prometheus", "rand 0.8.5", "rand_chacha 0.3.1", @@ -2972,7 +2973,7 @@ dependencies = [ "mas-templates", "mime", "oauth2-types", - "opentelemetry 0.20.0", + "opentelemetry", "opentelemetry-semantic-conventions", "pbkdf2", "psl", @@ -3011,7 +3012,7 @@ dependencies = [ "hyper-rustls", "mas-tower", "once_cell", - "opentelemetry 0.20.0", + "opentelemetry", "rustls", "rustls-native-certs", "serde", @@ -3286,7 +3287,7 @@ dependencies = [ "mas-iana", "mas-jose", "oauth2-types", - "opentelemetry 0.20.0", + "opentelemetry", "rand_core 0.6.4", "serde", "serde_json", @@ -3343,7 +3344,7 @@ dependencies = [ "mas-storage-pg", "mas-templates", "mas-tower", - "opentelemetry 0.20.0", + "opentelemetry", "rand 0.8.5", "rand_chacha 0.3.1", "serde", @@ -3391,7 +3392,7 @@ name = "mas-tower" version = "0.5.0" dependencies = [ "http", - "opentelemetry 0.20.0", + "opentelemetry", "opentelemetry-http", "opentelemetry-semantic-conventions", "pin-project-lite", @@ -3697,16 +3698,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "opentelemetry" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" -dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk 0.20.0", -] - [[package]] name = "opentelemetry" version = "0.21.0" @@ -3733,7 +3724,7 @@ dependencies = [ "bytes", "http", "hyper", - "opentelemetry 0.21.0", + "opentelemetry", "tokio", ] @@ -3747,10 +3738,10 @@ dependencies = [ "futures-core", "futures-util", "http", - "opentelemetry 0.21.0", + "opentelemetry", "opentelemetry-http", "opentelemetry-semantic-conventions", - "opentelemetry_sdk 0.21.0", + "opentelemetry_sdk", "thrift", "tokio", ] @@ -3764,10 +3755,10 @@ dependencies = [ "async-trait", "futures-core", "http", - "opentelemetry 0.21.0", + "opentelemetry", "opentelemetry-proto", "opentelemetry-semantic-conventions", - "opentelemetry_sdk 0.21.0", + "opentelemetry_sdk", "prost", "thiserror", "tokio", @@ -3781,8 +3772,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6cd37c9261414d49ed7bd7689ffdf77a01c8c95bc29c35dfc8c7435713149baa" dependencies = [ "once_cell", - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.0", + "opentelemetry", + "opentelemetry_sdk", "prometheus", "protobuf", ] @@ -3793,8 +3784,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1" dependencies = [ - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.0", + "opentelemetry", + "opentelemetry_sdk", "prost", "tonic", ] @@ -3805,7 +3796,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" dependencies = [ - "opentelemetry 0.21.0", + "opentelemetry", ] [[package]] @@ -3817,8 +3808,8 @@ dependencies = [ "async-trait", "chrono", "futures-util", - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.0", + "opentelemetry", + "opentelemetry_sdk", "ordered-float 4.1.1", "serde", "serde_json", @@ -3834,54 +3825,16 @@ dependencies = [ "futures-core", "http", "once_cell", - "opentelemetry 0.21.0", + "opentelemetry", "opentelemetry-http", "opentelemetry-semantic-conventions", - "opentelemetry_sdk 0.21.0", + "opentelemetry_sdk", "serde", "serde_json", "thiserror", "typed-builder", ] -[[package]] -name = "opentelemetry_api" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" -dependencies = [ - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror", - "urlencoding", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "once_cell", - "opentelemetry_api", - "ordered-float 3.9.2", - "percent-encoding", - "rand 0.8.5", - "regex", - "thiserror", - "tokio", - "tokio-stream", -] - [[package]] name = "opentelemetry_sdk" version = "0.21.0" @@ -3895,7 +3848,7 @@ dependencies = [ "futures-util", "glob", "once_cell", - "opentelemetry 0.21.0", + "opentelemetry", "ordered-float 4.1.1", "percent-encoding", "rand 0.8.5", @@ -3913,15 +3866,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-float" -version = "3.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-float" version = "4.1.1" @@ -6131,17 +6075,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-opentelemetry" version = "0.22.0" @@ -6150,12 +6083,10 @@ checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.21.0", - "opentelemetry_sdk 0.21.0", - "smallvec", + "opentelemetry", + "opentelemetry_sdk", "tracing", "tracing-core", - "tracing-log 0.2.0", "tracing-subscriber", "web-time", ] @@ -6175,7 +6106,7 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log 0.1.4", + "tracing-log", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5019ab7e..3616140f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,6 +63,16 @@ version = "0.1.40" [workspace.dependencies.tracing-subscriber] version = "0.3.17" +# OpenTelemetry +[workspace.dependencies.opentelemetry] +version = "0.21.0" +features = ["trace", "metrics"] +[workspace.dependencies.opentelemetry-semantic-conventions] +version = "0.13.0" +[workspace.dependencies.tracing-opentelemetry] +version = "0.22.0" +default-features = false + # URL manipulation [workspace.dependencies.url] version = "2.4.1" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 4eac1e58..14e78ca7 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -33,14 +33,15 @@ zeroize = "1.6.0" tracing.workspace = true tracing-appender = "0.2.2" tracing-subscriber = { workspace = true, features = ["env-filter"] } -tracing-opentelemetry = "0.22.0" -opentelemetry = { version = "0.20.0", features = ["trace", "metrics", "rt-tokio"] } +tracing-opentelemetry.workspace = true +opentelemetry.workspace = true opentelemetry-http = { version = "0.10.0", features = ["tokio", "hyper"] } opentelemetry-jaeger = { version = "0.20.0", features = ["rt-tokio", "collector_client"] } opentelemetry-otlp = { version = "0.14.0", features = ["trace", "metrics"] } opentelemetry-prometheus = "0.14.0" -opentelemetry-semantic-conventions = "0.13.0" +opentelemetry-semantic-conventions.workspace = true opentelemetry-stdout = { version = "0.2.0", features = ["trace", "metrics"] } +opentelemetry_sdk = { version = "0.21.0", features = ["trace", "metrics", "rt-tokio"] } opentelemetry-zipkin = { version = "0.19.0", default-features = false } prometheus = "0.13.3" sentry = { version = "0.31.7", default-features = false, features = ["backtrace", "contexts", "panic", "tower"] } diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index c65e6df3..b2ef7cf9 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -109,7 +109,6 @@ async fn try_main() -> anyhow::Result<()> { tracing_opentelemetry::layer() .with_tracer(tracer) .with_tracked_inactivity(false) - .with_exception_fields(true) .with_filter(LevelFilter::INFO) }); diff --git a/crates/cli/src/telemetry.rs b/crates/cli/src/telemetry.rs index de107665..b5b755f6 100644 --- a/crates/cli/src/telemetry.rs +++ b/crates/cli/src/telemetry.rs @@ -20,24 +20,20 @@ use mas_config::{ JaegerExporterProtocolConfig, MetricsExporterConfig, Propagator, TelemetryConfig, TracingExporterConfig, }; -use opentelemetry::{ - global, - propagation::TextMapPropagator, - sdk::{ - self, - metrics::{ - reader::{DefaultAggregationSelector, DefaultTemporalitySelector}, - ManualReader, MeterProvider, PeriodicReader, - }, - propagation::{BaggagePropagator, TextMapCompositePropagator, TraceContextPropagator}, - trace::{Sampler, Tracer, TracerProvider}, - Resource, - }, - trace::TracerProvider as _, -}; +use opentelemetry::{global, propagation::TextMapPropagator, trace::TracerProvider as _}; use opentelemetry_jaeger::Propagator as JaegerPropagator; use opentelemetry_otlp::MetricsExporterBuilder; use opentelemetry_prometheus::PrometheusExporter; +use opentelemetry_sdk::{ + self, + metrics::{ + reader::{DefaultAggregationSelector, DefaultTemporalitySelector}, + ManualReader, MeterProvider, PeriodicReader, + }, + propagation::{BaggagePropagator, TextMapCompositePropagator, TraceContextPropagator}, + trace::{Sampler, Tracer, TracerProvider}, + Resource, +}; use opentelemetry_semantic_conventions as semcov; use opentelemetry_zipkin::{B3Encoding, Propagator as ZipkinPropagator}; use prometheus::Registry; @@ -118,7 +114,7 @@ fn otlp_tracer(endpoint: Option<&Url>) -> anyhow::Result { .tracing() .with_exporter(exporter) .with_trace_config(trace_config()) - .install_batch(opentelemetry::runtime::Tokio) + .install_batch(opentelemetry_sdk::runtime::Tokio) .context("Failed to configure OTLP trace exporter")?; Ok(tracer) @@ -128,10 +124,10 @@ fn jaeger_agent_tracer_provider(host: &str, port: u16) -> anyhow::Result) -> anyhow::Result) -> anyhow::Result PeriodicReader { let exporter = opentelemetry_stdout::MetricsExporter::default(); - PeriodicReader::builder(exporter, opentelemetry::runtime::Tokio).build() + PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build() } -pub fn prometheus_service() -> tower::util::ServiceFn< - impl FnMut(T) -> std::future::Ready, std::convert::Infallible>> + Clone, -> { +type PromServiceFuture = std::future::Ready, std::convert::Infallible>>; + +#[allow(clippy::needless_pass_by_value)] +fn prometheus_service_fn(_req: T) -> PromServiceFuture { use prometheus::{Encoder, TextEncoder}; + let response = if let Some(registry) = PROMETHEUS_REGISTRY.get() { + let mut buffer = vec![]; + let encoder = TextEncoder::new(); + let metric_families = registry.gather(); + + // That shouldn't panic, unless we're constructing invalid labels + encoder.encode(&metric_families, &mut buffer).unwrap(); + + Response::builder() + .status(200) + .header(CONTENT_TYPE, encoder.format_type()) + .body(Body::from(buffer)) + .unwrap() + } else { + Response::builder() + .status(500) + .header(CONTENT_TYPE, "text/plain") + .body(Body::from("Prometheus exporter was not enabled in config")) + .unwrap() + }; + + std::future::ready(Ok(response)) +} + +pub fn prometheus_service() -> tower::util::ServiceFn PromServiceFuture> { if !PROMETHEUS_REGISTRY.initialized() { tracing::warn!("A Prometheus resource was mounted on a listener, but the Prometheus exporter was not setup in the config"); } - tower::service_fn(move |_req| { - let response = if let Some(registry) = PROMETHEUS_REGISTRY.get() { - let mut buffer = vec![]; - let encoder = TextEncoder::new(); - let metric_families = registry.gather(); - - // That shouldn't panic, unless we're constructing invalid labels - encoder.encode(&metric_families, &mut buffer).unwrap(); - - Response::builder() - .status(200) - .header(CONTENT_TYPE, encoder.format_type()) - .body(Body::from(buffer)) - .unwrap() - } else { - Response::builder() - .status(500) - .header(CONTENT_TYPE, "text/plain") - .body(Body::from("Prometheus exporter was not enabled in config")) - .unwrap() - }; - - std::future::ready(Ok(response)) - }) + tower::service_fn(prometheus_service_fn as _) } fn prometheus_metric_reader() -> anyhow::Result { @@ -309,8 +308,8 @@ fn init_meter(config: &MetricsExporterConfig) -> anyhow::Result<()> { Ok(()) } -fn trace_config() -> sdk::trace::Config { - sdk::trace::config() +fn trace_config() -> opentelemetry_sdk::trace::Config { + opentelemetry_sdk::trace::config() .with_resource(resource()) .with_sampler(Sampler::AlwaysOn) } @@ -324,10 +323,10 @@ fn resource() -> Resource { let detected = Resource::from_detectors( Duration::from_secs(5), vec![ - Box::new(sdk::resource::EnvResourceDetector::new()), - Box::new(sdk::resource::OsResourceDetector), - Box::new(sdk::resource::ProcessResourceDetector), - Box::new(sdk::resource::TelemetryResourceDetector), + Box::new(opentelemetry_sdk::resource::EnvResourceDetector::new()), + Box::new(opentelemetry_sdk::resource::OsResourceDetector), + Box::new(opentelemetry_sdk::resource::ProcessResourceDetector), + Box::new(opentelemetry_sdk::resource::TelemetryResourceDetector), ], ); diff --git a/crates/handlers/Cargo.toml b/crates/handlers/Cargo.toml index 635f4ce2..5d8b549f 100644 --- a/crates/handlers/Cargo.toml +++ b/crates/handlers/Cargo.toml @@ -14,8 +14,8 @@ futures-util = "0.3.28" # Logging and tracing tracing.workspace = true -opentelemetry = "0.20.0" -opentelemetry-semantic-conventions = "0.13.0" +opentelemetry.workspace = true +opentelemetry-semantic-conventions.workspace = true # Error management thiserror.workspace = true diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index 302855f0..7929404c 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -17,7 +17,7 @@ http-body = "0.4.5" hyper = "0.14.27" hyper-rustls = { version = "0.24.1", features = ["http1", "http2"], default-features = false, optional = true } once_cell = "1.18.0" -opentelemetry = "0.20.0" +opentelemetry.workspace = true rustls = { version = "0.21.8", optional = true } rustls-native-certs = { version = "0.6.3", optional = true } serde.workspace = true @@ -28,7 +28,7 @@ tokio = { version = "1.33.0", features = ["sync", "parking_lot"], optional = tru tower = { version = "0.4.13", features = [] } tower-http = { version = "0.4.4", features = ["cors"] } tracing.workspace = true -tracing-opentelemetry = "0.22.0" +tracing-opentelemetry.workspace = true webpki-roots = { version = "0.25.2", optional = true } mas-tower = { path = "../tower" } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index af75337e..e2062c38 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -14,12 +14,12 @@ thiserror.workspace = true futures-util = "0.3.28" apalis-core = { version = "0.4.5", features = ["tokio-comp"] } -opentelemetry = "0.20.0" +opentelemetry.workspace = true rand_core = "0.6.4" serde.workspace = true serde_json.workspace = true tracing.workspace = true -tracing-opentelemetry = "0.22.0" +tracing-opentelemetry.workspace = true url.workspace = true ulid.workspace = true diff --git a/crates/tasks/Cargo.toml b/crates/tasks/Cargo.toml index 6680412d..2dccbb50 100644 --- a/crates/tasks/Cargo.toml +++ b/crates/tasks/Cargo.toml @@ -23,8 +23,8 @@ thiserror.workspace = true tokio = { version = "1.33.0", features = ["rt"] } tower = "0.4.13" tracing.workspace = true -tracing-opentelemetry = "0.22.0" -opentelemetry = "0.20.0" +tracing-opentelemetry.workspace = true +opentelemetry.workspace = true ulid.workspace = true url.workspace = true serde.workspace = true diff --git a/crates/tower/Cargo.toml b/crates/tower/Cargo.toml index 66b5abb2..9408a616 100644 --- a/crates/tower/Cargo.toml +++ b/crates/tower/Cargo.toml @@ -10,10 +10,10 @@ repository.workspace = true [dependencies] http.workspace = true tracing.workspace = true -tracing-opentelemetry = "0.22.0" +tracing-opentelemetry.workspace = true tower = "0.4.13" tokio = { version = "1.33.0", features = ["time"] } -opentelemetry = { version = "0.20.0", features = ["metrics"] } +opentelemetry.workspace = true opentelemetry-http = "0.10.0" -opentelemetry-semantic-conventions = "0.13.0" -pin-project-lite = "0.2.13" \ No newline at end of file +opentelemetry-semantic-conventions.workspace = true +pin-project-lite = "0.2.13"