From a76c4c6db9bd8cb0c0de5ce6c3d963d588330ebc Mon Sep 17 00:00:00 2001 From: Braden Steffaniak Date: Tue, 11 Feb 2025 15:01:16 -0500 Subject: [PATCH 1/3] Upgrade opentelemetry-prometheus to 0.28 (#2650) --- opentelemetry-otlp/src/exporter/http/mod.rs | 2 +- opentelemetry-otlp/src/exporter/mod.rs | 4 +- opentelemetry-otlp/src/exporter/tonic/mod.rs | 2 +- opentelemetry-prometheus/CHANGELOG.md | 8 +- opentelemetry-prometheus/Cargo.toml | 8 +- opentelemetry-prometheus/src/lib.rs | 7 +- .../tests/integration_test.rs | 88 +++++++------------ 7 files changed, 51 insertions(+), 68 deletions(-) diff --git a/opentelemetry-otlp/src/exporter/http/mod.rs b/opentelemetry-otlp/src/exporter/http/mod.rs index 650358533e..10342a858a 100644 --- a/opentelemetry-otlp/src/exporter/http/mod.rs +++ b/opentelemetry-otlp/src/exporter/http/mod.rs @@ -120,7 +120,7 @@ impl HttpExporterBuilder { .or(env::var(OTEL_EXPORTER_OTLP_TIMEOUT).ok()) { Some(val) => match val.parse() { - Ok(seconds) => Duration::from_secs(seconds), + Ok(seconds) => Duration::from_millis(seconds), Err(_) => self.exporter_config.timeout, }, None => self.exporter_config.timeout, diff --git a/opentelemetry-otlp/src/exporter/mod.rs b/opentelemetry-otlp/src/exporter/mod.rs index bec1c809bb..219ea76387 100644 --- a/opentelemetry-otlp/src/exporter/mod.rs +++ b/opentelemetry-otlp/src/exporter/mod.rs @@ -52,7 +52,7 @@ const OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_JSON: &str = "http/json"; /// Max waiting time for the backend to process each signal batch, defaults to 10 seconds. pub const OTEL_EXPORTER_OTLP_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_TIMEOUT"; /// Default max waiting time for the backend to process each signal batch. -pub const OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT: u64 = 10; +pub const OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT: u64 = 10000; // Endpoints per protocol https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md #[cfg(feature = "grpc-tonic")] @@ -87,7 +87,7 @@ impl Default for ExportConfig { // don't use default_endpoint(protocol) here otherwise we // won't know if user provided a value protocol, - timeout: Duration::from_secs(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT), + timeout: Duration::from_millis(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT), } } } diff --git a/opentelemetry-otlp/src/exporter/tonic/mod.rs b/opentelemetry-otlp/src/exporter/tonic/mod.rs index 9e2b54c631..3b4bf03d42 100644 --- a/opentelemetry-otlp/src/exporter/tonic/mod.rs +++ b/opentelemetry-otlp/src/exporter/tonic/mod.rs @@ -200,7 +200,7 @@ impl TonicExporterBuilder { .or(env::var(OTEL_EXPORTER_OTLP_TIMEOUT).ok()) { Some(val) => match val.parse() { - Ok(seconds) => Duration::from_secs(seconds), + Ok(seconds) => Duration::from_millis(seconds), Err(_) => config.timeout, }, None => config.timeout, diff --git a/opentelemetry-prometheus/CHANGELOG.md b/opentelemetry-prometheus/CHANGELOG.md index b45f2b51dc..676cb24cff 100644 --- a/opentelemetry-prometheus/CHANGELOG.md +++ b/opentelemetry-prometheus/CHANGELOG.md @@ -2,8 +2,12 @@ ## vNext -- Bump msrv to 1.75.0. +## v0.28.0 +- Update `opentelemetry` dependency version to 0.28 +- Update `opentelemetry_sdk` dependency version to 0.28 +- Update `opentelemetry-semantic-conventions` dependency version to 0.28 +- Bump msrv to 1.75.0. ## v0.27.0 @@ -11,7 +15,6 @@ - Update `opentelemetry_sdk` dependency version to 0.27 - Update `opentelemetry-semantic-conventions` dependency version to 0.27 - ## v0.17.0 ### Changed @@ -66,6 +69,7 @@ ## v0.12.0 ### Changed + - [Breaking] Add `_total` suffix for all counters [#952](https://github.com/open-telemetry/opentelemetry-rust/pull/952). - Update to `opentelemetry` v0.19. - Bump MSRV to 1.57 [#953](https://github.com/open-telemetry/opentelemetry-rust/pull/953). diff --git a/opentelemetry-prometheus/Cargo.toml b/opentelemetry-prometheus/Cargo.toml index 4ace0c2a84..938fe3535d 100644 --- a/opentelemetry-prometheus/Cargo.toml +++ b/opentelemetry-prometheus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "opentelemetry-prometheus" -version = "0.27.0" +version = "0.28.0" description = "Prometheus exporter for OpenTelemetry" homepage = "https://github.com/open-telemetry/opentelemetry-rust" repository = "https://github.com/open-telemetry/opentelemetry-rust" @@ -21,14 +21,14 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] once_cell = { version = "1.13" } -opentelemetry = { version = "0.27", default-features = false, features = ["metrics"] } -opentelemetry_sdk = { version = "0.27", default-features = false, features = ["metrics"] } +opentelemetry = { version = "0.28", default-features = false, features = ["metrics"] } +opentelemetry_sdk = { version = "0.28", default-features = false, features = ["metrics"] } prometheus = "0.13" protobuf = "2.14" tracing = {version = ">=0.1.40", default-features = false, optional = true} # optional for opentelemetry internal logging [dev-dependencies] -opentelemetry-semantic-conventions = { version = "0.27" } +opentelemetry-semantic-conventions = { version = "0.28" } http-body-util = { version = "0.1" } hyper = { version = "1.3", features = ["full"] } hyper-util = { version = "0.1", features = ["full"] } diff --git a/opentelemetry-prometheus/src/lib.rs b/opentelemetry-prometheus/src/lib.rs index 968635a715..e68243fe2c 100644 --- a/opentelemetry-prometheus/src/lib.rs +++ b/opentelemetry-prometheus/src/lib.rs @@ -99,6 +99,7 @@ use once_cell::sync::{Lazy, OnceCell}; use opentelemetry::{otel_error, otel_warn, InstrumentationScope, Key, Value}; use opentelemetry_sdk::{ + error::OTelSdkResult, metrics::{ data::{self, ResourceMetrics}, reader::MetricReader, @@ -157,11 +158,11 @@ impl MetricReader for PrometheusExporter { self.reader.collect(rm) } - fn force_flush(&self) -> MetricResult<()> { + fn force_flush(&self) -> OTelSdkResult { self.reader.force_flush() } - fn shutdown(&self) -> MetricResult<()> { + fn shutdown(&self) -> OTelSdkResult { self.reader.shutdown() } @@ -284,7 +285,7 @@ impl prometheus::core::Collector for Collector { }; let mut metrics = ResourceMetrics { - resource: Resource::empty(), + resource: Resource::builder_empty().build(), scope_metrics: vec![], }; if let Err(err) = self.reader.collect(&mut metrics) { diff --git a/opentelemetry-prometheus/tests/integration_test.rs b/opentelemetry-prometheus/tests/integration_test.rs index 286f8e0392..ccc3b1edc7 100644 --- a/opentelemetry-prometheus/tests/integration_test.rs +++ b/opentelemetry-prometheus/tests/integration_test.rs @@ -1,16 +1,12 @@ use std::collections::HashSet; use std::fs; use std::path::Path; -use std::time::Duration; use opentelemetry::metrics::{Meter, MeterProvider as _}; use opentelemetry::KeyValue; use opentelemetry::{InstrumentationScope, Key}; use opentelemetry_prometheus::{ExporterBuilder, ResourceSelector}; use opentelemetry_sdk::metrics::SdkMeterProvider; -use opentelemetry_sdk::resource::{ - EnvResourceDetector, SdkProvidedResourceDetector, TelemetryResourceDetector, -}; use opentelemetry_sdk::Resource; use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, TELEMETRY_SDK_VERSION}; use prometheus::{Encoder, TextEncoder}; @@ -360,26 +356,20 @@ fn prometheus_exporter_integration() { let exporter = tc.builder.with_registry(registry.clone()).build().unwrap(); let res = if tc.empty_resource { - Resource::empty() + Resource::builder_empty().build() } else { - Resource::from_detectors( - Duration::from_secs(0), - vec![ - Box::new(SdkProvidedResourceDetector), - Box::new(EnvResourceDetector::new()), - Box::new(TelemetryResourceDetector), - ], - ) - .merge(&mut Resource::new( - vec![ - // always specify service.name because the default depends on the running OS - KeyValue::new(SERVICE_NAME, "prometheus_test"), - // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version - KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), - ] - .into_iter() - .chain(tc.custom_resource_attrs.into_iter()), - )) + Resource::builder() + .with_attributes( + vec![ + // always specify service.name because the default depends on the running OS + KeyValue::new(SERVICE_NAME, "prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), + ] + .into_iter() + .chain(tc.custom_resource_attrs.into_iter()), + ) + .build() }; let provider = SdkMeterProvider::builder() @@ -431,20 +421,14 @@ fn multiple_scopes() { .build() .unwrap(); - let resource = Resource::from_detectors( - Duration::from_secs(0), - vec![ - Box::new(SdkProvidedResourceDetector), - Box::new(EnvResourceDetector::new()), - Box::new(TelemetryResourceDetector), - ], - ) - .merge(&mut Resource::new(vec![ - // always specify service.name because the default depends on the running OS - KeyValue::new(SERVICE_NAME, "prometheus_test"), - // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version - KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), - ])); + let resource = Resource::builder() + .with_attributes([ + // always specify service.name because the default depends on the running OS + KeyValue::new(SERVICE_NAME, "prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), + ]) + .build(); let provider = SdkMeterProvider::builder() .with_reader(exporter) @@ -781,24 +765,18 @@ fn duplicate_metrics() { let registry = prometheus::Registry::new(); let exporter = tc.builder.with_registry(registry.clone()).build().unwrap(); - let resource = Resource::from_detectors( - Duration::from_secs(0), - vec![ - Box::new(SdkProvidedResourceDetector), - Box::new(EnvResourceDetector::new()), - Box::new(TelemetryResourceDetector), - ], - ) - .merge(&mut Resource::new( - vec![ - // always specify service.name because the default depends on the running OS - KeyValue::new(SERVICE_NAME, "prometheus_test"), - // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version - KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), - ] - .into_iter() - .chain(tc.custom_resource_attrs.into_iter()), - )); + let resource = Resource::builder() + .with_attributes( + vec![ + // always specify service.name because the default depends on the running OS + KeyValue::new(SERVICE_NAME, "prometheus_test"), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + KeyValue::new(TELEMETRY_SDK_VERSION, "latest"), + ] + .into_iter() + .chain(tc.custom_resource_attrs.into_iter()), + ) + .build(); let provider = SdkMeterProvider::builder() .with_resource(resource) From cc2180a80a8d5a0beb8e97a9f721481ce968bf41 Mon Sep 17 00:00:00 2001 From: mohammadVatandoost Date: Thu, 13 Feb 2025 08:43:39 +0100 Subject: [PATCH 2/3] update changelog --- opentelemetry-otlp/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index bc8046f9ad..91ac0519b6 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -2,6 +2,8 @@ ## vNext +- The `OTEL_EXPORTER_OTLP_TIMEOUT` is changed from seconds to miliseconds. + ## 0.28.0 Released 2025-Feb-10 From 91b13d282fd6991a518c633a532b612df5f5ae23 Mon Sep 17 00:00:00 2001 From: mohammadVatandoost Date: Thu, 13 Feb 2025 22:36:43 +0100 Subject: [PATCH 3/3] update changelog --- opentelemetry-otlp/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index 91ac0519b6..dc859dd542 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -2,7 +2,7 @@ ## vNext -- The `OTEL_EXPORTER_OTLP_TIMEOUT` is changed from seconds to miliseconds. +- The `OTEL_EXPORTER_OTLP_TIMEOUT`, `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`, `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` and `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` are changed from seconds to miliseconds. ## 0.28.0