11use std:: sync:: Arc ;
22
3+ use super :: OtlpHttpClient ;
34use futures_core:: future:: BoxFuture ;
45use http:: { header:: CONTENT_TYPE , Method } ;
5- use opentelemetry:: { otel_debug, trace:: TraceError } ;
6- use opentelemetry_sdk:: trace:: { ExportResult , SpanData , SpanExporter } ;
7-
8- use super :: OtlpHttpClient ;
6+ use opentelemetry:: otel_debug;
7+ use opentelemetry_sdk:: {
8+ error:: { OTelSdkError , OTelSdkResult } ,
9+ trace:: { SpanData , SpanExporter } ,
10+ } ;
911
1012impl SpanExporter for OtlpHttpClient {
11- fn export ( & mut self , batch : Vec < SpanData > ) -> BoxFuture < ' static , ExportResult > {
13+ fn export ( & mut self , batch : Vec < SpanData > ) -> BoxFuture < ' static , OTelSdkResult > {
1214 let client = match self
1315 . client
1416 . lock ( )
15- . map_err ( |e| TraceError :: Other ( e . to_string ( ) . into ( ) ) )
17+ . map_err ( |e| OTelSdkError :: InternalFailure ( format ! ( "Mutex lock failed: {}" , e ) ) )
1618 . and_then ( |g| match & * g {
1719 Some ( client) => Ok ( Arc :: clone ( client) ) ,
18- _ => Err ( TraceError :: Other ( "exporter is already shut down" . into ( ) ) ) ,
20+ _ => Err ( OTelSdkError :: AlreadyShutdown ) ,
1921 } ) {
2022 Ok ( client) => client,
2123 Err ( err) => return Box :: pin ( std:: future:: ready ( Err ( err) ) ) ,
2224 } ;
2325
2426 let ( body, content_type) = match self . build_trace_export_body ( batch) {
2527 Ok ( body) => body,
26- Err ( e) => return Box :: pin ( std:: future:: ready ( Err ( e) ) ) ,
28+ Err ( e) => {
29+ return Box :: pin ( std:: future:: ready ( Err ( OTelSdkError :: InternalFailure (
30+ e. to_string ( ) ,
31+ ) ) ) )
32+ }
2733 } ;
2834
2935 let mut request = match http:: Request :: builder ( )
@@ -34,10 +40,9 @@ impl SpanExporter for OtlpHttpClient {
3440 {
3541 Ok ( req) => req,
3642 Err ( e) => {
37- return Box :: pin ( std:: future:: ready ( Err ( crate :: Error :: RequestFailed (
38- Box :: new ( e) ,
39- )
40- . into ( ) ) ) )
43+ return Box :: pin ( std:: future:: ready ( Err ( OTelSdkError :: InternalFailure (
44+ e. to_string ( ) ,
45+ ) ) ) )
4146 }
4247 } ;
4348
@@ -48,7 +53,10 @@ impl SpanExporter for OtlpHttpClient {
4853 Box :: pin ( async move {
4954 let request_uri = request. uri ( ) . to_string ( ) ;
5055 otel_debug ! ( name: "HttpTracesClient.CallingExport" ) ;
51- let response = client. send_bytes ( request) . await ?;
56+ let response = client
57+ . send_bytes ( request)
58+ . await
59+ . map_err ( |e| OTelSdkError :: InternalFailure ( format ! ( "{e:?}" ) ) ) ?;
5260
5361 if !response. status ( ) . is_success ( ) {
5462 let error = format ! (
@@ -57,15 +65,23 @@ impl SpanExporter for OtlpHttpClient {
5765 request_uri,
5866 response. body( )
5967 ) ;
60- return Err ( TraceError :: Other ( error. into ( ) ) ) ;
68+ return Err ( OTelSdkError :: InternalFailure ( error) ) ;
6169 }
6270
6371 Ok ( ( ) )
6472 } )
6573 }
6674
67- fn shutdown ( & mut self ) {
68- let _ = self . client . lock ( ) . map ( |mut c| c. take ( ) ) ;
75+ fn shutdown ( & mut self ) -> OTelSdkResult {
76+ let mut client_guard = self . client . lock ( ) . map_err ( |e| {
77+ OTelSdkError :: InternalFailure ( format ! ( "Failed to acquire client lock: {}" , e) )
78+ } ) ?;
79+
80+ if client_guard. take ( ) . is_none ( ) {
81+ return Err ( OTelSdkError :: AlreadyShutdown ) ;
82+ }
83+
84+ Ok ( ( ) )
6985 }
7086
7187 fn set_resource ( & mut self , resource : & opentelemetry_sdk:: Resource ) {
0 commit comments