@@ -21,15 +21,26 @@ pub(crate) fn is_under_cardinality_limit(size: usize) -> bool {
2121
2222/// Receives measurements to be aggregated.
2323pub ( crate ) trait Measure < T > : Send + Sync + ' static {
24- fn call ( & self , measurement : T , attrs : & [ KeyValue ] ) ;
24+ fn measure ( & self , measurement : T , attrs : & [ KeyValue ] ) ;
2525}
2626
27- impl < F , T > Measure < T > for F
27+ struct FilteredMeasureInstrument < I > {
28+ instrument : Arc < I > ,
29+ filter : Filter ,
30+ }
31+
32+ impl < I , T > Measure < T > for FilteredMeasureInstrument < I >
2833where
29- F : Fn ( T , & [ KeyValue ] ) + Send + Sync + ' static ,
34+ T : ' static ,
35+ I : Measure < T > ,
3036{
31- fn call ( & self , measurement : T , attrs : & [ KeyValue ] ) {
32- self ( measurement, attrs)
37+ fn measure ( & self , measurement : T , attrs : & [ KeyValue ] ) {
38+ let filtered_attrs: Vec < KeyValue > = attrs
39+ . iter ( )
40+ . filter ( |kv| ( self . filter ) ( kv) )
41+ . cloned ( )
42+ . collect ( ) ;
43+ self . instrument . measure ( measurement, & filtered_attrs) ;
3344 }
3445}
3546
@@ -83,28 +94,24 @@ impl<T: Number> AggregateBuilder<T> {
8394 }
8495 }
8596
86- /// Wraps the passed in measure with an attribute filtering function.
87- fn filter ( & self , f : impl Measure < T > ) -> impl Measure < T > {
88- let filter = self . filter . clone ( ) ;
89- move |n, attrs : & [ KeyValue ] | {
90- if let Some ( filter) = & filter {
91- let filtered_attrs: Vec < KeyValue > =
92- attrs. iter ( ) . filter ( |kv| filter ( kv) ) . cloned ( ) . collect ( ) ;
93- f. call ( n, & filtered_attrs) ;
94- } else {
95- f. call ( n, attrs) ;
96- } ;
97+ fn maybe_filtered_measurement ( & self , instrument : Arc < impl Measure < T > > ) -> Arc < dyn Measure < T > > {
98+ if let Some ( filter) = & self . filter {
99+ Arc :: new ( FilteredMeasureInstrument {
100+ filter : filter. clone ( ) ,
101+ instrument,
102+ } )
103+ } else {
104+ instrument
97105 }
98106 }
99107
100108 /// Builds a last-value aggregate function input and output.
101- pub ( crate ) fn last_value ( & self ) -> ( impl Measure < T > , impl ComputeAggregation ) {
102- let lv_filter = Arc :: new ( LastValue :: new ( ) ) ;
103- let lv_agg = Arc :: clone ( & lv_filter) ;
109+ pub ( crate ) fn last_value ( & self ) -> ( Arc < dyn Measure < T > > , impl ComputeAggregation ) {
110+ let lv_agg = Arc :: new ( LastValue :: new ( ) ) ;
104111 let t = self . temporality ;
105112
106113 (
107- self . filter ( move |n , a : & [ KeyValue ] | lv_filter . measure ( n , a ) ) ,
114+ self . maybe_filtered_measurement ( lv_agg . clone ( ) ) ,
108115 move |dest : Option < & mut dyn Aggregation > | {
109116 let g = dest. and_then ( |d| d. as_mut ( ) . downcast_mut :: < Gauge < T > > ( ) ) ;
110117 let mut new_agg = if g. is_none ( ) {
@@ -132,13 +139,12 @@ impl<T: Number> AggregateBuilder<T> {
132139 pub ( crate ) fn precomputed_sum (
133140 & self ,
134141 monotonic : bool ,
135- ) -> ( impl Measure < T > , impl ComputeAggregation ) {
136- let s = Arc :: new ( PrecomputedSum :: new ( monotonic) ) ;
137- let agg_sum = Arc :: clone ( & s) ;
142+ ) -> ( Arc < dyn Measure < T > > , impl ComputeAggregation ) {
143+ let agg_sum = Arc :: new ( PrecomputedSum :: new ( monotonic) ) ;
138144 let t = self . temporality ;
139145
140146 (
141- self . filter ( move |n , a : & [ KeyValue ] | s . measure ( n , a ) ) ,
147+ self . maybe_filtered_measurement ( agg_sum . clone ( ) ) ,
142148 move |dest : Option < & mut dyn Aggregation > | match t {
143149 Some ( Temporality :: Delta ) => agg_sum. delta ( dest) ,
144150 _ => agg_sum. cumulative ( dest) ,
@@ -147,13 +153,12 @@ impl<T: Number> AggregateBuilder<T> {
147153 }
148154
149155 /// Builds a sum aggregate function input and output.
150- pub ( crate ) fn sum ( & self , monotonic : bool ) -> ( impl Measure < T > , impl ComputeAggregation ) {
151- let s = Arc :: new ( Sum :: new ( monotonic) ) ;
152- let agg_sum = Arc :: clone ( & s) ;
156+ pub ( crate ) fn sum ( & self , monotonic : bool ) -> ( Arc < dyn Measure < T > > , impl ComputeAggregation ) {
157+ let agg_sum = Arc :: new ( Sum :: new ( monotonic) ) ;
153158 let t = self . temporality ;
154159
155160 (
156- self . filter ( move |n , a : & [ KeyValue ] | s . measure ( n , a ) ) ,
161+ self . maybe_filtered_measurement ( agg_sum . clone ( ) ) ,
157162 move |dest : Option < & mut dyn Aggregation > | match t {
158163 Some ( Temporality :: Delta ) => agg_sum. delta ( dest) ,
159164 _ => agg_sum. cumulative ( dest) ,
@@ -167,13 +172,12 @@ impl<T: Number> AggregateBuilder<T> {
167172 boundaries : Vec < f64 > ,
168173 record_min_max : bool ,
169174 record_sum : bool ,
170- ) -> ( impl Measure < T > , impl ComputeAggregation ) {
171- let h = Arc :: new ( Histogram :: new ( boundaries, record_min_max, record_sum) ) ;
172- let agg_h = Arc :: clone ( & h) ;
175+ ) -> ( Arc < dyn Measure < T > > , impl ComputeAggregation ) {
176+ let agg_h = Arc :: new ( Histogram :: new ( boundaries, record_min_max, record_sum) ) ;
173177 let t = self . temporality ;
174178
175179 (
176- self . filter ( move |n , a : & [ KeyValue ] | h . measure ( n , a ) ) ,
180+ self . maybe_filtered_measurement ( agg_h . clone ( ) ) ,
177181 move |dest : Option < & mut dyn Aggregation > | match t {
178182 Some ( Temporality :: Delta ) => agg_h. delta ( dest) ,
179183 _ => agg_h. cumulative ( dest) ,
@@ -188,18 +192,17 @@ impl<T: Number> AggregateBuilder<T> {
188192 max_scale : i8 ,
189193 record_min_max : bool ,
190194 record_sum : bool ,
191- ) -> ( impl Measure < T > , impl ComputeAggregation ) {
192- let h = Arc :: new ( ExpoHistogram :: new (
195+ ) -> ( Arc < dyn Measure < T > > , impl ComputeAggregation ) {
196+ let agg_h = Arc :: new ( ExpoHistogram :: new (
193197 max_size,
194198 max_scale,
195199 record_min_max,
196200 record_sum,
197201 ) ) ;
198- let agg_h = Arc :: clone ( & h) ;
199202 let t = self . temporality ;
200203
201204 (
202- self . filter ( move |n , a : & [ KeyValue ] | h . measure ( n , a ) ) ,
205+ self . maybe_filtered_measurement ( agg_h . clone ( ) ) ,
203206 move |dest : Option < & mut dyn Aggregation > | match t {
204207 Some ( Temporality :: Delta ) => agg_h. delta ( dest) ,
205208 _ => agg_h. cumulative ( dest) ,
@@ -231,7 +234,7 @@ mod tests {
231234 } ] ,
232235 } ;
233236 let new_attributes = [ KeyValue :: new ( "b" , 2 ) ] ;
234- measure. call ( 2 , & new_attributes[ ..] ) ;
237+ measure. measure ( 2 , & new_attributes[ ..] ) ;
235238
236239 let ( count, new_agg) = agg. call ( Some ( & mut a) ) ;
237240
@@ -272,7 +275,7 @@ mod tests {
272275 is_monotonic : false ,
273276 } ;
274277 let new_attributes = [ KeyValue :: new ( "b" , 2 ) ] ;
275- measure. call ( 3 , & new_attributes[ ..] ) ;
278+ measure. measure ( 3 , & new_attributes[ ..] ) ;
276279
277280 let ( count, new_agg) = agg. call ( Some ( & mut a) ) ;
278281
@@ -315,7 +318,7 @@ mod tests {
315318 is_monotonic : false ,
316319 } ;
317320 let new_attributes = [ KeyValue :: new ( "b" , 2 ) ] ;
318- measure. call ( 3 , & new_attributes[ ..] ) ;
321+ measure. measure ( 3 , & new_attributes[ ..] ) ;
319322
320323 let ( count, new_agg) = agg. call ( Some ( & mut a) ) ;
321324
@@ -354,7 +357,7 @@ mod tests {
354357 } ,
355358 } ;
356359 let new_attributes = [ KeyValue :: new ( "b" , 2 ) ] ;
357- measure. call ( 3 , & new_attributes[ ..] ) ;
360+ measure. measure ( 3 , & new_attributes[ ..] ) ;
358361
359362 let ( count, new_agg) = agg. call ( Some ( & mut a) ) ;
360363
@@ -406,7 +409,7 @@ mod tests {
406409 } ,
407410 } ;
408411 let new_attributes = [ KeyValue :: new ( "b" , 2 ) ] ;
409- measure. call ( 3 , & new_attributes[ ..] ) ;
412+ measure. measure ( 3 , & new_attributes[ ..] ) ;
410413
411414 let ( count, new_agg) = agg. call ( Some ( & mut a) ) ;
412415
0 commit comments