From 5f590b72fb0755074567d93ecedc6ea8bbcc471b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Sun, 28 Apr 2024 18:00:55 +0200 Subject: [PATCH] . --- Cargo.lock | 72 +++++++- Cargo.toml | 164 ++++++++++--------- src/cli.rs | 2 +- src/main.rs | 4 +- src/telemetry/{tracing/mod.rs => tracing.rs} | 69 +++++--- start-jaeger.sh | 10 +- 6 files changed, 215 insertions(+), 106 deletions(-) rename src/telemetry/{tracing/mod.rs => tracing.rs} (79%) diff --git a/Cargo.lock b/Cargo.lock index 98e73ff..f2d65cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -424,7 +424,7 @@ dependencies = [ "futures-core", "prost", "prost-types", - "tonic", + "tonic 0.10.2", "tracing-core", ] @@ -446,7 +446,7 @@ dependencies = [ "thread_local", "tokio", "tokio-stream", - "tonic", + "tonic 0.10.2", "tracing", "tracing-core", "tracing-subscriber", @@ -1429,6 +1429,43 @@ dependencies = [ "urlencoding", ] +[[package]] +name = "opentelemetry-otlp" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" +dependencies = [ + "async-trait", + "futures-core", + "http 0.2.12", + "opentelemetry", + "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "prost", + "thiserror", + "tokio", + "tonic 0.11.0", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost", + "tonic 0.11.0", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" + [[package]] name = "opentelemetry_sdk" version = "0.22.1" @@ -1447,6 +1484,8 @@ dependencies = [ "percent-encoding", "rand", "thiserror", + "tokio", + "tokio-stream", ] [[package]] @@ -1481,6 +1520,7 @@ dependencies = [ "maud", "metrics", "opentelemetry", + "opentelemetry-otlp", "opentelemetry_sdk", "serde", "serde_variant", @@ -1488,6 +1528,7 @@ dependencies = [ "sqlx", "time", "tokio", + "tonic 0.11.0", "tower", "tower-http", "tracing", @@ -2527,6 +2568,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.21.7", + "bytes", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" diff --git a/Cargo.toml b/Cargo.toml index 47752e2..9a252c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,11 +8,18 @@ name = "packager" path = "src/main.rs" [features] -opentelemetry = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:tracing-opentelemetry", "tokio/tracing"] +otel = [ + "dep:opentelemetry", + "dep:opentelemetry_sdk", + "dep:tracing-opentelemetry", + "dep:opentelemetry-otlp", + "dep:tonic", + "tokio/tracing" +] prometheus = ["dep:axum-prometheus"] tokio-console = ["dep:console-subscriber"] -default = ["opentelemetry", "prometheus", "tokio-console"] +default = ["otel", "prometheus", "tokio-console"] [profile.dev] opt-level = 0 @@ -23,47 +30,94 @@ lto = "off" [dependencies.async-trait] version = "0.1" -[dependencies.opentelemetry] +[dependencies.axum] +version = "0.7" +features = ["macros"] + +[dependencies.axum-prometheus] +version = "0.6" +optional = true + +[dependencies.base64] version = "0.22" -optional = true - -[dependencies.opentelemetry_sdk] -version = "0.22" -optional = true - -[dependencies.tracing-opentelemetry] -version = "0.23" -optional = true - -[dependencies.tracing-log] -version = "0.2" - -[dependencies.http] -version = "1.1" - -[dependencies.log] -version = "0.4" [dependencies.clap] version = "4" features = ["derive"] -[dependencies.axum] +[dependencies.console-subscriber] +version = "0.2" +optional = true + +[dependencies.futures] +version = "0.3" + +[dependencies.http] +version = "1.1" + +[dependencies.hyper] +version = "1.3" +features = ["full"] + +[dependencies.log] +version = "0.4" + +[dependencies.maud] +version = "0.26" +features = [ + "axum", +] + +[dependencies.metrics] +version = "0.22" + +[dependencies.opentelemetry] +version = "0.22" +optional = true + +[dependencies.opentelemetry-otlp] +version = "0.15" +optional = true + +[dependencies.opentelemetry_sdk] +version = "0.22" +features = ["rt-tokio"] +optional = true + +[dependencies.serde] +version = "1" +features = ["derive"] + +[dependencies.serde_variant] +version = "0.1" + +[dependencies.sha2] +version = "0.10" + +[dependencies.sqlx] version = "0.7" -features = ["macros"] +#path = "./vendor/sqlx" +features = [ + "runtime-tokio-rustls", + # "offline", + "sqlite", + "macros", + "time", + "migrate", +] + +[dependencies.time] +version = "0.3" +features = ["serde"] [dependencies.tokio] version = "1" features = ["macros", "rt-multi-thread"] -[dependencies.console-subscriber] -version = "0.2" +[dependencies.tonic] +version = "0.11" optional = true -[dependencies.hyper] -version = "1.3" -features = ["full"] - [dependencies.tower] version = "0.4" features = ["timeout"] @@ -78,58 +132,20 @@ version = "0.1" [dependencies.tracing-attributes] version = "0.1" +[dependencies.tracing-log] +version = "0.2" + +[dependencies.tracing-opentelemetry] +version = "0.23" +optional = true + [dependencies.tracing-subscriber] version = "0.3" features = ["json", "env-filter"] -[dependencies.maud] -version = "0.26" -features = [ - "axum", -] - [dependencies.uuid] version = "1" features = [ "v4", "serde", ] - -[dependencies.sqlx] -version = "0.7" -#path = "./vendor/sqlx" -features = [ - "runtime-tokio-rustls", - # "offline", - "sqlite", - "macros", - "time", - "migrate", -] - -[dependencies.futures] -version = "0.3" - -[dependencies.time] -version = "0.3" -features = ["serde"] - -[dependencies.serde] -version = "1" -features = ["derive"] - -[dependencies.serde_variant] -version = "0.1" - -[dependencies.axum-prometheus] -version = "0.6" -optional = true - -[dependencies.metrics] -version = "0.22" - -[dependencies.sha2] -version = "0.10" - -[dependencies.base64] -version = "0.22" diff --git a/src/cli.rs b/src/cli.rs index 7d08c49..80aa4b6 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -43,7 +43,7 @@ pub struct Args { #[arg(long)] pub database_url: String, - #[cfg(feature = "opentelemetry")] + #[cfg(feature = "otel")] #[arg(long, value_enum, default_value_t = BoolArg::False)] pub enable_opentelemetry: BoolArg, diff --git a/src/main.rs b/src/main.rs index bf59e70..5cd2eec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,7 +42,7 @@ async fn main() -> MainResult { }; telemetry::tracing::init( - #[cfg(feature = "opentelemetry")] + #[cfg(feature = "otel")] if args.enable_opentelemetry.into() { telemetry::tracing::OpenTelemetryConfig::Enabled } else { @@ -142,7 +142,7 @@ async fn main() -> MainResult { .expect("join_set is empty, this is a bug"); // EXPECT: We never expect a JoinError, as all threads run infinitely - let result = result.expect("thread panicked"); + let result: Result<(), Error> = result.expect("thread panicked"); // If we get an Ok(()), something weird happened let result = result.expect_err("thread ran to completion"); diff --git a/src/telemetry/tracing/mod.rs b/src/telemetry/tracing.rs similarity index 79% rename from src/telemetry/tracing/mod.rs rename to src/telemetry/tracing.rs index 4715bdf..9009bb7 100644 --- a/src/telemetry/tracing/mod.rs +++ b/src/telemetry/tracing.rs @@ -22,11 +22,6 @@ use tracing::Instrument; use uuid::Uuid; -#[cfg(feature = "opentelemetry")] -use opentelemetry::{global, trace::TracerProvider as _}; -#[cfg(feature = "opentelemetry")] -use opentelemetry_sdk::trace::TracerProvider; - pub enum OpenTelemetryConfig { Enabled, Disabled, @@ -66,7 +61,7 @@ fn get_stdout_layer< stdout_layer.boxed() } -#[cfg(feature = "opentelemetry")] +#[cfg(feature = "otel")] fn get_opentelemetry_layer< T: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, >( @@ -75,20 +70,45 @@ fn get_opentelemetry_layer< ) -> Option> { match config { OpenTelemetryConfig::Enabled => { - global::set_text_map_propagator( - opentelemetry_sdk::propagation::TraceContextPropagator::new(), - ); - // Sets up the machinery needed to export data to an opentelemetry endpoint. - // There are other OTel crates that provide pipelines for the vendors - // mentioned earlier. - let provider = TracerProvider::builder() - // .with_service_name() - // .with_max_packet_size(50_000) - // .with_auto_split_batch(true) - // .install_batch(Tokio) - .build(); + use std::time::Duration; - let tracer = provider.tracer(env!("CARGO_PKG_NAME")); + use opentelemetry::{global, KeyValue}; + use opentelemetry_otlp::WithExportConfig as _; + use opentelemetry_sdk::{ + trace::{RandomIdGenerator, Sampler}, + Resource, + }; + + use tonic::metadata::MetadataMap; + + let mut metadata = MetadataMap::with_capacity(3); + metadata.insert("x-host", "localhost".parse().unwrap()); + + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint("http://localhost:4317") + .with_timeout(Duration::from_secs(3)) + .with_metadata(metadata), + ) + .with_trace_config( + opentelemetry_sdk::trace::config() + .with_sampler(Sampler::AlwaysOn) + .with_id_generator(RandomIdGenerator::default()) + .with_max_events_per_span(64) + .with_max_attributes_per_span(16) + .with_max_events_per_span(16) + .with_resource(Resource::new(vec![KeyValue::new( + "service.name", + "packager", + )])), + ) + .install_batch(opentelemetry_sdk::runtime::Tokio) + .unwrap(); + + // let tracer = provider.tracer(env!("CARGO_PKG_NAME")); let opentelemetry_filter = { Targets::new() @@ -119,7 +139,7 @@ fn get_opentelemetry_layer< type ShutdownFunction = Box Result<(), Box>>; pub async fn init( - #[cfg(feature = "opentelemetry")] opentelemetry_config: OpenTelemetryConfig, + #[cfg(feature = "otel")] opentelemetry_config: OpenTelemetryConfig, #[cfg(feature = "tokio-console")] tokio_console_config: TokioConsoleConfig, args: crate::cli::Args, f: Func, @@ -130,12 +150,9 @@ where { // mut is dependent on features (it's only required when opentelemetry is set), so // let's just disable the lint - #[cfg(feature = "opentelemetry")] + #[allow(unused_mut)] let mut shutdown_functions: Vec = vec![]; - #[cfg(not(feature = "opentelemetry"))] - let shutdown_functions: Vec = vec![]; - #[cfg(feature = "tokio-console")] let console_layer = match tokio_console_config { TokioConsoleConfig::Enabled => Some(console_subscriber::Builder::default().spawn()), @@ -144,7 +161,7 @@ where let stdout_layer = get_stdout_layer(); - #[cfg(feature = "opentelemetry")] + #[cfg(feature = "otel")] let opentelemetry_layer = get_opentelemetry_layer(&opentelemetry_config, &mut shutdown_functions); @@ -153,7 +170,7 @@ where #[cfg(feature = "tokio-console")] let registry = registry.with(console_layer); - #[cfg(feature = "opentelemetry")] + #[cfg(feature = "otel")] let registry = registry.with(opentelemetry_layer); // just an example, you can actuall pass Options here for layers that might be // set/unset at runtime diff --git a/start-jaeger.sh b/start-jaeger.sh index 77cef2b..d5592e6 100755 --- a/start-jaeger.sh +++ b/start-jaeger.sh @@ -1,3 +1,11 @@ #!/usr/bin/env bash -docker run --rm --name packager-jaeger -p6831:6831/udp -p6832:6832/udp -p16686:16686 -p14268:14268 jaegertracing/all-in-one:latest "${@}" +docker run \ + --rm \ + --name \ + packager-jaeger \ + -p 4317:4317 \ + -p 4318:4318 \ + -p16686:16686 \ + jaegertracing/all-in-one:latest \ + "${@}"