Skip to content

Commit b5155cc

Browse files
committed
Update the rest of the OTEL deps and use the new APIs
1 parent 5a86aed commit b5155cc

File tree

13 files changed

+205
-265
lines changed

13 files changed

+205
-265
lines changed

Cargo.lock

Lines changed: 113 additions & 147 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ resolver = "2"
55

66
# Updated in the CI with a `sed` command
77
package.version = "0.12.0"
8-
98
package.license = "AGPL-3.0-only"
109
package.authors = ["Element Backend Team"]
1110
package.edition = "2021"
@@ -337,15 +336,15 @@ version = "0.3.19"
337336

338337
# OpenTelemetry
339338
[workspace.dependencies.opentelemetry]
340-
version = "0.24.0"
339+
version = "0.27.1"
341340
features = ["trace", "metrics"]
342341
[workspace.dependencies.opentelemetry-http]
343-
version = "0.13.0"
342+
version = "0.27.0"
344343
features = ["reqwest"]
345344
[workspace.dependencies.opentelemetry-semantic-conventions]
346-
version = "0.16.0"
345+
version = "0.27.0"
347346
[workspace.dependencies.tracing-opentelemetry]
348-
version = "0.25.0"
347+
version = "0.28.0"
349348
default-features = false
350349

351350
# URL manipulation

crates/cli/src/app_state.rs

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ use mas_router::UrlBuilder;
2525
use mas_storage::{BoxClock, BoxRepository, BoxRng, SystemClock};
2626
use mas_storage_pg::PgRepository;
2727
use mas_templates::Templates;
28-
use opentelemetry::{
29-
metrics::{Histogram, MetricsError},
30-
KeyValue,
31-
};
28+
use opentelemetry::{metrics::Histogram, KeyValue};
3229
use rand::SeedableRng;
3330
use sqlx::PgPool;
3431

@@ -55,50 +52,45 @@ pub struct AppState {
5552

5653
impl AppState {
5754
/// Init the metrics for the app state.
58-
///
59-
/// # Errors
60-
///
61-
/// Returns an error if the metrics could not be initialized.
62-
pub fn init_metrics(&mut self) -> Result<(), MetricsError> {
55+
pub fn init_metrics(&mut self) {
6356
// XXX: do we want to put that somewhere else?
64-
let meter = opentelemetry::global::meter_with_version(
65-
env!("CARGO_PKG_NAME"),
66-
Some(env!("CARGO_PKG_VERSION")),
67-
Some(opentelemetry_semantic_conventions::SCHEMA_URL),
68-
None,
69-
);
57+
let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME"))
58+
.with_version(env!("CARGO_PKG_VERSION"))
59+
.with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL)
60+
.build();
61+
let meter = opentelemetry::global::meter_with_scope(scope);
62+
7063
let pool = self.pool.clone();
71-
let usage = meter
64+
meter
7265
.i64_observable_up_down_counter("db.connections.usage")
7366
.with_description("The number of connections that are currently in `state` described by the state attribute.")
7467
.with_unit("{connection}")
75-
.init();
68+
.with_callback(move |instrument| {
69+
let idle = u32::try_from(pool.num_idle()).unwrap_or(u32::MAX);
70+
let used = pool.size() - idle;
71+
instrument.observe(i64::from(idle), &[KeyValue::new("state", "idle")]);
72+
instrument.observe(i64::from(used), &[KeyValue::new("state", "used")]);
73+
})
74+
.build();
7675

77-
let max = meter
76+
let pool = self.pool.clone();
77+
meter
7878
.i64_observable_up_down_counter("db.connections.max")
7979
.with_description("The maximum number of open connections allowed.")
8080
.with_unit("{connection}")
81-
.init();
82-
83-
// Observe the number of active and idle connections in the pool
84-
meter.register_callback(&[usage.as_any(), max.as_any()], move |observer| {
85-
let idle = u32::try_from(pool.num_idle()).unwrap_or(u32::MAX);
86-
let used = pool.size() - idle;
87-
let max_conn = pool.options().get_max_connections();
88-
observer.observe_i64(&usage, i64::from(idle), &[KeyValue::new("state", "idle")]);
89-
observer.observe_i64(&usage, i64::from(used), &[KeyValue::new("state", "used")]);
90-
observer.observe_i64(&max, i64::from(max_conn), &[]);
91-
})?;
81+
.with_callback(move |instrument| {
82+
let max_conn = pool.options().get_max_connections();
83+
instrument.observe(i64::from(max_conn), &[]);
84+
})
85+
.build();
9286

9387
// Track the connection acquisition time
9488
let histogram = meter
9589
.u64_histogram("db.client.connections.create_time")
9690
.with_description("The time it took to create a new connection.")
9791
.with_unit("ms")
98-
.init();
92+
.build();
9993
self.conn_acquisition_histogram = Some(histogram);
100-
101-
Ok(())
10294
}
10395

10496
/// Init the metadata cache.

crates/cli/src/commands/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ impl Options {
228228
limiter,
229229
conn_acquisition_histogram: None,
230230
};
231-
s.init_metrics()?;
231+
s.init_metrics();
232232
// XXX: this might panic
233233
s.init_metadata_cache().await;
234234
s

crates/cli/src/server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,14 +248,14 @@ pub fn build_router(
248248
router
249249
.layer(
250250
InFlightCounterLayer::new("http.server.active_requests").on_request((
251-
name.map(|name| MAS_LISTENER_NAME.string(name.to_owned())),
251+
name.map(|name| KeyValue::new(MAS_LISTENER_NAME, name.to_owned())),
252252
metrics_attributes_fn(on_http_request_labels),
253253
)),
254254
)
255255
.layer(
256256
DurationRecorderLayer::new("http.server.duration")
257257
.on_request((
258-
name.map(|name| MAS_LISTENER_NAME.string(name.to_owned())),
258+
name.map(|name| KeyValue::new(MAS_LISTENER_NAME, name.to_owned())),
259259
metrics_attributes_fn(on_http_request_labels),
260260
))
261261
.on_response_fn(on_http_response_labels),

crates/cli/src/telemetry.rs

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,13 @@ use opentelemetry::{
1818
global,
1919
propagation::{TextMapCompositePropagator, TextMapPropagator},
2020
trace::TracerProvider as _,
21-
KeyValue,
21+
InstrumentationScope, KeyValue,
2222
};
23-
use opentelemetry_otlp::MetricsExporterBuilder;
23+
use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
2424
use opentelemetry_prometheus::PrometheusExporter;
2525
use opentelemetry_sdk::{
2626
self,
27-
metrics::{
28-
reader::{DefaultAggregationSelector, DefaultTemporalitySelector},
29-
ManualReader, PeriodicReader, SdkMeterProvider,
30-
},
27+
metrics::{ManualReader, PeriodicReader, SdkMeterProvider},
3128
propagation::{BaggagePropagator, TraceContextPropagator},
3229
trace::{Sampler, Tracer, TracerProvider},
3330
Resource,
@@ -41,16 +38,6 @@ static METER_PROVIDER: OnceCell<SdkMeterProvider> = OnceCell::const_new();
4138
static PROMETHEUS_REGISTRY: OnceCell<Registry> = OnceCell::const_new();
4239

4340
pub fn setup(config: &TelemetryConfig) -> anyhow::Result<Option<Tracer>> {
44-
global::set_error_handler(|e| {
45-
// Don't log the propagation errors, else we'll log an error on each request if
46-
// the propagation errors aren't there
47-
if matches!(e, opentelemetry::global::Error::Propagation(_)) {
48-
return;
49-
}
50-
51-
tracing::error!(error = &e as &dyn std::error::Error);
52-
})?;
53-
5441
let propagator = propagator(&config.tracing.propagators);
5542

5643
// The CORS filter needs to know what headers it should whitelist for
@@ -96,22 +83,22 @@ fn stdout_tracer_provider() -> TracerProvider {
9683
}
9784

9885
fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result<TracerProvider> {
99-
use opentelemetry_otlp::WithExportConfig;
100-
101-
let mut exporter = opentelemetry_otlp::new_exporter()
102-
.http()
86+
let mut exporter = opentelemetry_otlp::SpanExporter::builder()
87+
.with_http()
10388
.with_http_client(mas_http::reqwest_client());
10489
if let Some(endpoint) = endpoint {
10590
exporter = exporter.with_endpoint(endpoint.to_string());
10691
}
107-
108-
let tracer = opentelemetry_otlp::new_pipeline()
109-
.tracing()
110-
.with_exporter(exporter)
111-
.with_trace_config(trace_config())
112-
.install_batch(opentelemetry_sdk::runtime::Tokio)
92+
let exporter = exporter
93+
.build()
11394
.context("Failed to configure OTLP trace exporter")?;
11495

96+
let tracer = opentelemetry_sdk::trace::TracerProvider::builder()
97+
.with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio)
98+
.with_resource(resource())
99+
.with_sampler(Sampler::AlwaysOn)
100+
.build();
101+
115102
Ok(tracer)
116103
}
117104

@@ -122,37 +109,35 @@ fn tracer(config: &TracingConfig) -> anyhow::Result<Option<Tracer>> {
122109
TracingExporterKind::Otlp => otlp_tracer_provider(config.endpoint.as_ref())?,
123110
};
124111

125-
let tracer = tracer_provider
126-
.tracer_builder(env!("CARGO_PKG_NAME"))
112+
let scope = InstrumentationScope::builder(env!("CARGO_PKG_NAME"))
127113
.with_version(env!("CARGO_PKG_VERSION"))
128114
.with_schema_url(semcov::SCHEMA_URL)
129115
.build();
130116

117+
let tracer = tracer_provider.tracer_with_scope(scope);
118+
131119
global::set_tracer_provider(tracer_provider);
132120

133121
Ok(Some(tracer))
134122
}
135123

136124
fn otlp_metric_reader(endpoint: Option<&url::Url>) -> anyhow::Result<PeriodicReader> {
137-
use opentelemetry_otlp::WithExportConfig;
138-
139-
let mut exporter = opentelemetry_otlp::new_exporter()
140-
.http()
125+
let mut exporter = opentelemetry_otlp::MetricExporter::builder()
126+
.with_http()
141127
.with_http_client(mas_http::reqwest_client());
142128
if let Some(endpoint) = endpoint {
143129
exporter = exporter.with_endpoint(endpoint.to_string());
144130
}
131+
let exporter = exporter
132+
.build()
133+
.context("Failed to configure OTLP metric exporter")?;
145134

146-
let exporter = MetricsExporterBuilder::from(exporter).build_metrics_exporter(
147-
Box::new(DefaultTemporalitySelector::new()),
148-
Box::new(DefaultAggregationSelector::new()),
149-
)?;
150-
151-
Ok(PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build())
135+
let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build();
136+
Ok(reader)
152137
}
153138

154139
fn stdout_metric_reader() -> PeriodicReader {
155-
let exporter = opentelemetry_stdout::MetricsExporter::default();
140+
let exporter = opentelemetry_stdout::MetricExporter::builder().build();
156141
PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build()
157142
}
158143

@@ -230,12 +215,6 @@ fn init_meter(config: &MetricsConfig) -> anyhow::Result<()> {
230215
Ok(())
231216
}
232217

233-
fn trace_config() -> opentelemetry_sdk::trace::Config {
234-
opentelemetry_sdk::trace::Config::default()
235-
.with_resource(resource())
236-
.with_sampler(Sampler::AlwaysOn)
237-
}
238-
239218
fn resource() -> Resource {
240219
let resource = Resource::new([
241220
KeyValue::new(semcov::resource::SERVICE_NAME, env!("CARGO_PKG_NAME")),

crates/handlers/src/activity_tracker/worker.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use chrono::{DateTime, Utc};
1010
use mas_storage::{user::BrowserSessionRepository, RepositoryAccess};
1111
use opentelemetry::{
1212
metrics::{Counter, Histogram},
13-
Key,
13+
Key, KeyValue,
1414
};
1515
use sqlx::PgPool;
1616
use tokio_util::sync::CancellationToken;
@@ -48,18 +48,17 @@ pub struct Worker {
4848

4949
impl Worker {
5050
pub(crate) fn new(pool: PgPool) -> Self {
51-
let meter = opentelemetry::global::meter_with_version(
52-
env!("CARGO_PKG_NAME"),
53-
Some(env!("CARGO_PKG_VERSION")),
54-
Some(opentelemetry_semantic_conventions::SCHEMA_URL),
55-
None,
56-
);
51+
let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME"))
52+
.with_version(env!("CARGO_PKG_VERSION"))
53+
.with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL)
54+
.build();
55+
let meter = opentelemetry::global::meter_with_scope(scope);
5756

5857
let message_counter = meter
5958
.u64_counter("mas.activity_tracker.messages")
6059
.with_description("The number of messages received by the activity tracker")
6160
.with_unit("{messages}")
62-
.init();
61+
.build();
6362

6463
// Record stuff on the counter so that the metrics are initialized
6564
for kind in &[
@@ -69,17 +68,20 @@ impl Worker {
6968
] {
7069
message_counter.add(
7170
0,
72-
&[TYPE.string("record"), SESSION_KIND.string(kind.as_str())],
71+
&[
72+
KeyValue::new(TYPE, "record"),
73+
KeyValue::new(SESSION_KIND, kind.as_str()),
74+
],
7375
);
7476
}
75-
message_counter.add(0, &[TYPE.string("flush")]);
76-
message_counter.add(0, &[TYPE.string("shutdown")]);
77+
message_counter.add(0, &[KeyValue::new(TYPE, "flush")]);
78+
message_counter.add(0, &[KeyValue::new(TYPE, "shutdown")]);
7779

7880
let flush_time_histogram = meter
7981
.u64_histogram("mas.activity_tracker.flush_time")
8082
.with_description("The time it took to flush the activity tracker")
8183
.with_unit("ms")
82-
.init();
84+
.build();
8385

8486
Self {
8587
pool,
@@ -137,7 +139,10 @@ impl Worker {
137139

138140
self.message_counter.add(
139141
1,
140-
&[TYPE.string("record"), SESSION_KIND.string(kind.as_str())],
142+
&[
143+
KeyValue::new(TYPE, "record"),
144+
KeyValue::new(SESSION_KIND, kind.as_str()),
145+
],
141146
);
142147

143148
let record =
@@ -153,7 +158,7 @@ impl Worker {
153158
}
154159

155160
Message::Flush(tx) => {
156-
self.message_counter.add(1, &[TYPE.string("flush")]);
161+
self.message_counter.add(1, &[KeyValue::new(TYPE, "flush")]);
157162

158163
self.flush().await;
159164
let _ = tx.send(());
@@ -182,11 +187,11 @@ impl Worker {
182187
match res {
183188
Ok(()) => {
184189
self.flush_time_histogram
185-
.record(duration_ms, &[RESULT.string("success")]);
190+
.record(duration_ms, &[KeyValue::new(RESULT, "success")]);
186191
}
187192
Err(e) => {
188193
self.flush_time_histogram
189-
.record(duration_ms, &[RESULT.string("failure")]);
194+
.record(duration_ms, &[KeyValue::new(RESULT, "failure")]);
190195
tracing::error!("Failed to flush activity tracker: {}", e);
191196
}
192197
}

crates/http/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ pub use self::{
2020
};
2121

2222
static METER: LazyLock<opentelemetry::metrics::Meter> = LazyLock::new(|| {
23-
opentelemetry::global::meter_with_version(
24-
env!("CARGO_PKG_NAME"),
25-
Some(env!("CARGO_PKG_VERSION")),
26-
Some(opentelemetry_semantic_conventions::SCHEMA_URL),
27-
None,
28-
)
23+
let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME"))
24+
.with_version(env!("CARGO_PKG_VERSION"))
25+
.with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL)
26+
.build();
27+
28+
opentelemetry::global::meter_with_scope(scope)
2929
});

0 commit comments

Comments
 (0)