Skip to content

Commit 9e9932c

Browse files
authored
Merge branch 'main' into enable-integration-test
2 parents 8813ae1 + e726892 commit 9e9932c

File tree

6 files changed

+55
-19
lines changed

6 files changed

+55
-19
lines changed

opentelemetry-appender-log/examples/logs-basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@ async fn main() {
3232
warn!("warn!");
3333
info!("test log!");
3434

35-
logger_provider.force_flush();
35+
let _ = logger_provider.shutdown();
3636
}

opentelemetry-appender-tracing/examples/basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ fn main() {
2424
tracing_subscriber::registry().with(layer).init();
2525

2626
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "otel@opentelemetry.io");
27-
drop(provider);
27+
let _ = provider.shutdown();
2828
}

opentelemetry-sdk/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
- **Breaking** [#1729](https://github.com/open-telemetry/opentelemetry-rust/pull/1729)
3232
- Update the return type of `TracerProvider.span_processors()` from `&Vec<Box<dyn SpanProcessor>>` to `&[Box<dyn SpanProcessor>]`.
3333
- Update the return type of `LoggerProvider.log_processors()` from `&Vec<Box<dyn LogProcessor>>` to `&[Box<dyn LogProcessor>]`.
34+
- **Breaking** [#1750](https://github.com/open-telemetry/opentelemetry-rust/pull/1729)
35+
- Update the return type of `LoggerProvider.shutdown()` from `Vec<LogResult<()>>` to `LogResult<()>`.
3436

3537
## v0.22.1
3638

opentelemetry-sdk/src/logs/log_emitter.rs

+49-15
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ use crate::{
44
runtime::RuntimeChannel,
55
};
66
use opentelemetry::{
7-
global::{self},
8-
logs::LogResult,
7+
global,
8+
logs::{LogError, LogResult},
99
trace::TraceContextExt,
1010
Context, InstrumentationLibrary,
1111
};
1212

1313
#[cfg(feature = "logs_level_enabled")]
1414
use opentelemetry::logs::Severity;
1515

16-
use std::{borrow::Cow, sync::Arc};
16+
use std::{
17+
borrow::Cow,
18+
sync::{atomic::Ordering, Arc},
19+
};
1720
use std::{sync::atomic::AtomicBool, time::SystemTime};
1821

1922
use once_cell::sync::Lazy;
@@ -105,17 +108,29 @@ impl LoggerProvider {
105108
}
106109

107110
/// Shuts down this `LoggerProvider`
108-
pub fn shutdown(&self) -> Vec<LogResult<()>> {
109-
// mark itself as already shutdown
110-
self.is_shutdown
111-
.store(true, std::sync::atomic::Ordering::Relaxed);
112-
// propagate the shutdown signal to processors
113-
// it's up to the processor to properly block new logs after shutdown
114-
self.inner
115-
.processors
116-
.iter()
117-
.map(|processor| processor.shutdown())
118-
.collect()
111+
pub fn shutdown(&self) -> LogResult<()> {
112+
if self
113+
.is_shutdown
114+
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
115+
.is_ok()
116+
{
117+
// propagate the shutdown signal to processors
118+
// it's up to the processor to properly block new logs after shutdown
119+
let mut errs = vec![];
120+
for processor in &self.inner.processors {
121+
if let Err(err) = processor.shutdown() {
122+
errs.push(err);
123+
}
124+
}
125+
126+
if errs.is_empty() {
127+
Ok(())
128+
} else {
129+
Err(LogError::Other(format!("{errs:?}").into()))
130+
}
131+
} else {
132+
Err(LogError::Other("logger provider already shut down".into()))
133+
}
119134
}
120135
}
121136

@@ -485,6 +500,25 @@ mod tests {
485500
assert_eq!(counter.load(std::sync::atomic::Ordering::SeqCst), 3);
486501
}
487502

503+
#[test]
504+
fn shutdown_idempotent_test() {
505+
let counter = Arc::new(AtomicU64::new(0));
506+
let logger_provider = LoggerProvider::builder()
507+
.with_log_processor(ShutdownTestLogProcessor::new(counter.clone()))
508+
.build();
509+
510+
let shutdown_res = logger_provider.shutdown();
511+
assert!(shutdown_res.is_ok());
512+
513+
// Subsequent shutdowns should return an error.
514+
let shutdown_res = logger_provider.shutdown();
515+
assert!(shutdown_res.is_err());
516+
517+
// Subsequent shutdowns should return an error.
518+
let shutdown_res = logger_provider.shutdown();
519+
assert!(shutdown_res.is_err());
520+
}
521+
488522
#[test]
489523
fn global_shutdown_test() {
490524
// cargo test shutdown_test --features=logs
@@ -508,7 +542,7 @@ mod tests {
508542

509543
// explicitly calling shutdown on logger_provider. This will
510544
// indeed do the shutdown, even if there are loggers still alive.
511-
logger_provider.shutdown();
545+
let _ = logger_provider.shutdown();
512546

513547
// Assert
514548

opentelemetry-sdk/src/logs/log_processor.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ mod tests {
729729
])))
730730
.build();
731731
assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 4);
732-
provider.shutdown();
732+
let _ = provider.shutdown();
733733
}
734734

735735
#[tokio::test(flavor = "multi_thread")]

opentelemetry-stdout/examples/basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
107107
meter_provider.shutdown()?;
108108

109109
#[cfg(feature = "logs")]
110-
drop(logger_provider);
110+
logger_provider.shutdown()?;
111111

112112
Ok(())
113113
}

0 commit comments

Comments
 (0)