Skip to content

Commit 56682a4

Browse files
committed
fix
1 parent 115e73f commit 56682a4

File tree

3 files changed

+51
-22
lines changed

3 files changed

+51
-22
lines changed

opentelemetry-sdk/src/metrics/manual_reader.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,11 @@ impl MetricReader for ManualReader {
7676
// Only register once. If producer is already set, do nothing.
7777
if inner.sdk_producer.is_none() {
7878
inner.sdk_producer = Some(pipeline);
79-
} else {
80-
otel_debug!(name: "ManualReader.RegisterPipeline.DuplicateRegistration");
79+
} else {
80+
otel_debug!(
81+
name: "ManualReader.RegisterPipeline.DuplicateRegistration",
82+
error = "The pipeline is already registered to the Reader. Registering pipeline multiple times is not allowed."
83+
);
8184
}
8285
});
8386
}

opentelemetry-sdk/src/metrics/periodic_reader.rs

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use futures_util::{
1414
use opentelemetry::{
1515
global,
1616
metrics::{MetricsError, Result},
17-
otel_error,
17+
otel_debug, otel_error,
1818
};
1919

2020
use crate::runtime::Runtime;
@@ -245,36 +245,56 @@ impl<RT: Runtime> PeriodicReaderWorker<RT> {
245245
Either::Left((res, _)) => {
246246
res // return the status of export.
247247
}
248-
Either::Right(_) => {
249-
otel_error!(
250-
name: "collect_and_export",
251-
status = "timed_out"
252-
);
253-
Err(MetricsError::Other("export timed out".into()))
254-
}
248+
Either::Right(_) => Err(MetricsError::ExportTimeout(
249+
"PeriodicReader".into(),
250+
self.timeout.as_nanos(),
251+
)
252+
.into()),
255253
}
256254
}
257255

258256
async fn process_message(&mut self, message: Message) -> bool {
259257
match message {
260258
Message::Export => {
261259
if let Err(err) = self.collect_and_export().await {
262-
global::handle_error(err)
260+
match err {
261+
MetricsError::ExportTimeout(_, _) => {
262+
otel_error!( name: "PeriodicReader.ExportFailed", error = format!("{:?}", err));
263+
}
264+
MetricsError::ReaderShutdown => {
265+
otel_debug!( name: "PeriodicReader.ReaderShutdown", error = format!("{:?}", err));
266+
}
267+
MetricsError::ReaderNotRegistered => {
268+
otel_debug!( name: "PeriodicReader.ReaderNotRegistered", error = format!("{:?}", err));
269+
}
270+
_ => {
271+
// TBD: This includes errors from both collection and export. Need to be made more specific
272+
// and identify the levels to log them.
273+
otel_error!( name: "PeriodicReader.ExportFailed", error = format!("{:?}", err));
274+
}
275+
}
263276
}
264277
}
265278
Message::Flush(ch) => {
266279
let res = self.collect_and_export().await;
267-
if ch.send(res).is_err() {
268-
global::handle_error(MetricsError::Other("flush channel closed".into()))
280+
if let Err(send_error) = ch.send(res) {
281+
otel_debug!(
282+
name: "PeriodicReader.Flush.SendResultError",
283+
error = format!("{:?}", send_error),
284+
);
269285
}
270286
}
271287
Message::Shutdown(ch) => {
272288
let res = self.collect_and_export().await;
273289
let _ = self.reader.exporter.shutdown();
274-
if ch.send(res).is_err() {
275-
global::handle_error(MetricsError::Other("shutdown channel closed".into()))
290+
if let Err(send_error) = ch.send(res) {
291+
otel_debug!(
292+
name: "PeriodicReader.Flush.SendResultError",
293+
error = format!("{:?}", send_error),
294+
);
295+
//Return false to break the loop and shutdown the worker.
296+
return false;
276297
}
277-
return false;
278298
}
279299
}
280300

@@ -300,9 +320,7 @@ impl MetricReader for PeriodicReader {
300320
let worker = match &mut inner.sdk_producer_or_worker {
301321
ProducerOrWorker::Producer(_) => {
302322
// Only register once. If producer is already set, do nothing.
303-
global::handle_error(MetricsError::Other(
304-
"duplicate meter registration, did not register manual reader".into(),
305-
));
323+
otel_debug!(name: "PeriodicReader.RegisterPipeline.DuplicateRegistration");
306324
return;
307325
}
308326
ProducerOrWorker::Worker(w) => mem::replace(w, Box::new(|_| {})),
@@ -315,7 +333,7 @@ impl MetricReader for PeriodicReader {
315333
fn collect(&self, rm: &mut ResourceMetrics) -> Result<()> {
316334
let inner = self.inner.lock()?;
317335
if inner.is_shutdown {
318-
return Err(MetricsError::Other("reader is shut down".into()));
336+
return Err(MetricsError::ReaderShutdown);
319337
}
320338

321339
if let Some(producer) = match &inner.sdk_producer_or_worker {
@@ -324,7 +342,7 @@ impl MetricReader for PeriodicReader {
324342
} {
325343
producer.produce(rm)?;
326344
} else {
327-
return Err(MetricsError::Other("reader is not registered".into()));
345+
return Err(MetricsError::ReaderNotRegistered);
328346
}
329347

330348
Ok(())

opentelemetry/src/metrics/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! # OpenTelemetry Metrics API
2-
32
use std::hash::{Hash, Hasher};
43
use std::result;
54
use std::sync::Arc;
@@ -34,9 +33,18 @@ pub enum MetricsError {
3433
/// Invalid configuration
3534
#[error("Config error {0}")]
3635
Config(String),
36+
/// Timeout
37+
#[error("Metrics reader {0} failed with timeout. Max configured timeout: {1} ns")]
38+
ExportTimeout(String, u128),
3739
/// Fail to export metrics
3840
#[error("Metrics exporter {} failed with {0}", .0.exporter_name())]
3941
ExportErr(Box<dyn ExportError>),
42+
/// Metrics Reader shutdown
43+
#[error("Metrics reader is shutdown")]
44+
ReaderShutdown,
45+
/// Metrics reader is not registered
46+
#[error("Metrics reader is not registered")]
47+
ReaderNotRegistered,
4048
/// Invalid instrument configuration such invalid instrument name, invalid instrument description, invalid instrument unit, etc.
4149
/// See [spec](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#general-characteristics)
4250
/// for full list of requirements.

0 commit comments

Comments
 (0)