Skip to content

Commit f111c09

Browse files
authored
Switch to opentelemetry-prometheus-text-exporter (#4901)
2 parents 511614d + cc39368 commit f111c09

File tree

5 files changed

+51
-86
lines changed

5 files changed

+51
-86
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -407,10 +407,8 @@ version = "0.30.0"
407407
version = "0.30.0"
408408
default-features = false
409409
features = ["trace", "metrics", "http-proto"]
410-
[workspace.dependencies.opentelemetry-prometheus]
411-
# https://github.com/open-telemetry/opentelemetry-rust/pull/3076
412-
git = "https://github.com/sandhose/opentelemetry-rust.git"
413-
branch = "otel-prometheus-0.30"
410+
[workspace.dependencies.opentelemetry-prometheus-text-exporter]
411+
version = "0.2.0"
414412
[workspace.dependencies.opentelemetry-resource-detectors]
415413
version = "0.9.0"
416414
[workspace.dependencies.opentelemetry-semantic-conventions]
@@ -480,10 +478,6 @@ features = ["std", "pkcs5", "encryption"]
480478
[workspace.dependencies.psl]
481479
version = "2.1.141"
482480

483-
# Prometheus metrics
484-
[workspace.dependencies.prometheus]
485-
version = "0.14.0"
486-
487481
# High-precision clock
488482
[workspace.dependencies.quanta]
489483
version = "0.12.6"

crates/cli/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,11 @@ opentelemetry.workspace = true
5959
opentelemetry-http.workspace = true
6060
opentelemetry-jaeger-propagator.workspace = true
6161
opentelemetry-otlp.workspace = true
62-
opentelemetry-prometheus.workspace = true
62+
opentelemetry-prometheus-text-exporter.workspace = true
6363
opentelemetry-resource-detectors.workspace = true
6464
opentelemetry-semantic-conventions.workspace = true
6565
opentelemetry-stdout.workspace = true
6666
opentelemetry_sdk.workspace = true
67-
prometheus.workspace = true
6867
sentry.workspace = true
6968
sentry-tracing.workspace = true
7069
sentry-tower.workspace = true

crates/cli/src/telemetry.rs

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use opentelemetry::{
2323
trace::TracerProvider as _,
2424
};
2525
use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
26-
use opentelemetry_prometheus::PrometheusExporter;
26+
use opentelemetry_prometheus_text_exporter::PrometheusExporter;
2727
use opentelemetry_sdk::{
2828
Resource,
2929
metrics::{ManualReader, SdkMeterProvider, periodic_reader_with_async_runtime::PeriodicReader},
@@ -33,7 +33,6 @@ use opentelemetry_sdk::{
3333
},
3434
};
3535
use opentelemetry_semantic_conventions as semcov;
36-
use prometheus::Registry;
3736
use url::Url;
3837

3938
static SCOPE: LazyLock<InstrumentationScope> = LazyLock::new(|| {
@@ -49,7 +48,7 @@ pub static METER: LazyLock<Meter> =
4948
pub static TRACER: OnceLock<Tracer> = OnceLock::new();
5049
static METER_PROVIDER: OnceLock<SdkMeterProvider> = OnceLock::new();
5150
static TRACER_PROVIDER: OnceLock<SdkTracerProvider> = OnceLock::new();
52-
static PROMETHEUS_REGISTRY: OnceLock<Registry> = OnceLock::new();
51+
static PROMETHEUS_EXPORTER: OnceLock<PrometheusExporter> = OnceLock::new();
5352

5453
pub fn setup(config: &TelemetryConfig) -> anyhow::Result<()> {
5554
let propagator = propagator(&config.tracing.propagators);
@@ -180,21 +179,30 @@ type PromServiceFuture =
180179

181180
#[allow(clippy::needless_pass_by_value)]
182181
fn prometheus_service_fn<T>(_req: T) -> PromServiceFuture {
183-
use prometheus::{Encoder, TextEncoder};
184-
185-
let response = if let Some(registry) = PROMETHEUS_REGISTRY.get() {
186-
let mut buffer = Vec::new();
187-
let encoder = TextEncoder::new();
188-
let metric_families = registry.gather();
189-
190-
// That shouldn't panic, unless we're constructing invalid labels
191-
encoder.encode(&metric_families, &mut buffer).unwrap();
192-
193-
Response::builder()
194-
.status(200)
195-
.header(CONTENT_TYPE, encoder.format_type())
196-
.body(Full::new(Bytes::from(buffer)))
197-
.unwrap()
182+
let response = if let Some(exporter) = PROMETHEUS_EXPORTER.get() {
183+
// We'll need some space for this, so we preallocate a bit
184+
let mut buffer = Vec::with_capacity(1024);
185+
186+
if let Err(err) = exporter.export(&mut buffer) {
187+
tracing::error!(
188+
error = &err as &dyn std::error::Error,
189+
"Failed to export Prometheus metrics"
190+
);
191+
192+
Response::builder()
193+
.status(500)
194+
.header(CONTENT_TYPE, "text/plain")
195+
.body(Full::new(Bytes::from_static(
196+
b"Failed to export Prometheus metrics, see logs for details",
197+
)))
198+
.unwrap()
199+
} else {
200+
Response::builder()
201+
.status(200)
202+
.header(CONTENT_TYPE, "text/plain;version=1.0.0")
203+
.body(Full::new(Bytes::from(buffer)))
204+
.unwrap()
205+
}
198206
} else {
199207
Response::builder()
200208
.status(500)
@@ -209,7 +217,7 @@ fn prometheus_service_fn<T>(_req: T) -> PromServiceFuture {
209217
}
210218

211219
pub fn prometheus_service<T>() -> tower::util::ServiceFn<fn(T) -> PromServiceFuture> {
212-
if PROMETHEUS_REGISTRY.get().is_none() {
220+
if PROMETHEUS_EXPORTER.get().is_none() {
213221
tracing::warn!(
214222
"A Prometheus resource was mounted on a listener, but the Prometheus exporter was not setup in the config"
215223
);
@@ -219,16 +227,11 @@ pub fn prometheus_service<T>() -> tower::util::ServiceFn<fn(T) -> PromServiceFut
219227
}
220228

221229
fn prometheus_metric_reader() -> anyhow::Result<PrometheusExporter> {
222-
let registry = Registry::new();
223-
224-
PROMETHEUS_REGISTRY
225-
.set(registry.clone())
226-
.map_err(|_| anyhow::anyhow!("PROMETHEUS_REGISTRY was set twice"))?;
230+
let exporter = PrometheusExporter::builder().without_scope_info().build();
227231

228-
let exporter = opentelemetry_prometheus::exporter()
229-
.with_registry(registry)
230-
.without_scope_info()
231-
.build()?;
232+
PROMETHEUS_EXPORTER
233+
.set(exporter.clone())
234+
.map_err(|_| anyhow::anyhow!("PROMETHEUS_EXPORTER was set twice"))?;
232235

233236
Ok(exporter)
234237
}

deny.toml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,3 @@ deny = ["oldtime"]
9898
unknown-registry = "warn"
9999
unknown-git = "warn"
100100
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
101-
102-
allow-git = [
103-
# https://github.com/open-telemetry/opentelemetry-rust/pull/3076
104-
"https://github.com/sandhose/opentelemetry-rust",
105-
]

0 commit comments

Comments
 (0)