Skip to content

Commit 55d798e

Browse files
authored
fix(otlp): upgrade tonic to 0.5. (#597)
* fix(otlp): upgrade tonic to 0.5. We no longer have a universal type for both client with interceptors and the client without interceptors. So instead of using a interceptors we just add the headers for each request as needed. * chore: remove tower as dependency.
1 parent e7d05e7 commit 55d798e

File tree

5 files changed

+53
-50
lines changed

5 files changed

+53
-50
lines changed

examples/external-otlp-tonic-tokio/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ opentelemetry = { path = "../../opentelemetry", features = ["rt-tokio", "metrics
99
opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["tonic", "tls", "tls-roots"] }
1010
serde_json = "1.0"
1111
tokio = { version = "1.0", features = ["full"] }
12-
tonic = "0.4.0"
12+
tonic = "0.5.0"
1313
url = "2.2.0"

opentelemetry-otlp/Cargo.toml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ async-trait = "0.1"
3939
futures = "0.3"
4040
grpcio = { version = "0.9", optional = true }
4141
opentelemetry = { version = "0.15", default-features = false, features = ["trace"], path = "../opentelemetry" }
42-
prost = { version = "0.7", optional = true }
42+
prost = { version = "0.8", optional = true }
4343
protobuf = { version = "2.18", optional = true }
4444
thiserror = "1.0"
45-
tonic = { version = "0.4", optional = true }
45+
tonic = { version = "0.5", optional = true }
4646
tokio = { version = "1.0", features = ["full"], optional = true }
4747
opentelemetry-http = { version = "0.4", path = "../opentelemetry-http", optional = true }
4848
reqwest = { version = "0.11", optional = true, default-features = false }
@@ -52,6 +52,8 @@ http = "0.2"
5252
[dev-dependencies]
5353
chrono = "0.4"
5454
tokio-stream = { version = "0.1", features = ["net"] }
55+
# need tokio runtime to run smoke tests.
56+
opentelemetry = { version = "0.15", features = ["trace", "rt-tokio"], path = "../opentelemetry" }
5557
protobuf-codegen = { version = "2.16"}
5658
protoc-grpcio = { version = "3.0"}
5759

@@ -75,5 +77,5 @@ reqwest-rustls = ["reqwest", "reqwest/rustls-tls-native-roots"]
7577
surf-client = ["surf", "opentelemetry-http/surf"]
7678

7779
[build-dependencies]
78-
tonic-build = { version = "0.4", optional = true }
79-
prost-build = {version = "0.7", optional = true }
80+
tonic-build = { version = "0.5", optional = true }
81+
prost-build = {version = "0.8", optional = true }

opentelemetry-otlp/src/metric.rs

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ pub struct MetricsExporter {
252252
#[cfg(feature = "tokio")]
253253
sender: Arc<Mutex<tokio::sync::mpsc::Sender<ExportMsg>>>,
254254
export_kind_selector: Arc<dyn ExportKindFor + Send + Sync>,
255+
metadata: Option<tonic::metadata::MetadataMap>,
255256
}
256257

257258
impl Debug for MetricsExporter {
@@ -274,7 +275,7 @@ impl MetricsExporter {
274275
#[cfg(feature = "tonic")]
275276
pub fn new<T: ExportKindFor + Send + Sync + 'static>(
276277
config: ExportConfig,
277-
tonic_config: TonicConfig,
278+
mut tonic_config: TonicConfig,
278279
export_selector: T,
279280
) -> Result<MetricsExporter> {
280281
let endpoint =
@@ -297,25 +298,7 @@ impl MetricsExporter {
297298
.connect_lazy()
298299
.map_err::<crate::Error, _>(Into::into)?;
299300

300-
let client = match tonic_config.metadata.to_owned() {
301-
None => MetricsServiceClient::new(channel),
302-
Some(metadata) => {
303-
MetricsServiceClient::with_interceptor(channel, move |mut req: Request<()>| {
304-
for key_and_value in metadata.iter() {
305-
match key_and_value {
306-
KeyAndValueRef::Ascii(key, value) => {
307-
req.metadata_mut().append(key, value.to_owned())
308-
}
309-
KeyAndValueRef::Binary(key, value) => {
310-
req.metadata_mut().append_bin(key, value.to_owned())
311-
}
312-
};
313-
}
314-
315-
Ok(req)
316-
})
317-
}
318-
};
301+
let client = MetricsServiceClient::new(channel);
319302

320303
let (sender, mut receiver) = tokio::sync::mpsc::channel::<ExportMsg>(2);
321304
tokio::spawn(Box::pin(async move {
@@ -334,6 +317,7 @@ impl MetricsExporter {
334317
Ok(MetricsExporter {
335318
sender: Arc::new(Mutex::new(sender)),
336319
export_kind_selector: Arc::new(export_selector),
320+
metadata: tonic_config.metadata.take(),
337321
})
338322
}
339323
}
@@ -359,7 +343,19 @@ impl Exporter for MetricsExporter {
359343
Err(err) => Err(err),
360344
}
361345
})?;
362-
let request = Request::new(sink(resource_metrics));
346+
let mut request = Request::new(sink(resource_metrics));
347+
if let Some(metadata) = &self.metadata {
348+
for key_and_value in metadata.iter() {
349+
match key_and_value {
350+
KeyAndValueRef::Ascii(key, value) => {
351+
request.metadata_mut().append(key, value.to_owned())
352+
}
353+
KeyAndValueRef::Binary(key, value) => {
354+
request.metadata_mut().append_bin(key, value.to_owned())
355+
}
356+
};
357+
}
358+
}
363359
self.sender
364360
.lock()
365361
.map(|sender| {

opentelemetry-otlp/src/span.rs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -352,30 +352,10 @@ impl SpanExporter {
352352
tonic_config: TonicConfig,
353353
channel: tonic::transport::Channel,
354354
) -> Result<Self, crate::Error> {
355-
let client = match tonic_config.metadata.to_owned() {
356-
None => TonicTraceServiceClient::new(channel),
357-
Some(metadata) => {
358-
TonicTraceServiceClient::with_interceptor(channel, move |mut req: Request<()>| {
359-
for key_and_value in metadata.iter() {
360-
match key_and_value {
361-
KeyAndValueRef::Ascii(key, value) => {
362-
req.metadata_mut().append(key, value.to_owned())
363-
}
364-
KeyAndValueRef::Binary(key, value) => {
365-
req.metadata_mut().append_bin(key, value.to_owned())
366-
}
367-
};
368-
}
369-
370-
Ok(req)
371-
})
372-
}
373-
};
374-
375355
Ok(SpanExporter::Tonic {
376356
timeout: config.timeout,
377357
metadata: tonic_config.metadata,
378-
trace_exporter: client,
358+
trace_exporter: TonicTraceServiceClient::new(channel),
379359
})
380360
}
381361

@@ -466,11 +446,28 @@ impl opentelemetry::sdk::export::trace::SpanExporter for SpanExporter {
466446
}
467447

468448
#[cfg(feature = "tonic")]
469-
SpanExporter::Tonic { trace_exporter, .. } => {
470-
let request = Request::new(TonicRequest {
449+
SpanExporter::Tonic {
450+
trace_exporter,
451+
metadata,
452+
..
453+
} => {
454+
let mut request = Request::new(TonicRequest {
471455
resource_spans: batch.into_iter().map(Into::into).collect(),
472456
});
473457

458+
if let Some(metadata) = metadata {
459+
for key_and_value in metadata.iter() {
460+
match key_and_value {
461+
KeyAndValueRef::Ascii(key, value) => {
462+
request.metadata_mut().append(key, value.to_owned())
463+
}
464+
KeyAndValueRef::Binary(key, value) => {
465+
request.metadata_mut().append_bin(key, value.to_owned())
466+
}
467+
};
468+
}
469+
}
470+
474471
trace_exporter
475472
.to_owned()
476473
.export(request)

opentelemetry-otlp/tests/smoke.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ impl TraceService for MockServer {
2727
request: tonic::Request<ExportTraceServiceRequest>,
2828
) -> Result<tonic::Response<ExportTraceServiceResponse>, tonic::Status> {
2929
println!("Sending request into channel...");
30+
// assert we have required metadata key
31+
assert_eq!(
32+
request.metadata().get("x-header-key"),
33+
Some(&("header-value".parse().unwrap()))
34+
);
3035
self.tx
3136
.lock()
3237
.unwrap()
@@ -68,12 +73,15 @@ async fn smoke_tracer() {
6873

6974
{
7075
println!("Installing tracer...");
76+
let mut metadata = tonic::metadata::MetadataMap::new();
77+
metadata.insert("x-header-key", "header-value".parse().unwrap());
7178
let tracer = opentelemetry_otlp::new_pipeline()
7279
.tracing()
7380
.with_exporter(
7481
opentelemetry_otlp::new_exporter()
7582
.tonic()
76-
.with_endpoint(format!("http://{}", addr)),
83+
.with_endpoint(format!("http://{}", addr))
84+
.with_metadata(metadata),
7785
)
7886
.install_batch(opentelemetry::runtime::Tokio)
7987
.expect("failed to install");

0 commit comments

Comments
 (0)