Skip to content

Commit 773803c

Browse files
committed
refactor: use temporality enum for selection
1 parent 4327283 commit 773803c

File tree

17 files changed

+152
-252
lines changed

17 files changed

+152
-252
lines changed

Diff for: examples/metrics-advanced/src/main.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use opentelemetry::global;
22
use opentelemetry::Key;
33
use opentelemetry::KeyValue;
4-
use opentelemetry_sdk::metrics::reader::DeltaTemporalitySelector;
54
use opentelemetry_sdk::metrics::{
6-
Aggregation, Instrument, PeriodicReader, SdkMeterProvider, Stream,
5+
data::Temporality, Aggregation, Instrument, PeriodicReader, SdkMeterProvider, Stream,
76
};
87
use opentelemetry_sdk::{runtime, Resource};
98
use std::error::Error;
@@ -47,7 +46,7 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
4746

4847
// Build exporter using Delta Temporality.
4948
let exporter = opentelemetry_stdout::MetricsExporterBuilder::default()
50-
.with_temporality_selector(DeltaTemporalitySelector::new())
49+
.with_temporality(Temporality::Delta)
5150
.build();
5251

5352
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();

Diff for: examples/metrics-basic/src/main.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
use opentelemetry::global;
22
use opentelemetry::KeyValue;
3-
use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider};
3+
use opentelemetry_sdk::metrics::{data::Temporality, PeriodicReader, SdkMeterProvider};
44
use opentelemetry_sdk::{runtime, Resource};
55
use std::error::Error;
66
use std::vec;
77

88
fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
99
let exporter = opentelemetry_stdout::MetricsExporterBuilder::default()
10-
// Build exporter using Default (Cumulative) Temporality Selector.
11-
.with_temporality_selector(
12-
opentelemetry_sdk::metrics::reader::DefaultTemporalitySelector::new(),
13-
)
14-
// Build exporter using Delta Temporality Selector.
15-
// .with_temporality_selector(
16-
// opentelemetry_sdk::metrics::reader::DeltaTemporalitySelector::new(),
17-
// )
10+
// Build exporter using Default (Cumulative) Temporality.
11+
.with_temporality(Temporality::default())
12+
// Build exporter using Delta Temporality.
13+
// .with_temporality(Temporality::Delta)
1814
.build();
1915
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
2016
let provider = SdkMeterProvider::builder()

Diff for: opentelemetry-otlp/src/exporter/http/mod.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ use opentelemetry_proto::transform::trace::tonic::group_spans_by_resource_and_sc
1717
use opentelemetry_sdk::export::logs::LogBatch;
1818
#[cfg(feature = "trace")]
1919
use opentelemetry_sdk::export::trace::SpanData;
20-
#[cfg(feature = "metrics")]
21-
use opentelemetry_sdk::metrics::data::ResourceMetrics;
2220
use prost::Message;
2321
use std::collections::HashMap;
2422
use std::env;
@@ -77,9 +75,7 @@ impl Default for HttpConfig {
7775
///
7876
/// ```
7977
/// # #[cfg(feature="metrics")]
80-
/// use opentelemetry_sdk::metrics::reader::{
81-
/// DefaultTemporalitySelector,
82-
/// };
78+
/// use opentelemetry_sdk::metrics::data:Temporality;
8379
///
8480
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
8581
/// // Create a span exporter you can use to when configuring tracer providers
@@ -91,7 +87,7 @@ impl Default for HttpConfig {
9187
/// let metrics_exporter = opentelemetry_otlp::new_exporter()
9288
/// .http()
9389
/// .build_metrics_exporter(
94-
/// Box::new(DefaultTemporalitySelector::new()),
90+
/// Temporality::default(),
9591
/// )?;
9692
///
9793
/// // Create a log exporter you can use when configuring logger providers
@@ -251,7 +247,7 @@ impl HttpExporterBuilder {
251247
#[cfg(feature = "metrics")]
252248
pub fn build_metrics_exporter(
253249
mut self,
254-
temporality_selector: Box<dyn opentelemetry_sdk::metrics::reader::TemporalitySelector>,
250+
temporality: opentelemetry_sdk::metrics::data::Temporality,
255251
) -> opentelemetry::metrics::Result<crate::MetricsExporter> {
256252
use crate::{
257253
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, OTEL_EXPORTER_OTLP_METRICS_HEADERS,
@@ -265,7 +261,7 @@ impl HttpExporterBuilder {
265261
OTEL_EXPORTER_OTLP_METRICS_HEADERS,
266262
)?;
267263

268-
Ok(crate::MetricsExporter::new(client, temporality_selector))
264+
Ok(crate::MetricsExporter::new(client, temporality))
269265
}
270266
}
271267

@@ -341,7 +337,7 @@ impl OtlpHttpClient {
341337
#[cfg(feature = "metrics")]
342338
fn build_metrics_export_body(
343339
&self,
344-
metrics: &mut ResourceMetrics,
340+
metrics: &mut opentelemetry_sdk::metrics::data::ResourceMetrics,
345341
) -> opentelemetry::metrics::Result<(Vec<u8>, &'static str)> {
346342
use opentelemetry_proto::tonic::collector::metrics::v1::ExportMetricsServiceRequest;
347343

Diff for: opentelemetry-otlp/src/exporter/tonic/mod.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,7 @@ fn resolve_compression(
9696
///
9797
/// ```no_run
9898
/// # #[cfg(feature="metrics")]
99-
/// use opentelemetry_sdk::metrics::reader::{
100-
/// DefaultTemporalitySelector,
101-
/// };
99+
/// use opentelemetry_sdk::metrics::data::Temporality;
102100
///
103101
/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
104102
/// // Create a span exporter you can use to when configuring tracer providers
@@ -110,7 +108,7 @@ fn resolve_compression(
110108
/// let metrics_exporter = opentelemetry_otlp::new_exporter()
111109
/// .tonic()
112110
/// .build_metrics_exporter(
113-
/// Box::new(DefaultTemporalitySelector::new()),
111+
/// Temporality::default(),
114112
/// )?;
115113
///
116114
/// // Create a log exporter you can use when configuring logger providers
@@ -331,7 +329,7 @@ impl TonicExporterBuilder {
331329
#[cfg(feature = "metrics")]
332330
pub fn build_metrics_exporter(
333331
self,
334-
temporality_selector: Box<dyn opentelemetry_sdk::metrics::reader::TemporalitySelector>,
332+
temporality: opentelemetry_sdk::metrics::data::Temporality,
335333
) -> opentelemetry::metrics::Result<crate::MetricsExporter> {
336334
use crate::MetricsExporter;
337335
use metrics::TonicMetricsClient;
@@ -345,7 +343,7 @@ impl TonicExporterBuilder {
345343

346344
let client = TonicMetricsClient::new(channel, interceptor, compression);
347345

348-
Ok(MetricsExporter::new(client, temporality_selector))
346+
Ok(MetricsExporter::new(client, temporality))
349347
}
350348

351349
/// Build a new tonic span exporter

Diff for: opentelemetry-otlp/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
//! use opentelemetry::{global, KeyValue, trace::Tracer};
127127
//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource};
128128
//! # #[cfg(feature = "metrics")]
129-
//! use opentelemetry_sdk::metrics::reader::DefaultTemporalitySelector;
129+
//! use opentelemetry_sdk::metrics::data::Temporality;
130130
//! use opentelemetry_otlp::{Protocol, WithExportConfig, ExportConfig};
131131
//! use std::time::Duration;
132132
//! # #[cfg(feature = "grpc-tonic")]
@@ -184,7 +184,7 @@
184184
//! .with_resource(Resource::new(vec![KeyValue::new("service.name", "example")]))
185185
//! .with_period(Duration::from_secs(3))
186186
//! .with_timeout(Duration::from_secs(10))
187-
//! .with_temporality_selector(DefaultTemporalitySelector::new())
187+
//! .with_temporality(Temporality::default())
188188
//! .build();
189189
//! # }
190190
//!

Diff for: opentelemetry-otlp/src/metric.rs

+21-45
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ use opentelemetry_sdk::{
1414
metrics::{
1515
data::{ResourceMetrics, Temporality},
1616
exporter::PushMetricsExporter,
17-
reader::{DefaultTemporalitySelector, DeltaTemporalitySelector, TemporalitySelector},
18-
InstrumentKind, PeriodicReader, SdkMeterProvider,
17+
PeriodicReader, SdkMeterProvider,
1918
},
2019
runtime::Runtime,
2120
Resource,
@@ -47,7 +46,7 @@ impl OtlpPipeline {
4746
{
4847
OtlpMetricPipeline {
4948
rt,
50-
temporality_selector: None,
49+
temporality: None,
5150
exporter_pipeline: NoExporterConfig(()),
5251
resource: None,
5352
period: None,
@@ -75,22 +74,15 @@ pub enum MetricsExporterBuilder {
7574

7675
impl MetricsExporterBuilder {
7776
/// Build a OTLP metrics exporter with given configuration.
78-
pub fn build_metrics_exporter(
79-
self,
80-
temporality_selector: Box<dyn TemporalitySelector>,
81-
) -> Result<MetricsExporter> {
77+
pub fn build_metrics_exporter(self, temporality: Temporality) -> Result<MetricsExporter> {
8278
match self {
8379
#[cfg(feature = "grpc-tonic")]
84-
MetricsExporterBuilder::Tonic(builder) => {
85-
builder.build_metrics_exporter(temporality_selector)
86-
}
80+
MetricsExporterBuilder::Tonic(builder) => builder.build_metrics_exporter(temporality),
8781
#[cfg(feature = "http-proto")]
88-
MetricsExporterBuilder::Http(builder) => {
89-
builder.build_metrics_exporter(temporality_selector)
90-
}
82+
MetricsExporterBuilder::Http(builder) => builder.build_metrics_exporter(temporality),
9183
#[cfg(not(any(feature = "http-proto", feature = "grpc-tonic")))]
9284
MetricsExporterBuilder::Unconfigured => {
93-
drop(temporality_selector);
85+
let _ = temporality;
9486
Err(opentelemetry::metrics::MetricsError::Other(
9587
"no configured metrics exporter, enable `http-proto` or `grpc-tonic` feature to configure a metrics exporter".into(),
9688
))
@@ -119,7 +111,7 @@ impl From<HttpExporterBuilder> for MetricsExporterBuilder {
119111
/// runtime.
120112
pub struct OtlpMetricPipeline<RT, EB> {
121113
rt: RT,
122-
temporality_selector: Option<Box<dyn TemporalitySelector>>,
114+
temporality: Option<Temporality>,
123115
exporter_pipeline: EB,
124116
resource: Option<Resource>,
125117
period: Option<time::Duration>,
@@ -154,23 +146,13 @@ where
154146
}
155147
}
156148

157-
/// Build with the given temporality selector
158-
pub fn with_temporality_selector<T: TemporalitySelector + 'static>(self, selector: T) -> Self {
149+
/// Set the [Temporality] of the exporter.
150+
pub fn with_temporality(self, temporality: Temporality) -> Self {
159151
OtlpMetricPipeline {
160-
temporality_selector: Some(Box::new(selector)),
152+
temporality: Some(temporality),
161153
..self
162154
}
163155
}
164-
165-
/// Build with delta temporality selector.
166-
///
167-
/// This temporality selector is equivalent to OTLP Metrics Exporter's
168-
/// `Delta` temporality preference (see [its documentation][exporter-docs]).
169-
///
170-
/// [exporter-docs]: https://github.com/open-telemetry/opentelemetry-specification/blob/a1c13d59bb7d0fb086df2b3e1eaec9df9efef6cc/specification/metrics/sdk_exporters/otlp.md#additional-configuration
171-
pub fn with_delta_temporality(self) -> Self {
172-
self.with_temporality_selector(DeltaTemporalitySelector::new())
173-
}
174156
}
175157

176158
impl<RT> OtlpMetricPipeline<RT, NoExporterConfig>
@@ -185,7 +167,7 @@ where
185167
OtlpMetricPipeline {
186168
exporter_pipeline: pipeline.into(),
187169
rt: self.rt,
188-
temporality_selector: self.temporality_selector,
170+
temporality: self.temporality,
189171
resource: self.resource,
190172
period: self.period,
191173
timeout: self.timeout,
@@ -199,10 +181,9 @@ where
199181
{
200182
/// Build MeterProvider
201183
pub fn build(self) -> Result<SdkMeterProvider> {
202-
let exporter = self.exporter_pipeline.build_metrics_exporter(
203-
self.temporality_selector
204-
.unwrap_or_else(|| Box::new(DefaultTemporalitySelector::new())),
205-
)?;
184+
let exporter = self
185+
.exporter_pipeline
186+
.build_metrics_exporter(self.temporality.unwrap_or_default())?;
206187

207188
let mut builder = PeriodicReader::builder(exporter, self.rt);
208189

@@ -247,7 +228,7 @@ pub trait MetricsClient: fmt::Debug + Send + Sync + 'static {
247228
/// Export metrics in OTEL format.
248229
pub struct MetricsExporter {
249230
client: Box<dyn MetricsClient>,
250-
temporality_selector: Box<dyn TemporalitySelector>,
231+
temporality: Temporality,
251232
}
252233

253234
impl Debug for MetricsExporter {
@@ -256,12 +237,6 @@ impl Debug for MetricsExporter {
256237
}
257238
}
258239

259-
impl TemporalitySelector for MetricsExporter {
260-
fn temporality(&self, kind: InstrumentKind) -> Temporality {
261-
self.temporality_selector.temporality(kind)
262-
}
263-
}
264-
265240
#[async_trait]
266241
impl PushMetricsExporter for MetricsExporter {
267242
async fn export(&self, metrics: &mut ResourceMetrics) -> Result<()> {
@@ -276,17 +251,18 @@ impl PushMetricsExporter for MetricsExporter {
276251
fn shutdown(&self) -> Result<()> {
277252
self.client.shutdown()
278253
}
254+
255+
fn temporality(&self) -> Temporality {
256+
self.temporality
257+
}
279258
}
280259

281260
impl MetricsExporter {
282261
/// Create a new metrics exporter
283-
pub fn new(
284-
client: impl MetricsClient,
285-
temporality_selector: Box<dyn TemporalitySelector>,
286-
) -> MetricsExporter {
262+
pub fn new(client: impl MetricsClient, temporality: Temporality) -> MetricsExporter {
287263
MetricsExporter {
288264
client: Box::new(client),
289-
temporality_selector,
265+
temporality,
290266
}
291267
}
292268
}

Diff for: opentelemetry-sdk/benches/metric.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use opentelemetry_sdk::{
1010
metrics::{
1111
data::{ResourceMetrics, Temporality},
1212
new_view,
13-
reader::{DeltaTemporalitySelector, MetricReader, TemporalitySelector},
13+
reader::MetricReader,
1414
Aggregation, Instrument, InstrumentKind, ManualReader, Pipeline, SdkMeterProvider, Stream,
1515
View,
1616
},
@@ -20,12 +20,6 @@ use opentelemetry_sdk::{
2020
#[derive(Clone, Debug)]
2121
struct SharedReader(Arc<dyn MetricReader>);
2222

23-
impl TemporalitySelector for SharedReader {
24-
fn temporality(&self, kind: InstrumentKind) -> Temporality {
25-
self.0.temporality(kind)
26-
}
27-
}
28-
2923
impl MetricReader for SharedReader {
3024
fn register_pipeline(&self, pipeline: Weak<Pipeline>) {
3125
self.0.register_pipeline(pipeline)
@@ -42,6 +36,10 @@ impl MetricReader for SharedReader {
4236
fn shutdown(&self) -> Result<()> {
4337
self.0.shutdown()
4438
}
39+
40+
fn temporality(&self, kind: InstrumentKind) -> Temporality {
41+
self.0.temporality(kind)
42+
}
4543
}
4644

4745
// * Summary *
@@ -118,7 +116,7 @@ fn bench_counter(view: Option<Box<dyn View>>, temporality: &str) -> (SharedReade
118116
} else {
119117
SharedReader(Arc::new(
120118
ManualReader::builder()
121-
.with_temporality_selector(DeltaTemporalitySelector::new())
119+
.with_temporality(Temporality::Delta)
122120
.build(),
123121
))
124122
};

Diff for: opentelemetry-sdk/src/metrics/data/temporality.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
/// Defines the window that an aggregation was calculated over.
2-
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2+
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, Hash)]
33
#[non_exhaustive]
44
pub enum Temporality {
55
/// A measurement interval that continues to expand forward in time from a
66
/// starting point.
77
///
88
/// New measurements are added to all previous measurements since a start time.
9+
#[default]
910
Cumulative,
1011

1112
/// A measurement interval that resets each cycle.
1213
///
1314
/// Measurements from one cycle are recorded independently, measurements from
1415
/// other cycles do not affect them.
1516
Delta,
17+
18+
/// Configures Synchronous Counter and Histogram instruments to use
19+
/// Delta aggregation temporality, which allows them to shed memory
20+
/// following a cardinality explosion, thus use less memory.
21+
LowMemory,
1622
}

0 commit comments

Comments
 (0)