@@ -99,6 +99,7 @@ impl From<MetricType> for openmetrics_data_model::MetricType {
99
99
MetricType :: Counter => openmetrics_data_model:: MetricType :: Counter ,
100
100
MetricType :: Gauge => openmetrics_data_model:: MetricType :: Gauge ,
101
101
MetricType :: Histogram => openmetrics_data_model:: MetricType :: Histogram ,
102
+ MetricType :: Summary => openmetrics_data_model:: MetricType :: Summary ,
102
103
MetricType :: Info => openmetrics_data_model:: MetricType :: Info ,
103
104
MetricType :: Unknown => openmetrics_data_model:: MetricType :: Unknown ,
104
105
}
@@ -247,6 +248,44 @@ impl<'a> MetricEncoder<'a> {
247
248
248
249
Ok ( ( ) )
249
250
}
251
+
252
+ pub fn encode_summary < S : EncodeLabelSet > (
253
+ & mut self ,
254
+ sum : f64 ,
255
+ count : u64 ,
256
+ quantile : & [ ( f64 , f64 ) ] ,
257
+ ) -> Result < ( ) , std:: fmt:: Error > {
258
+ let quantiles = quantiles
259
+ . iter ( )
260
+ . enumerate ( )
261
+ . map ( |( _, ( quantile, value) ) | {
262
+ Ok ( openmetrics_data_model:: summary_value:: Quantile {
263
+ quantile : * quantile,
264
+ value : * value,
265
+ } )
266
+ } )
267
+ . collect :: < Result < Vec < _ > , std:: fmt:: Error > > ( ) ?;
268
+
269
+ self . family . push ( openmetrics_data_model:: Metric {
270
+ labels : self . labels . clone ( ) ,
271
+ metric_points : vec ! [ openmetrics_data_model:: MetricPoint {
272
+ value: Some ( openmetrics_data_model:: metric_point:: Value :: SummaryValue (
273
+ openmetrics_data_model:: SummaryValue {
274
+ count,
275
+ created: None ,
276
+ quantiles,
277
+ sum: Some ( openmetrics_data_model:: summary_value:: Sum :: DoubleValue (
278
+ sum,
279
+ ) ) ,
280
+ } ,
281
+ ) ) ,
282
+ ..Default :: default ( )
283
+ } ] ,
284
+ } ) ;
285
+
286
+ Ok ( ( ) )
287
+ }
288
+
250
289
}
251
290
252
291
impl < S : EncodeLabelSet , V : EncodeExemplarValue > TryFrom < & Exemplar < S , V > >
@@ -403,6 +442,7 @@ mod tests {
403
442
use crate :: metrics:: family:: Family ;
404
443
use crate :: metrics:: gauge:: Gauge ;
405
444
use crate :: metrics:: histogram:: { exponential_buckets, Histogram } ;
445
+ use crate :: metrics:: summary:: Summary ;
406
446
use crate :: metrics:: info:: Info ;
407
447
use crate :: registry:: Unit ;
408
448
use std:: borrow:: Cow ;
@@ -643,6 +683,39 @@ mod tests {
643
683
}
644
684
}
645
685
686
+ #[ test]
687
+ fn encode_summary ( ) {
688
+ let mut registry = Registry :: default ( ) ;
689
+ let summary = Summary :: new ( 5 , 10 , vec ! [ 0.5 , 0.9 , 0.99 ] , 0.01 ) ;
690
+ registry. register ( "my_summary" , "My summary" , summary. clone ( ) ) ;
691
+ summary. observe ( 1.0 ) ;
692
+
693
+ let metric_set = encode ( & registry) . unwrap ( ) ;
694
+
695
+ let family = metric_set. metric_families . first ( ) . unwrap ( ) ;
696
+ assert_eq ! ( "my_summary" , family. name) ;
697
+ assert_eq ! ( "My summary." , family. help) ;
698
+
699
+ assert_eq ! (
700
+ openmetrics_data_model:: MetricType :: Summary as i32 ,
701
+ extract_metric_type( & metric_set)
702
+ ) ;
703
+
704
+ match extract_metric_point_value ( metric_set) {
705
+ openmetrics_data_model:: metric_point:: Value :: SummaryValue ( value) => {
706
+ assert_eq ! (
707
+ Some ( openmetrics_data_model:: summary_value:: Sum :: DoubleValue (
708
+ 1.0
709
+ ) ) ,
710
+ value. sum
711
+ ) ;
712
+ assert_eq ! ( 1 , value. count) ;
713
+ assert_eq ! ( 11 , value. quantile. len( ) ) ;
714
+ }
715
+ _ => panic ! ( "wrong value type" ) ,
716
+ }
717
+ }
718
+
646
719
#[ test]
647
720
fn encode_histogram ( ) {
648
721
let mut registry = Registry :: default ( ) ;
0 commit comments