@@ -53,6 +53,8 @@ impl From<MetricType> for openmetrics_data_model::MetricType {
5353 MetricType :: Counter => openmetrics_data_model:: MetricType :: Counter ,
5454 MetricType :: Gauge => openmetrics_data_model:: MetricType :: Gauge ,
5555 MetricType :: Histogram => openmetrics_data_model:: MetricType :: Histogram ,
56+ #[ cfg( feature = "summary" ) ]
57+ MetricType :: Summary => openmetrics_data_model:: MetricType :: Summary ,
5658 MetricType :: Info => openmetrics_data_model:: MetricType :: Info ,
5759 MetricType :: Unknown => openmetrics_data_model:: MetricType :: Unknown ,
5860 }
@@ -288,6 +290,42 @@ impl MetricEncoder<'_> {
288290
289291 Ok ( ( ) )
290292 }
293+
294+ #[ cfg( feature = "summary" ) ]
295+ pub fn encode_summary < S : EncodeLabelSet > (
296+ & mut self ,
297+ sum : f64 ,
298+ count : u64 ,
299+ quantiles : & [ ( f64 , f64 ) ] ,
300+ ) -> Result < ( ) , std:: fmt:: Error > {
301+ let quantile = quantiles
302+ . iter ( )
303+ . enumerate ( )
304+ . map ( |( _, ( quantile, value) ) | {
305+ Ok ( openmetrics_data_model:: summary_value:: Quantile {
306+ quantile : * quantile,
307+ value : * value,
308+ } )
309+ } )
310+ . collect :: < Result < Vec < _ > , std:: fmt:: Error > > ( ) ?;
311+
312+ self . family . push ( openmetrics_data_model:: Metric {
313+ labels : self . labels . clone ( ) ,
314+ metric_points : vec ! [ openmetrics_data_model:: MetricPoint {
315+ value: Some ( openmetrics_data_model:: metric_point:: Value :: SummaryValue (
316+ openmetrics_data_model:: SummaryValue {
317+ count,
318+ created: None ,
319+ quantile,
320+ sum: Some ( openmetrics_data_model:: summary_value:: Sum :: DoubleValue ( sum) ) ,
321+ } ,
322+ ) ) ,
323+ ..Default :: default ( )
324+ } ] ,
325+ } ) ;
326+
327+ Ok ( ( ) )
328+ }
291329}
292330
293331impl < S : EncodeLabelSet , V : EncodeExemplarValue > TryFrom < & Exemplar < S , V > >
@@ -817,6 +855,45 @@ mod tests {
817855 }
818856 }
819857
858+ #[ cfg( feature = "summary" ) ]
859+ #[ test]
860+ fn encode_summary ( ) {
861+ use crate :: metrics:: summary:: Summary ;
862+
863+ let mut registry = Registry :: default ( ) ;
864+ let summary = Summary :: new ( std:: time:: Duration :: from_secs ( 5 ) , 10 , vec ! [ 0.5 , 0.9 , 0.99 ] , 0.01 ) ;
865+ registry. register ( "my_summary" , "My summary" , summary. clone ( ) ) ;
866+ summary. observe ( 0.10 ) ;
867+ summary. observe ( 0.20 ) ;
868+ summary. observe ( 0.30 ) ;
869+
870+ let metric_set = encode ( & registry) . unwrap ( ) ;
871+
872+ let family = metric_set. metric_families . first ( ) . unwrap ( ) ;
873+ assert_eq ! ( "my_summary" , family. name) ;
874+ assert_eq ! ( "My summary." , family. help) ;
875+
876+ assert_eq ! (
877+ openmetrics_data_model:: MetricType :: Summary as i32 ,
878+ extract_metric_type( & metric_set)
879+ ) ;
880+
881+ match extract_metric_point_value ( & metric_set) {
882+ openmetrics_data_model:: metric_point:: Value :: SummaryValue ( value) => {
883+ assert_eq ! (
884+ "Some(DoubleValue(0.6000000000000001))" ,
885+ format!( "{:?}" , value. sum) ,
886+ ) ;
887+ assert_eq ! ( 3 , value. count) ;
888+ assert_eq ! (
889+ "[Quantile { quantile: 0.5, value: 0.2 }, Quantile { quantile: 0.9, value: 0.3 }, Quantile { quantile: 0.99, value: 0.3 }]" ,
890+ format!( "{:?}" , value. quantile) ,
891+ ) ;
892+ }
893+ _ => panic ! ( "wrong value type" ) ,
894+ }
895+ }
896+
820897 #[ test]
821898 fn encode_family_counter_histogram ( ) {
822899 let mut registry = Registry :: default ( ) ;
0 commit comments