Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 8 additions & 1 deletion packages/opentelemetry-tracing-utils/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ 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.

## [0.7.1] - 2025-11-21

## [0.7.0] - 2025-11-21
Expand Down Expand Up @@ -42,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.

<!-- next-url -->
[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
Expand Down
2 changes: 1 addition & 1 deletion packages/opentelemetry-tracing-utils/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
54 changes: 32 additions & 22 deletions packages/opentelemetry-tracing-utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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<LoggingSetupBuildResult> {
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();
Expand All @@ -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
Expand All @@ -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"));

Expand Down
6 changes: 2 additions & 4 deletions packages/opentelemetry-tracing-utils/src/trace_output_fmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<()> {
Expand Down