Skip to content

Commit ff33638

Browse files
authored
feat: Allow event name to be provided to IsEnabled check in Logger (#2756)
1 parent c5a4b7f commit ff33638

File tree

11 files changed

+108
-27
lines changed

11 files changed

+108
-27
lines changed

opentelemetry-appender-log/src/lib.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,11 @@ where
136136
{
137137
fn enabled(&self, _metadata: &Metadata) -> bool {
138138
#[cfg(feature = "spec_unstable_logs_enabled")]
139-
return self
140-
.logger
141-
.event_enabled(severity_of_level(_metadata.level()), _metadata.target());
139+
return self.logger.event_enabled(
140+
severity_of_level(_metadata.level()),
141+
_metadata.target(),
142+
None,
143+
);
142144
#[cfg(not(feature = "spec_unstable_logs_enabled"))]
143145
true
144146
}

opentelemetry-appender-tracing/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ Receivers (processors, exporters) are expected to use `LogRecord.target()` as
3838
scope name. This is already done in OTLP Exporters, so this change should be
3939
transparent to most users.
4040

41+
- Passes event name to the `event_enabled` method on the `Logger`. This allows
42+
implementations (SDK, processor, exporters) to leverage this additional
43+
information to determine if an event is enabled.
44+
4145
## 0.28.1
4246

4347
Released 2025-Feb-12

opentelemetry-appender-tracing/benches/logs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl LogProcessor for NoopProcessor {
5252
&self,
5353
_level: opentelemetry::logs::Severity,
5454
_target: &str,
55-
_name: &str,
55+
_name: Option<&str>,
5656
) -> bool {
5757
self.enabled
5858
}

opentelemetry-appender-tracing/src/layer.rs

+80-17
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ where
155155
event: &tracing::Event<'_>,
156156
_ctx: tracing_subscriber::layer::Context<'_, S>,
157157
) {
158-
let severity = severity_of_level(event.metadata().level());
159-
let target = event.metadata().target();
158+
let metadata = event.metadata();
159+
let severity = severity_of_level(metadata.level());
160+
let target = metadata.target();
161+
let name = metadata.name();
160162
#[cfg(feature = "spec_unstable_logs_enabled")]
161-
if !self.logger.event_enabled(severity, target) {
163+
if !self.logger.event_enabled(severity, target, Some(name)) {
162164
// TODO: See if we need internal logs or track the count.
163165
return;
164166
}
@@ -169,16 +171,13 @@ where
169171
#[cfg(feature = "experimental_metadata_attributes")]
170172
let meta = normalized_meta.as_ref().unwrap_or_else(|| event.metadata());
171173

172-
#[cfg(not(feature = "experimental_metadata_attributes"))]
173-
let meta = event.metadata();
174-
175174
let mut log_record = self.logger.create_log_record();
176175

177176
// TODO: Fix heap allocation
178177
log_record.set_target(target.to_string());
179-
log_record.set_event_name(meta.name());
178+
log_record.set_event_name(name);
180179
log_record.set_severity_number(severity);
181-
log_record.set_severity_text(meta.level().as_str());
180+
log_record.set_severity_text(metadata.level().as_str());
182181
let mut visitor = EventVisitor::new(&mut log_record);
183182
#[cfg(feature = "experimental_metadata_attributes")]
184183
visitor.visit_experimental_metadata(meta);
@@ -226,9 +225,10 @@ mod tests {
226225
use opentelemetry::logs::Severity;
227226
use opentelemetry::trace::TracerProvider;
228227
use opentelemetry::trace::{TraceContextExt, TraceFlags, Tracer};
228+
use opentelemetry::InstrumentationScope;
229229
use opentelemetry::{logs::AnyValue, Key};
230230
use opentelemetry_sdk::error::OTelSdkResult;
231-
use opentelemetry_sdk::logs::InMemoryLogExporter;
231+
use opentelemetry_sdk::logs::{InMemoryLogExporter, LogProcessor};
232232
use opentelemetry_sdk::logs::{LogBatch, LogExporter};
233233
use opentelemetry_sdk::logs::{SdkLogRecord, SdkLoggerProvider};
234234
use opentelemetry_sdk::trace::{Sampler, SdkTracerProvider};
@@ -244,10 +244,7 @@ mod tests {
244244
}
245245

246246
#[allow(impl_trait_overcaptures)] // can only be fixed with Rust 1.82+
247-
fn create_tracing_subscriber(
248-
_exporter: InMemoryLogExporter,
249-
logger_provider: &SdkLoggerProvider,
250-
) -> impl tracing::Subscriber {
247+
fn create_tracing_subscriber(logger_provider: &SdkLoggerProvider) -> impl tracing::Subscriber {
251248
let level_filter = tracing_subscriber::filter::LevelFilter::WARN; // Capture WARN and ERROR levels
252249
let layer =
253250
layer::OpenTelemetryTracingBridge::new(logger_provider).with_filter(level_filter); // No filter based on target, only based on log level
@@ -327,7 +324,7 @@ mod tests {
327324
.with_simple_exporter(exporter.clone())
328325
.build();
329326

330-
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
327+
let subscriber = create_tracing_subscriber(&logger_provider);
331328

332329
// avoiding setting tracing subscriber as global as that does not
333330
// play well with unit tests.
@@ -450,7 +447,7 @@ mod tests {
450447
.with_simple_exporter(exporter.clone())
451448
.build();
452449

453-
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
450+
let subscriber = create_tracing_subscriber(&logger_provider);
454451

455452
// avoiding setting tracing subscriber as global as that does not
456453
// play well with unit tests.
@@ -627,7 +624,7 @@ mod tests {
627624
.with_simple_exporter(exporter.clone())
628625
.build();
629626

630-
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
627+
let subscriber = create_tracing_subscriber(&logger_provider);
631628

632629
// avoiding setting tracing subscriber as global as that does not
633630
// play well with unit tests.
@@ -703,7 +700,7 @@ mod tests {
703700
.with_simple_exporter(exporter.clone())
704701
.build();
705702

706-
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
703+
let subscriber = create_tracing_subscriber(&logger_provider);
707704

708705
// avoiding setting tracing subscriber as global as that does not
709706
// play well with unit tests.
@@ -785,4 +782,70 @@ mod tests {
785782
assert!(!attributes_key.contains(&Key::new("log.target")));
786783
}
787784
}
785+
786+
#[derive(Debug)]
787+
struct LogProcessorWithIsEnabled {
788+
severity_level: Severity,
789+
name: String,
790+
target: String,
791+
}
792+
793+
impl LogProcessorWithIsEnabled {
794+
fn new(severity_level: Severity, name: String, target: String) -> Self {
795+
LogProcessorWithIsEnabled {
796+
severity_level,
797+
name,
798+
target,
799+
}
800+
}
801+
}
802+
803+
impl LogProcessor for LogProcessorWithIsEnabled {
804+
fn emit(&self, _record: &mut SdkLogRecord, _scope: &InstrumentationScope) {
805+
// no-op
806+
}
807+
808+
#[cfg(feature = "spec_unstable_logs_enabled")]
809+
fn event_enabled(&self, level: Severity, target: &str, name: Option<&str>) -> bool {
810+
// assert that passed in arguments are same as the ones set in the test.
811+
assert_eq!(self.severity_level, level);
812+
assert_eq!(self.target, target);
813+
assert_eq!(
814+
self.name,
815+
name.expect("name is expected from tracing appender")
816+
);
817+
true
818+
}
819+
820+
fn force_flush(&self) -> OTelSdkResult {
821+
Ok(())
822+
}
823+
824+
fn shutdown(&self) -> OTelSdkResult {
825+
Ok(())
826+
}
827+
}
828+
829+
#[cfg(feature = "spec_unstable_logs_enabled")]
830+
#[test]
831+
fn is_enabled() {
832+
// Arrange
833+
let logger_provider = SdkLoggerProvider::builder()
834+
.with_log_processor(LogProcessorWithIsEnabled::new(
835+
Severity::Error,
836+
"my-event-name".to_string(),
837+
"my-system".to_string(),
838+
))
839+
.build();
840+
841+
let subscriber = create_tracing_subscriber(&logger_provider);
842+
843+
// avoiding setting tracing subscriber as global as that does not
844+
// play well with unit tests.
845+
let _guard = tracing::subscriber::set_default(subscriber);
846+
847+
// Name, Target and Severity are expected to be passed to the IsEnabled check
848+
// The validation is done in the LogProcessorWithIsEnabled struct.
849+
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]");
850+
}
788851
}

opentelemetry-sdk/CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@
3838

3939
- **Breaking** The SpanExporter::export() method no longer requires a mutable reference to self.
4040
Before:
41+
4142
```rust
4243
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult
4344
```
45+
4446
After:
47+
4548
```rust
4649
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult
4750
```
@@ -52,6 +55,11 @@
5255
when its `shutdown` is invoked.
5356

5457
- Reduced some info level logs to debug
58+
- **Breaking** for custom LogProcessor/Exporter authors: Changed `name`
59+
parameter from `&str` to `Option<&str>` in `event_enabled` method on the
60+
`LogProcessor` and `LogExporter` traits. `SdkLogger` no longer passes its
61+
`scope` name but instead passes the incoming `name` when invoking
62+
`event_enabled` on processors.
5563

5664
## 0.28.0
5765

opentelemetry-sdk/src/logs/export.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ pub trait LogExporter: Send + Sync + Debug {
141141
}
142142
#[cfg(feature = "spec_unstable_logs_enabled")]
143143
/// Check if logs are enabled.
144-
fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool {
144+
fn event_enabled(&self, _level: Severity, _target: &str, _name: Option<&str>) -> bool {
145145
// By default, all logs are enabled
146146
true
147147
}

opentelemetry-sdk/src/logs/log_processor.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub trait LogProcessor: Send + Sync + Debug {
5959
fn shutdown(&self) -> OTelSdkResult;
6060
#[cfg(feature = "spec_unstable_logs_enabled")]
6161
/// Check if logging is enabled
62-
fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool {
62+
fn event_enabled(&self, _level: Severity, _target: &str, _name: Option<&str>) -> bool {
6363
// By default, all logs are enabled
6464
true
6565
}

opentelemetry-sdk/src/logs/logger.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ impl opentelemetry::logs::Logger for SdkLogger {
5353
}
5454

5555
#[cfg(feature = "spec_unstable_logs_enabled")]
56-
fn event_enabled(&self, level: Severity, target: &str) -> bool {
56+
fn event_enabled(&self, level: Severity, target: &str, name: Option<&str>) -> bool {
5757
self.provider
5858
.log_processors()
5959
.iter()
60-
.any(|processor| processor.event_enabled(level, target, self.scope.name().as_ref()))
60+
.any(|processor| processor.event_enabled(level, target, name))
6161
}
6262
}

opentelemetry/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
- Updated `Baggage` constants to reflect latest standard (`MAX_KEY_VALUE_PAIRS` - 180 -> 64, `MAX_BYTES_FOR_ONE_PAIR` - removed) and increased insert performance see #[2284](https://github.com/open-telemetry/opentelemetry-rust/pull/2284).
1212
- *Breaking* Align `Baggage.remove()` signature with `.get()` to take the key as a reference
1313

14+
- Added additional `name: Option<&str>` parameter to the `event_enabled` method
15+
on the `Logger` trait. This allows implementations (SDK, processor, exporters)
16+
to leverage this additional information to determine if an event is enabled.
17+
1418
## 0.28.0
1519

1620
Released 2025-Feb-10

opentelemetry/src/logs/logger.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub trait Logger {
2121

2222
#[cfg(feature = "spec_unstable_logs_enabled")]
2323
/// Check if the given log level is enabled.
24-
fn event_enabled(&self, level: Severity, target: &str) -> bool;
24+
fn event_enabled(&self, level: Severity, target: &str, name: Option<&str>) -> bool;
2525
}
2626

2727
/// Interfaces that can create [`Logger`] instances.

opentelemetry/src/logs/noop.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl Logger for NoopLogger {
7979
}
8080
fn emit(&self, _record: Self::LogRecord) {}
8181
#[cfg(feature = "spec_unstable_logs_enabled")]
82-
fn event_enabled(&self, _level: super::Severity, _target: &str) -> bool {
82+
fn event_enabled(&self, _level: super::Severity, _target: &str, _name: Option<&str>) -> bool {
8383
false
8484
}
8585
}

0 commit comments

Comments
 (0)