Skip to content

Commit 2156c23

Browse files
authored
Update otel to version 0.21 (#68)
Support the latest version of otel. See https://github.com/open-telemetry/opentelemetry-rust/blob/v0.21.0/opentelemetry/CHANGELOG.md for changes.
1 parent cfc64f3 commit 2156c23

File tree

13 files changed

+80
-82
lines changed

13 files changed

+80
-82
lines changed

.github/workflows/CI.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ jobs:
8888
strategy:
8989
matrix:
9090
toolchain:
91-
- 1.60.0
91+
- 1.65.0
9292
- stable
9393
steps:
9494
- uses: actions/checkout@v3

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
# Unreleased
2+
3+
### Breaking Changes
4+
5+
- Upgrade to `v0.21.0` of `opentelemetry`
6+
For list of breaking changes in OpenTelemetry, see the
7+
[v0.21.0 changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/v0.21.0/opentelemetry/CHANGELOG.md).
8+
- Update MSRV to require Rust 1.65+, as `opentelemetry` requires it now.
9+
110
# 0.21.0 (August 28, 2023)
211

312
### Added

Cargo.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ categories = [
1717
keywords = ["tracing", "opentelemetry", "jaeger", "zipkin", "async"]
1818
license = "MIT"
1919
edition = "2018"
20-
rust-version = "1.60.0"
20+
rust-version = "1.65.0"
2121

2222
[features]
2323
default = ["tracing-log", "metrics"]
2424
# Enables support for exporting OpenTelemetry metrics
2525
metrics = ["opentelemetry/metrics","opentelemetry_sdk/metrics", "smallvec"]
2626

2727
[dependencies]
28-
opentelemetry = { version = "0.20.0", default-features = false, features = ["trace"] }
29-
opentelemetry_sdk = { version = "0.20.0", default-features = false, features = ["trace"] }
28+
opentelemetry = { version = "0.21.0", default-features = false, features = ["trace"] }
29+
opentelemetry_sdk = { version = "0.21.0", default-features = false, features = ["trace"] }
3030
tracing = { version = "0.1.35", default-features = false, features = ["std"] }
3131
tracing-core = "0.1.28"
3232
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["registry", "std"] }
@@ -41,12 +41,12 @@ smallvec = { version = "1.0", optional = true }
4141
[dev-dependencies]
4242
async-trait = "0.1.56"
4343
criterion = { version = "0.5.1", default-features = false, features = ["html_reports"] }
44-
opentelemetry = { version = "0.20.0", features = ["trace", "metrics", "rt-tokio"] }
45-
opentelemetry_sdk = { version = "0.20.0", default-features = false, features = ["trace"] }
46-
opentelemetry-jaeger = "0.19.0"
47-
opentelemetry-stdout = { version = "0.1.0", features = ["trace", "metrics"] }
48-
opentelemetry-otlp = { version = "0.13.0", features = ["metrics"] }
49-
opentelemetry-semantic-conventions = "0.12.0"
44+
opentelemetry = { version = "0.21.0", features = ["trace", "metrics"] }
45+
opentelemetry_sdk = { version = "0.21.0", default-features = false, features = ["trace", "rt-tokio"] }
46+
opentelemetry-jaeger = "0.20.0"
47+
opentelemetry-stdout = { version = "0.2.0", features = ["trace", "metrics"] }
48+
opentelemetry-otlp = { version = "0.14.0", features = ["metrics"] }
49+
opentelemetry-semantic-conventions = "0.13.0"
5050
futures-util = { version = "0.3", default-features = false }
5151
tokio = { version = "1", features = ["full"] }
5252
tokio-stream = "0.1"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ The crate provides the following types:
5050
[`tracing`]: https://crates.io/crates/tracing
5151
[OpenTelemetry]: https://opentelemetry.io/
5252

53-
*Compiler support: [requires `rustc` 1.60+][msrv]*
53+
*Compiler support: [requires `rustc` 1.65+][msrv]*
5454

5555
[msrv]: #supported-rust-versions
5656

benches/trace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use criterion::{criterion_group, criterion_main, Criterion};
22
use opentelemetry::{
3-
sdk::trace::{Tracer, TracerProvider},
43
trace::{SpanBuilder, Tracer as _, TracerProvider as _},
54
Context,
65
};
6+
use opentelemetry_sdk::trace::{Tracer, TracerProvider};
77
#[cfg(not(target_os = "windows"))]
88
use pprof::criterion::{Output, PProfProfiler};
99
use std::time::SystemTime;

examples/opentelemetry-error.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ use std::{
77
time::{Duration, SystemTime},
88
};
99

10-
use opentelemetry::{
11-
global,
12-
sdk::{
13-
self,
14-
export::trace::{ExportResult, SpanExporter},
15-
},
16-
trace::TracerProvider,
10+
use opentelemetry::{global, trace::TracerProvider};
11+
12+
use opentelemetry_sdk::{
13+
self as sdk,
14+
export::trace::{ExportResult, SpanExporter},
1715
};
1816
use tracing::{error, instrument, span, trace, warn};
1917
use tracing_subscriber::prelude::*;
@@ -104,9 +102,8 @@ struct WriterExporter;
104102
impl SpanExporter for WriterExporter {
105103
fn export(
106104
&mut self,
107-
batch: Vec<opentelemetry::sdk::export::trace::SpanData>,
108-
) -> futures_util::future::BoxFuture<'static, opentelemetry::sdk::export::trace::ExportResult>
109-
{
105+
batch: Vec<sdk::export::trace::SpanData>,
106+
) -> futures_util::future::BoxFuture<'static, sdk::export::trace::ExportResult> {
110107
let mut writer = std::io::stdout();
111108
for span in batch {
112109
writeln!(writer, "{}", SpanData(span)).unwrap();
@@ -117,7 +114,7 @@ impl SpanExporter for WriterExporter {
117114
}
118115
}
119116

120-
struct SpanData(opentelemetry::sdk::export::trace::SpanData);
117+
struct SpanData(sdk::export::trace::SpanData);
121118
impl Display for SpanData {
122119
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
123120
writeln!(f, "Span: \"{}\"", self.0.name)?;
@@ -152,8 +149,8 @@ impl Display for SpanData {
152149
writeln!(f, " - {}: {}", k, v)?;
153150
}
154151
writeln!(f, "- Attributes:")?;
155-
for (k, v) in self.0.attributes.iter() {
156-
writeln!(f, " - {}: {}", k, v)?;
152+
for kv in self.0.attributes.iter() {
153+
writeln!(f, " - {}: {}", kv.key, kv.value)?;
157154
}
158155

159156
writeln!(f, "- Events:")?;

examples/opentelemetry-otlp.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
use opentelemetry::{global, runtime, Key, KeyValue};
2-
use opentelemetry_otlp::TonicExporterBuilder;
1+
use opentelemetry::{global, Key, KeyValue};
32
use opentelemetry_sdk::{
43
metrics::{
54
reader::{DefaultAggregationSelector, DefaultTemporalitySelector},
65
Aggregation, Instrument, MeterProvider, PeriodicReader, Stream,
76
},
7+
runtime,
88
trace::{BatchConfig, RandomIdGenerator, Sampler, Tracer},
99
Resource,
1010
};
@@ -30,14 +30,13 @@ fn resource() -> Resource {
3030

3131
// Construct MeterProvider for MetricsLayer
3232
fn init_meter_provider() -> MeterProvider {
33-
// Currently we could not access MeterProviderBuilder from opentelemetry_otlp
34-
// However to customize View we need MeterBuilder, so manually construct.
35-
let exporter = opentelemetry_otlp::MetricsExporter::new(
36-
TonicExporterBuilder::default(),
37-
Box::new(DefaultTemporalitySelector::new()),
38-
Box::new(DefaultAggregationSelector::new()),
39-
)
40-
.unwrap();
33+
let exporter = opentelemetry_otlp::new_exporter()
34+
.tonic()
35+
.build_metrics_exporter(
36+
Box::new(DefaultAggregationSelector::new()),
37+
Box::new(DefaultTemporalitySelector::new()),
38+
)
39+
.unwrap();
4140

4241
let reader = PeriodicReader::builder(exporter, runtime::Tokio)
4342
.with_interval(std::time::Duration::from_secs(30))

src/layer.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{OtelData, PreSampledTracer};
22
use once_cell::unsync;
33
use opentelemetry::{
4-
trace::{self as otel, noop, OrderMap, TraceContextExt},
4+
trace::{self as otel, noop, TraceContextExt},
55
Context as OtelContext, Key, KeyValue, StringValue, Value,
66
};
77
use std::any::TypeId;
@@ -290,21 +290,21 @@ impl<'a, 'b> field::Visit for SpanEventVisitor<'a, 'b> {
290290
if self.sem_conv_config.error_records_to_exceptions {
291291
if let Some(span) = &mut self.span_builder {
292292
if let Some(attrs) = span.attributes.as_mut() {
293-
attrs.insert(
294-
Key::new(FIELD_EXCEPTION_MESSAGE),
293+
attrs.push(KeyValue::new(
294+
FIELD_EXCEPTION_MESSAGE,
295295
Value::String(error_msg.clone().into()),
296-
);
296+
));
297297

298298
// NOTE: This is actually not the stacktrace of the exception. This is
299299
// the "source chain". It represents the heirarchy of errors from the
300300
// app level to the lowest level such as IO. It does not represent all
301301
// of the callsites in the code that led to the error happening.
302302
// `std::error::Error::backtrace` is a nightly-only API and cannot be
303303
// used here until the feature is stabilized.
304-
attrs.insert(
305-
Key::new(FIELD_EXCEPTION_STACKTRACE),
304+
attrs.push(KeyValue::new(
305+
FIELD_EXCEPTION_STACKTRACE,
306306
Value::Array(chain.clone().into()),
307-
);
307+
));
308308
}
309309
}
310310
}
@@ -362,7 +362,7 @@ impl<'a> SpanAttributeVisitor<'a> {
362362
fn record(&mut self, attribute: KeyValue) {
363363
debug_assert!(self.span_builder.attributes.is_some());
364364
if let Some(v) = self.span_builder.attributes.as_mut() {
365-
v.insert(attribute.key, attribute.value);
365+
v.push(KeyValue::new(attribute.key, attribute.value));
366366
}
367367
}
368368
}
@@ -859,34 +859,34 @@ where
859859
builder.trace_id = Some(self.tracer.new_trace_id());
860860
}
861861

862-
let builder_attrs = builder.attributes.get_or_insert(OrderMap::with_capacity(
862+
let builder_attrs = builder.attributes.get_or_insert(Vec::with_capacity(
863863
attrs.fields().len() + self.extra_span_attrs(),
864864
));
865865

866866
if self.location {
867867
let meta = attrs.metadata();
868868

869869
if let Some(filename) = meta.file() {
870-
builder_attrs.insert("code.filepath".into(), filename.into());
870+
builder_attrs.push(KeyValue::new("code.filepath", filename));
871871
}
872872

873873
if let Some(module) = meta.module_path() {
874-
builder_attrs.insert("code.namespace".into(), module.into());
874+
builder_attrs.push(KeyValue::new("code.namespace", module));
875875
}
876876

877877
if let Some(line) = meta.line() {
878-
builder_attrs.insert("code.lineno".into(), (line as i64).into());
878+
builder_attrs.push(KeyValue::new("code.lineno", line as i64));
879879
}
880880
}
881881

882882
if self.with_threads {
883-
THREAD_ID.with(|id| builder_attrs.insert("thread.id".into(), (**id as i64).into()));
883+
THREAD_ID.with(|id| builder_attrs.push(KeyValue::new("thread.id", **id as i64)));
884884
if let Some(name) = std::thread::current().name() {
885885
// TODO(eliza): it's a bummer that we have to allocate here, but
886886
// we can't easily get the string as a `static`. it would be
887887
// nice if `opentelemetry` could also take `Arc<str>`s as
888888
// `String` values...
889-
builder_attrs.insert("thread.name".into(), name.to_owned().into());
889+
builder_attrs.push(KeyValue::new("thread.name", name.to_string()));
890890
}
891891
}
892892

@@ -1090,9 +1090,9 @@ where
10901090

10911091
let attributes = builder
10921092
.attributes
1093-
.get_or_insert_with(|| OrderMap::with_capacity(2));
1094-
attributes.insert(busy_ns, timings.busy.into());
1095-
attributes.insert(idle_ns, timings.idle.into());
1093+
.get_or_insert_with(|| Vec::with_capacity(2));
1094+
attributes.push(KeyValue::new(busy_ns, timings.busy));
1095+
attributes.push(KeyValue::new(idle_ns, timings.idle));
10961096
}
10971097
}
10981098

@@ -1168,7 +1168,7 @@ mod tests {
11681168
where
11691169
T: Into<Cow<'static, str>>,
11701170
{
1171-
noop::NoopSpan::new()
1171+
noop::NoopSpan::DEFAULT
11721172
}
11731173
fn span_builder<T>(&self, name: T) -> otel::SpanBuilder
11741174
where
@@ -1185,7 +1185,7 @@ mod tests {
11851185
builder,
11861186
parent_cx: parent_cx.clone(),
11871187
});
1188-
noop::NoopSpan::new()
1188+
noop::NoopSpan::DEFAULT
11891189
}
11901190
}
11911191

@@ -1369,7 +1369,7 @@ mod tests {
13691369
let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
13701370
let keys = attributes
13711371
.iter()
1372-
.map(|(key, _)| key.as_str())
1372+
.map(|kv| kv.key.as_str())
13731373
.collect::<Vec<&str>>();
13741374
assert!(keys.contains(&"idle_ns"));
13751375
assert!(keys.contains(&"busy_ns"));
@@ -1405,7 +1405,7 @@ mod tests {
14051405

14061406
let key_values = attributes
14071407
.into_iter()
1408-
.map(|(key, value)| (key.as_str().to_owned(), value))
1408+
.map(|kv| (kv.key.as_str().to_owned(), kv.value))
14091409
.collect::<HashMap<_, _>>();
14101410

14111411
assert_eq!(key_values["error"].as_str(), "user error");
@@ -1467,7 +1467,7 @@ mod tests {
14671467

14681468
let key_values = attributes
14691469
.into_iter()
1470-
.map(|(key, value)| (key.as_str().to_owned(), value))
1470+
.map(|kv| (kv.key.as_str().to_owned(), kv.value))
14711471
.collect::<HashMap<_, _>>();
14721472

14731473
assert_eq!(key_values["error"].as_str(), "user error");
@@ -1508,7 +1508,7 @@ mod tests {
15081508
let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
15091509
let keys = attributes
15101510
.iter()
1511-
.map(|(key, _)| key.as_str())
1511+
.map(|kv| kv.key.as_str())
15121512
.collect::<Vec<&str>>();
15131513
assert!(keys.contains(&"code.filepath"));
15141514
assert!(keys.contains(&"code.namespace"));
@@ -1528,7 +1528,7 @@ mod tests {
15281528
let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
15291529
let keys = attributes
15301530
.iter()
1531-
.map(|(key, _)| key.as_str())
1531+
.map(|kv| kv.key.as_str())
15321532
.collect::<Vec<&str>>();
15331533
assert!(!keys.contains(&"code.filepath"));
15341534
assert!(!keys.contains(&"code.namespace"));
@@ -1554,7 +1554,7 @@ mod tests {
15541554
let attributes = tracer
15551555
.with_data(|data| data.builder.attributes.as_ref().unwrap().clone())
15561556
.drain(..)
1557-
.map(|(key, value)| (key.as_str().to_string(), value))
1557+
.map(|kv| (kv.key.as_str().to_string(), kv.value))
15581558
.collect::<HashMap<_, _>>();
15591559
assert_eq!(attributes.get("thread.name"), expected_name.as_ref());
15601560
assert_eq!(attributes.get("thread.id"), Some(&expected_id));
@@ -1573,7 +1573,7 @@ mod tests {
15731573
let attributes = tracer.with_data(|data| data.builder.attributes.as_ref().unwrap().clone());
15741574
let keys = attributes
15751575
.iter()
1576-
.map(|(key, _)| key.as_str())
1576+
.map(|kv| kv.key.as_str())
15771577
.collect::<Vec<&str>>();
15781578
assert!(!keys.contains(&"thread.name"));
15791579
assert!(!keys.contains(&"thread.id"));
@@ -1611,7 +1611,7 @@ mod tests {
16111611

16121612
let key_values = attributes
16131613
.into_iter()
1614-
.map(|(key, value)| (key.as_str().to_owned(), value))
1614+
.map(|kv| (kv.key.as_str().to_owned(), kv.value))
16151615
.collect::<HashMap<_, _>>();
16161616

16171617
assert_eq!(key_values[FIELD_EXCEPTION_MESSAGE].as_str(), "user error");
@@ -1663,7 +1663,7 @@ mod tests {
16631663

16641664
let key_values = attributes
16651665
.into_iter()
1666-
.map(|(key, value)| (key.as_str().to_owned(), value))
1666+
.map(|kv| (kv.key.as_str().to_owned(), kv.value))
16671667
.collect::<HashMap<_, _>>();
16681668

16691669
assert_eq!(key_values[FIELD_EXCEPTION_MESSAGE].as_str(), "user error");

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
//! [OpenTelemetry]: https://opentelemetry.io
1010
//! [`tracing`]: https://github.com/tokio-rs/tracing
1111
//!
12-
//! *Compiler support: [requires `rustc` 1.60+][msrv]*
12+
//! *Compiler support: [requires `rustc` 1.65+][msrv]*
1313
//!
1414
//! [msrv]: #supported-rust-versions
1515
//!

src/span_ext.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ impl OpenTelemetrySpanExt for tracing::Span {
201201
.attributes
202202
.as_mut()
203203
.unwrap()
204-
.insert(key.take().unwrap(), value.take().unwrap());
204+
.push(KeyValue::new(key.take().unwrap(), value.take().unwrap()));
205205
})
206206
}
207207
});

0 commit comments

Comments
 (0)