diff --git a/opentelemetry-sdk/src/export/logs/mod.rs b/opentelemetry-sdk/src/export/logs/mod.rs index 245d6fe742..c7cc25731d 100644 --- a/opentelemetry-sdk/src/export/logs/mod.rs +++ b/opentelemetry-sdk/src/export/logs/mod.rs @@ -143,6 +143,14 @@ pub trait LogExporter: Send + Sync + Debug { // By default, all logs are enabled true } + + /// + /// This method SHOULD block the current thread until all pending log records are exported. + /// If the export was not successful, an error is returned. + /// + fn force_flush(&mut self) -> ExportResult { + Ok(()) + } /// Set the resource for the exporter. fn set_resource(&mut self, _resource: &Resource) {} } diff --git a/opentelemetry-sdk/src/logs/log_processor.rs b/opentelemetry-sdk/src/logs/log_processor.rs index 9135141574..671b36bdff 100644 --- a/opentelemetry-sdk/src/logs/log_processor.rs +++ b/opentelemetry-sdk/src/logs/log_processor.rs @@ -174,7 +174,11 @@ impl LogProcessor for SimpleLogProcessor { } fn force_flush(&self) -> LogResult<()> { - Ok(()) + if let Ok(mut exporter) = self.exporter.lock() { + exporter.force_flush() + } else { + Err(LogError::MutexPoisoned("SimpleLogProcessor".into())) + } } fn shutdown(&self) -> LogResult<()> { @@ -1063,6 +1067,20 @@ mod tests { let _ = provider.shutdown(); } + #[tokio::test(flavor = "multi_thread")] + async fn test_batch_forceflush() { + let exporter = InMemoryLogExporterBuilder::default().build(); + + let processor = BatchLogProcessor::new(exporter.clone(), BatchConfig::default()); + + let mut record = LogRecord::default(); + let instrumentation = InstrumentationScope::default(); + + processor.emit(&mut record, &instrumentation); + processor.force_flush().unwrap(); + assert_eq!(1, exporter.get_emitted_logs().unwrap().len()); + } + #[tokio::test(flavor = "multi_thread")] async fn test_batch_shutdown() { // assert we will receive an error