Skip to content

Commit 641df96

Browse files
committed
Removed Clone on metric data
1 parent 3692f9b commit 641df96

File tree

2 files changed

+77
-8
lines changed

2 files changed

+77
-8
lines changed

opentelemetry-sdk/src/metrics/data/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::Resource;
99
use super::Temporality;
1010

1111
/// A collection of [ScopeMetrics] and the associated [Resource] that created them.
12-
#[derive(Debug, Clone)]
12+
#[derive(Debug)]
1313
pub struct ResourceMetrics {
1414
/// The entity that collected the metrics.
1515
pub resource: Resource,
@@ -18,7 +18,7 @@ pub struct ResourceMetrics {
1818
}
1919

2020
/// A collection of metrics produced by a meter.
21-
#[derive(Default, Clone, Debug)]
21+
#[derive(Default, Debug)]
2222
pub struct ScopeMetrics {
2323
/// The [InstrumentationScope] that the meter was created with.
2424
pub scope: InstrumentationScope,
@@ -29,7 +29,7 @@ pub struct ScopeMetrics {
2929
/// A collection of one or more aggregated time series from an [Instrument].
3030
///
3131
/// [Instrument]: crate::metrics::Instrument
32-
#[derive(Debug, Clone)]
32+
#[derive(Debug)]
3333
pub struct Metric {
3434
/// The name of the instrument that created this data.
3535
pub name: Cow<'static, str>,
@@ -42,7 +42,7 @@ pub struct Metric {
4242
}
4343

4444
/// Aggregated metrics data from an instrument
45-
#[derive(Debug, Clone)]
45+
#[derive(Debug)]
4646
pub enum AggregatedMetrics {
4747
/// All metric data with `f64` value type
4848
F64(MetricData<f64>),
@@ -53,7 +53,7 @@ pub enum AggregatedMetrics {
5353
}
5454

5555
/// Metric data for all types
56-
#[derive(Debug, Clone)]
56+
#[derive(Debug)]
5757
pub enum MetricData<T> {
5858
/// Metric data for Gauge
5959
Gauge(Gauge<T>),

opentelemetry-sdk/src/metrics/in_memory_exporter.rs

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
use crate::error::{OTelSdkError, OTelSdkResult};
2-
use crate::metrics::data::ResourceMetrics;
2+
use crate::metrics::data::{
3+
ExponentialHistogram, Gauge, Histogram, MetricData, ResourceMetrics, Sum,
4+
};
35
use crate::metrics::exporter::PushMetricExporter;
46
use crate::metrics::Temporality;
57
use crate::InMemoryExporterError;
68
use std::collections::VecDeque;
79
use std::fmt;
810
use std::sync::{Arc, Mutex};
911

12+
use super::data::{AggregatedMetrics, Metric, ScopeMetrics};
13+
1014
/// An in-memory metrics exporter that stores metrics data in memory.
1115
///
1216
/// This exporter is useful for testing and debugging purposes. It stores
@@ -145,7 +149,7 @@ impl InMemoryMetricExporter {
145149
let metrics = self
146150
.metrics
147151
.lock()
148-
.map(|metrics_guard| metrics_guard.iter().cloned().collect())
152+
.map(|metrics_guard| metrics_guard.iter().map(Self::clone_metrics).collect())
149153
.map_err(InMemoryExporterError::from)?;
150154
Ok(metrics)
151155
}
@@ -166,13 +170,78 @@ impl InMemoryMetricExporter {
166170
.lock()
167171
.map(|mut metrics_guard| metrics_guard.clear());
168172
}
173+
174+
fn clone_metrics(metric: &ResourceMetrics) -> ResourceMetrics {
175+
ResourceMetrics {
176+
resource: metric.resource.clone(),
177+
scope_metrics: metric
178+
.scope_metrics
179+
.iter()
180+
.map(|scope_metric| ScopeMetrics {
181+
scope: scope_metric.scope.clone(),
182+
metrics: scope_metric
183+
.metrics
184+
.iter()
185+
.map(|metric| Metric {
186+
name: metric.name.clone(),
187+
description: metric.description.clone(),
188+
unit: metric.unit.clone(),
189+
data: Self::clone_data(&metric.data),
190+
})
191+
.collect(),
192+
})
193+
.collect(),
194+
}
195+
}
196+
197+
fn clone_data(data: &AggregatedMetrics) -> AggregatedMetrics {
198+
fn clone_inner<T: Clone>(data: &MetricData<T>) -> MetricData<T> {
199+
match data {
200+
MetricData::Gauge(gauge) => Gauge {
201+
data_points: gauge.data_points.clone(),
202+
start_time: gauge.start_time,
203+
time: gauge.time,
204+
}
205+
.into(),
206+
MetricData::Sum(sum) => Sum {
207+
data_points: sum.data_points.clone(),
208+
start_time: sum.start_time,
209+
time: sum.time,
210+
temporality: sum.temporality,
211+
is_monotonic: sum.is_monotonic,
212+
}
213+
.into(),
214+
MetricData::Histogram(histogram) => Histogram {
215+
data_points: histogram.data_points.clone(),
216+
start_time: histogram.start_time,
217+
time: histogram.time,
218+
temporality: histogram.temporality,
219+
}
220+
.into(),
221+
MetricData::ExponentialHistogram(exponential_histogram) => ExponentialHistogram {
222+
data_points: exponential_histogram.data_points.clone(),
223+
start_time: exponential_histogram.start_time,
224+
time: exponential_histogram.time,
225+
temporality: exponential_histogram.temporality,
226+
}
227+
.into(),
228+
}
229+
}
230+
match data {
231+
AggregatedMetrics::F64(metric_data) => AggregatedMetrics::F64(clone_inner(metric_data)),
232+
AggregatedMetrics::U64(metric_data) => AggregatedMetrics::U64(clone_inner(metric_data)),
233+
AggregatedMetrics::I64(metric_data) => AggregatedMetrics::I64(clone_inner(metric_data)),
234+
}
235+
}
169236
}
170237

171238
impl PushMetricExporter for InMemoryMetricExporter {
172239
async fn export(&self, metrics: &mut ResourceMetrics) -> OTelSdkResult {
173240
self.metrics
174241
.lock()
175-
.map(|mut metrics_guard| metrics_guard.push_back(metrics.clone()))
242+
.map(|mut metrics_guard| {
243+
metrics_guard.push_back(InMemoryMetricExporter::clone_metrics(metrics))
244+
})
176245
.map_err(|_| OTelSdkError::InternalFailure("Failed to lock metrics".to_string()))
177246
}
178247

0 commit comments

Comments
 (0)