From 6cd1d4a393c85b222faf9a65847fa59f69489298 Mon Sep 17 00:00:00 2001 From: Sam Greening <2552620+SG60@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:09:05 +0000 Subject: [PATCH 1/4] feat: support sending OTEL trace data to stdout, for debugging This is a breaking change, as the type of `LoggingSetupBuilder` has changed. --- .../opentelemetry-tracing-utils/CHANGELOG.md | 3 ++ .../opentelemetry-tracing-utils/src/lib.rs | 54 +++++++++++-------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/packages/opentelemetry-tracing-utils/CHANGELOG.md b/packages/opentelemetry-tracing-utils/CHANGELOG.md index 54869f3..17dd4e0 100644 --- a/packages/opentelemetry-tracing-utils/CHANGELOG.md +++ b/packages/opentelemetry-tracing-utils/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - ReleaseDate +### Changed +- **BREAKING**: Support sending OTEL trace data to stdout, for debugging. This is a breaking change, as the type of `LoggingSetupBuilder` has changed. + ## [0.7.1] - 2025-11-21 ## [0.7.0] - 2025-11-21 diff --git a/packages/opentelemetry-tracing-utils/src/lib.rs b/packages/opentelemetry-tracing-utils/src/lib.rs index 86fa2f0..b7643e2 100644 --- a/packages/opentelemetry-tracing-utils/src/lib.rs +++ b/packages/opentelemetry-tracing-utils/src/lib.rs @@ -41,10 +41,20 @@ pub const NO_OTLP: &str = "NO_OTLP"; #[derive(Debug)] pub struct LoggingSetupBuilder { - pub otlp_output_enabled: bool, + pub otel_traces_exporter: OtelTracesExporterOption, pub pretty_logs: bool, pub use_test_writer: bool, } +#[derive(Debug)] +pub enum OtelTracesExporterOption { + /// Send traces to an OTLP endpoint + Otlp, + /// Write OTLP traces to stdout. Useful for debugging otel stuff. + Stdout, + /// Don't send OTEL traces anywhere + None, +} + impl Default for LoggingSetupBuilder { fn default() -> Self { let no_otlp = match std::env::var(NO_OTLP).as_deref() { @@ -53,42 +63,37 @@ impl Default for LoggingSetupBuilder { Err(_) => false, }; - let otel_traces_exporter = match std::env::var(OTEL_TRACES_EXPORTER).as_deref() { - Ok("otlp") => OtelTracesExporterOption::Otlp, - Ok("none") => OtelTracesExporterOption::None, - _ => OtelTracesExporterOption::Otlp, + let otel_traces_exporter = match no_otlp { + true => OtelTracesExporterOption::None, + false => match std::env::var(OTEL_TRACES_EXPORTER).as_deref() { + Ok("otlp") => OtelTracesExporterOption::Otlp, + Ok("none") => OtelTracesExporterOption::None, + Ok("stdout") => OtelTracesExporterOption::Stdout, + _ => OtelTracesExporterOption::Otlp, + }, }; - let otlp_enabled = no_otlp == false - && match otel_traces_exporter { - OtelTracesExporterOption::Otlp => true, - OtelTracesExporterOption::None => false, - }; - // either use the otlp state or PRETTY_LOGS env var to decide log format let pretty_logs = std::env::var("PRETTY_LOGS") .map(|e| &e == "1") - .unwrap_or_else(|_| !otlp_enabled); + // if PRETTY_LOGS is not set, and the otel traces exporter is set to none, then use + // pretty logs (since this is probably a dev environment) + .unwrap_or_else(|_| matches!(otel_traces_exporter, OtelTracesExporterOption::None)); Self { - otlp_output_enabled: otlp_enabled, + otel_traces_exporter, pretty_logs, use_test_writer: false, } } } -enum OtelTracesExporterOption { - Otlp, - None, -} - impl LoggingSetupBuilder { pub fn new() -> Self { Self::default() } pub fn build(&self) -> Result { - let otlp_enabled = self.otlp_output_enabled; + let otlp_enabled = &self.otel_traces_exporter; // First create 1 or more propagators let baggage_propagator = BaggagePropagator::new(); @@ -103,7 +108,11 @@ impl LoggingSetupBuilder { global::set_text_map_propagator(composite_propagator); // An exporter to be used when there is no OTLP endpoint - let basic_no_otlp_tracer_provider = SdkTracerProvider::builder().build(); + let otel_tracer_provider_no_output = SdkTracerProvider::builder().build(); + // An exporter that sends otel traces to stdout. Useful for debugging otel stuff. + let otel_tracer_provider_stdout = SdkTracerProvider::builder() + .with_simple_exporter(opentelemetry_stdout::SpanExporter::default()) + .build(); // Install a new OpenTelemetry trace pipeline // OTLP over GRPC tracer exporter @@ -116,9 +125,10 @@ impl LoggingSetupBuilder { .build(); let tracer_provider = match otlp_enabled { - true => otlp_tracer, + OtelTracesExporterOption::Otlp => otlp_tracer, + OtelTracesExporterOption::Stdout => otel_tracer_provider_stdout, // BUG: the non-otlp tracer isn't correctly setting context/linking ids - false => basic_no_otlp_tracer_provider, + OtelTracesExporterOption::None => otel_tracer_provider_no_output, }; let tracer = tracer_provider.tracer(env!("CARGO_PKG_NAME")); From 0498e8493459173b4a1d86ffa3b3efd83ba214da Mon Sep 17 00:00:00 2001 From: Sam Greening <2552620+SG60@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:25:27 +0000 Subject: [PATCH 2/4] chore: fix some clippy warning lints --- packages/opentelemetry-tracing-utils/CHANGELOG.md | 1 + .../opentelemetry-tracing-utils/src/trace_output_fmt.rs | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/opentelemetry-tracing-utils/CHANGELOG.md b/packages/opentelemetry-tracing-utils/CHANGELOG.md index 17dd4e0..13a9d9e 100644 --- a/packages/opentelemetry-tracing-utils/CHANGELOG.md +++ b/packages/opentelemetry-tracing-utils/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - **BREAKING**: Support sending OTEL trace data to stdout, for debugging. This is a breaking change, as the type of `LoggingSetupBuilder` has changed. +- Fix some new clippy warnings. ## [0.7.1] - 2025-11-21 diff --git a/packages/opentelemetry-tracing-utils/src/trace_output_fmt.rs b/packages/opentelemetry-tracing-utils/src/trace_output_fmt.rs index d5655f9..6fc6da9 100644 --- a/packages/opentelemetry-tracing-utils/src/trace_output_fmt.rs +++ b/packages/opentelemetry-tracing-utils/src/trace_output_fmt.rs @@ -22,11 +22,9 @@ impl<'a> io::Write for WriteAdaptor<'a> { let s = std::str::from_utf8(buf).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?; - self.fmt_write - .write_str(s) - .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; + self.fmt_write.write_str(s).map_err(io::Error::other)?; - Ok(s.as_bytes().len()) + Ok(s.len()) } fn flush(&mut self) -> io::Result<()> { From 385446594548ace33c2d51b4f754c9e8d7f74c6a Mon Sep 17 00:00:00 2001 From: Sam Greening <2552620+SG60@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:28:38 +0000 Subject: [PATCH 3/4] bump version --- Cargo.lock | 2 +- packages/opentelemetry-tracing-utils/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df87838..ad3f637 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -954,7 +954,7 @@ dependencies = [ [[package]] name = "opentelemetry-tracing-utils" -version = "0.7.1" +version = "0.8.0" dependencies = [ "anyhow", "console-subscriber", diff --git a/packages/opentelemetry-tracing-utils/Cargo.toml b/packages/opentelemetry-tracing-utils/Cargo.toml index 25bc800..108663b 100644 --- a/packages/opentelemetry-tracing-utils/Cargo.toml +++ b/packages/opentelemetry-tracing-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "opentelemetry-tracing-utils" -version = "0.7.1" +version = "0.8.0" edition.workspace = true license = "MIT OR Apache-2.0" authors.workspace = true From 78b95204caa9803de269edc6ad2ffc0a9a10f71f Mon Sep 17 00:00:00 2001 From: Sam Greening <2552620+SG60@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:30:07 +0000 Subject: [PATCH 4/4] chore: Release opentelemetry-tracing-utils version 0.8.0 --- packages/opentelemetry-tracing-utils/CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-tracing-utils/CHANGELOG.md b/packages/opentelemetry-tracing-utils/CHANGELOG.md index 13a9d9e..4c753fe 100644 --- a/packages/opentelemetry-tracing-utils/CHANGELOG.md +++ b/packages/opentelemetry-tracing-utils/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - ReleaseDate +## [0.8.0] - 2025-11-24 + ### Changed - **BREAKING**: Support sending OTEL trace data to stdout, for debugging. This is a breaking change, as the type of `LoggingSetupBuilder` has changed. - Fix some new clippy warnings. @@ -46,7 +48,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - make_tower_http_otel_trace_layer function, to create a tower layer that will propagate OTEL traces and also log requests. -[Unreleased]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.7.1...HEAD +[Unreleased]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.8.0...HEAD +[0.8.0]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.7.1...opentelemetry-tracing-utils-v0.8.0 [0.7.1]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.7.0...opentelemetry-tracing-utils-v0.7.1 [0.7.0]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.7.0...opentelemetry-tracing-utils-v0.7.0 [0.7.0]: https://github.com/sg60/sg-rust-utils/compare/opentelemetry-tracing-utils-v0.6.0...opentelemetry-tracing-utils-v0.7.0