Skip to content

Commit 6e31f54

Browse files
committed
Add easier way to add periodicreader to meterprovider
1 parent a81ad24 commit 6e31f54

File tree

6 files changed

+50
-13
lines changed

6 files changed

+50
-13
lines changed

examples/metrics-advanced/src/main.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,12 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
4949
.with_temporality(Temporality::Delta)
5050
.build();
5151

52-
let reader = PeriodicReader::builder(exporter).build();
53-
5452
let resource = Resource::builder()
5553
.with_service_name("metrics-advanced-example")
5654
.build();
5755

5856
let provider = SdkMeterProvider::builder()
59-
.with_reader(reader)
57+
.with_periodic_exporter(exporter)
6058
.with_resource(resource)
6159
.with_view(my_view_rename_and_unit)
6260
.with_view(my_view_drop_attributes)

examples/metrics-basic/src/main.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
1010
// Build exporter using Delta Temporality (Defaults to Temporality::Cumulative)
1111
// .with_temporality(opentelemetry_sdk::metrics::Temporality::Delta)
1212
.build();
13-
let reader = PeriodicReader::builder(exporter).build();
1413
let provider = SdkMeterProvider::builder()
15-
.with_reader(reader)
14+
.with_periodic_exporter(exporter)
1615
.with_resource(
1716
Resource::builder()
1817
.with_service_name("metrics-basic-example")

opentelemetry-otlp/examples/basic-otlp-http/src/main.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,8 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
6161
.with_endpoint("http://localhost:4318/v1/metrics")
6262
.build()?;
6363

64-
let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter).build();
65-
6664
Ok(SdkMeterProvider::builder()
67-
.with_reader(reader)
65+
.with_periodic_exporter(exporter)
6866
.with_resource(RESOURCE.clone())
6967
.build())
7068
}

opentelemetry-otlp/examples/basic-otlp/src/main.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@ fn init_traces() -> Result<sdktrace::TracerProvider, TraceError> {
3333

3434
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricError> {
3535
let exporter = MetricExporter::builder().with_tonic().build()?;
36-
let reader = PeriodicReader::builder(exporter).build();
3736

3837
Ok(SdkMeterProvider::builder()
39-
.with_reader(reader)
38+
.with_periodic_exporter(exporter)
4039
.with_resource(RESOURCE.clone())
4140
.build())
4241
}

opentelemetry-sdk/CHANGELOG.md

+19
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,25 @@ let processor = BatchLogProcessor::builder(exporter)
337337
.build();
338338
```
339339

340+
- Added `with_periodic_exporter` method to `MeterProviderBuilder`, allowing
341+
users to easily attach an exporter with a PeriodicReader for automatic metric
342+
export. Retained with_reader() for advanced use cases where a custom
343+
MetricReader configuration is needed.
344+
Example Usage:
345+
346+
```rust
347+
SdkMeterProvider::builder()
348+
.with_periodic_exporter(exporter)
349+
.build();
350+
```
351+
352+
Using a custom PeriodicReader (advanced use case):
353+
354+
let reader = PeriodicReader::builder(exporter).build();
355+
SdkMeterProvider::builder()
356+
.with_reader(reader)
357+
.build();
358+
340359
## 0.27.1
341360

342361
Released 2024-Nov-27

opentelemetry-sdk/src/metrics/meter_provider.rs

+27-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use crate::{
1919
};
2020

2121
use super::{
22-
meter::SdkMeter, noop::NoopMeter, pipeline::Pipelines, reader::MetricReader, view::View,
22+
exporter::PushMetricExporter, meter::SdkMeter, noop::NoopMeter, pipeline::Pipelines,
23+
reader::MetricReader, view::View, PeriodicReader,
2324
};
2425

2526
/// Handles the creation and coordination of [Meter]s.
@@ -244,14 +245,37 @@ impl MeterProviderBuilder {
244245
}
245246

246247
/// Associates a [MetricReader] with a [MeterProvider].
248+
/// [`with_periodic_exporter`] can be used to add a PeriodicReader which is
249+
/// the most common use case.
247250
///
248-
/// By default, if this option is not used, the [MeterProvider] will perform no
249-
/// operations; no data will be exported without a [MetricReader].
251+
/// A [MeterProvider] will perform no operations without [MetricReader]
252+
/// added.
250253
pub fn with_reader<T: MetricReader>(mut self, reader: T) -> Self {
251254
self.readers.push(Box::new(reader));
252255
self
253256
}
254257

258+
/// Adds a [`PushMetricExporter`] to the [`MeterProvider`] and configures it
259+
/// to export metrics at **fixed** intervals (60 seconds) using a
260+
/// [`PeriodicReader`].
261+
///
262+
/// To customize the export interval, set the
263+
/// **"OTEL_METRIC_EXPORT_INTERVAL"** environment variable (in
264+
/// milliseconds).
265+
///
266+
/// Most users should use this method to attach an exporter. Advanced users
267+
/// who need finer control over the export process can use
268+
/// [`PeriodicReaderBuilder`] to configure a custom reader and attach it
269+
/// using [`with_reader`].
270+
pub fn with_periodic_exporter<T>(mut self, exporter: T) -> Self
271+
where
272+
T: PushMetricExporter,
273+
{
274+
let reader = PeriodicReader::builder(exporter).build();
275+
self.readers.push(Box::new(reader));
276+
self
277+
}
278+
255279
#[cfg(feature = "spec_unstable_metrics_views")]
256280
/// Associates a [View] with a [MeterProvider].
257281
///

0 commit comments

Comments
 (0)