From f670dc184cc4647f82ea4b341acf8501495fb351 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 27 Jun 2023 00:46:18 -0700 Subject: [PATCH 1/4] initial commit --- opentelemetry-api/src/global/logs.rs | 39 ++++++----------------- opentelemetry-api/src/logs/logger.rs | 37 +++++++++++++++++++-- opentelemetry-api/src/logs/noop.rs | 12 +++++-- opentelemetry-sdk/src/logs/log_emitter.rs | 24 ++++++++++---- 4 files changed, 72 insertions(+), 40 deletions(-) diff --git a/opentelemetry-api/src/global/logs.rs b/opentelemetry-api/src/global/logs.rs index 986679a412..e588d955ac 100644 --- a/opentelemetry-api/src/global/logs.rs +++ b/opentelemetry-api/src/global/logs.rs @@ -8,7 +8,7 @@ use once_cell::sync::Lazy; use crate::{ logs::{Logger, LoggerProvider, NoopLoggerProvider}, - KeyValue, + InstrumentationLibrary, }; /// Allows a specific [`LoggerProvider`] to be used generically, by mirroring @@ -21,12 +21,9 @@ pub trait ObjectSafeLoggerProvider { /// /// [`Logger`]: crate::logs::Logger /// [`LoggerProvider`]: crate::logs::LoggerProvider - fn versioned_logger_boxed( + fn boxed_logger( &self, - name: Cow<'static, str>, - version: Option>, - schema_url: Option>, - attributes: Option>, + library: Arc, include_trace_context: bool, ) -> Box; } @@ -36,21 +33,12 @@ where L: Logger + Send + Sync + 'static, P: LoggerProvider, { - fn versioned_logger_boxed( + fn boxed_logger( &self, - name: Cow<'static, str>, - version: Option>, - schema_url: Option>, - attributes: Option>, + library: Arc, include_trace_context: bool, ) -> Box { - Box::new(self.versioned_logger( - name, - version, - schema_url, - attributes, - include_trace_context, - )) + Box::new(self.library_logger(library, include_trace_context)) } } @@ -96,21 +84,12 @@ impl GlobalLoggerProvider { impl LoggerProvider for GlobalLoggerProvider { type Logger = BoxedLogger; - fn versioned_logger( + fn library_logger( &self, - name: impl Into>, - version: Option>, - schema_url: Option>, - attributes: Option>, + library: Arc, include_trace_context: bool, ) -> Self::Logger { - BoxedLogger(self.provider.versioned_logger_boxed( - name.into(), - version, - schema_url, - attributes, - include_trace_context, - )) + BoxedLogger(self.provider.boxed_logger(library, include_trace_context)) } } diff --git a/opentelemetry-api/src/logs/logger.rs b/opentelemetry-api/src/logs/logger.rs index 04c68d334d..3f65bc740b 100644 --- a/opentelemetry-api/src/logs/logger.rs +++ b/opentelemetry-api/src/logs/logger.rs @@ -1,6 +1,6 @@ -use std::borrow::Cow; +use std::{borrow::Cow, sync::Arc}; -use crate::{logs::LogRecord, KeyValue}; +use crate::{logs::LogRecord, InstrumentationLibrary, KeyValue}; /// The interface for emitting [`LogRecord`]s. pub trait Logger { @@ -39,6 +39,39 @@ pub trait LoggerProvider { schema_url: Option>, attributes: Option>, include_trace_context: bool, + ) -> Self::Logger { + self.library_logger( + Arc::new(InstrumentationLibrary::new( + name, version, schema_url, attributes, + )), + include_trace_context, + ) + } + + /// Returns a new versioned logger with the given instrumentation library. + /// + /// # Examples + /// + /// ``` + /// use opentelemetry_api::{global, InstrumentationLibrary, trace::LoggerProvider}; + /// + /// let provider = global::logger_provider(); + /// + /// // logger used in applications/binaries + /// let logger = provider.logger("my_app"); + /// // logger used in libraries/crates that optionally includes version and schema url + /// let library = std::sync::Arc::new(InstrumentationLibrary::new( + /// env!("CARGO_PKG_NAME"), + /// Some(env!("CARGO_PKG_VERSION")) + /// Some("https://opentelemetry.io/schema/1.0.0"), + /// None, + /// )); + /// let logger = provider.library_logger(library); + /// ``` + fn library_logger( + &self, + library: Arc, + include_trace_context: bool, ) -> Self::Logger; /// Returns a new logger with the given name. diff --git a/opentelemetry-api/src/logs/noop.rs b/opentelemetry-api/src/logs/noop.rs index 172b8ad3bb..d9361dc08d 100644 --- a/opentelemetry-api/src/logs/noop.rs +++ b/opentelemetry-api/src/logs/noop.rs @@ -1,8 +1,8 @@ -use std::borrow::Cow; +use std::{borrow::Cow, sync::Arc}; use crate::{ logs::{LogRecord, Logger, LoggerProvider}, - KeyValue, + InstrumentationLibrary, KeyValue, }; /// A no-op implementation of a [`LoggerProvider`]. @@ -19,6 +19,14 @@ impl NoopLoggerProvider { impl LoggerProvider for NoopLoggerProvider { type Logger = NoopLogger; + fn library_logger( + &self, + _library: Arc, + _include_trace_context: bool, + ) -> Self::Logger { + NoopLogger(()) + } + fn versioned_logger( &self, _name: impl Into>, diff --git a/opentelemetry-sdk/src/logs/log_emitter.rs b/opentelemetry-sdk/src/logs/log_emitter.rs index f4a03e89dc..4d931a7683 100644 --- a/opentelemetry-sdk/src/logs/log_emitter.rs +++ b/opentelemetry-sdk/src/logs/log_emitter.rs @@ -43,12 +43,24 @@ impl opentelemetry_api::logs::LoggerProvider for LoggerProvider { name }; - Logger::new( - InstrumentationLibrary::new(component_name, version, schema_url, attributes), - Arc::downgrade(&self.inner), + self.library_logger( + Arc::new(InstrumentationLibrary::new( + component_name, + version, + schema_url, + attributes, + )), include_trace_context, ) } + + fn library_logger( + &self, + library: Arc, + include_trace_context: bool, + ) -> Self::Logger { + Logger::new(library, Arc::downgrade(&self.inner), include_trace_context) + } } impl LoggerProvider { @@ -171,13 +183,13 @@ impl Builder { /// [`LogRecord`]: opentelemetry_api::logs::LogRecord pub struct Logger { include_trace_context: bool, - instrumentation_lib: InstrumentationLibrary, + instrumentation_lib: Arc, provider: Weak, } impl Logger { pub(crate) fn new( - instrumentation_lib: InstrumentationLibrary, + instrumentation_lib: Arc, provider: Weak, include_trace_context: bool, ) -> Self { @@ -220,7 +232,7 @@ impl opentelemetry_api::logs::Logger for Logger { let data = LogData { record, resource: config.resource.clone(), - instrumentation: self.instrumentation_lib.clone(), + instrumentation: self.instrumentation_library().clone(), }; processor.emit(data); } From 4f116173ab7f71f5361fedc6bdfe2ec6e75e6f9b Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 27 Jun 2023 11:47:26 -0700 Subject: [PATCH 2/4] fix unit test --- opentelemetry-api/src/logs/logger.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/logs/logger.rs b/opentelemetry-api/src/logs/logger.rs index 3f65bc740b..a9894fd72b 100644 --- a/opentelemetry-api/src/logs/logger.rs +++ b/opentelemetry-api/src/logs/logger.rs @@ -62,7 +62,7 @@ pub trait LoggerProvider { /// // logger used in libraries/crates that optionally includes version and schema url /// let library = std::sync::Arc::new(InstrumentationLibrary::new( /// env!("CARGO_PKG_NAME"), - /// Some(env!("CARGO_PKG_VERSION")) + /// Some(env!("CARGO_PKG_VERSION")), /// Some("https://opentelemetry.io/schema/1.0.0"), /// None, /// )); From 93b8d0fc9610e86e283b33fdc6d7af57d1ec2913 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 27 Jun 2023 12:28:11 -0700 Subject: [PATCH 3/4] fix doctest --- opentelemetry-api/src/logs/logger.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/logs/logger.rs b/opentelemetry-api/src/logs/logger.rs index a9894fd72b..f2a4eeb969 100644 --- a/opentelemetry-api/src/logs/logger.rs +++ b/opentelemetry-api/src/logs/logger.rs @@ -53,7 +53,7 @@ pub trait LoggerProvider { /// # Examples /// /// ``` - /// use opentelemetry_api::{global, InstrumentationLibrary, trace::LoggerProvider}; + /// use opentelemetry_api::{global, InstrumentationLibrary, logs::LoggerProvider}; /// /// let provider = global::logger_provider(); /// From ab2938cd620b18976952f37aede1ba471db09491 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 27 Jun 2023 15:12:49 -0700 Subject: [PATCH 4/4] fix doctest --- opentelemetry-api/src/logs/logger.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/logs/logger.rs b/opentelemetry-api/src/logs/logger.rs index f2a4eeb969..3e66e2659f 100644 --- a/opentelemetry-api/src/logs/logger.rs +++ b/opentelemetry-api/src/logs/logger.rs @@ -66,7 +66,7 @@ pub trait LoggerProvider { /// Some("https://opentelemetry.io/schema/1.0.0"), /// None, /// )); - /// let logger = provider.library_logger(library); + /// let logger = provider.library_logger(library, true); /// ``` fn library_logger( &self,