Skip to content

Commit 2e6c2de

Browse files
committed
add shutdown in global logger provider
1 parent 7797c0c commit 2e6c2de

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

opentelemetry-sdk/src/logs/log_emitter.rs

+15-22
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,20 @@ impl opentelemetry::logs::LoggerProvider for LoggerProvider {
7373
}
7474
Logger::new(library, self.clone())
7575
}
76+
77+
/// Shuts down this `LoggerProvider`
78+
fn shutdown(&self) -> Vec<LogResult<()>> {
79+
// mark itself as already shutdown
80+
self.is_shutdown
81+
.store(true, std::sync::atomic::Ordering::Relaxed);
82+
// propagate the shutdown signal to processors
83+
// it's up to the processor to properly block new logs after shutdown
84+
self.inner
85+
.processors
86+
.iter()
87+
.map(|processor| processor.shutdown())
88+
.collect()
89+
}
7690
}
7791

7892
impl LoggerProvider {
@@ -98,27 +112,6 @@ impl LoggerProvider {
98112
.map(|processor| processor.force_flush())
99113
.collect()
100114
}
101-
102-
/// Shuts down this `LoggerProvider`, panicking on failure.
103-
pub fn shutdown(&mut self) -> Vec<LogResult<()>> {
104-
// mark itself as already shutdown
105-
self.is_shutdown
106-
.store(true, std::sync::atomic::Ordering::Relaxed);
107-
// propagate the shutdown signal to processors
108-
// it's up to the processor to properly block new logs after shutdown
109-
self.inner
110-
.processors
111-
.iter()
112-
.map(|processor| processor.shutdown())
113-
.collect()
114-
}
115-
116-
/// Attempts to shutdown this `LoggerProvider`, succeeding only when
117-
/// all cloned `LoggerProvider` values have been dropped.
118-
// todo: remove this
119-
pub fn try_shutdown(&mut self) -> Option<Vec<LogResult<()>>> {
120-
Some(self.shutdown())
121-
}
122115
}
123116

124117
#[derive(Debug)]
@@ -457,7 +450,7 @@ mod tests {
457450
#[test]
458451
fn shutdown_test() {
459452
let counter = Arc::new(AtomicU64::new(0));
460-
let mut logger_provider = LoggerProvider::builder()
453+
let logger_provider = LoggerProvider::builder()
461454
.with_log_processor(ShutdownTestLogProcessor::new(counter.clone()))
462455
.build();
463456

opentelemetry/src/global/logs.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{
66

77
use once_cell::sync::Lazy;
88

9+
use crate::logs::LogResult;
910
use crate::{
1011
logs::{Logger, LoggerProvider, NoopLoggerProvider},
1112
InstrumentationLibrary,
@@ -25,6 +26,9 @@ pub trait ObjectSafeLoggerProvider {
2526
&self,
2627
library: Arc<InstrumentationLibrary>,
2728
) -> Box<dyn Logger + Send + Sync + 'static>;
29+
30+
/// shutdown the logger provider, logs emitted after this will not be processed.
31+
fn shutdown(&self) -> Vec<LogResult<()>>;
2832
}
2933

3034
impl<L, P> ObjectSafeLoggerProvider for P
@@ -38,6 +42,10 @@ where
3842
) -> Box<dyn Logger + Send + Sync + 'static> {
3943
Box::new(self.library_logger(library))
4044
}
45+
46+
fn shutdown(&self) -> Vec<LogResult<()>> {
47+
self.shutdown()
48+
}
4149
}
4250

4351
pub struct BoxedLogger(Box<dyn Logger + Send + Sync + 'static>);
@@ -132,5 +140,6 @@ where
132140

133141
/// Shut down the current global [`LoggerProvider`].
134142
pub fn shutdown_logger_provider() {
135-
let _ = set_logger_provider(NoopLoggerProvider::new());
143+
let logger_provider = set_logger_provider(NoopLoggerProvider::new());
144+
let _ = ObjectSafeLoggerProvider::shutdown(&logger_provider);
136145
}

opentelemetry/src/logs/logger.rs

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::{borrow::Cow, sync::Arc};
22

3+
use crate::logs::LogResult;
34
use crate::{logs::LogRecord, InstrumentationLibrary, KeyValue};
45

56
#[cfg(feature = "logs_level_enabled")]
@@ -72,4 +73,12 @@ pub trait LoggerProvider {
7273
fn logger(&self, name: impl Into<Cow<'static, str>>) -> Self::Logger {
7374
self.versioned_logger(name, None, None, None)
7475
}
76+
77+
/// Shutdown the logger provider. Noop logger will be returned after shutdown.
78+
///
79+
/// Note that `shutdown` doesn't mean `Drop`(though `Drop` can call `shutdown`).
80+
/// It simply means the provider will emit anything in the buffer(if applicable) and stop processing
81+
fn shutdown(&self) -> Vec<LogResult<()>> {
82+
Vec::new() // noop
83+
}
7584
}

0 commit comments

Comments
 (0)