Skip to content

Commit 760d383

Browse files
committed
inmemory error variant
1 parent 17e873b commit 760d383

File tree

4 files changed

+37
-9
lines changed

4 files changed

+37
-9
lines changed

opentelemetry-sdk/src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,24 @@ pub use resource::Resource;
146146

147147
pub mod error;
148148
pub use error::ExportError;
149+
150+
#[cfg(any(feature = "testing", test))]
151+
#[derive(thiserror::Error, Debug)]
152+
/// Errors that can occur during when returning telemetry from InMemoryLogExporter
153+
pub enum InMemoryExporterError {
154+
/// Operation failed due to an internal error.
155+
///
156+
/// The error message is intended for logging purposes only and should not
157+
/// be used to make programmatic decisions. It is implementation-specific
158+
/// and subject to change without notice. Consumers of this error should not
159+
/// rely on its content beyond logging.
160+
#[error("Unable to obtain telemetry. Reason: {0}")]
161+
InternalFailure(String),
162+
}
163+
164+
#[cfg(any(feature = "testing", test))]
165+
impl<T> From<std::sync::PoisonError<T>> for InMemoryExporterError {
166+
fn from(err: std::sync::PoisonError<T>) -> Self {
167+
InMemoryExporterError::InternalFailure(format!("Mutex poison error: {}", err))
168+
}
169+
}

opentelemetry-sdk/src/logs/in_memory_exporter.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::error::{OTelSdkError, OTelSdkResult};
22
use crate::logs::SdkLogRecord;
33
use crate::logs::{LogBatch, LogExporter};
4+
use crate::InMemoryExporterError;
45
use crate::Resource;
56
use opentelemetry::InstrumentationScope;
67
use std::borrow::Cow;
@@ -155,9 +156,9 @@ impl InMemoryLogExporter {
155156
/// let emitted_logs = exporter.get_emitted_logs().unwrap();
156157
/// ```
157158
///
158-
pub fn get_emitted_logs(&self) -> Result<Vec<LogDataWithResource>, String> {
159-
let logs_guard = self.logs.lock().map_err(|e| e.to_string())?;
160-
let resource_guard = self.resource.lock().map_err(|e| e.to_string())?;
159+
pub fn get_emitted_logs(&self) -> Result<Vec<LogDataWithResource>, InMemoryExporterError> {
160+
let logs_guard = self.logs.lock().map_err(InMemoryExporterError::from)?;
161+
let resource_guard = self.resource.lock().map_err(InMemoryExporterError::from)?;
161162
let logs: Vec<LogDataWithResource> = logs_guard
162163
.iter()
163164
.map(|log_data| LogDataWithResource {

opentelemetry-sdk/src/metrics/in_memory_exporter.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::metrics::data::{self, Gauge, Sum};
33
use crate::metrics::data::{Histogram, Metric, ResourceMetrics, ScopeMetrics};
44
use crate::metrics::exporter::PushMetricExporter;
55
use crate::metrics::Temporality;
6+
use crate::InMemoryExporterError;
67
use std::collections::VecDeque;
78
use std::fmt;
89
use std::sync::{Arc, Mutex};
@@ -141,11 +142,13 @@ impl InMemoryMetricExporter {
141142
/// let exporter = InMemoryMetricExporter::default();
142143
/// let finished_metrics = exporter.get_finished_metrics().unwrap();
143144
/// ```
144-
pub fn get_finished_metrics(&self) -> Result<Vec<ResourceMetrics>, String> {
145-
self.metrics
145+
pub fn get_finished_metrics(&self) -> Result<Vec<ResourceMetrics>, InMemoryExporterError> {
146+
let metrics = self
147+
.metrics
146148
.lock()
147149
.map(|metrics_guard| metrics_guard.iter().map(Self::clone_metrics).collect())
148-
.map_err(|e| e.to_string())
150+
.map_err(InMemoryExporterError::from)?;
151+
Ok(metrics)
149152
}
150153

151154
/// Clears the internal storage of finished metrics.

opentelemetry-sdk/src/trace/in_memory_exporter.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::error::{OTelSdkError, OTelSdkResult};
22
use crate::resource::Resource;
33
use crate::trace::{SpanData, SpanExporter};
4+
use crate::InMemoryExporterError;
45
use std::sync::{Arc, Mutex};
56

67
/// An in-memory span exporter that stores span data in memory.
@@ -103,11 +104,13 @@ impl InMemorySpanExporter {
103104
/// let exporter = InMemorySpanExporter::default();
104105
/// let finished_spans = exporter.get_finished_spans().unwrap();
105106
/// ```
106-
pub fn get_finished_spans(&self) -> Result<Vec<SpanData>, String> {
107-
self.spans
107+
pub fn get_finished_spans(&self) -> Result<Vec<SpanData>, InMemoryExporterError> {
108+
let spans = self
109+
.spans
108110
.lock()
109111
.map(|spans_guard| spans_guard.iter().cloned().collect())
110-
.map_err(|e| e.to_string())
112+
.map_err(InMemoryExporterError::from)?;
113+
Ok(spans)
111114
}
112115

113116
/// Clears the internal storage of finished spans.

0 commit comments

Comments
 (0)