Skip to content

Commit 76de7ff

Browse files
committed
add shutdown in global logger provider
1 parent 77d1b75 commit 76de7ff

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

opentelemetry-sdk/src/logs/log_emitter.rs

+15-22
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,20 @@ impl opentelemetry::logs::LoggerProvider for LoggerProvider {
8080
}
8181
Logger::new(library, self.clone())
8282
}
83+
84+
/// Shuts down this `LoggerProvider`
85+
fn shutdown(&self) -> Vec<LogResult<()>> {
86+
// mark itself as already shutdown
87+
self.is_shutdown
88+
.store(true, std::sync::atomic::Ordering::Relaxed);
89+
// propagate the shutdown signal to processors
90+
// it's up to the processor to properly block new logs after shutdown
91+
self.inner
92+
.processors
93+
.iter()
94+
.map(|processor| processor.shutdown())
95+
.collect()
96+
}
8397
}
8498

8599
impl LoggerProvider {
@@ -105,27 +119,6 @@ impl LoggerProvider {
105119
.map(|processor| processor.force_flush())
106120
.collect()
107121
}
108-
109-
/// Shuts down this `LoggerProvider`, panicking on failure.
110-
pub fn shutdown(&mut self) -> Vec<LogResult<()>> {
111-
// mark itself as already shutdown
112-
self.is_shutdown
113-
.store(true, std::sync::atomic::Ordering::Relaxed);
114-
// propagate the shutdown signal to processors
115-
// it's up to the processor to properly block new logs after shutdown
116-
self.inner
117-
.processors
118-
.iter()
119-
.map(|processor| processor.shutdown())
120-
.collect()
121-
}
122-
123-
/// Attempts to shutdown this `LoggerProvider`, succeeding only when
124-
/// all cloned `LoggerProvider` values have been dropped.
125-
// todo: remove this
126-
pub fn try_shutdown(&mut self) -> Option<Vec<LogResult<()>>> {
127-
Some(self.shutdown())
128-
}
129122
}
130123

131124
#[derive(Debug)]
@@ -464,7 +457,7 @@ mod tests {
464457
#[test]
465458
fn shutdown_test() {
466459
let counter = Arc::new(AtomicU64::new(0));
467-
let mut logger_provider = LoggerProvider::builder()
460+
let logger_provider = LoggerProvider::builder()
468461
.with_log_processor(ShutdownTestLogProcessor::new(counter.clone()))
469462
.build();
470463

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-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::{borrow::Cow, sync::Arc};
22

3-
use crate::{logs::LogRecord, InstrumentationLibrary, InstrumentationLibraryBuilder, KeyValue};
3+
use crate::{logs::{LogRecord, LogResult}, InstrumentationLibrary, InstrumentationLibraryBuilder, KeyValue};
44

55
#[cfg(feature = "logs_level_enabled")]
66
use super::Severity;
@@ -145,4 +145,12 @@ impl<'a, T: LoggerProvider + ?Sized> LoggerBuilder<'a, T> {
145145
self.provider
146146
.library_logger(Arc::new(self.library_builder.build()))
147147
}
148+
149+
/// Shutdown the logger provider. Noop logger will be returned after shutdown.
150+
///
151+
/// Note that `shutdown` doesn't mean `Drop`(though `Drop` can call `shutdown`).
152+
/// It simply means the provider will emit anything in the buffer(if applicable) and stop processing
153+
fn shutdown(&self) -> Vec<LogResult<()>> {
154+
Vec::new() // noop
155+
}
148156
}

0 commit comments

Comments
 (0)