Skip to content

chore: Prepare for opentelemetry-appender-tracing 0.30.1 - bump tracing-opentelemetry to 0.31 #3022

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 5, 2025
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.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ sysinfo = "0.32"
tempfile = "3.3.0"
testcontainers = "0.23.1"
tracing-log = "0.2"
tracing-opentelemetry = "0.30"
tracing-opentelemetry = "0.31"
typed-builder = "0.20"
uuid = "1.3"

Expand Down
6 changes: 6 additions & 0 deletions opentelemetry-appender-tracing/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## vNext

## 0.30.1

Released 2025-June-05

- Bump `tracing-opentelemetry` to 0.31

## 0.30.0

Released 2025-May-23
Expand Down
7 changes: 3 additions & 4 deletions opentelemetry-appender-tracing/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "opentelemetry-appender-tracing"
version = "0.30.0"
version = "0.30.1"
edition = "2021"
description = "An OpenTelemetry log appender for the tracing crate"
homepage = "https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-appender-tracing"
Expand All @@ -18,7 +18,7 @@ tracing = { workspace = true, features = ["std"]}
tracing-core = { workspace = true }
tracing-log = { workspace = true, optional = true }
tracing-subscriber = { workspace = true, features = ["registry", "std"] }
# tracing-opentelemetry = { workspace = true, optional = true }
tracing-opentelemetry = { workspace = true, optional = true }

[dev-dependencies]
log = { workspace = true }
Expand All @@ -37,8 +37,7 @@ pprof = { version = "0.14", features = ["flamegraph", "criterion"] }
default = []
experimental_metadata_attributes = ["dep:tracing-log"]
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled"]
# TODO: Enable this back in 0.30.1 after tracing-opentelemetry is released
# experimental_use_tracing_span_context = ["tracing-opentelemetry"]
experimental_use_tracing_span_context = ["tracing-opentelemetry"]


[[bench]]
Expand Down
266 changes: 133 additions & 133 deletions opentelemetry-appender-tracing/src/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -244,28 +244,28 @@
// Visit fields.
event.record(&mut visitor);

// #[cfg(feature = "experimental_use_tracing_span_context")]
// if let Some(span) = _ctx.event_span(event) {
// use opentelemetry::trace::TraceContextExt;
// use tracing_opentelemetry::OtelData;
// if let Some(otd) = span.extensions().get::<OtelData>() {
// if let Some(span_id) = otd.builder.span_id {
// let opt_trace_id = if otd.parent_cx.has_active_span() {
// Some(otd.parent_cx.span().span_context().trace_id())
// } else {
// span.scope().last().and_then(|root_span| {
// root_span
// .extensions()
// .get::<OtelData>()
// .and_then(|otd| otd.builder.trace_id)
// })
// };
// if let Some(trace_id) = opt_trace_id {
// log_record.set_trace_context(trace_id, span_id, None);
// }
// }
// }
// }
#[cfg(feature = "experimental_use_tracing_span_context")]
if let Some(span) = _ctx.event_span(event) {
use opentelemetry::trace::TraceContextExt;
use tracing_opentelemetry::OtelData;
if let Some(otd) = span.extensions().get::<OtelData>() {
if let Some(span_id) = otd.builder.span_id {
let opt_trace_id = if otd.parent_cx.has_active_span() {
Some(otd.parent_cx.span().span_context().trace_id())
} else {
span.scope().last().and_then(|root_span| {
root_span
.extensions()
.get::<OtelData>()
.and_then(|otd| otd.builder.trace_id)
})
};
if let Some(trace_id) = opt_trace_id {
log_record.set_trace_context(trace_id, span_id, None);
}
}
}

Check warning on line 267 in opentelemetry-appender-tracing/src/layer.rs

View check run for this annotation

Codecov / codecov/patch

opentelemetry-appender-tracing/src/layer.rs#L266-L267

Added lines #L266 - L267 were not covered by tests
}

//emit record
self.logger.emit(log_record);
Expand Down Expand Up @@ -611,117 +611,117 @@
}
}

// #[cfg(feature = "experimental_use_tracing_span_context")]
// #[test]
// fn tracing_appender_inside_tracing_crate_context() {
// use opentelemetry::{trace::SpanContext, Context, SpanId, TraceId};
// use opentelemetry_sdk::trace::InMemorySpanExporterBuilder;
// use tracing_opentelemetry::OpenTelemetrySpanExt;

// // Arrange
// let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
// let logger_provider = SdkLoggerProvider::builder()
// .with_simple_exporter(exporter.clone())
// .build();

// // setup tracing layer to compare trace/span IDs against
// let span_exporter = InMemorySpanExporterBuilder::new().build();
// let tracer_provider = SdkTracerProvider::builder()
// .with_simple_exporter(span_exporter.clone())
// .build();
// let tracer = tracer_provider.tracer("test-tracer");

// let level_filter = tracing_subscriber::filter::LevelFilter::ERROR;
// let log_layer =
// layer::OpenTelemetryTracingBridge::new(&logger_provider).with_filter(level_filter);

// let subscriber = tracing_subscriber::registry()
// .with(log_layer)
// .with(tracing_opentelemetry::layer().with_tracer(tracer));

// // Avoiding global subscriber.init() as that does not play well with unit tests.
// let _guard = tracing::subscriber::set_default(subscriber);

// // Act
// tracing::error_span!("outer-span").in_scope(|| {
// error!("first-event");

// tracing::error_span!("inner-span").in_scope(|| {
// error!("second-event");
// });
// });

// assert!(logger_provider.force_flush().is_ok());

// let logs = exporter.get_emitted_logs().expect("No emitted logs");
// assert_eq!(logs.len(), 2, "Expected 2 logs, got: {logs:?}");

// let spans = span_exporter.get_finished_spans().unwrap();
// assert_eq!(spans.len(), 2);

// let trace_id = spans[0].span_context.trace_id();
// assert_eq!(trace_id, spans[1].span_context.trace_id());
// let inner_span_id = spans[0].span_context.span_id();
// let outer_span_id = spans[1].span_context.span_id();
// assert_eq!(outer_span_id, spans[0].parent_span_id);

// let trace_ctx0 = logs[0].record.trace_context().unwrap();
// let trace_ctx1 = logs[1].record.trace_context().unwrap();

// assert_eq!(trace_ctx0.trace_id, trace_id);
// assert_eq!(trace_ctx1.trace_id, trace_id);
// assert_eq!(trace_ctx0.span_id, outer_span_id);
// assert_eq!(trace_ctx1.span_id, inner_span_id);

// // Set context from remote.
// let remote_trace_id = TraceId::from_u128(233);
// let remote_span_id = SpanId::from_u64(2333);
// let remote_span_context = SpanContext::new(
// remote_trace_id,
// remote_span_id,
// TraceFlags::SAMPLED,
// true,
// Default::default(),
// );

// // Act again.
// tracing::error_span!("outer-span").in_scope(|| {
// let span = tracing::Span::current();
// let parent_context = Context::current().with_remote_span_context(remote_span_context);
// span.set_parent(parent_context);

// error!("first-event");

// tracing::error_span!("inner-span").in_scope(|| {
// error!("second-event");
// });
// });

// assert!(logger_provider.force_flush().is_ok());

// let logs = exporter.get_emitted_logs().expect("No emitted logs");
// assert_eq!(logs.len(), 4, "Expected 4 logs, got: {logs:?}");
// let logs = &logs[2..];

// let spans = span_exporter.get_finished_spans().unwrap();
// assert_eq!(spans.len(), 4);
// let spans = &spans[2..];

// let trace_id = spans[0].span_context.trace_id();
// assert_eq!(trace_id, remote_trace_id);
// assert_eq!(trace_id, spans[1].span_context.trace_id());
// let inner_span_id = spans[0].span_context.span_id();
// let outer_span_id = spans[1].span_context.span_id();
// assert_eq!(outer_span_id, spans[0].parent_span_id);

// let trace_ctx0 = logs[0].record.trace_context().unwrap();
// let trace_ctx1 = logs[1].record.trace_context().unwrap();

// assert_eq!(trace_ctx0.trace_id, trace_id);
// assert_eq!(trace_ctx1.trace_id, trace_id);
// assert_eq!(trace_ctx0.span_id, outer_span_id);
// assert_eq!(trace_ctx1.span_id, inner_span_id);
// }
#[cfg(feature = "experimental_use_tracing_span_context")]
#[test]
fn tracing_appender_inside_tracing_crate_context() {
use opentelemetry::{trace::SpanContext, Context, SpanId, TraceId};
use opentelemetry_sdk::trace::InMemorySpanExporterBuilder;
use tracing_opentelemetry::OpenTelemetrySpanExt;

// Arrange
let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
let logger_provider = SdkLoggerProvider::builder()
.with_simple_exporter(exporter.clone())
.build();

// setup tracing layer to compare trace/span IDs against
let span_exporter = InMemorySpanExporterBuilder::new().build();
let tracer_provider = SdkTracerProvider::builder()
.with_simple_exporter(span_exporter.clone())
.build();
let tracer = tracer_provider.tracer("test-tracer");

let level_filter = tracing_subscriber::filter::LevelFilter::ERROR;
let log_layer =
layer::OpenTelemetryTracingBridge::new(&logger_provider).with_filter(level_filter);

let subscriber = tracing_subscriber::registry()
.with(log_layer)
.with(tracing_opentelemetry::layer().with_tracer(tracer));

// Avoiding global subscriber.init() as that does not play well with unit tests.
let _guard = tracing::subscriber::set_default(subscriber);

// Act
tracing::error_span!("outer-span").in_scope(|| {
error!("first-event");

tracing::error_span!("inner-span").in_scope(|| {
error!("second-event");
});
});

assert!(logger_provider.force_flush().is_ok());

let logs = exporter.get_emitted_logs().expect("No emitted logs");
assert_eq!(logs.len(), 2, "Expected 2 logs, got: {logs:?}");

let spans = span_exporter.get_finished_spans().unwrap();
assert_eq!(spans.len(), 2);

let trace_id = spans[0].span_context.trace_id();
assert_eq!(trace_id, spans[1].span_context.trace_id());
let inner_span_id = spans[0].span_context.span_id();
let outer_span_id = spans[1].span_context.span_id();
assert_eq!(outer_span_id, spans[0].parent_span_id);

let trace_ctx0 = logs[0].record.trace_context().unwrap();
let trace_ctx1 = logs[1].record.trace_context().unwrap();

assert_eq!(trace_ctx0.trace_id, trace_id);
assert_eq!(trace_ctx1.trace_id, trace_id);
assert_eq!(trace_ctx0.span_id, outer_span_id);
assert_eq!(trace_ctx1.span_id, inner_span_id);

// Set context from remote.
let remote_trace_id = TraceId::from_u128(233);
let remote_span_id = SpanId::from_u64(2333);
let remote_span_context = SpanContext::new(
remote_trace_id,
remote_span_id,
TraceFlags::SAMPLED,
true,
Default::default(),
);

// Act again.
tracing::error_span!("outer-span").in_scope(|| {
let span = tracing::Span::current();
let parent_context = Context::current().with_remote_span_context(remote_span_context);
span.set_parent(parent_context);

error!("first-event");

tracing::error_span!("inner-span").in_scope(|| {
error!("second-event");
});
});

assert!(logger_provider.force_flush().is_ok());

let logs = exporter.get_emitted_logs().expect("No emitted logs");
assert_eq!(logs.len(), 4, "Expected 4 logs, got: {logs:?}");
let logs = &logs[2..];

let spans = span_exporter.get_finished_spans().unwrap();
assert_eq!(spans.len(), 4);
let spans = &spans[2..];

let trace_id = spans[0].span_context.trace_id();
assert_eq!(trace_id, remote_trace_id);
assert_eq!(trace_id, spans[1].span_context.trace_id());
let inner_span_id = spans[0].span_context.span_id();
let outer_span_id = spans[1].span_context.span_id();
assert_eq!(outer_span_id, spans[0].parent_span_id);

let trace_ctx0 = logs[0].record.trace_context().unwrap();
let trace_ctx1 = logs[1].record.trace_context().unwrap();

assert_eq!(trace_ctx0.trace_id, trace_id);
assert_eq!(trace_ctx1.trace_id, trace_id);
assert_eq!(trace_ctx0.span_id, outer_span_id);
assert_eq!(trace_ctx1.span_id, inner_span_id);
}

#[test]
fn tracing_appender_standalone_with_tracing_log() {
Expand Down
Loading