@@ -7,6 +7,10 @@ use vector_core::metrics::AgentDDSketch;
7
7
8
8
use crate :: sinks:: util:: statistic:: DistributionStatistic ;
9
9
10
+ pub ( super ) const DISTRIBUTION_QUANTILES : [ f64 ; 5 ] = [ 0.5 , 0.75 , 0.90 , 0.95 , 0.99 ] ;
11
+ pub ( super ) const DISTRIBUTION_STAT_FIELD_COUNT : usize = 5 ;
12
+ pub ( super ) const SUMMARY_STAT_FIELD_COUNT : usize = 2 ;
13
+
10
14
fn f64_field ( name : & str , value : f64 ) -> Column {
11
15
Column {
12
16
column_name : name. to_owned ( ) ,
@@ -112,9 +116,7 @@ pub(super) fn metric_to_insert_request(metric: Metric) -> InsertRequest {
112
116
}
113
117
114
118
fn encode_distribution ( samples : & [ Sample ] , columns : & mut Vec < Column > ) {
115
- if let Some ( stats) =
116
- DistributionStatistic :: from_samples ( samples, & [ 0.5 , 0.75 , 0.90 , 0.95 , 0.99 ] )
117
- {
119
+ if let Some ( stats) = DistributionStatistic :: from_samples ( samples, & DISTRIBUTION_QUANTILES ) {
118
120
columns. push ( f64_field ( "min" , stats. min ) ) ;
119
121
columns. push ( f64_field ( "max" , stats. max ) ) ;
120
122
columns. push ( f64_field ( "avg" , stats. avg ) ) ;
@@ -159,20 +161,11 @@ fn encode_sketch(sketch: &AgentDDSketch, columns: &mut Vec<Column>) {
159
161
columns. push ( f64_field ( "avg" , avg) ) ;
160
162
}
161
163
162
- if let Some ( quantile) = sketch. quantile ( 0.5 ) {
163
- columns. push ( f64_field ( "p50" , quantile) ) ;
164
- }
165
- if let Some ( quantile) = sketch. quantile ( 0.75 ) {
166
- columns. push ( f64_field ( "p75" , quantile) ) ;
167
- }
168
- if let Some ( quantile) = sketch. quantile ( 0.90 ) {
169
- columns. push ( f64_field ( "p90" , quantile) ) ;
170
- }
171
- if let Some ( quantile) = sketch. quantile ( 0.95 ) {
172
- columns. push ( f64_field ( "p95" , quantile) ) ;
173
- }
174
- if let Some ( quantile) = sketch. quantile ( 0.99 ) {
175
- columns. push ( f64_field ( "p99" , quantile) ) ;
164
+ for q in DISTRIBUTION_QUANTILES {
165
+ if let Some ( quantile) = sketch. quantile ( q) {
166
+ let column_name = format ! ( "p{:02}" , q * 100f64 ) ;
167
+ columns. push ( f64_field ( & column_name, quantile) ) ;
168
+ }
176
169
}
177
170
}
178
171
@@ -265,7 +258,10 @@ mod tests {
265
258
} ,
266
259
) ;
267
260
let insert = metric_to_insert_request ( metric) ;
268
- assert_eq ! ( insert. columns. len( ) , 11 ) ;
261
+ assert_eq ! (
262
+ insert. columns. len( ) ,
263
+ 1 + DISTRIBUTION_STAT_FIELD_COUNT + DISTRIBUTION_QUANTILES . len( )
264
+ ) ;
269
265
270
266
assert_eq ! ( get_column( & insert. columns, "max" ) , 3.0 ) ;
271
267
assert_eq ! ( get_column( & insert. columns, "min" ) , 1.0 ) ;
@@ -281,17 +277,22 @@ mod tests {
281
277
282
278
#[ test]
283
279
fn test_histogram ( ) {
280
+ let buckets = vector_core:: buckets![ 1.0 => 1 , 2.0 => 2 , 3.0 => 1 ] ;
281
+ let buckets_len = buckets. len ( ) ;
284
282
let metric = Metric :: new (
285
283
"cpu_seconds_total" ,
286
284
MetricKind :: Incremental ,
287
285
MetricValue :: AggregatedHistogram {
288
- buckets : vector_core :: buckets! [ 1.0 => 1 , 2.0 => 2 , 3.0 => 1 ] ,
286
+ buckets,
289
287
count : 4 ,
290
288
sum : 8.0 ,
291
289
} ,
292
290
) ;
293
291
let insert = metric_to_insert_request ( metric) ;
294
- assert_eq ! ( insert. columns. len( ) , 6 ) ;
292
+ assert_eq ! (
293
+ insert. columns. len( ) ,
294
+ 1 + SUMMARY_STAT_FIELD_COUNT + buckets_len
295
+ ) ;
295
296
296
297
assert_eq ! ( get_column( & insert. columns, "b1" ) , 1.0 ) ;
297
298
assert_eq ! ( get_column( & insert. columns, "b2" ) , 2.0 ) ;
@@ -302,23 +303,61 @@ mod tests {
302
303
303
304
#[ test]
304
305
fn test_summary ( ) {
306
+ let quantiles = vector_core:: quantiles![ 0.01 => 1.5 , 0.5 => 2.0 , 0.99 => 3.0 ] ;
307
+ let quantiles_len = quantiles. len ( ) ;
305
308
let metric = Metric :: new (
306
309
"cpu_seconds_total" ,
307
310
MetricKind :: Incremental ,
308
311
MetricValue :: AggregatedSummary {
309
- quantiles : vector_core :: quantiles! [ 0.01 => 1.5 , 0.5 => 2.0 , 0.99 => 3.0 ] ,
312
+ quantiles,
310
313
count : 6 ,
311
314
sum : 12.0 ,
312
315
} ,
313
316
) ;
314
317
315
318
let insert = metric_to_insert_request ( metric) ;
316
- assert_eq ! ( insert. columns. len( ) , 6 ) ;
319
+ assert_eq ! (
320
+ insert. columns. len( ) ,
321
+ 1 + SUMMARY_STAT_FIELD_COUNT + quantiles_len
322
+ ) ;
317
323
318
324
assert_eq ! ( get_column( & insert. columns, "p01" ) , 1.5 ) ;
319
325
assert_eq ! ( get_column( & insert. columns, "p50" ) , 2.0 ) ;
320
326
assert_eq ! ( get_column( & insert. columns, "p99" ) , 3.0 ) ;
321
327
assert_eq ! ( get_column( & insert. columns, "count" ) , 6.0 ) ;
322
328
assert_eq ! ( get_column( & insert. columns, "sum" ) , 12.0 ) ;
323
329
}
330
+
331
+ #[ test]
332
+ fn test_sketch ( ) {
333
+ let mut sketch = AgentDDSketch :: with_agent_defaults ( ) ;
334
+ let samples = 10 ;
335
+ for i in 0 ..samples {
336
+ sketch. insert ( i as f64 ) ;
337
+ }
338
+
339
+ let metric = Metric :: new (
340
+ "cpu_seconds_total" ,
341
+ MetricKind :: Incremental ,
342
+ MetricValue :: Sketch {
343
+ sketch : MetricSketch :: AgentDDSketch ( sketch) ,
344
+ } ,
345
+ ) ;
346
+
347
+ let insert = metric_to_insert_request ( metric) ;
348
+ assert_eq ! (
349
+ insert. columns. len( ) ,
350
+ 1 + DISTRIBUTION_QUANTILES . len( ) + DISTRIBUTION_STAT_FIELD_COUNT
351
+ ) ;
352
+
353
+ assert ! ( get_column( & insert. columns, "p50" ) <= 4.0 ) ;
354
+ assert ! ( get_column( & insert. columns, "p95" ) > 8.0 ) ;
355
+ assert ! ( get_column( & insert. columns, "p95" ) <= 9.0 ) ;
356
+ assert ! ( get_column( & insert. columns, "p99" ) > 8.0 ) ;
357
+ assert ! ( get_column( & insert. columns, "p99" ) <= 9.0 ) ;
358
+ assert_eq ! ( get_column( & insert. columns, "count" ) , samples as f64 ) ;
359
+ assert_eq ! ( get_column( & insert. columns, "sum" ) , 45.0 ) ;
360
+ assert_eq ! ( get_column( & insert. columns, "max" ) , 9.0 ) ;
361
+ assert_eq ! ( get_column( & insert. columns, "min" ) , 0.0 ) ;
362
+ }
324
363
}
0 commit comments