Skip to content

Commit 108a40f

Browse files
committed
Merge branch 'semconv-1.30.0' of github.com:lalitb/opentelemetry-rust into semconv-1.30.0
2 parents ca22b5c + ac65bc0 commit 108a40f

File tree

19 files changed

+180
-70
lines changed

19 files changed

+180
-70
lines changed

.cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
// workspace dictionary.
2727
"words": [
2828
"actix",
29+
"anyvalue",
2930
"appender",
3031
"appenders",
3132
"Bhasin",

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ members = [
88
"stress",
99
]
1010
resolver = "2"
11+
# Avoid applying patch to force use of workspace members for this
12+
# not actively maintained crate
13+
exclude = ["opentelemetry-prometheus"]
1114

1215
[profile.bench]
1316
# https://doc.rust-lang.org/cargo/reference/profiles.html#bench
@@ -50,3 +53,9 @@ tracing = { version = ">=0.1.40", default-features = false }
5053
tracing-core = { version = ">=0.1.33", default-features = false }
5154
tracing-subscriber = { version = "0.3", default-features = false }
5255
url = { version = "2.5", default-features = false }
56+
57+
# Aviod use of crates.io version of these crates through the tracing-opentelemetry dependencies
58+
[patch.crates-io]
59+
opentelemetry = { path = "opentelemetry" }
60+
opentelemetry_sdk = { path = "opentelemetry-sdk" }
61+
opentelemetry-stdout = { path = "opentelemetry-stdout" }

opentelemetry-appender-tracing/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## vNext
44

55
- Bump msrv to 1.75.0.
6+
- New experimental feature to use trace\_id & span\_id from spans created through the [tracing](https://crates.io/crates/tracing) crate (experimental_use_tracing_span_context) [#2438](https://github.com/open-telemetry/opentelemetry-rust/pull/2438)
67

78

89
## 0.27.0

opentelemetry-appender-tracing/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ tracing = { workspace = true, features = ["std"]}
1717
tracing-core = { workspace = true }
1818
tracing-log = { version = "0.2", optional = true }
1919
tracing-subscriber = { workspace = true, features = ["registry", "std"] }
20+
tracing-opentelemetry = { version = "0.28", optional = true }
2021

2122
[dev-dependencies]
2223
log = { workspace = true }
@@ -33,6 +34,7 @@ pprof = { version = "0.14", features = ["flamegraph", "criterion"] }
3334
[features]
3435
experimental_metadata_attributes = ["dep:tracing-log"]
3536
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled"]
37+
experimental_use_tracing_span_context = ["tracing-opentelemetry"]
3638

3739

3840
[[bench]]

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tracing_core::Level;
88
use tracing_core::Metadata;
99
#[cfg(feature = "experimental_metadata_attributes")]
1010
use tracing_log::NormalizeEvent;
11-
use tracing_subscriber::Layer;
11+
use tracing_subscriber::{registry::LookupSpan, Layer};
1212

1313
const INSTRUMENTATION_LIBRARY_NAME: &str = "opentelemetry-appender-tracing";
1414

@@ -149,7 +149,7 @@ where
149149

150150
impl<S, P, L> Layer<S> for OpenTelemetryTracingBridge<P, L>
151151
where
152-
S: tracing::Subscriber,
152+
S: tracing::Subscriber + for<'a> LookupSpan<'a>,
153153
P: LoggerProvider<Logger = L> + Send + Sync + 'static,
154154
L: Logger + Send + Sync + 'static,
155155
{
@@ -180,6 +180,26 @@ where
180180
// Visit fields.
181181
event.record(&mut visitor);
182182

183+
#[cfg(feature = "experimental_use_tracing_span_context")]
184+
if let Some(span) = _ctx.event_span(event) {
185+
use tracing_opentelemetry::OtelData;
186+
let opt_span_id = span
187+
.extensions()
188+
.get::<OtelData>()
189+
.and_then(|otd| otd.builder.span_id);
190+
191+
let opt_trace_id = span.scope().last().and_then(|root_span| {
192+
root_span
193+
.extensions()
194+
.get::<OtelData>()
195+
.and_then(|otd| otd.builder.trace_id)
196+
});
197+
198+
if let Some((trace_id, span_id)) = opt_trace_id.zip(opt_span_id) {
199+
log_record.set_trace_context(trace_id, span_id, None);
200+
}
201+
}
202+
183203
//emit record
184204
self.logger.emit(log_record);
185205
}
@@ -495,6 +515,67 @@ mod tests {
495515
}
496516
}
497517

518+
#[cfg(feature = "experimental_use_tracing_span_context")]
519+
#[test]
520+
fn tracing_appender_inside_tracing_crate_context() {
521+
use opentelemetry_sdk::trace::InMemorySpanExporterBuilder;
522+
523+
// Arrange
524+
let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
525+
let logger_provider = LoggerProvider::builder()
526+
.with_simple_exporter(exporter.clone())
527+
.build();
528+
529+
// setup tracing layer to compare trace/span IDs against
530+
let span_exporter = InMemorySpanExporterBuilder::new().build();
531+
let tracer_provider = TracerProvider::builder()
532+
.with_simple_exporter(span_exporter.clone())
533+
.build();
534+
let tracer = tracer_provider.tracer("test-tracer");
535+
536+
let level_filter = tracing_subscriber::filter::LevelFilter::INFO;
537+
let log_layer =
538+
layer::OpenTelemetryTracingBridge::new(&logger_provider).with_filter(level_filter);
539+
540+
let subscriber = tracing_subscriber::registry()
541+
.with(log_layer)
542+
.with(tracing_opentelemetry::layer().with_tracer(tracer));
543+
544+
// Avoiding global subscriber.init() as that does not play well with unit tests.
545+
let _guard = tracing::subscriber::set_default(subscriber);
546+
547+
// Act
548+
tracing::info_span!("outer-span").in_scope(|| {
549+
error!("first-event");
550+
551+
tracing::info_span!("inner-span").in_scope(|| {
552+
error!("second-event");
553+
});
554+
});
555+
556+
logger_provider.force_flush();
557+
558+
let logs = exporter.get_emitted_logs().expect("No emitted logs");
559+
assert_eq!(logs.len(), 2);
560+
561+
let spans = span_exporter.get_finished_spans().unwrap();
562+
assert_eq!(spans.len(), 2);
563+
564+
let trace_id = spans[0].span_context.trace_id();
565+
assert_eq!(trace_id, spans[1].span_context.trace_id());
566+
let inner_span_id = spans[0].span_context.span_id();
567+
let outer_span_id = spans[1].span_context.span_id();
568+
assert_eq!(outer_span_id, spans[0].parent_span_id);
569+
570+
let trace_ctx0 = logs[0].record.trace_context().unwrap();
571+
let trace_ctx1 = logs[1].record.trace_context().unwrap();
572+
573+
assert_eq!(trace_ctx0.trace_id, trace_id);
574+
assert_eq!(trace_ctx1.trace_id, trace_id);
575+
assert_eq!(trace_ctx0.span_id, outer_span_id);
576+
assert_eq!(trace_ctx1.span_id, inner_span_id);
577+
}
578+
498579
#[test]
499580
fn tracing_appender_standalone_with_tracing_log() {
500581
// Arrange

opentelemetry-otlp/src/lib.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77
//! order to support open-source telemetry data formats (e.g. Jaeger,
88
//! Prometheus, etc.) sending to multiple open-source or commercial back-ends.
99
//!
10-
//! Currently, this crate only support sending telemetry in OTLP
11-
//! via grpc and http (in binary format). Supports for other format and protocol
12-
//! will be added in the future. The details of what's currently offering in this
13-
//! crate can be found in this doc.
10+
//! Currently, this crate supports sending telemetry in OTLP
11+
//! via gRPC and http (binary and json).
1412
//!
1513
//! # Quickstart
1614
//!
@@ -56,34 +54,36 @@
5654
//!
5755
//! ## Performance
5856
//!
59-
//! For optimal performance, a batch exporter is recommended as the simple
60-
//! exporter will export each span synchronously on dropping. You can enable the
61-
//! [`rt-tokio`], [`rt-tokio-current-thread`] or [`rt-async-std`] features and
62-
//! specify a runtime on the pipeline builder to have a batch exporter
63-
//! configured for you automatically.
57+
//! For optimal performance, a batch exporting processor is recommended as the simple
58+
//! processor will export each span synchronously on dropping, and is only good
59+
//! for test/debug purposes.
6460
//!
6561
//! ```toml
6662
//! [dependencies]
67-
//! opentelemetry_sdk = { version = "*", features = ["async-std"] }
6863
//! opentelemetry-otlp = { version = "*", features = ["grpc-tonic"] }
6964
//! ```
7065
//!
7166
//! ```no_run
7267
//! # #[cfg(all(feature = "trace", feature = "grpc-tonic"))]
7368
//! # {
74-
//! # fn main() -> Result<(), opentelemetry::trace::TraceError> {
75-
//! let tracer = opentelemetry_sdk::trace::TracerProvider::builder()
76-
//! .with_batch_exporter(
77-
//! opentelemetry_otlp::SpanExporter::builder()
78-
//! .with_tonic()
79-
//! .build()?,
80-
//! opentelemetry_sdk::runtime::Tokio,
81-
//! )
82-
//! .build();
69+
//! use opentelemetry::global;
70+
//! use opentelemetry::trace::Tracer;
8371
//!
84-
//! # Ok(())
85-
//! # }
86-
//! # }
72+
//! fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
73+
//! // First, create a OTLP exporter builder. Configure it as you need.
74+
//! let otlp_exporter = opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?;
75+
//! // Then pass it into provider builder
76+
//! let _ = opentelemetry_sdk::trace::TracerProvider::builder()
77+
//! .with_batch_exporter(otlp_exporter)
78+
//! .build();
79+
//! let tracer = global::tracer("my_tracer");
80+
//! tracer.in_span("doing_work", |cx| {
81+
//! // Traced app logic here...
82+
//! });
83+
//!
84+
//! Ok(())
85+
//! # }
86+
//! }
8787
//! ```
8888
//!
8989
//! [`tokio`]: https://tokio.rs
@@ -92,7 +92,7 @@
9292
//! # Feature Flags
9393
//! The following feature flags can enable exporters for different telemetry signals:
9494
//!
95-
//! * `trace`: Includes the trace exporters (enabled by default).
95+
//! * `trace`: Includes the trace exporters.
9696
//! * `metrics`: Includes the metrics exporters.
9797
//! * `logs`: Includes the logs exporters.
9898
//!
@@ -101,17 +101,17 @@
101101
//!
102102
//! The following feature flags offer additional configurations on gRPC:
103103
//!
104-
//! For users uses `tonic` as grpc layer:
105-
//! * `grpc-tonic`: Use `tonic` as grpc layer. This is enabled by default.
104+
//! For users using `tonic` as grpc layer:
105+
//! * `grpc-tonic`: Use `tonic` as grpc layer.
106106
//! * `gzip-tonic`: Use gzip compression for `tonic` grpc layer.
107107
//! * `zstd-tonic`: Use zstd compression for `tonic` grpc layer.
108108
//! * `tls-roots`: Adds system trust roots to rustls-based gRPC clients using the rustls-native-certs crate
109109
//! * `tls-webpki-roots`: Embeds Mozilla's trust roots to rustls-based gRPC clients using the webpki-roots crate
110110
//!
111111
//! The following feature flags offer additional configurations on http:
112112
//!
113-
//! * `http-proto`: Use http as transport layer, protobuf as body format.
114-
//! * `reqwest-blocking-client`: Use reqwest blocking http client.
113+
//! * `http-proto`: Use http as transport layer, protobuf as body format. This feature is enabled by default.
114+
//! * `reqwest-blocking-client`: Use reqwest blocking http client. This feature is enabled by default.
115115
//! * `reqwest-client`: Use reqwest http client.
116116
//! * `reqwest-rustls`: Use reqwest with TLS with system trust roots via `rustls-native-certs` crate.
117117
//! * `reqwest-rustls-webpki-roots`: Use reqwest with TLS with Mozilla's trust roots via `webpki-roots` crate.
@@ -152,7 +152,7 @@
152152
//! .build()?;
153153
//!
154154
//! let tracer_provider = opentelemetry_sdk::trace::TracerProvider::builder()
155-
//! .with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio)
155+
//! .with_batch_exporter(exporter)
156156
//! .with_config(
157157
//! trace::Config::default()
158158
//! .with_sampler(Sampler::AlwaysOn)
@@ -162,7 +162,7 @@
162162
//! .with_max_events_per_span(16)
163163
//! .with_resource(Resource::builder_empty().with_attributes([KeyValue::new("service.name", "example")]).build()),
164164
//! ).build();
165-
//! global::set_tracer_provider(tracer_provider);
165+
//! global::set_tracer_provider(tracer_provider.clone());
166166
//! let tracer = global::tracer("tracer-name");
167167
//! # tracer
168168
//! # };
@@ -179,7 +179,7 @@
179179
//!
180180
//! let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter)
181181
//! .with_interval(std::time::Duration::from_secs(3))
182-
//! .with_timeout(Duration::from_secs(10))
182+
//! .with_timeout(Duration::from_secs(10))
183183
//! .build();
184184
//!
185185
//! let provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()

opentelemetry-prometheus/Cargo.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ all-features = true
2020
rustdoc-args = ["--cfg", "docsrs"]
2121

2222
[dependencies]
23-
once_cell = { workspace = true }
23+
once_cell = { version = "1.13" }
2424
opentelemetry = { version = "0.27", default-features = false, features = ["metrics"] }
2525
opentelemetry_sdk = { version = "0.27", default-features = false, features = ["metrics"] }
2626
prometheus = "0.13"
2727
protobuf = "2.14"
28-
tracing = {workspace = true, optional = true} # optional for opentelemetry internal logging
28+
tracing = {version = ">=0.1.40", default-features = false, optional = true} # optional for opentelemetry internal logging
2929

3030
[dev-dependencies]
3131
opentelemetry-semantic-conventions = { version = "0.27" }
32-
http-body-util = { workspace = true }
33-
hyper = { workspace = true, features = ["full"] }
34-
hyper-util = { workspace = true, features = ["full"] }
35-
tokio = { workspace = true, features = ["full"] }
32+
http-body-util = { version = "0.1" }
33+
hyper = { version = "1.3", features = ["full"] }
34+
hyper-util = { version = "0.1", features = ["full"] }
35+
tokio = { version = "1", features = ["full"] }
3636

3737
[features]
3838
default = ["internal-logs"]

opentelemetry-sdk/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,12 @@ limit.
288288
`opentelemetry_sdk::logs::{ExportResult, LogBatch, LogExporter};`
289289

290290
- *Breaking* `opentelemetry_sdk::LogRecord::default()` method is removed.
291-
The only way to create log record outside opentelemetry_sdk crate is using
291+
The only way to create log record outside opentelemetry_sdk crate is using
292292
`Logger::create_log_record()` method.
293293

294+
- Rename `opentelemetry_sdk::logs::Builder` to `opentelemetry_sdk::logs::LoggerProviderBuilder`.
295+
- Rename `opentelemetry_sdk::trace::Builder` to `opentelemetry_sdk::trace::TracerProviderBuilder`.
296+
294297
- *Breaking*: Rename namespaces for InMemoryExporters. (The module is still under "testing" feature flag)
295298
before:
296299
`opentelemetry_sdk::testing::logs::{InMemoryLogExporter, InMemoryLogExporterBuilder};`

opentelemetry-sdk/src/logs/logger_provider.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ impl opentelemetry::logs::LoggerProvider for LoggerProvider {
7878

7979
impl LoggerProvider {
8080
/// Create a new `LoggerProvider` builder.
81-
pub fn builder() -> Builder {
82-
Builder::default()
81+
pub fn builder() -> LoggerProviderBuilder {
82+
LoggerProviderBuilder::default()
8383
}
8484

8585
pub(crate) fn log_processors(&self) -> &[Box<dyn LogProcessor>] {
@@ -179,12 +179,12 @@ impl Drop for LoggerProviderInner {
179179

180180
#[derive(Debug, Default)]
181181
/// Builder for provider attributes.
182-
pub struct Builder {
182+
pub struct LoggerProviderBuilder {
183183
processors: Vec<Box<dyn LogProcessor>>,
184184
resource: Option<Resource>,
185185
}
186186

187-
impl Builder {
187+
impl LoggerProviderBuilder {
188188
/// Adds a [SimpleLogProcessor] with the configured exporter to the pipeline.
189189
///
190190
/// # Arguments
@@ -200,7 +200,7 @@ impl Builder {
200200
let mut processors = self.processors;
201201
processors.push(Box::new(SimpleLogProcessor::new(exporter)));
202202

203-
Builder { processors, ..self }
203+
LoggerProviderBuilder { processors, ..self }
204204
}
205205

206206
/// Adds a [BatchLogProcessor] with the configured exporter to the pipeline.
@@ -234,12 +234,12 @@ impl Builder {
234234
let mut processors = self.processors;
235235
processors.push(Box::new(processor));
236236

237-
Builder { processors, ..self }
237+
LoggerProviderBuilder { processors, ..self }
238238
}
239239

240240
/// The `Resource` to be associated with this Provider.
241241
pub fn with_resource(self, resource: Resource) -> Self {
242-
Builder {
242+
LoggerProviderBuilder {
243243
resource: Some(resource),
244244
..self
245245
}

opentelemetry-sdk/src/logs/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub use log_processor::{
1919
BatchConfig, BatchConfigBuilder, BatchLogProcessor, BatchLogProcessorBuilder, LogProcessor,
2020
SimpleLogProcessor,
2121
};
22-
pub use logger_provider::{Builder, Logger, LoggerProvider};
22+
pub use logger_provider::{Logger, LoggerProvider, LoggerProviderBuilder};
2323
pub use record::{LogRecord, TraceContext};
2424

2525
#[cfg(feature = "experimental_logs_batch_log_processor_with_async_runtime")]

0 commit comments

Comments
 (0)