Skip to content

Commit f9581f5

Browse files
authored
Add internal logging for OTLP Exporter tonic client (#2415)
1 parent e4cba94 commit f9581f5

File tree

7 files changed

+56
-20
lines changed

7 files changed

+56
-20
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use async_trait::async_trait;
22
use core::fmt;
3+
use opentelemetry::otel_debug;
34
use opentelemetry_proto::tonic::collector::logs::v1::{
45
logs_service_client::LogsServiceClient, ExportLogsServiceRequest,
56
};
@@ -43,6 +44,8 @@ impl TonicLogsClient {
4344
.accept_compressed(compression);
4445
}
4546

47+
otel_debug!(name: "TonicsLogsClientBuilt");
48+
4649
TonicLogsClient {
4750
inner: Some(ClientInner {
4851
client,
@@ -72,6 +75,8 @@ impl LogExporter for TonicLogsClient {
7275

7376
let resource_logs = group_logs_by_resource_and_scope(batch, &self.resource);
7477

78+
otel_debug!(name: "TonicsLogsClient.CallingExport");
79+
7580
client
7681
.export(Request::from_parts(
7782
metadata,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use core::fmt;
22
use std::sync::Mutex;
33

44
use async_trait::async_trait;
5+
use opentelemetry::otel_debug;
56
use opentelemetry_proto::tonic::collector::metrics::v1::{
67
metrics_service_client::MetricsServiceClient, ExportMetricsServiceRequest,
78
};
@@ -40,6 +41,8 @@ impl TonicMetricsClient {
4041
.accept_compressed(compression);
4142
}
4243

44+
otel_debug!(name: "TonicsMetricsClientBuilt");
45+
4346
TonicMetricsClient {
4447
inner: Mutex::new(Some(ClientInner {
4548
client,
@@ -72,6 +75,8 @@ impl MetricsClient for TonicMetricsClient {
7275
None => Err(MetricError::Other("exporter is already shut down".into())),
7376
})?;
7477

78+
otel_debug!(name: "TonicsMetricsClient.CallingExport");
79+
7580
client
7681
.export(Request::from_parts(
7782
metadata,

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

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::str::FromStr;
44
use std::time::Duration;
55

66
use http::{HeaderMap, HeaderName, HeaderValue};
7+
use opentelemetry::otel_debug;
78
use tonic::codec::CompressionEncoding;
89
use tonic::metadata::{KeyAndValueRef, MetadataMap};
910
use 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(),

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

Lines changed: 5 additions & 1 deletion
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::{otel_debug, trace::TraceError};
55
use opentelemetry_proto::tonic::collector::trace::v1::{
66
trace_service_client::TraceServiceClient, ExportTraceServiceRequest,
77
};
@@ -43,6 +43,8 @@ impl TonicTracesClient {
4343
.accept_compressed(compression);
4444
}
4545

46+
otel_debug!(name: "TonicsTracesClientBuilt");
47+
4648
TonicTracesClient {
4749
inner: Some(ClientInner {
4850
client,
@@ -74,6 +76,8 @@ impl SpanExporter for TonicTracesClient {
7476

7577
let resource_spans = group_spans_by_resource_and_scope(batch, &self.resource);
7678

79+
otel_debug!(name: "TonicsTracesClient.CallingExport");
80+
7781
Box::pin(async move {
7882
client
7983
.export(Request::from_parts(

opentelemetry-otlp/src/logs.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//! Defines a [LogExporter] to send logs via the OpenTelemetry Protocol (OTLP)
44
55
use async_trait::async_trait;
6+
use opentelemetry::otel_debug;
67
use std::fmt::Debug;
78

89
use opentelemetry_sdk::logs::LogResult;
@@ -63,7 +64,9 @@ impl LogExporterBuilder<NoExporterBuilderSet> {
6364
#[cfg(feature = "grpc-tonic")]
6465
impl LogExporterBuilder<TonicExporterBuilderSet> {
6566
pub fn build(self) -> Result<LogExporter, opentelemetry_sdk::logs::LogError> {
66-
self.client.0.build_log_exporter()
67+
let result = self.client.0.build_log_exporter();
68+
otel_debug!(name: "LogExporterBuilt", result = format!("{:?}", &result));
69+
result
6770
}
6871
}
6972

opentelemetry-otlp/src/metric.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ impl<C> MetricExporterBuilder<C> {
7878
impl MetricExporterBuilder<TonicExporterBuilderSet> {
7979
pub fn build(self) -> MetricResult<MetricExporter> {
8080
let exporter = self.client.0.build_metrics_exporter(self.temporality)?;
81+
opentelemetry::otel_debug!(name: "MetricExporterBuilt");
8182
Ok(exporter)
8283
}
8384
}

opentelemetry-otlp/src/span.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ impl SpanExporterBuilder<NoExporterBuilderSet> {
6464
impl SpanExporterBuilder<TonicExporterBuilderSet> {
6565
pub fn build(self) -> Result<SpanExporter, opentelemetry::trace::TraceError> {
6666
let span_exporter = self.client.0.build_span_exporter()?;
67+
opentelemetry::otel_debug!(name: "SpanExporterBuilt");
6768
Ok(SpanExporter::new(span_exporter))
6869
}
6970
}

0 commit comments

Comments
 (0)