From a37fbbf459632157b6a175b24b1b0d75b48e3b10 Mon Sep 17 00:00:00 2001 From: David Pitoniak Date: Sat, 12 Oct 2024 19:24:05 -0400 Subject: [PATCH 1/2] chore: move DeltaTemporalitySelector into reader Move Delta selector into same file as Default, and update duplication in benches. --- opentelemetry-otlp/src/metric.rs | 33 ++------------------- opentelemetry-sdk/benches/metric.rs | 24 +--------------- opentelemetry-sdk/src/metrics/reader.rs | 38 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 54 deletions(-) diff --git a/opentelemetry-otlp/src/metric.rs b/opentelemetry-otlp/src/metric.rs index 83474e94ff..f693235ea7 100644 --- a/opentelemetry-otlp/src/metric.rs +++ b/opentelemetry-otlp/src/metric.rs @@ -14,7 +14,7 @@ use opentelemetry_sdk::{ metrics::{ data::{ResourceMetrics, Temporality}, exporter::PushMetricsExporter, - reader::{DefaultTemporalitySelector, TemporalitySelector}, + reader::{DefaultTemporalitySelector, DeltaTemporalitySelector, TemporalitySelector}, InstrumentKind, PeriodicReader, SdkMeterProvider, }, runtime::Runtime, @@ -169,7 +169,7 @@ where /// /// [exporter-docs]: https://github.com/open-telemetry/opentelemetry-specification/blob/a1c13d59bb7d0fb086df2b3e1eaec9df9efef6cc/specification/metrics/sdk_exporters/otlp.md#additional-configuration pub fn with_delta_temporality(self) -> Self { - self.with_temporality_selector(DeltaTemporalitySelector) + self.with_temporality_selector(DeltaTemporalitySelector::new()) } } @@ -237,35 +237,6 @@ impl Debug for OtlpMetricPipeline { } } -/// A temporality selector that returns [`Delta`][Temporality::Delta] for all -/// instruments except `UpDownCounter` and `ObservableUpDownCounter`. -/// -/// This temporality selector is equivalent to OTLP Metrics Exporter's -/// `Delta` temporality preference (see [its documentation][exporter-docs]). -/// -/// [exporter-docs]: https://github.com/open-telemetry/opentelemetry-specification/blob/a1c13d59bb7d0fb086df2b3e1eaec9df9efef6cc/specification/metrics/sdk_exporters/otlp.md#additional-configuration -#[derive(Debug)] -struct DeltaTemporalitySelector; - -impl TemporalitySelector for DeltaTemporalitySelector { - #[rustfmt::skip] - fn temporality(&self, kind: InstrumentKind) -> Temporality { - match kind { - InstrumentKind::Counter - | InstrumentKind::Histogram - | InstrumentKind::ObservableCounter - | InstrumentKind::Gauge - | InstrumentKind::ObservableGauge => { - Temporality::Delta - } - InstrumentKind::UpDownCounter - | InstrumentKind::ObservableUpDownCounter => { - Temporality::Cumulative - } - } - } -} - /// An interface for OTLP metrics clients #[async_trait] pub trait MetricsClient: fmt::Debug + Send + Sync + 'static { diff --git a/opentelemetry-sdk/benches/metric.rs b/opentelemetry-sdk/benches/metric.rs index 88143bccff..8eb472b48c 100644 --- a/opentelemetry-sdk/benches/metric.rs +++ b/opentelemetry-sdk/benches/metric.rs @@ -10,7 +10,7 @@ use opentelemetry_sdk::{ metrics::{ data::{ResourceMetrics, Temporality}, new_view, - reader::{MetricReader, TemporalitySelector}, + reader::{DeltaTemporalitySelector, MetricReader, TemporalitySelector}, Aggregation, Instrument, InstrumentKind, ManualReader, Pipeline, SdkMeterProvider, Stream, View, }, @@ -44,28 +44,6 @@ impl MetricReader for SharedReader { } } -/// Configure delta temporality for all [InstrumentKind] -/// -/// [Temporality::Delta] will be used for all instrument kinds if this -/// [TemporalitySelector] is used. -#[derive(Clone, Default, Debug)] -pub struct DeltaTemporalitySelector { - pub(crate) _private: (), -} - -impl DeltaTemporalitySelector { - /// Create a new default temporality selector. - pub fn new() -> Self { - Self::default() - } -} - -impl TemporalitySelector for DeltaTemporalitySelector { - fn temporality(&self, _kind: InstrumentKind) -> Temporality { - Temporality::Delta - } -} - // * Summary * // rustc 1.68.0 (2c8cc3432 2023-03-06) diff --git a/opentelemetry-sdk/src/metrics/reader.rs b/opentelemetry-sdk/src/metrics/reader.rs index 0a6dbc1b4e..052dd73508 100644 --- a/opentelemetry-sdk/src/metrics/reader.rs +++ b/opentelemetry-sdk/src/metrics/reader.rs @@ -86,3 +86,41 @@ impl TemporalitySelector for DefaultTemporalitySelector { Temporality::Cumulative } } + +/// A temporality selector that returns [`Delta`][Temporality::Delta] for all +/// instruments except `UpDownCounter` and `ObservableUpDownCounter`. +/// +/// This temporality selector is equivalent to OTLP Metrics Exporter's +/// `Delta` temporality preference (see [its documentation][exporter-docs]). +/// +/// [exporter-docs]: https://github.com/open-telemetry/opentelemetry-specification/blob/a1c13d59bb7d0fb086df2b3e1eaec9df9efef6cc/specification/metrics/sdk_exporters/otlp.md#additional-configuration +#[derive(Clone, Default, Debug)] +pub struct DeltaTemporalitySelector { + pub(crate) _private: (), +} + +impl DeltaTemporalitySelector { + /// Create a new default temporality selector. + pub fn new() -> Self { + Self::default() + } +} + +impl TemporalitySelector for DeltaTemporalitySelector { + #[rustfmt::skip] + fn temporality(&self, kind: InstrumentKind) -> Temporality { + match kind { + InstrumentKind::Counter + | InstrumentKind::Histogram + | InstrumentKind::ObservableCounter + | InstrumentKind::Gauge + | InstrumentKind::ObservableGauge => { + Temporality::Delta + } + InstrumentKind::UpDownCounter + | InstrumentKind::ObservableUpDownCounter => { + Temporality::Cumulative + } + } + } +} From e84b182942f9df15e42821274ae879be50f8e7e7 Mon Sep 17 00:00:00 2001 From: David Pitoniak Date: Sat, 12 Oct 2024 19:24:24 -0400 Subject: [PATCH 2/2] example: update advanced metrics to use delta temporality --- examples/metrics-advanced/Cargo.toml | 2 +- examples/metrics-advanced/src/main.rs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/metrics-advanced/Cargo.toml b/examples/metrics-advanced/Cargo.toml index a5a8a7c489..f03edbd898 100644 --- a/examples/metrics-advanced/Cargo.toml +++ b/examples/metrics-advanced/Cargo.toml @@ -8,6 +8,6 @@ publish = false [dependencies] opentelemetry = { path = "../../opentelemetry", features = ["metrics"] } opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["metrics", "rt-tokio"] } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["metrics"]} +opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["metrics"] } tokio = { workspace = true, features = ["full"] } serde_json = { workspace = true } diff --git a/examples/metrics-advanced/src/main.rs b/examples/metrics-advanced/src/main.rs index 268bd8f747..570693dc20 100644 --- a/examples/metrics-advanced/src/main.rs +++ b/examples/metrics-advanced/src/main.rs @@ -1,6 +1,7 @@ use opentelemetry::global; use opentelemetry::Key; use opentelemetry::KeyValue; +use opentelemetry_sdk::metrics::reader::DeltaTemporalitySelector; use opentelemetry_sdk::metrics::{ Aggregation, Instrument, PeriodicReader, SdkMeterProvider, Stream, }; @@ -44,7 +45,11 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider { } }; - let exporter = opentelemetry_stdout::MetricsExporterBuilder::default().build(); + // Build exporter using Delta Temporality. + let exporter = opentelemetry_stdout::MetricsExporterBuilder::default() + .with_temporality_selector(DeltaTemporalitySelector::new()) + .build(); + let reader = PeriodicReader::builder(exporter, runtime::Tokio).build(); let provider = SdkMeterProvider::builder() .with_reader(reader)