@@ -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,40 @@ 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 ( 1.0 ) ;
867+
868+ let metric_set = encode ( & registry) . unwrap ( ) ;
869+
870+ let family = metric_set. metric_families . first ( ) . unwrap ( ) ;
871+ assert_eq ! ( "my_summary" , family. name) ;
872+ assert_eq ! ( "My summary." , family. help) ;
873+
874+ assert_eq ! (
875+ openmetrics_data_model:: MetricType :: Summary as i32 ,
876+ extract_metric_type( & metric_set)
877+ ) ;
878+
879+ match extract_metric_point_value ( & metric_set) {
880+ openmetrics_data_model:: metric_point:: Value :: SummaryValue ( value) => {
881+ assert_eq ! (
882+ Some ( openmetrics_data_model:: summary_value:: Sum :: DoubleValue ( 1.0 ) ) ,
883+ value. sum
884+ ) ;
885+ assert_eq ! ( 1 , value. count) ;
886+ assert_eq ! ( 11 , value. quantile. len( ) ) ;
887+ }
888+ _ => panic ! ( "wrong value type" ) ,
889+ }
890+ }
891+
820892 #[ test]
821893 fn encode_family_counter_histogram ( ) {
822894 let mut registry = Registry :: default ( ) ;
0 commit comments