Skip to content
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
6 changes: 6 additions & 0 deletions opentelemetry-appender-log/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## vNext

- Similar to the `opentelemetry-appender-tracing` fix [2658](https://github.com/open-telemetry/opentelemetry-rust/issues/2658)
InstrumentationScope(Logger) used by the appender now uses an empty ("") named Logger.
Previously, a Logger with name and version of the crate was used.
Receivers (processors, exporters) are expected to use `LogRecord.target()` as scope name.
This is already done in OTLP Exporters, so this change should be transparent to most users.

## 0.28.0

Released 2025-Feb-10
Expand Down
27 changes: 18 additions & 9 deletions opentelemetry-appender-log/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
use log::{Level, Metadata, Record};
use opentelemetry::{
logs::{AnyValue, LogRecord, Logger, LoggerProvider, Severity},
InstrumentationScope, Key,
Key,
};
#[cfg(feature = "experimental_metadata_attributes")]
use opentelemetry_semantic_conventions::attribute::{
Expand Down Expand Up @@ -189,12 +189,13 @@ where
L: Logger + Send + Sync,
{
pub fn new(provider: &P) -> Self {
let scope = InstrumentationScope::builder("opentelemetry-log-appender")
.with_version(env!("CARGO_PKG_VERSION"))
.build();

OpenTelemetryLogBridge {
logger: provider.logger_with_scope(scope),
Self {
// Using empty scope name.
// The name/version of this library itself can be added
// as a Scope attribute once a semantic convention is
// defined for the same.
// See https://github.com/open-telemetry/semantic-conventions/issues/1550
logger: provider.logger(""),
_phantom: Default::default(),
}
}
Expand Down Expand Up @@ -985,9 +986,13 @@ mod tests {
);

let logs = exporter.get_emitted_logs().unwrap();
assert_eq!(logs.len(), 1);

let log = logs.first().unwrap();
assert_eq!(log.instrumentation.name(), "");

let get = |needle: &str| -> Option<AnyValue> {
logs[0].record.attributes_iter().find_map(|(k, v)| {
log.record.attributes_iter().find_map(|(k, v)| {
if k.as_str() == needle {
Some(v.clone())
} else {
Expand Down Expand Up @@ -1197,9 +1202,13 @@ mod tests {
);

let logs = exporter.get_emitted_logs().unwrap();
assert_eq!(logs.len(), 1);

let log = logs.first().unwrap();
assert_eq!(log.instrumentation.name(), "");

let get = |needle: &str| -> Option<AnyValue> {
logs[0].record.attributes_iter().find_map(|(k, v)| {
log.record.attributes_iter().find_map(|(k, v)| {
if k.as_str() == needle {
Some(v.clone())
} else {
Expand Down