Skip to content
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

Remove default logger name #2316

Merged
merged 15 commits into from
Nov 24, 2024
Merged
Show file tree
Hide file tree
Changes from 11 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
4 changes: 4 additions & 0 deletions opentelemetry-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
```
- `logs::LogData` struct is deprecated, and scheduled to be removed from public API in `v0.28.0`.

- Bug fix: Empty Logger names are retained as-is instead of replacing with
"rust.opentelemetry.io/sdk/logger"
[#2316](https://github.com/open-telemetry/opentelemetry-rust/pull/2316)

## 0.27.0

Released 2024-Nov-11
Expand Down
36 changes: 29 additions & 7 deletions opentelemetry-sdk/src/logs/log_emitter.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
use super::{BatchLogProcessor, LogProcessor, LogRecord, SimpleLogProcessor, TraceContext};
use crate::{export::logs::LogExporter, runtime::RuntimeChannel, Resource};
use crate::{logs::LogError, logs::LogResult};
use opentelemetry::otel_info;
use opentelemetry::{otel_debug, trace::TraceContextExt, Context, InstrumentationScope};
use opentelemetry::{otel_debug, otel_info, trace::TraceContextExt, Context, InstrumentationScope};

#[cfg(feature = "spec_unstable_logs_enabled")]
use opentelemetry::logs::Severity;
Expand Down Expand Up @@ -45,17 +44,14 @@ pub struct LoggerProvider {
inner: Arc<LoggerProviderInner>,
}

/// Default logger name if empty string is provided.
const DEFAULT_COMPONENT_NAME: &str = "rust.opentelemetry.io/sdk/logger";

impl opentelemetry::logs::LoggerProvider for LoggerProvider {
type Logger = Logger;

fn logger(&self, name: impl Into<Cow<'static, str>>) -> Self::Logger {
let mut name = name.into();
let name = name.into();

if name.is_empty() {
cijothomas marked this conversation as resolved.
Show resolved Hide resolved
name = Cow::Borrowed(DEFAULT_COMPONENT_NAME)
otel_info!(name: "LoggerNameEmpty", message = "Logger name is empty; consider providing a meaningful name. Logger will function normally and the provided name will be used as-is.");
cijothomas marked this conversation as resolved.
Show resolved Hide resolved
cijothomas marked this conversation as resolved.
Show resolved Hide resolved
};

let scope = InstrumentationScope::builder(name).build();
Expand All @@ -67,6 +63,9 @@ impl opentelemetry::logs::LoggerProvider for LoggerProvider {
if self.inner.is_shutdown.load(Ordering::Relaxed) {
return Logger::new(scope, NOOP_LOGGER_PROVIDER.clone());
}
if scope.name().is_empty() {
otel_info!(name: "LoggerNameEmpty", message = "Logger name is empty; consider providing a meaningful name. Logger will function normally and the provided name will be used as-is.");
};
Logger::new(scope, self.clone())
}
}
Expand Down Expand Up @@ -706,6 +705,29 @@ mod tests {
assert_eq!(*shutdown_called.lock().unwrap(), 1);
}

#[test]
fn test_empty_logger_name() {
let exporter = InMemoryLogExporter::default();
let logger_provider = LoggerProvider::builder()
.with_simple_exporter(exporter.clone())
.build();
let logger = logger_provider.logger("");
let mut record = logger.create_log_record();
record.set_body("Testing empty logger name".into());
logger.emit(record);

// Assert: Verify that the emitted log is processed correctly
let emitted_logs = exporter.get_emitted_logs().unwrap();
assert_eq!(emitted_logs.len(), 1);
assert_eq!(
emitted_logs[0].clone().record.body,
Some(AnyValue::String("Testing empty logger name".into()))
);

// Assert: Ensure the logger name is empty in the instrumentation scope
assert_eq!(logger.instrumentation_scope().name(), "");
}

#[derive(Debug)]
pub(crate) struct LazyLogProcessor {
shutdown_called: Arc<Mutex<bool>>,
Expand Down
3 changes: 1 addition & 2 deletions opentelemetry/src/logs/logger.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ pub trait LoggerProvider {
/// Returns a new logger with the given name.
///
/// The `name` should be the application name or the name of the library
/// providing instrumentation. If the name is empty, then an
/// implementation-defined default name may be used instead.
/// providing instrumentation.
fn logger(&self, name: impl Into<Cow<'static, str>>) -> Self::Logger {
let scope = InstrumentationScope::builder(name).build();
self.logger_with_scope(scope)
Expand Down
Loading