@@ -99,6 +99,7 @@ impl From<MetricType> for openmetrics_data_model::MetricType {
9999 MetricType :: Counter => openmetrics_data_model:: MetricType :: Counter ,
100100 MetricType :: Gauge => openmetrics_data_model:: MetricType :: Gauge ,
101101 MetricType :: Histogram => openmetrics_data_model:: MetricType :: Histogram ,
102+ MetricType :: Summary => openmetrics_data_model:: MetricType :: Summary ,
102103 MetricType :: Info => openmetrics_data_model:: MetricType :: Info ,
103104 MetricType :: Unknown => openmetrics_data_model:: MetricType :: Unknown ,
104105 }
@@ -247,6 +248,44 @@ impl<'a> MetricEncoder<'a> {
247248
248249 Ok ( ( ) )
249250 }
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+
250289}
251290
252291impl < S : EncodeLabelSet , V : EncodeExemplarValue > TryFrom < & Exemplar < S , V > >
@@ -403,6 +442,7 @@ mod tests {
403442 use crate :: metrics:: family:: Family ;
404443 use crate :: metrics:: gauge:: Gauge ;
405444 use crate :: metrics:: histogram:: { exponential_buckets, Histogram } ;
445+ use crate :: metrics:: summary:: Summary ;
406446 use crate :: metrics:: info:: Info ;
407447 use crate :: registry:: Unit ;
408448 use std:: borrow:: Cow ;
@@ -643,6 +683,39 @@ mod tests {
643683 }
644684 }
645685
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+
646719 #[ test]
647720 fn encode_histogram ( ) {
648721 let mut registry = Registry :: default ( ) ;
0 commit comments