Skip to content

Commit dc5d9b1

Browse files
committed
chore: Switch SpanExporter to use ShutdownResult
1 parent 77d9a01 commit dc5d9b1

File tree

7 files changed

+54
-22
lines changed

7 files changed

+54
-22
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use futures_core::future::BoxFuture;
44
use http::{header::CONTENT_TYPE, Method};
55
use opentelemetry::otel_debug;
66
use opentelemetry::trace::{TraceError, TraceResult};
7-
use opentelemetry_sdk::export::trace::{ExportResult, SpanData, SpanExporter};
7+
use opentelemetry_sdk::export::trace::{ExportResult, ShutdownResult, SpanData, SpanExporter};
88

99
use super::OtlpHttpClient;
1010

@@ -65,7 +65,7 @@ impl SpanExporter for OtlpHttpClient {
6565
})
6666
}
6767

68-
fn shutdown(&mut self) -> TraceResult<()> {
68+
fn shutdown(&mut self) -> ShutdownResult {
6969
let _ = self.client.lock()?.take();
7070
Ok(())
7171
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use opentelemetry_proto::tonic::collector::trace::v1::{
77
trace_service_client::TraceServiceClient, ExportTraceServiceRequest,
88
};
99
use opentelemetry_proto::transform::trace::tonic::group_spans_by_resource_and_scope;
10-
use opentelemetry_sdk::export::trace::{ExportResult, SpanData, SpanExporter};
10+
use opentelemetry_sdk::export::trace::{ExportResult, ShutdownResult, SpanData, SpanExporter};
1111
use tonic::{codegen::CompressionEncoding, service::Interceptor, transport::Channel, Request};
1212

1313
use super::BoxInterceptor;
@@ -92,7 +92,7 @@ impl SpanExporter for TonicTracesClient {
9292
})
9393
}
9494

95-
fn shutdown(&mut self) -> TraceResult<()> {
95+
fn shutdown(&mut self) -> ShutdownResult {
9696
let _ = self.inner.take();
9797
Ok(())
9898
}

opentelemetry-sdk/src/export/trace.rs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ use opentelemetry::trace::{SpanContext, SpanId, SpanKind, Status, TraceError};
55
use opentelemetry::{InstrumentationScope, KeyValue};
66
use std::borrow::Cow;
77
use std::fmt::Debug;
8-
use std::time::SystemTime;
8+
use std::sync::PoisonError;
9+
use std::time::{Duration, SystemTime};
10+
use thiserror::Error;
911

10-
/// Describes the results of other operations on the trace API.
11-
pub type TraceResult<T> = Result<T, TraceError>;
12+
/// Results of an export operation
13+
pub type ExportResult = Result<(), TraceError>;
1214

13-
/// Describes the results of an export
14-
/// Note: This is an alias we will remove in the future, favouring
15-
/// using TraceResult directly.
16-
pub type ExportResult = TraceResult<()>;
15+
/// Result of a shutdown operation
16+
pub type ShutdownResult = Result<(), ShutdownError>;
1717

1818
/// `SpanExporter` defines the interface that protocol-specific exporters must
1919
/// implement so that they can be plugged into OpenTelemetry SDK and support
@@ -35,7 +35,7 @@ pub trait SpanExporter: Send + Sync + Debug {
3535
///
3636
/// Any retry logic that is required by the exporter is the responsibility
3737
/// of the exporter.
38-
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, TraceResult<()>>;
38+
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, Result<(), TraceError>>;
3939

4040
/// Shuts down the exporter. Called when SDK is shut down. This is an
4141
/// opportunity for exporter to do any cleanup required.
@@ -48,7 +48,7 @@ pub trait SpanExporter: Send + Sync + Debug {
4848
/// flush the data and the destination is unavailable). SDK authors
4949
/// can decide if they want to make the shutdown timeout
5050
/// configurable.
51-
fn shutdown(&mut self) -> TraceResult<()> {
51+
fn shutdown(&mut self) -> ShutdownResult {
5252
Ok(())
5353
}
5454

@@ -105,3 +105,31 @@ pub struct SpanData {
105105
/// Instrumentation scope that produced this span
106106
pub instrumentation_scope: InstrumentationScope,
107107
}
108+
109+
/// Errors returned by shutdown operations in the Export API.
110+
#[derive(Error, Debug)]
111+
#[non_exhaustive]
112+
pub enum ShutdownError {
113+
/// The exporter has already been shut down.
114+
#[error("Shutdown already performed")]
115+
AlreadyShutdown,
116+
117+
/// Shutdown timed out before completing.
118+
#[error("Shutdown timed out after {0:?}")]
119+
Timeout(Duration),
120+
121+
/// An unexpected error occurred during shutdown.
122+
#[error(transparent)]
123+
Other(#[from] Box<dyn std::error::Error + Send + Sync + 'static>),
124+
}
125+
126+
/// Custom error wrapper for string messages.
127+
#[derive(Error, Debug)]
128+
#[error("{0}")]
129+
struct CustomError(String);
130+
131+
impl<T> From<PoisonError<T>> for ShutdownError {
132+
fn from(err: PoisonError<T>) -> Self {
133+
ShutdownError::Other(Box::new(CustomError(err.to_string())))
134+
}
135+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::export::trace::{ExportResult, SpanData, SpanExporter};
1+
use crate::export::trace::{ExportResult, ShutdownResult, SpanData, SpanExporter};
22
use crate::resource::Resource;
33
use futures_util::future::BoxFuture;
44
use opentelemetry::trace::{TraceError, TraceResult};
@@ -142,7 +142,7 @@ impl SpanExporter for InMemorySpanExporter {
142142
Box::pin(std::future::ready(Ok(())))
143143
}
144144

145-
fn shutdown(&mut self) -> TraceResult<()> {
145+
fn shutdown(&mut self) -> ShutdownResult {
146146
self.reset();
147147
Ok(())
148148
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
use crate::export::trace::{ShutdownError, ShutdownResult};
12
use crate::{
2-
export::trace::{ExportResult, SpanData, SpanExporter, TraceResult},
3+
export::trace::{ExportResult, SpanData, SpanExporter},
34
trace::{SpanEvents, SpanLinks},
45
};
56
use futures_util::future::BoxFuture;
@@ -53,10 +54,10 @@ impl SpanExporter for TokioSpanExporter {
5354
Box::pin(std::future::ready(Ok(())))
5455
}
5556

56-
fn shutdown(&mut self) -> TraceResult<()> {
57+
fn shutdown(&mut self) -> ShutdownResult {
5758
self.tx_shutdown
5859
.send(())
59-
.map_err::<TraceError, _>(|err| TraceError::Other(Box::new(err)))?;
60+
.map_err::<ShutdownError, _>(|err| ShutdownError::Other(Box::new(err)))?;
6061
Ok(())
6162
}
6263
}

opentelemetry-sdk/src/trace/span_processor.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,10 @@ impl SpanProcessor for SimpleSpanProcessor {
149149
}
150150

151151
fn shutdown(&self) -> TraceResult<()> {
152-
self.exporter.lock()?.shutdown()
152+
self.exporter
153+
.lock()?
154+
.shutdown()
155+
.map_err(|e| TraceError::Other(Box::new(e)))
153156
}
154157

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

opentelemetry-stdout/src/trace/exporter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ use chrono::{DateTime, Utc};
22
use core::fmt;
33
use futures_util::future::BoxFuture;
44
use opentelemetry::trace::{TraceError, TraceResult};
5+
use opentelemetry_sdk::export::trace::ShutdownResult;
56
use opentelemetry_sdk::export::{self, trace::ExportResult};
6-
use std::sync::atomic;
7-
87
use opentelemetry_sdk::resource::Resource;
8+
use std::sync::atomic;
99

1010
/// An OpenTelemetry exporter that writes Spans to stdout on export.
1111
pub struct SpanExporter {
@@ -59,7 +59,7 @@ impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter {
5959
}
6060
}
6161

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

0 commit comments

Comments
 (0)