Skip to content

Commit 41c6ea8

Browse files
authored
Use custom channel in exporters if configured (#1335)
1 parent 59728c8 commit 41c6ea8

File tree

2 files changed

+38
-33
lines changed

2 files changed

+38
-33
lines changed

opentelemetry-otlp/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
- Add `build_{signal}_exporter` methods to client builders (#1187)
1010
- Add `grpcio` metrics exporter (#1202)
1111
- Allow specifying OTLP HTTP headers from env variable (#1290)
12+
- Support custom channels in topic exporters [#1335](https://github.com/open-telemetry/opentelemetry-rust/pull/1335)
1213

1314
### Changed
1415

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

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,44 @@ impl TonicExporterBuilder {
208208
}
209209

210210
fn build_channel(
211-
&mut self,
211+
self,
212212
signal_endpoint_var: &str,
213213
signal_endpoint_path: &str,
214214
signal_timeout_var: &str,
215215
signal_compression_var: &str,
216216
) -> Result<(Channel, BoxInterceptor, Option<CompressionEncoding>), crate::Error> {
217-
let config = &mut self.exporter_config;
218-
let tonic_config: &mut TonicConfig = &mut self.tonic_config;
217+
let tonic_config = self.tonic_config;
218+
let compression = resolve_compression(&tonic_config, signal_compression_var)?;
219219

220+
let metadata = tonic_config.metadata.unwrap_or_default();
221+
let add_metadata = move |mut req: tonic::Request<()>| {
222+
for key_and_value in metadata.iter() {
223+
match key_and_value {
224+
KeyAndValueRef::Ascii(key, value) => {
225+
req.metadata_mut().append(key, value.to_owned())
226+
}
227+
KeyAndValueRef::Binary(key, value) => {
228+
req.metadata_mut().append_bin(key, value.to_owned())
229+
}
230+
};
231+
}
232+
233+
Ok(req)
234+
};
235+
236+
let interceptor = match self.interceptor {
237+
Some(mut interceptor) => {
238+
BoxInterceptor(Box::new(move |req| interceptor.call(add_metadata(req)?)))
239+
}
240+
None => BoxInterceptor(Box::new(add_metadata)),
241+
};
242+
243+
// If a custom channel was provided, use that channel instead of creating one
244+
if let Some(channel) = self.channel {
245+
return Ok((channel, interceptor, compression));
246+
}
247+
248+
let config = self.exporter_config;
220249
let endpoint = match env::var(signal_endpoint_var)
221250
.ok()
222251
.or(env::var(OTEL_EXPORTER_OTLP_ENDPOINT).ok())
@@ -225,6 +254,7 @@ impl TonicExporterBuilder {
225254
None => format!("{}{signal_endpoint_path}", config.endpoint),
226255
};
227256

257+
let endpoint = Channel::from_shared(endpoint).map_err(crate::Error::from)?;
228258
let timeout = match env::var(signal_timeout_var)
229259
.ok()
230260
.or(env::var(OTEL_EXPORTER_OTLP_TIMEOUT).ok())
@@ -235,12 +265,9 @@ impl TonicExporterBuilder {
235265
},
236266
None => config.timeout,
237267
};
238-
let compression = resolve_compression(tonic_config, signal_compression_var)?;
239-
240-
let endpoint = Channel::from_shared(endpoint).map_err(crate::Error::from)?;
241268

242269
#[cfg(feature = "tls")]
243-
let channel = match tonic_config.tls_config.take() {
270+
let channel = match tonic_config.tls_config {
244271
Some(tls_config) => endpoint
245272
.tls_config(tls_config)
246273
.map_err(crate::Error::from)?,
@@ -252,36 +279,13 @@ impl TonicExporterBuilder {
252279
#[cfg(not(feature = "tls"))]
253280
let channel = endpoint.timeout(timeout).connect_lazy();
254281

255-
let metadata = tonic_config.metadata.take().unwrap_or_default();
256-
let add_metadata = move |mut req: tonic::Request<()>| {
257-
for key_and_value in metadata.iter() {
258-
match key_and_value {
259-
KeyAndValueRef::Ascii(key, value) => {
260-
req.metadata_mut().append(key, value.to_owned())
261-
}
262-
KeyAndValueRef::Binary(key, value) => {
263-
req.metadata_mut().append_bin(key, value.to_owned())
264-
}
265-
};
266-
}
267-
268-
Ok(req)
269-
};
270-
271-
let interceptor = match self.interceptor.take() {
272-
Some(mut interceptor) => {
273-
BoxInterceptor(Box::new(move |req| interceptor.call(add_metadata(req)?)))
274-
}
275-
None => BoxInterceptor(Box::new(add_metadata)),
276-
};
277-
278282
Ok((channel, interceptor, compression))
279283
}
280284

281285
/// Build a new tonic log exporter
282286
#[cfg(feature = "logs")]
283287
pub fn build_log_exporter(
284-
mut self,
288+
self,
285289
) -> Result<crate::logs::LogExporter, opentelemetry::logs::LogError> {
286290
use crate::exporter::tonic::logs::TonicLogsClient;
287291

@@ -300,7 +304,7 @@ impl TonicExporterBuilder {
300304
/// Build a new tonic metrics exporter
301305
#[cfg(feature = "metrics")]
302306
pub fn build_metrics_exporter(
303-
mut self,
307+
self,
304308
aggregation_selector: Box<dyn opentelemetry_sdk::metrics::reader::AggregationSelector>,
305309
temporality_selector: Box<dyn opentelemetry_sdk::metrics::reader::TemporalitySelector>,
306310
) -> opentelemetry::metrics::Result<crate::MetricsExporter> {
@@ -326,7 +330,7 @@ impl TonicExporterBuilder {
326330
/// Build a new tonic span exporter
327331
#[cfg(feature = "trace")]
328332
pub fn build_span_exporter(
329-
mut self,
333+
self,
330334
) -> Result<crate::SpanExporter, opentelemetry::trace::TraceError> {
331335
use crate::exporter::tonic::trace::TonicTracesClient;
332336

0 commit comments

Comments
 (0)