@@ -4,6 +4,7 @@ use std::str::FromStr;
44use std:: time:: Duration ;
55
66use http:: { HeaderMap , HeaderName , HeaderValue } ;
7+ use opentelemetry:: otel_debug;
78use tonic:: codec:: CompressionEncoding ;
89use tonic:: metadata:: { KeyAndValueRef , MetadataMap } ;
910use tonic:: service:: Interceptor ;
@@ -153,7 +154,7 @@ impl TonicExporterBuilder {
153154 ) -> Result < ( Channel , BoxInterceptor , Option < CompressionEncoding > ) , crate :: Error > {
154155 let compression = self . resolve_compression ( signal_compression_var) ?;
155156
156- let headers_from_env = parse_headers_from_env ( signal_headers_var) ;
157+ let ( headers_from_env, headers_for_logging ) = parse_headers_from_env ( signal_headers_var) ;
157158 let metadata = merge_metadata_with_headers_from_env (
158159 self . tonic_config . metadata . unwrap_or_default ( ) ,
159160 headers_from_env,
@@ -190,6 +191,9 @@ impl TonicExporterBuilder {
190191
191192 let endpoint = Self :: resolve_endpoint ( signal_endpoint_var, config. endpoint ) ;
192193
194+ // Used for logging the endpoint
195+ let endpoint_clone = endpoint. clone ( ) ;
196+
193197 let endpoint = Channel :: from_shared ( endpoint) . map_err ( crate :: Error :: from) ?;
194198 let timeout = match env:: var ( signal_timeout_var)
195199 . ok ( )
@@ -215,6 +219,7 @@ impl TonicExporterBuilder {
215219 #[ cfg( not( feature = "tls" ) ) ]
216220 let channel = endpoint. timeout ( timeout) . connect_lazy ( ) ;
217221
222+ otel_debug ! ( name: "TonicChannelBuilt" , endpoint = endpoint_clone, timeout_in_millisecs = timeout. as_millis( ) , compression = format!( "{:?}" , compression) , headers = format!( "{:?}" , headers_for_logging) ) ;
218223 Ok ( ( channel, interceptor, compression) )
219224 }
220225
@@ -257,6 +262,8 @@ impl TonicExporterBuilder {
257262 ) -> Result < crate :: logs:: LogExporter , opentelemetry_sdk:: logs:: LogError > {
258263 use crate :: exporter:: tonic:: logs:: TonicLogsClient ;
259264
265+ otel_debug ! ( name: "LogsTonicChannelBuilding" ) ;
266+
260267 let ( channel, interceptor, compression) = self . build_channel (
261268 crate :: logs:: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT ,
262269 crate :: logs:: OTEL_EXPORTER_OTLP_LOGS_TIMEOUT ,
@@ -278,6 +285,8 @@ impl TonicExporterBuilder {
278285 use crate :: MetricExporter ;
279286 use metrics:: TonicMetricsClient ;
280287
288+ otel_debug ! ( name: "MetricsTonicChannelBuilding" ) ;
289+
281290 let ( channel, interceptor, compression) = self . build_channel (
282291 crate :: metric:: OTEL_EXPORTER_OTLP_METRICS_ENDPOINT ,
283292 crate :: metric:: OTEL_EXPORTER_OTLP_METRICS_TIMEOUT ,
@@ -297,6 +306,8 @@ impl TonicExporterBuilder {
297306 ) -> Result < crate :: SpanExporter , opentelemetry:: trace:: TraceError > {
298307 use crate :: exporter:: tonic:: trace:: TonicTracesClient ;
299308
309+ otel_debug ! ( name: "TracesTonicChannelBuilding" ) ;
310+
300311 let ( channel, interceptor, compression) = self . build_channel (
301312 crate :: span:: OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ,
302313 crate :: span:: OTEL_EXPORTER_OTLP_TRACES_TIMEOUT ,
@@ -324,20 +335,26 @@ fn merge_metadata_with_headers_from_env(
324335 }
325336}
326337
327- fn parse_headers_from_env ( signal_headers_var : & str ) -> HeaderMap {
328- env:: var ( signal_headers_var)
329- . or_else ( |_| env:: var ( OTEL_EXPORTER_OTLP_HEADERS ) )
330- . map ( |input| {
331- parse_header_string ( & input)
332- . filter_map ( |( key, value) | {
333- Some ( (
334- HeaderName :: from_str ( key) . ok ( ) ?,
335- HeaderValue :: from_str ( & value) . ok ( ) ?,
336- ) )
337- } )
338- . collect :: < HeaderMap > ( )
339- } )
340- . unwrap_or_default ( )
338+ fn parse_headers_from_env ( signal_headers_var : & str ) -> ( HeaderMap , Vec < ( String , String ) > ) {
339+ let mut headers = Vec :: new ( ) ;
340+
341+ (
342+ env:: var ( signal_headers_var)
343+ . or_else ( |_| env:: var ( OTEL_EXPORTER_OTLP_HEADERS ) )
344+ . map ( |input| {
345+ parse_header_string ( & input)
346+ . filter_map ( |( key, value) | {
347+ headers. push ( ( key. to_owned ( ) , value. clone ( ) ) ) ;
348+ Some ( (
349+ HeaderName :: from_str ( key) . ok ( ) ?,
350+ HeaderValue :: from_str ( & value) . ok ( ) ?,
351+ ) )
352+ } )
353+ . collect :: < HeaderMap > ( )
354+ } )
355+ . unwrap_or_default ( ) ,
356+ headers,
357+ )
341358}
342359
343360/// Expose interface for modifying [TonicConfig] fields within the exporter builders.
@@ -516,7 +533,7 @@ mod tests {
516533 ] ,
517534 || {
518535 assert_eq ! (
519- super :: parse_headers_from_env( OTEL_EXPORTER_OTLP_TRACES_HEADERS ) ,
536+ super :: parse_headers_from_env( OTEL_EXPORTER_OTLP_TRACES_HEADERS ) . 0 ,
520537 HeaderMap :: from_iter( [
521538 (
522539 HeaderName :: from_static( "k1" ) ,
@@ -530,7 +547,7 @@ mod tests {
530547 ) ;
531548
532549 assert_eq ! (
533- super :: parse_headers_from_env( "EMPTY_ENV" ) ,
550+ super :: parse_headers_from_env( "EMPTY_ENV" ) . 0 ,
534551 HeaderMap :: from_iter( [ (
535552 HeaderName :: from_static( "k3" ) ,
536553 HeaderValue :: from_static( "v3" )
@@ -553,7 +570,7 @@ mod tests {
553570 metadata. insert ( "k1" , "v0" . parse ( ) . unwrap ( ) ) ;
554571
555572 let result =
556- super :: merge_metadata_with_headers_from_env ( metadata, headers_from_env) ;
573+ super :: merge_metadata_with_headers_from_env ( metadata, headers_from_env. 0 ) ;
557574
558575 assert_eq ! (
559576 result. get( "foo" ) . unwrap( ) ,
0 commit comments