Skip to content

Commit b9a422b

Browse files
frailltcijothomas
andauthored
Directly implement ComputeAggregation (#2425)
Co-authored-by: Cijo Thomas <[email protected]> Co-authored-by: Cijo Thomas <[email protected]>
1 parent 551760b commit b9a422b

File tree

7 files changed

+150
-82
lines changed

7 files changed

+150
-82
lines changed

opentelemetry-sdk/src/metrics/internal/aggregate.rs

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,7 @@ impl Default for AggregateTimeInitiator {
100100
/// Builds aggregate functions
101101
pub(crate) struct AggregateBuilder<T> {
102102
/// The temporality used for the returned aggregate functions.
103-
///
104-
/// If this is not provided, a default of cumulative will be used (except for the
105-
/// last-value aggregate function where delta is the only appropriate
106-
/// temporality).
107-
temporality: Option<Temporality>,
103+
temporality: Temporality,
108104

109105
/// The attribute filter the aggregate function will use on the input of
110106
/// measurements.
@@ -116,7 +112,7 @@ pub(crate) struct AggregateBuilder<T> {
116112
type Filter = Arc<dyn Fn(&KeyValue) -> bool + Send + Sync>;
117113

118114
impl<T: Number> AggregateBuilder<T> {
119-
pub(crate) fn new(temporality: Option<Temporality>, filter: Option<Filter>) -> Self {
115+
pub(crate) fn new(temporality: Temporality, filter: Option<Filter>) -> Self {
120116
AggregateBuilder {
121117
temporality,
122118
filter,
@@ -140,16 +136,12 @@ impl<T: Number> AggregateBuilder<T> {
140136

141137
/// Builds a last-value aggregate function input and output.
142138
pub(crate) fn last_value(&self) -> (impl Measure<T>, impl ComputeAggregation) {
143-
let lv = Arc::new(LastValue::new());
139+
let lv = Arc::new(LastValue::new(self.temporality));
144140
let agg_lv = Arc::clone(&lv);
145-
let t = self.temporality;
146141

147142
(
148143
self.filter(move |n, a: &[KeyValue]| lv.measure(n, a)),
149-
move |dest: Option<&mut dyn Aggregation>| match t {
150-
Some(Temporality::Delta) => agg_lv.delta(dest),
151-
_ => agg_lv.cumulative(dest),
152-
},
144+
agg_lv,
153145
)
154146
}
155147

@@ -158,31 +150,23 @@ impl<T: Number> AggregateBuilder<T> {
158150
&self,
159151
monotonic: bool,
160152
) -> (impl Measure<T>, impl ComputeAggregation) {
161-
let s = Arc::new(PrecomputedSum::new(monotonic));
153+
let s = Arc::new(PrecomputedSum::new(self.temporality, monotonic));
162154
let agg_sum = Arc::clone(&s);
163-
let t = self.temporality;
164155

165156
(
166157
self.filter(move |n, a: &[KeyValue]| s.measure(n, a)),
167-
move |dest: Option<&mut dyn Aggregation>| match t {
168-
Some(Temporality::Delta) => agg_sum.delta(dest),
169-
_ => agg_sum.cumulative(dest),
170-
},
158+
agg_sum,
171159
)
172160
}
173161

174162
/// Builds a sum aggregate function input and output.
175163
pub(crate) fn sum(&self, monotonic: bool) -> (impl Measure<T>, impl ComputeAggregation) {
176-
let s = Arc::new(Sum::new(monotonic));
164+
let s = Arc::new(Sum::new(self.temporality, monotonic));
177165
let agg_sum = Arc::clone(&s);
178-
let t = self.temporality;
179166

180167
(
181168
self.filter(move |n, a: &[KeyValue]| s.measure(n, a)),
182-
move |dest: Option<&mut dyn Aggregation>| match t {
183-
Some(Temporality::Delta) => agg_sum.delta(dest),
184-
_ => agg_sum.cumulative(dest),
185-
},
169+
agg_sum,
186170
)
187171
}
188172

@@ -193,17 +177,15 @@ impl<T: Number> AggregateBuilder<T> {
193177
record_min_max: bool,
194178
record_sum: bool,
195179
) -> (impl Measure<T>, impl ComputeAggregation) {
196-
let h = Arc::new(Histogram::new(boundaries, record_min_max, record_sum));
180+
let h = Arc::new(Histogram::new(
181+
self.temporality,
182+
boundaries,
183+
record_min_max,
184+
record_sum,
185+
));
197186
let agg_h = Arc::clone(&h);
198-
let t = self.temporality;
199187

200-
(
201-
self.filter(move |n, a: &[KeyValue]| h.measure(n, a)),
202-
move |dest: Option<&mut dyn Aggregation>| match t {
203-
Some(Temporality::Delta) => agg_h.delta(dest),
204-
_ => agg_h.cumulative(dest),
205-
},
206-
)
188+
(self.filter(move |n, a: &[KeyValue]| h.measure(n, a)), agg_h)
207189
}
208190

209191
/// Builds an exponential histogram aggregate function input and output.
@@ -215,21 +197,15 @@ impl<T: Number> AggregateBuilder<T> {
215197
record_sum: bool,
216198
) -> (impl Measure<T>, impl ComputeAggregation) {
217199
let h = Arc::new(ExpoHistogram::new(
200+
self.temporality,
218201
max_size,
219202
max_scale,
220203
record_min_max,
221204
record_sum,
222205
));
223206
let agg_h = Arc::clone(&h);
224-
let t = self.temporality;
225207

226-
(
227-
self.filter(move |n, a: &[KeyValue]| h.measure(n, a)),
228-
move |dest: Option<&mut dyn Aggregation>| match t {
229-
Some(Temporality::Delta) => agg_h.delta(dest),
230-
_ => agg_h.cumulative(dest),
231-
},
232-
)
208+
(self.filter(move |n, a: &[KeyValue]| h.measure(n, a)), agg_h)
233209
}
234210
}
235211

@@ -245,7 +221,8 @@ mod tests {
245221

246222
#[test]
247223
fn last_value_aggregation() {
248-
let (measure, agg) = AggregateBuilder::<u64>::new(None, None).last_value();
224+
let (measure, agg) =
225+
AggregateBuilder::<u64>::new(Temporality::Cumulative, None).last_value();
249226
let mut a = Gauge {
250227
data_points: vec![GaugeDataPoint {
251228
attributes: vec![KeyValue::new("a", 1)],
@@ -271,7 +248,7 @@ mod tests {
271248
fn precomputed_sum_aggregation() {
272249
for temporality in [Temporality::Delta, Temporality::Cumulative] {
273250
let (measure, agg) =
274-
AggregateBuilder::<u64>::new(Some(temporality), None).precomputed_sum(true);
251+
AggregateBuilder::<u64>::new(temporality, None).precomputed_sum(true);
275252
let mut a = Sum {
276253
data_points: vec![
277254
SumDataPoint {
@@ -312,7 +289,7 @@ mod tests {
312289
#[test]
313290
fn sum_aggregation() {
314291
for temporality in [Temporality::Delta, Temporality::Cumulative] {
315-
let (measure, agg) = AggregateBuilder::<u64>::new(Some(temporality), None).sum(true);
292+
let (measure, agg) = AggregateBuilder::<u64>::new(temporality, None).sum(true);
316293
let mut a = Sum {
317294
data_points: vec![
318295
SumDataPoint {
@@ -353,7 +330,7 @@ mod tests {
353330
#[test]
354331
fn explicit_bucket_histogram_aggregation() {
355332
for temporality in [Temporality::Delta, Temporality::Cumulative] {
356-
let (measure, agg) = AggregateBuilder::<u64>::new(Some(temporality), None)
333+
let (measure, agg) = AggregateBuilder::<u64>::new(temporality, None)
357334
.explicit_bucket_histogram(vec![1.0], true, true);
358335
let mut a = Histogram {
359336
data_points: vec![HistogramDataPoint {
@@ -396,7 +373,7 @@ mod tests {
396373
#[test]
397374
fn exponential_histogram_aggregation() {
398375
for temporality in [Temporality::Delta, Temporality::Cumulative] {
399-
let (measure, agg) = AggregateBuilder::<u64>::new(Some(temporality), None)
376+
let (measure, agg) = AggregateBuilder::<u64>::new(temporality, None)
400377
.exponential_bucket_histogram(4, 20, true, true);
401378
let mut a = ExponentialHistogram {
402379
data_points: vec![ExponentialHistogramDataPoint {

opentelemetry-sdk/src/metrics/internal/exponential_histogram.rs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
use std::{f64::consts::LOG2_E, mem::replace, ops::DerefMut, sync::Mutex};
1+
use std::{
2+
f64::consts::LOG2_E,
3+
mem::replace,
4+
ops::DerefMut,
5+
sync::{Arc, Mutex},
6+
};
27

38
use opentelemetry::{otel_debug, KeyValue};
49
use std::sync::OnceLock;
@@ -8,7 +13,7 @@ use crate::metrics::{
813
Temporality,
914
};
1015

11-
use super::{aggregate::AggregateTimeInitiator, Aggregator, Number, ValueMap};
16+
use super::{aggregate::AggregateTimeInitiator, Aggregator, ComputeAggregation, Number, ValueMap};
1217

1318
pub(crate) const EXPO_MAX_SCALE: i8 = 20;
1419
pub(crate) const EXPO_MIN_SCALE: i8 = -10;
@@ -351,13 +356,15 @@ struct BucketConfig {
351356
pub(crate) struct ExpoHistogram<T: Number> {
352357
value_map: ValueMap<Mutex<ExpoHistogramDataPoint<T>>>,
353358
init_time: AggregateTimeInitiator,
359+
temporality: Temporality,
354360
record_sum: bool,
355361
record_min_max: bool,
356362
}
357363

358364
impl<T: Number> ExpoHistogram<T> {
359365
/// Create a new exponential histogram.
360366
pub(crate) fn new(
367+
temporality: Temporality,
361368
max_size: u32,
362369
max_scale: i8,
363370
record_min_max: bool,
@@ -368,9 +375,10 @@ impl<T: Number> ExpoHistogram<T> {
368375
max_size: max_size as i32,
369376
max_scale,
370377
}),
378+
init_time: AggregateTimeInitiator::default(),
379+
temporality,
371380
record_sum,
372381
record_min_max,
373-
init_time: AggregateTimeInitiator::default(),
374382
}
375383
}
376384

@@ -385,10 +393,7 @@ impl<T: Number> ExpoHistogram<T> {
385393
self.value_map.measure(value, attrs);
386394
}
387395

388-
pub(crate) fn delta(
389-
&self,
390-
dest: Option<&mut dyn Aggregation>,
391-
) -> (usize, Option<Box<dyn Aggregation>>) {
396+
fn delta(&self, dest: Option<&mut dyn Aggregation>) -> (usize, Option<Box<dyn Aggregation>>) {
392397
let time = self.init_time.delta();
393398

394399
let h = dest.and_then(|d| d.as_mut().downcast_mut::<data::ExponentialHistogram<T>>());
@@ -442,7 +447,7 @@ impl<T: Number> ExpoHistogram<T> {
442447
(h.data_points.len(), new_agg.map(|a| Box::new(a) as Box<_>))
443448
}
444449

445-
pub(crate) fn cumulative(
450+
fn cumulative(
446451
&self,
447452
dest: Option<&mut dyn Aggregation>,
448453
) -> (usize, Option<Box<dyn Aggregation>>) {
@@ -500,6 +505,18 @@ impl<T: Number> ExpoHistogram<T> {
500505
}
501506
}
502507

508+
impl<T> ComputeAggregation for Arc<ExpoHistogram<T>>
509+
where
510+
T: Number,
511+
{
512+
fn call(&self, dest: Option<&mut dyn Aggregation>) -> (usize, Option<Box<dyn Aggregation>>) {
513+
match self.temporality {
514+
Temporality::Delta => self.delta(dest),
515+
_ => self.cumulative(dest),
516+
}
517+
}
518+
}
519+
503520
#[cfg(test)]
504521
mod tests {
505522
use std::{ops::Neg, time::SystemTime};
@@ -665,7 +682,7 @@ mod tests {
665682
];
666683

667684
for test in test_cases {
668-
let h = ExpoHistogram::new(4, 20, true, true);
685+
let h = ExpoHistogram::new(Temporality::Cumulative, 4, 20, true, true);
669686
for v in test.values {
670687
h.measure(v, &[]);
671688
}
@@ -714,7 +731,7 @@ mod tests {
714731
];
715732

716733
for test in test_cases {
717-
let h = ExpoHistogram::new(4, 20, true, true);
734+
let h = ExpoHistogram::new(Temporality::Cumulative, 4, 20, true, true);
718735
for v in test.values {
719736
h.measure(v, &[]);
720737
}
@@ -1241,7 +1258,7 @@ mod tests {
12411258
name: "Delta Single",
12421259
build: Box::new(move || {
12431260
box_val(
1244-
AggregateBuilder::new(Some(Temporality::Delta), None)
1261+
AggregateBuilder::new(Temporality::Delta, None)
12451262
.exponential_bucket_histogram(
12461263
max_size,
12471264
max_scale,
@@ -1284,7 +1301,7 @@ mod tests {
12841301
name: "Cumulative Single",
12851302
build: Box::new(move || {
12861303
box_val(
1287-
internal::AggregateBuilder::new(Some(Temporality::Cumulative), None)
1304+
internal::AggregateBuilder::new(Temporality::Cumulative, None)
12881305
.exponential_bucket_histogram(
12891306
max_size,
12901307
max_scale,
@@ -1327,7 +1344,7 @@ mod tests {
13271344
name: "Delta Multiple",
13281345
build: Box::new(move || {
13291346
box_val(
1330-
internal::AggregateBuilder::new(Some(Temporality::Delta), None)
1347+
internal::AggregateBuilder::new(Temporality::Delta, None)
13311348
.exponential_bucket_histogram(
13321349
max_size,
13331350
max_scale,
@@ -1373,7 +1390,7 @@ mod tests {
13731390
name: "Cumulative Multiple ",
13741391
build: Box::new(move || {
13751392
box_val(
1376-
internal::AggregateBuilder::new(Some(Temporality::Cumulative), None)
1393+
internal::AggregateBuilder::new(Temporality::Cumulative, None)
13771394
.exponential_bucket_histogram(
13781395
max_size,
13791396
max_scale,

0 commit comments

Comments
 (0)