Skip to content

Commit 4d644d5

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents 3677ceb + eca1ce8 commit 4d644d5

File tree

29 files changed

+265
-237
lines changed

29 files changed

+265
-237
lines changed

examples/logs-basic/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["logs"] }
1010
opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["logs"]}
1111
opentelemetry-appender-tracing = { path = "../../opentelemetry-appender-tracing", default-features = false}
1212
tracing = { workspace = true, features = ["std"]}
13-
tracing-subscriber = { workspace = true, features = ["registry", "std"] }
13+
tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] }

examples/logs-basic/src/main.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use opentelemetry_appender_tracing::layer;
22
use opentelemetry_sdk::logs::SdkLoggerProvider;
33
use opentelemetry_sdk::Resource;
44
use tracing::error;
5-
use tracing_subscriber::prelude::*;
5+
use tracing_subscriber::{prelude::*, EnvFilter};
66

77
fn main() {
88
let exporter = opentelemetry_stdout::LogExporter::default();
@@ -14,8 +14,37 @@ fn main() {
1414
)
1515
.with_simple_exporter(exporter)
1616
.build();
17-
let layer = layer::OpenTelemetryTracingBridge::new(&provider);
18-
tracing_subscriber::registry().with(layer).init();
17+
18+
// For the OpenTelemetry layer, add a tracing filter to filter events from
19+
// OpenTelemetry and its dependent crates (opentelemetry-otlp uses crates
20+
// like reqwest/tonic etc.) from being sent back to OTel itself, thus
21+
// preventing infinite telemetry generation. The filter levels are set as
22+
// follows:
23+
// - Allow `info` level and above by default.
24+
// - Restrict `opentelemetry`, `hyper`, `tonic`, and `reqwest` completely.
25+
// Note: This will also drop events from crates like `tonic` etc. even when
26+
// they are used outside the OTLP Exporter. For more details, see:
27+
// https://github.com/open-telemetry/opentelemetry-rust/issues/761
28+
let filter_otel = EnvFilter::new("info")
29+
.add_directive("hyper=off".parse().unwrap())
30+
.add_directive("opentelemetry=off".parse().unwrap())
31+
.add_directive("tonic=off".parse().unwrap())
32+
.add_directive("h2=off".parse().unwrap())
33+
.add_directive("reqwest=off".parse().unwrap());
34+
let otel_layer = layer::OpenTelemetryTracingBridge::new(&provider).with_filter(filter_otel);
35+
36+
// Create a new tracing::Fmt layer to print the logs to stdout. It has a
37+
// default filter of `info` level and above, and `debug` and above for logs
38+
// from OpenTelemetry crates. The filter levels can be customized as needed.
39+
let filter_fmt = EnvFilter::new("info").add_directive("opentelemetry=debug".parse().unwrap());
40+
let fmt_layer = tracing_subscriber::fmt::layer()
41+
.with_thread_names(true)
42+
.with_filter(filter_fmt);
43+
44+
tracing_subscriber::registry()
45+
.with(otel_layer)
46+
.with(fmt_layer)
47+
.init();
1948

2049
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", message = "This is an example message");
2150
let _ = provider.shutdown();

examples/tracing-grpc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"]
1919
opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["trace"] }
2020
prost = { workspace = true }
2121
tokio = { workspace = true, features = ["full"] }
22-
tonic = { workspace = true }
22+
tonic = { workspace = true, features = ["server"] }
2323

2424
[build-dependencies]
2525
tonic-build = { workspace = true }

opentelemetry-appender-tracing/CHANGELOG.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
## vNext
44

5+
Fixes [1682](https://github.com/open-telemetry/opentelemetry-rust/issues/1682).
6+
"spec_unstable_logs_enabled" feature now do not suppress logs for other layers.
7+
58
## 0.28.1
69

710
Released 2025-Feb-12
811

9-
- Bump `tracing-opentelemetry` to 0.29
10-
- 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)
11-
12+
- 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)
1213

1314
## 0.28.0
1415

@@ -27,6 +28,7 @@ Released 2024-Nov-11
2728
- **Breaking** [2291](https://github.com/open-telemetry/opentelemetry-rust/pull/2291) Rename `logs_level_enabled flag` to `spec_unstable_logs_enabled`. Please enable this updated flag if the feature is needed. This flag will be removed once the feature is stabilized in the specifications.
2829

2930
## v0.26.0
31+
3032
Released 2024-Sep-30
3133

3234
- Update `opentelemetry` dependency version to 0.26
@@ -45,7 +47,7 @@ Released 2024-Sep-30
4547
Exporters might use the target to override the instrumentation scope, which previously contained "opentelemetry-appender-tracing".
4648

4749
- **Breaking** [1928](https://github.com/open-telemetry/opentelemetry-rust/pull/1928) Insert tracing event name into LogRecord::event_name instead of attributes.
48-
- If using a custom exporter, then they must serialize this field directly from LogRecord::event_name instead of iterating over the attributes. OTLP Exporter is modified to handle this.
50+
- If using a custom exporter, then they must serialize this field directly from LogRecord::event_name instead of iterating over the attributes. OTLP Exporter is modified to handle this.
4951
- Update `opentelemetry` dependency version to 0.24
5052

5153
## v0.4.0

opentelemetry-appender-tracing/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ tracing-opentelemetry = { version = "0.29", optional = true }
2323
log = { workspace = true }
2424
opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] }
2525
opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs", "testing"] }
26-
tracing-subscriber = { workspace = true, features = ["registry", "std", "env-filter"] }
26+
tracing = { workspace = true, features = ["std"]}
27+
tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] }
2728
tracing-log = "0.2"
2829
criterion = { workspace = true }
2930
tokio = { workspace = true, features = ["full"]}
@@ -35,7 +36,6 @@ pprof = { version = "0.14", features = ["flamegraph", "criterion"] }
3536
default = []
3637
experimental_metadata_attributes = ["dep:tracing-log"]
3738
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled"]
38-
# TODO - Enable this in 0.28.1 (once tracing-opentelemetry v0.29 is released)
3939
experimental_use_tracing_span_context = ["tracing-opentelemetry"]
4040

4141

opentelemetry-appender-tracing/benches/logs.rs

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use criterion::{criterion_group, criterion_main, Criterion};
1717
use opentelemetry::InstrumentationScope;
1818
use opentelemetry_appender_tracing::layer as tracing_layer;
1919
use opentelemetry_sdk::error::OTelSdkResult;
20-
use opentelemetry_sdk::logs::{LogBatch, LogExporter};
2120
use opentelemetry_sdk::logs::{LogProcessor, SdkLogRecord, SdkLoggerProvider};
2221
use opentelemetry_sdk::Resource;
2322
#[cfg(not(target_os = "windows"))]
@@ -27,40 +26,19 @@ use tracing_subscriber::prelude::*;
2726
use tracing_subscriber::Layer;
2827
use tracing_subscriber::Registry;
2928

30-
#[derive(Debug, Clone)]
31-
struct NoopExporter {
32-
enabled: bool,
33-
}
34-
35-
impl LogExporter for NoopExporter {
36-
#[allow(clippy::manual_async_fn)]
37-
fn export(
38-
&self,
39-
_batch: LogBatch<'_>,
40-
) -> impl std::future::Future<Output = OTelSdkResult> + Send {
41-
async { OTelSdkResult::Ok(()) }
42-
}
43-
44-
fn event_enabled(&self, _: opentelemetry::logs::Severity, _: &str, _: &str) -> bool {
45-
self.enabled
46-
}
47-
}
48-
4929
#[derive(Debug)]
50-
struct NoopProcessor<E: LogExporter> {
51-
exporter: E,
30+
struct NoopProcessor {
31+
enabled: bool,
5232
}
5333

54-
impl<E: LogExporter> NoopProcessor<E> {
55-
fn new(exporter: E) -> Self {
56-
Self { exporter }
34+
impl NoopProcessor {
35+
fn new(enabled: bool) -> Self {
36+
Self { enabled }
5737
}
5838
}
5939

60-
impl<E: LogExporter> LogProcessor for NoopProcessor<E> {
61-
fn emit(&self, _: &mut SdkLogRecord, _: &InstrumentationScope) {
62-
// no-op
63-
}
40+
impl LogProcessor for NoopProcessor {
41+
fn emit(&self, _: &mut SdkLogRecord, _: &InstrumentationScope) {}
6442

6543
fn force_flush(&self) -> OTelSdkResult {
6644
Ok(())
@@ -72,11 +50,11 @@ impl<E: LogExporter> LogProcessor for NoopProcessor<E> {
7250

7351
fn event_enabled(
7452
&self,
75-
level: opentelemetry::logs::Severity,
76-
target: &str,
77-
name: &str,
53+
_level: opentelemetry::logs::Severity,
54+
_target: &str,
55+
_name: &str,
7856
) -> bool {
79-
self.exporter.event_enabled(level, target, name)
57+
self.enabled
8058
}
8159
}
8260

@@ -126,8 +104,7 @@ fn benchmark_no_subscriber(c: &mut Criterion) {
126104
}
127105

128106
fn benchmark_with_ot_layer(c: &mut Criterion, enabled: bool, bench_name: &str) {
129-
let exporter = NoopExporter { enabled };
130-
let processor = NoopProcessor::new(exporter);
107+
let processor = NoopProcessor::new(enabled);
131108
let provider = SdkLoggerProvider::builder()
132109
.with_resource(
133110
Resource::builder_empty()

opentelemetry-appender-tracing/examples/basic.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use opentelemetry_appender_tracing::layer;
44
use opentelemetry_sdk::{logs::SdkLoggerProvider, Resource};
55
use tracing::error;
6-
use tracing_subscriber::prelude::*;
6+
use tracing_subscriber::{prelude::*, EnvFilter};
77

88
fn main() {
99
let exporter = opentelemetry_stdout::LogExporter::default();
@@ -15,8 +15,37 @@ fn main() {
1515
)
1616
.with_simple_exporter(exporter)
1717
.build();
18-
let layer = layer::OpenTelemetryTracingBridge::new(&provider);
19-
tracing_subscriber::registry().with(layer).init();
18+
19+
// For the OpenTelemetry layer, add a tracing filter to filter events from
20+
// OpenTelemetry and its dependent crates (opentelemetry-otlp uses crates
21+
// like reqwest/tonic etc.) from being sent back to OTel itself, thus
22+
// preventing infinite telemetry generation. The filter levels are set as
23+
// follows:
24+
// - Allow `info` level and above by default.
25+
// - Restrict `opentelemetry`, `hyper`, `tonic`, and `reqwest` completely.
26+
// Note: This will also drop events from crates like `tonic` etc. even when
27+
// they are used outside the OTLP Exporter. For more details, see:
28+
// https://github.com/open-telemetry/opentelemetry-rust/issues/761
29+
let filter_otel = EnvFilter::new("info")
30+
.add_directive("hyper=off".parse().unwrap())
31+
.add_directive("opentelemetry=off".parse().unwrap())
32+
.add_directive("tonic=off".parse().unwrap())
33+
.add_directive("h2=off".parse().unwrap())
34+
.add_directive("reqwest=off".parse().unwrap());
35+
let otel_layer = layer::OpenTelemetryTracingBridge::new(&provider).with_filter(filter_otel);
36+
37+
// Create a new tracing::Fmt layer to print the logs to stdout. It has a
38+
// default filter of `info` level and above, and `debug` and above for logs
39+
// from OpenTelemetry crates. The filter levels can be customized as needed.
40+
let filter_fmt = EnvFilter::new("info").add_directive("opentelemetry=debug".parse().unwrap());
41+
let fmt_layer = tracing_subscriber::fmt::layer()
42+
.with_thread_names(true)
43+
.with_filter(filter_fmt);
44+
45+
tracing_subscriber::registry()
46+
.with(otel_layer)
47+
.with(fmt_layer)
48+
.init();
2049

2150
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", message = "This is an example message");
2251
let _ = provider.shutdown();

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ where
158158
event: &tracing::Event<'_>,
159159
_ctx: tracing_subscriber::layer::Context<'_, S>,
160160
) {
161+
let severity = severity_of_level(event.metadata().level());
162+
let target = event.metadata().target();
163+
#[cfg(feature = "spec_unstable_logs_enabled")]
164+
if !self.logger.event_enabled(severity, target) {
165+
// TODO: See if we need internal logs or track the count.
166+
return;
167+
}
168+
161169
#[cfg(feature = "experimental_metadata_attributes")]
162170
let normalized_meta = event.normalized_metadata();
163171

@@ -170,9 +178,9 @@ where
170178
let mut log_record = self.logger.create_log_record();
171179

172180
// TODO: Fix heap allocation
173-
log_record.set_target(meta.target().to_string());
181+
log_record.set_target(target.to_string());
174182
log_record.set_event_name(meta.name());
175-
log_record.set_severity_number(severity_of_level(meta.level()));
183+
log_record.set_severity_number(severity);
176184
log_record.set_severity_text(meta.level().as_str());
177185
let mut visitor = EventVisitor::new(&mut log_record);
178186
#[cfg(feature = "experimental_metadata_attributes")]
@@ -203,17 +211,6 @@ where
203211
//emit record
204212
self.logger.emit(log_record);
205213
}
206-
207-
#[cfg(feature = "spec_unstable_logs_enabled")]
208-
fn event_enabled(
209-
&self,
210-
_event: &tracing_core::Event<'_>,
211-
_ctx: tracing_subscriber::layer::Context<'_, S>,
212-
) -> bool {
213-
let severity = severity_of_level(_event.metadata().level());
214-
self.logger
215-
.event_enabled(severity, _event.metadata().target())
216-
}
217214
}
218215

219216
const fn severity_of_level(level: &Level) -> Severity {
@@ -266,17 +263,11 @@ mod tests {
266263
struct ReentrantLogExporter;
267264

268265
impl LogExporter for ReentrantLogExporter {
269-
#[allow(clippy::manual_async_fn)]
270-
fn export(
271-
&self,
272-
_batch: LogBatch<'_>,
273-
) -> impl std::future::Future<Output = OTelSdkResult> + Send {
274-
async {
275-
// This will cause a deadlock as the export itself creates a log
276-
// while still within the lock of the SimpleLogProcessor.
277-
warn!(name: "my-event-name", target: "reentrant", event_id = 20, user_name = "otel", user_email = "[email protected]");
278-
Ok(())
279-
}
266+
async fn export(&self, _batch: LogBatch<'_>) -> OTelSdkResult {
267+
// This will cause a deadlock as the export itself creates a log
268+
// while still within the lock of the SimpleLogProcessor.
269+
warn!(name: "my-event-name", target: "reentrant", event_id = 20, user_name = "otel", user_email = "[email protected]");
270+
Ok(())
280271
}
281272
}
282273

opentelemetry-otlp/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## vNext
44

5+
- The `OTEL_EXPORTER_OTLP_TIMEOUT`, `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`, `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` and `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` are changed from seconds to miliseconds.
6+
57
## 0.28.0
68

79
Released 2025-Feb-10

opentelemetry-otlp/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ all-features = true
2626
rustdoc-args = ["--cfg", "docsrs"]
2727

2828
[dependencies]
29-
async-trait = { workspace = true }
3029
futures-core = { workspace = true }
3130
opentelemetry = { version = "0.28", default-features = false, path = "../opentelemetry" }
3231
opentelemetry_sdk = { version = "0.28", default-features = false, path = "../opentelemetry-sdk" }
@@ -51,6 +50,7 @@ opentelemetry_sdk = { features = ["trace", "rt-tokio", "testing"], path = "../op
5150
tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
5251
futures-util = { workspace = true }
5352
temp-env = { workspace = true }
53+
tonic = { workspace = true, features = ["server"] }
5454

5555
[features]
5656
# telemetry pillars and functions

0 commit comments

Comments
 (0)