Skip to content

Commit cbc410a

Browse files
committed
Make PeriodicReader with own Thread the default
1 parent 902baa9 commit cbc410a

File tree

11 files changed

+1143
-1104
lines changed

11 files changed

+1143
-1104
lines changed

examples/metrics-advanced/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use opentelemetry::KeyValue;
44
use opentelemetry_sdk::metrics::{
55
Aggregation, Instrument, PeriodicReader, SdkMeterProvider, Stream, Temporality,
66
};
7-
use opentelemetry_sdk::{runtime, Resource};
7+
use opentelemetry_sdk::Resource;
88
use std::error::Error;
99

1010
fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
@@ -49,7 +49,7 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
4949
.with_temporality(Temporality::Delta)
5050
.build();
5151

52-
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
52+
let reader = PeriodicReader::builder(exporter).build();
5353
let provider = SdkMeterProvider::builder()
5454
.with_reader(reader)
5555
.with_resource(Resource::new([KeyValue::new(

examples/metrics-basic/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use opentelemetry::{global, KeyValue};
22
use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider};
3-
use opentelemetry_sdk::{runtime, Resource};
3+
use opentelemetry_sdk::Resource;
44
use std::error::Error;
55
use std::vec;
66

@@ -9,7 +9,7 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
99
// Build exporter using Delta Temporality (Defaults to Temporality::Cumulative)
1010
// .with_temporality(opentelemetry_sdk::metrics::Temporality::Delta)
1111
.build();
12-
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
12+
let reader = PeriodicReader::builder(exporter).build();
1313
let provider = SdkMeterProvider::builder()
1414
.with_reader(reader)
1515
.with_resource(Resource::new([KeyValue::new(

opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ hyper = ["opentelemetry-otlp/hyper-client"]
1414
[dependencies]
1515
once_cell = { workspace = true }
1616
opentelemetry = { path = "../../../opentelemetry" }
17-
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "metrics", "logs"]}
17+
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "metrics", "logs", "experimental_metrics_periodicreader_with_async_runtime"]}
1818
opentelemetry-http = { path = "../../../opentelemetry-http", optional = true, default-features = false}
1919
opentelemetry-otlp = { path = "../..", features = ["http-proto", "http-json", "logs"] , default-features = false}
2020
opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing", default-features = false}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn init_traces() -> Result<sdktrace::TracerProvider, TraceError> {
3535
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricError> {
3636
let exporter = MetricExporter::builder().with_tonic().build()?;
3737

38-
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
38+
let reader = PeriodicReader::builder(exporter).build();
3939

4040
Ok(SdkMeterProvider::builder()
4141
.with_reader(reader)

opentelemetry-sdk/CHANGELOG.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,45 @@
2828
Migration Guidance:
2929
- These methods were intended for log appenders. Keep the clone of the provider handle, instead of depending on above methods.
3030

31+
- *Breaking* - `PeriodicReader` Updates
32+
33+
`PeriodicReader` no longer requires an async runtime by default. Instead, it
34+
now creates its own background thread for execution. This change allows
35+
metrics to be used in environments without async runtimes.
36+
37+
For users who prefer the previous behavior of relying on a specific
38+
`Runtime`, they can do so by enabling the feature flag
39+
**`experimental_metrics_periodicreader_with_async_runtime`**.
40+
41+
Migration Guide:
42+
43+
1. *Default Implementation, requires no async runtime* (**Recommended**) The
44+
new default implementation does not require a runtime argument. Replace the
45+
builder method accordingly:
46+
- *Before:*
47+
```rust
48+
let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter, runtime::Tokio).build();
49+
```
50+
- *After:*
51+
```rust
52+
let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter).build();
53+
```
54+
55+
2. *Async Runtime Support*
56+
If your application cannot spin up new thread or you prefer using async
57+
runtimes, enable the "experimental_metrics_periodicreader_with_async_runtime" feature flag.
58+
59+
- *Code requires no change*
60+
```rust
61+
let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter, runtime::Tokio).build();
62+
```
63+
64+
*Requirements:*
65+
- Enable the feature flag:
66+
`experimental_metrics_periodicreader_with_async_runtime`.
67+
- Continue enabling one of the async runtime feature flags: `rt-tokio`,
68+
`rt-tokio-current-thread`, or `rt-async-std`.
69+
3170
## 0.27.1
3271

3372
Released 2024-Nov-27

opentelemetry-sdk/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ rt-tokio-current-thread = ["tokio", "tokio-stream"]
5353
rt-async-std = ["async-std"]
5454
internal-logs = ["tracing"]
5555
experimental_metrics_periodic_reader_no_runtime = ["metrics"]
56+
experimental_metrics_periodicreader_with_async_runtime = ["metrics"]
5657
spec_unstable_metrics_views = ["metrics"]
5758

5859
[[bench]]

opentelemetry-sdk/src/metrics/mod.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ pub(crate) mod manual_reader;
4949
pub(crate) mod meter;
5050
mod meter_provider;
5151
pub(crate) mod noop;
52+
#[cfg(not(feature = "experimental_metrics_periodicreader_with_async_runtime"))]
5253
pub(crate) mod periodic_reader;
53-
#[cfg(feature = "experimental_metrics_periodic_reader_no_runtime")]
54-
pub(crate) mod periodic_reader_with_own_thread;
54+
#[cfg(feature = "experimental_metrics_periodicreader_with_async_runtime")]
55+
pub(crate) mod periodic_reader_with_async_runtime;
5556
pub(crate) mod pipeline;
5657
pub mod reader;
5758
pub(crate) mod view;
@@ -60,9 +61,10 @@ pub use aggregation::*;
6061
pub use error::{MetricError, MetricResult};
6162
pub use manual_reader::*;
6263
pub use meter_provider::*;
64+
#[cfg(not(feature = "experimental_metrics_periodicreader_with_async_runtime"))]
6365
pub use periodic_reader::*;
64-
#[cfg(feature = "experimental_metrics_periodic_reader_no_runtime")]
65-
pub use periodic_reader_with_own_thread::*;
66+
#[cfg(feature = "experimental_metrics_periodicreader_with_async_runtime")]
67+
pub use periodic_reader_with_async_runtime::*;
6668
pub use pipeline::Pipeline;
6769

6870
pub use instrument::InstrumentKind;
@@ -513,7 +515,7 @@ mod tests {
513515
}
514516

515517
let exporter = InMemoryMetricExporter::default();
516-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
518+
let reader = PeriodicReader::builder(exporter.clone()).build();
517519
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
518520

519521
// Test Meter creation in 2 ways, both with empty string as meter name
@@ -529,7 +531,7 @@ mod tests {
529531
async fn counter_duplicate_instrument_merge() {
530532
// Arrange
531533
let exporter = InMemoryMetricExporter::default();
532-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
534+
let reader = PeriodicReader::builder(exporter.clone()).build();
533535
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
534536

535537
// Act
@@ -580,7 +582,7 @@ mod tests {
580582
async fn counter_duplicate_instrument_different_meter_no_merge() {
581583
// Arrange
582584
let exporter = InMemoryMetricExporter::default();
583-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
585+
let reader = PeriodicReader::builder(exporter.clone()).build();
584586
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
585587

586588
// Act
@@ -669,7 +671,7 @@ mod tests {
669671
async fn instrumentation_scope_identity_test() {
670672
// Arrange
671673
let exporter = InMemoryMetricExporter::default();
672-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
674+
let reader = PeriodicReader::builder(exporter.clone()).build();
673675
let meter_provider = SdkMeterProvider::builder().with_reader(reader).build();
674676

675677
// Act
@@ -753,7 +755,7 @@ mod tests {
753755

754756
// Arrange
755757
let exporter = InMemoryMetricExporter::default();
756-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
758+
let reader = PeriodicReader::builder(exporter.clone()).build();
757759
let criteria = Instrument::new().name("test_histogram");
758760
let stream_invalid_aggregation = Stream::new()
759761
.aggregation(Aggregation::ExplicitBucketHistogram {
@@ -803,7 +805,7 @@ mod tests {
803805

804806
// Arrange
805807
let exporter = InMemoryMetricExporter::default();
806-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
808+
let reader = PeriodicReader::builder(exporter.clone()).build();
807809
let criteria = Instrument::new().name("my_observable_counter");
808810
// View drops all attributes.
809811
let stream_invalid_aggregation = Stream::new().allowed_attribute_keys(vec![]);
@@ -878,7 +880,7 @@ mod tests {
878880

879881
// Arrange
880882
let exporter = InMemoryMetricExporter::default();
881-
let reader = PeriodicReader::builder(exporter.clone(), runtime::Tokio).build();
883+
let reader = PeriodicReader::builder(exporter.clone()).build();
882884
let criteria = Instrument::new().name("my_counter");
883885
// View drops all attributes.
884886
let stream_invalid_aggregation = Stream::new().allowed_attribute_keys(vec![]);

0 commit comments

Comments
 (0)