Skip to content

Commit bf6fdce

Browse files
committed
Minor fixes to PeriodicReader and examples
1 parent 238a8f2 commit bf6fdce

File tree

4 files changed

+29
-28
lines changed

4 files changed

+29
-28
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ publish = false
77

88
[dependencies]
99
once_cell = { workspace = true }
10-
opentelemetry = { path = "../../../opentelemetry", features = ["metrics", "logs"] }
11-
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "logs"] }
12-
opentelemetry-otlp = { path = "../../../opentelemetry-otlp", features = ["tonic", "metrics", "logs"] }
10+
opentelemetry = { path = "../../../opentelemetry" }
11+
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio"] }
12+
opentelemetry-otlp = { path = "../../../opentelemetry-otlp" }
1313
opentelemetry-semantic-conventions = { path = "../../../opentelemetry-semantic-conventions" }
1414
tokio = { version = "1.0", features = ["full"] }
1515
opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing", default-features = false}

opentelemetry-otlp/examples/basic-otlp/README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,16 @@ The example employs a `BatchExporter` for logs and traces, which is the
1414
recommended approach when using OTLP exporters. While it can be modified to use
1515
a `SimpleExporter`, this requires the main method to be a `tokio::main` function
1616
since the `tonic` client requires a Tokio runtime. If you prefer not to use
17-
`tokio::main`, then the `init_logs`, `init_traces`, and `init_metrics` functions
18-
must be executed within a Tokio runtime. Below is an example:
17+
`tokio::main`, then the `init_logs` and `init_traces` functions must be executed
18+
within a Tokio runtime.
19+
20+
This examples uses the default `PeriodicReader` for metrics, which uses own
21+
thread for background processing/exporting. Since the `tonic` client requires a
22+
Tokio runtime, the main method must be a `tokio::main` function. If you prefer not
23+
to use `tokio::main`, then the `init_metrics` function must be executed within a
24+
Tokio runtime.
25+
26+
Below is an example on how to use non `tokio::main`:
1927

2028
```rust
2129
fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
5656

5757
#[tokio::main]
5858
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
59-
let tracer_provider = init_traces()?;
60-
global::set_tracer_provider(tracer_provider.clone());
61-
62-
let meter_provider = init_metrics()?;
63-
global::set_meter_provider(meter_provider.clone());
64-
6559
let logger_provider = init_logs()?;
6660

6761
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
@@ -100,6 +94,12 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
10094
.with(fmt_layer)
10195
.init();
10296

97+
let tracer_provider = init_traces()?;
98+
global::set_tracer_provider(tracer_provider.clone());
99+
100+
let meter_provider = init_metrics()?;
101+
global::set_meter_provider(meter_provider.clone());
102+
103103
let common_scope_attributes = vec![KeyValue::new("scope-key", "scope-value")];
104104
let scope = InstrumentationScope::builder("basic")
105105
.with_version("1.0")

opentelemetry-sdk/src/metrics/periodic_reader.rs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,12 @@ impl PeriodicReader {
175175
let mut remaining_interval = interval;
176176
otel_info!(
177177
name: "PeriodReaderThreadStarted",
178-
interval = interval.as_secs(),
179-
timeout = timeout.as_secs()
178+
interval_in_secs = interval.as_secs(),
179+
timeout_in_secs = timeout.as_secs()
180180
);
181181
loop {
182182
otel_debug!(
183-
name: "PeriodReaderThreadLoopAlive", message = "Next export will happen after interval, unless flush or shutdown is triggered.", interval = remaining_interval.as_millis()
183+
name: "PeriodReaderThreadLoopAlive", message = "Next export will happen after interval, unless flush or shutdown is triggered.", interval_in_millisecs = remaining_interval.as_millis()
184184
);
185185
match message_receiver.recv_timeout(remaining_interval) {
186186
Ok(Message::Flush(response_sender)) => {
@@ -228,22 +228,19 @@ impl PeriodicReader {
228228
Err(mpsc::RecvTimeoutError::Timeout) => {
229229
let export_start = Instant::now();
230230
otel_debug!(
231-
name: "PeriodReaderThreadExportingDueToTimer",
232-
event_name = "PeriodReaderThreadExportingDueToTimer"
231+
name: "PeriodReaderThreadExportingDueToTimer"
233232
);
234233

235234
if let Err(_e) = cloned_reader.collect_and_export(timeout) {
236235
otel_debug!(
237-
name: "PeriodReaderThreadExportingDueToTimerFailed",
238-
event_name = "PeriodReaderThreadExportingDueToTimerFailed"
236+
name: "PeriodReaderThreadExportingDueToTimerFailed"
239237
);
240238
}
241239

242240
let time_taken_for_export = export_start.elapsed();
243241
if time_taken_for_export > interval {
244242
otel_debug!(
245-
name: "PeriodReaderThreadExportTookLongerThanInterval",
246-
event_name = "PeriodReaderThreadExportTookLongerThanInterval"
243+
name: "PeriodReaderThreadExportTookLongerThanInterval"
247244
);
248245
// if export took longer than interval, do the
249246
// next export immediately.
@@ -265,8 +262,7 @@ impl PeriodicReader {
265262
}
266263
}
267264
otel_info!(
268-
name: "PeriodReaderThreadStopped",
269-
event_name = "PeriodReaderThreadStopped"
265+
name: "PeriodReaderThreadStopped"
270266
);
271267
});
272268

@@ -275,7 +271,6 @@ impl PeriodicReader {
275271
if let Err(e) = result_thread_creation {
276272
otel_error!(
277273
name: "PeriodReaderThreadStartError",
278-
event_name = "PeriodReaderThreadStartError",
279274
error = format!("{:?}", e)
280275
);
281276
}
@@ -339,7 +334,6 @@ impl PeriodicReaderInner {
339334
if let Err(e) = collect_result {
340335
otel_warn!(
341336
name: "PeriodReaderCollectError",
342-
event_name = "PeriodReaderCollectError",
343337
error = format!("{:?}", e)
344338
);
345339
return Err(e);
@@ -350,6 +344,8 @@ impl PeriodicReaderInner {
350344
return Ok(());
351345
}
352346

347+
otel_debug!(name: "PeriodicReaderMetricsCollected", count = rm.scope_metrics.len());
348+
353349
// TODO: substract the time taken for collect from the timeout. collect
354350
// involves observable callbacks too, which are user defined and can
355351
// take arbitrary time.
@@ -362,7 +358,6 @@ impl PeriodicReaderInner {
362358
if let Err(e) = exporter_result {
363359
otel_warn!(
364360
name: "PeriodReaderExportError",
365-
event_name = "PeriodReaderExportError",
366361
error = format!("{:?}", e)
367362
);
368363
return Err(e);
@@ -385,7 +380,6 @@ impl PeriodicReaderInner {
385380
Err(e) => {
386381
otel_debug!(
387382
name: "PeriodReaderForceFlushError",
388-
event_name = "PeriodReaderForceFlushError",
389383
error = format!("{:?}", e)
390384
);
391385
return Err(MetricError::Other(e.to_string()));
@@ -420,7 +414,6 @@ impl PeriodicReaderInner {
420414
Err(e) => {
421415
otel_debug!(
422416
name: "PeriodReaderShutdownError",
423-
event_name = "PeriodReaderShutdownError",
424417
error = format!("{:?}", e)
425418
);
426419
return Err(MetricError::Other(e.to_string()));
@@ -504,7 +497,7 @@ mod tests {
504497
};
505498

506499
// use below command to run all tests
507-
// cargo test metrics::periodic_reader_with_own_thread::tests --features=testing,experimental_metrics_periodic_reader_no_runtime -- --nocapture
500+
// cargo test metrics::periodic_reader::tests --features=testing,spec_unstable_metrics_views -- --nocapture
508501

509502
#[derive(Debug, Clone)]
510503
struct MetricExporterThatFailsOnlyOnFirst {

0 commit comments

Comments
 (0)