Skip to content

Commit 2df2353

Browse files
committed
chore: modify LogExporter and SpanExporter interfaces to support returning failure
1 parent 957659f commit 2df2353

File tree

16 files changed

+67
-32
lines changed

16 files changed

+67
-32
lines changed

opentelemetry-otlp/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## vNext
44

5+
- `OtlpHttpClient.shutdown` `TonicLogsClient.shutdown`, and `TonicTracesClient.shutdown` now explicitly return a result. The
6+
semantics of the method have not changed, but you will have a new lint encouraging you to consume these results.
7+
58
## 0.27.0
69

710
Released 2024-Nov-11

opentelemetry-otlp/src/exporter/http/logs.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ impl LogExporter for OtlpHttpClient {
4747
Ok(())
4848
}
4949

50-
fn shutdown(&mut self) {
51-
let _ = self.client.lock().map(|mut c| c.take());
50+
fn shutdown(&mut self) -> LogResult<()> {
51+
let _ = self.client.lock()?.take();
52+
Ok(())
5253
}
5354

5455
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {

opentelemetry-otlp/src/exporter/http/trace.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::sync::Arc;
22

33
use futures_core::future::BoxFuture;
44
use http::{header::CONTENT_TYPE, Method};
5-
use opentelemetry::trace::TraceError;
5+
use opentelemetry::trace::{TraceError, TraceResult};
66
use opentelemetry_sdk::export::trace::{ExportResult, SpanData, SpanExporter};
77

88
use super::OtlpHttpClient;
@@ -63,8 +63,9 @@ impl SpanExporter for OtlpHttpClient {
6363
})
6464
}
6565

66-
fn shutdown(&mut self) {
67-
let _ = self.client.lock().map(|mut c| c.take());
66+
fn shutdown(&mut self) -> TraceResult<()> {
67+
let _ = self.client.lock()?.take();
68+
Ok(())
6869
}
6970

7071
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {

opentelemetry-otlp/src/exporter/tonic/logs.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ impl LogExporter for TonicLogsClient {
8181
Ok(())
8282
}
8383

84-
fn shutdown(&mut self) {
84+
fn shutdown(&mut self) -> LogResult<()> {
8585
let _ = self.inner.take();
86+
Ok(())
8687
}
8788

8889
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {

opentelemetry-otlp/src/exporter/tonic/trace.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::fmt;
22

33
use futures_core::future::BoxFuture;
4-
use opentelemetry::trace::TraceError;
4+
use opentelemetry::trace::{TraceError, TraceResult};
55
use opentelemetry_proto::tonic::collector::trace::v1::{
66
trace_service_client::TraceServiceClient, ExportTraceServiceRequest,
77
};
@@ -88,8 +88,9 @@ impl SpanExporter for TonicTracesClient {
8888
})
8989
}
9090

91-
fn shutdown(&mut self) {
91+
fn shutdown(&mut self) -> TraceResult<()> {
9292
let _ = self.inner.take();
93+
Ok(())
9394
}
9495

9596
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {

opentelemetry-sdk/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
[#2338](https://github.com/open-telemetry/opentelemetry-rust/pull/2338)
1111
- `ResourceDetector.detect()` no longer supports timeout option.
1212
- `opentelemetry::global::shutdown_tracer_provider()` Removed from the API, should now use `tracer_provider.shutdown()` see [#2369](https://github.com/open-telemetry/opentelemetry-rust/pull/2369) for a migration example. "Tracer provider" is cheaply cloneable, so users are encouraged to set a clone of it as the global (ex: `global::set_tracer_provider(provider.clone()))`, so that instrumentations and other components can obtain tracers from `global::tracer()`. The tracer_provider must be kept around to call shutdown on it at the end of application (ex: `tracer_provider.shutdown()`)
13+
- The trait functions `LogExporter.shutdown` and `TraceExporter.shutdown` now explicitly return a result. The
14+
semantics of the method have not changed, but you will have a new lint encouraging you to consume these results.
1315

1416
## 0.27.1
1517

opentelemetry-sdk/src/export/logs/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ pub trait LogExporter: Send + Sync + Debug {
8282
/// `Ok(())`) or an error (`Err(LogError)`) if the export operation failed.
8383
///
8484
async fn export(&mut self, batch: LogBatch<'_>) -> LogResult<()>;
85+
8586
/// Shuts down the exporter.
86-
fn shutdown(&mut self) {}
87+
fn shutdown(&mut self) -> LogResult<()> {
88+
Ok(())
89+
}
90+
8791
#[cfg(feature = "spec_unstable_logs_enabled")]
8892
/// Chek if logs are enabled.
8993
fn event_enabled(&self, _level: Severity, _target: &str, _name: &str) -> bool {

opentelemetry-sdk/src/export/trace.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ use std::time::SystemTime;
1010
/// Describes the result of an export.
1111
pub type ExportResult = Result<(), TraceError>;
1212

13+
/// Describes the results of other operations on the trace API.
14+
pub type TraceResult<T> = Result<T, TraceError>;
15+
1316
/// `SpanExporter` defines the interface that protocol-specific exporters must
1417
/// implement so that they can be plugged into OpenTelemetry SDK and support
1518
/// sending of telemetry data.
@@ -43,7 +46,9 @@ pub trait SpanExporter: Send + Sync + Debug {
4346
/// flush the data and the destination is unavailable). SDK authors
4447
/// can decide if they want to make the shutdown timeout
4548
/// configurable.
46-
fn shutdown(&mut self) {}
49+
fn shutdown(&mut self) -> TraceResult<()> {
50+
Ok(())
51+
}
4752

4853
/// This is a hint to ensure that the export of any Spans the exporter
4954
/// has received prior to the call to this function SHOULD be completed

opentelemetry-sdk/src/logs/log_processor.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl<T: LogExporter> LogProcessor for SimpleLogProcessor<T> {
136136
self.is_shutdown
137137
.store(true, std::sync::atomic::Ordering::Relaxed);
138138
if let Ok(mut exporter) = self.exporter.lock() {
139-
exporter.shutdown();
139+
exporter.shutdown()?;
140140
Ok(())
141141
} else {
142142
Err(LogError::MutexPoisoned("SimpleLogProcessor".into()))
@@ -299,7 +299,13 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
299299
)
300300
.await;
301301

302-
exporter.shutdown();
302+
if let Err(e) = exporter.shutdown() {
303+
otel_warn!(
304+
name: "BatchLogProcessor.Shutdown.Failed",
305+
message = "failed shutting down exporter cleanly",
306+
error = format!("{:?}", e)
307+
);
308+
};
303309

304310
if let Err(send_error) = ch.send(result) {
305311
otel_debug!(
@@ -590,7 +596,9 @@ mod tests {
590596
Ok(())
591597
}
592598

593-
fn shutdown(&mut self) {}
599+
fn shutdown(&mut self) -> LogResult<()> {
600+
Ok(())
601+
}
594602

595603
fn set_resource(&mut self, resource: &Resource) {
596604
self.resource

opentelemetry-sdk/src/testing/logs/in_memory_exporter.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,11 @@ impl LogExporter for InMemoryLogExporter {
195195
Ok(())
196196
}
197197

198-
fn shutdown(&mut self) {
198+
fn shutdown(&mut self) -> LogResult<()> {
199199
if self.should_reset_on_shutdown {
200200
self.reset();
201201
}
202+
Ok(())
202203
}
203204

204205
fn set_resource(&mut self, resource: &Resource) {

opentelemetry-sdk/src/testing/trace/in_memory_exporter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,9 @@ impl SpanExporter for InMemorySpanExporter {
142142
Box::pin(std::future::ready(Ok(())))
143143
}
144144

145-
fn shutdown(&mut self) {
146-
self.reset()
145+
fn shutdown(&mut self) -> TraceResult<()> {
146+
self.reset();
147+
Ok(())
147148
}
148149

149150
fn set_resource(&mut self, resource: &Resource) {

opentelemetry-sdk/src/testing/trace/span_exporters.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::{
2-
export::trace::{ExportResult, SpanData, SpanExporter},
2+
export::trace::{ExportResult, SpanData, SpanExporter, TraceResult},
33
trace::{SpanEvents, SpanLinks},
44
};
55
use futures_util::future::BoxFuture;
66
pub use opentelemetry::testing::trace::TestSpan;
77
use opentelemetry::{
8-
trace::{SpanContext, SpanId, SpanKind, Status, TraceFlags, TraceId, TraceState},
8+
trace::{SpanContext, SpanId, SpanKind, Status, TraceError, TraceFlags, TraceId, TraceState},
99
InstrumentationScope,
1010
};
1111
use std::fmt::{Display, Formatter};
@@ -53,8 +53,11 @@ impl SpanExporter for TokioSpanExporter {
5353
Box::pin(std::future::ready(Ok(())))
5454
}
5555

56-
fn shutdown(&mut self) {
57-
self.tx_shutdown.send(()).unwrap();
56+
fn shutdown(&mut self) -> TraceResult<()> {
57+
self.tx_shutdown
58+
.send(())
59+
.map_err::<TraceError, _>(|err| TraceError::Other(Box::new(err)))?;
60+
Ok(())
5861
}
5962
}
6063

opentelemetry-sdk/src/trace/span_processor.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,7 @@ impl SpanProcessor for SimpleSpanProcessor {
149149
}
150150

151151
fn shutdown(&self) -> TraceResult<()> {
152-
if let Ok(mut exporter) = self.exporter.lock() {
153-
exporter.shutdown();
154-
Ok(())
155-
} else {
156-
Err(TraceError::Other(
157-
"SimpleSpanProcessor mutex poison at shutdown".into(),
158-
))
159-
}
152+
self.exporter.lock()?.shutdown()
160153
}
161154

162155
fn set_resource(&mut self, resource: &Resource) {
@@ -432,7 +425,12 @@ impl<R: RuntimeChannel> BatchSpanProcessorInternal<R> {
432425
// Stream has terminated or processor is shutdown, return to finish execution.
433426
BatchMessage::Shutdown(ch) => {
434427
self.flush(Some(ch)).await;
435-
self.exporter.shutdown();
428+
if let Err(e) = self.exporter.shutdown() {
429+
otel_warn!(
430+
name: "SpanProcessor.Shutdown.Failed",
431+
message = "failed shutting down exporter cleanly",
432+
error = format!("{:?}", e));
433+
}
436434
return false;
437435
}
438436
// propagate the resource

opentelemetry-stdout/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## vNext
44

5+
- `LogExporter.shutdown` and `SpanExporter.shutdown` now explicitly return a result. The
6+
semantics of the method have not changed, but you will have a new lint encouraging you to consume these results.
7+
8+
59
## 0.27.0
610

711
Released 2024-Nov-11

opentelemetry-stdout/src/logs/exporter.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,9 @@ impl opentelemetry_sdk::export::logs::LogExporter for LogExporter {
5656
}
5757
}
5858

59-
fn shutdown(&mut self) {
59+
fn shutdown(&mut self) -> LogResult<()> {
6060
self.is_shutdown.store(true, atomic::Ordering::SeqCst);
61+
Ok(())
6162
}
6263

6364
fn set_resource(&mut self, res: &opentelemetry_sdk::Resource) {

opentelemetry-stdout/src/trace/exporter.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use chrono::{DateTime, Utc};
22
use core::fmt;
33
use futures_util::future::BoxFuture;
4-
use opentelemetry::trace::TraceError;
4+
use opentelemetry::trace::{TraceError, TraceResult};
55
use opentelemetry_sdk::export::{self, trace::ExportResult};
66
use std::sync::atomic;
77

@@ -59,8 +59,9 @@ impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter {
5959
}
6060
}
6161

62-
fn shutdown(&mut self) {
62+
fn shutdown(&mut self) -> TraceResult<()> {
6363
self.is_shutdown.store(true, atomic::Ordering::SeqCst);
64+
Ok(())
6465
}
6566

6667
fn set_resource(&mut self, res: &opentelemetry_sdk::Resource) {

0 commit comments

Comments
 (0)