@@ -311,7 +311,7 @@ impl<S: EncodeLabelSet, V: EncodeExemplarValue> TryFrom<&Exemplar<S, V>>
311311
312312 Ok ( openmetrics_data_model:: Exemplar {
313313 value,
314- timestamp : Some ( exemplar. time . into ( ) ) ,
314+ timestamp : exemplar. timestamp . map ( Into :: into ) ,
315315 label : labels,
316316 } )
317317 }
@@ -547,15 +547,7 @@ mod tests {
547547 counter_with_exemplar. clone ( ) ,
548548 ) ;
549549
550- counter_with_exemplar. inc_by ( 1.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 42.0 ) ] ) ) ;
551-
552- counter_with_exemplar
553- . inner
554- . write ( )
555- . exemplar
556- . as_mut ( )
557- . unwrap ( )
558- . time = now;
550+ counter_with_exemplar. inc_by ( 1.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 42.0 ) ] ) , None ) ;
559551
560552 let metric_set = encode ( & registry) . unwrap ( ) ;
561553
@@ -577,7 +569,7 @@ mod tests {
577569 let exemplar = value. exemplar . as_ref ( ) . unwrap ( ) ;
578570 assert_eq ! ( 1.0 , exemplar. value) ;
579571
580- assert_eq ! ( & now_ts , exemplar. timestamp. as_ref ( ) . unwrap ( ) ) ;
572+ assert ! ( exemplar. timestamp. is_none ( ) ) ;
581573
582574 let expected_label = {
583575 openmetrics_data_model:: Label {
@@ -589,6 +581,30 @@ mod tests {
589581 }
590582 _ => panic ! ( "wrong value type" ) ,
591583 }
584+
585+ counter_with_exemplar. inc_by ( 1.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 99.0 ) ] ) , Some ( now) ) ;
586+
587+ match extract_metric_point_value ( & encode ( & registry) . unwrap ( ) ) {
588+ openmetrics_data_model:: metric_point:: Value :: CounterValue ( value) => {
589+ // The counter should be encoded as `DoubleValue`
590+ let expected = openmetrics_data_model:: counter_value:: Total :: DoubleValue ( 2.0 ) ;
591+ assert_eq ! ( Some ( expected) , value. total) ;
592+
593+ let exemplar = value. exemplar . as_ref ( ) . unwrap ( ) ;
594+ assert_eq ! ( 1.0 , exemplar. value) ;
595+
596+ assert_eq ! ( & now_ts, exemplar. timestamp. as_ref( ) . unwrap( ) ) ;
597+
598+ let expected_label = {
599+ openmetrics_data_model:: Label {
600+ name : "user_id" . to_string ( ) ,
601+ value : "99.0" . to_string ( ) ,
602+ }
603+ } ;
604+ assert_eq ! ( vec![ expected_label] , exemplar. label) ;
605+ }
606+ _ => panic ! ( "wrong value type" ) ,
607+ }
592608 }
593609
594610 #[ test]
@@ -806,16 +822,8 @@ mod tests {
806822 let mut registry = Registry :: default ( ) ;
807823 let histogram = HistogramWithExemplars :: new ( exponential_buckets ( 1.0 , 2.0 , 10 ) ) ;
808824 registry. register ( "my_histogram" , "My histogram" , histogram. clone ( ) ) ;
809- histogram. observe ( 1.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 42u64 ) ] ) ) ;
810-
811- histogram
812- . inner
813- . write ( )
814- . exemplars
815- . get_mut ( & 0 )
816- . as_mut ( )
817- . unwrap ( )
818- . time = now;
825+
826+ histogram. observe ( 1.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 42u64 ) ] ) , None ) ;
819827
820828 let metric_set = encode ( & registry) . unwrap ( ) ;
821829
@@ -833,7 +841,7 @@ mod tests {
833841 let exemplar = value. buckets . first ( ) . unwrap ( ) . exemplar . as_ref ( ) . unwrap ( ) ;
834842 assert_eq ! ( 1.0 , exemplar. value) ;
835843
836- assert_eq ! ( & now_ts , exemplar. timestamp. as_ref ( ) . unwrap ( ) ) ;
844+ assert ! ( exemplar. timestamp. is_none ( ) ) ;
837845
838846 let expected_label = {
839847 openmetrics_data_model:: Label {
@@ -845,6 +853,26 @@ mod tests {
845853 }
846854 _ => panic ! ( "wrong value type" ) ,
847855 }
856+
857+ histogram. observe ( 2.0 , Some ( vec ! [ ( "user_id" . to_string( ) , 99u64 ) ] ) , Some ( now) ) ;
858+
859+ match extract_metric_point_value ( & encode ( & registry) . unwrap ( ) ) {
860+ openmetrics_data_model:: metric_point:: Value :: HistogramValue ( value) => {
861+ let exemplar = value. buckets . get ( 1 ) . unwrap ( ) . exemplar . as_ref ( ) . unwrap ( ) ;
862+ assert_eq ! ( 2.0 , exemplar. value) ;
863+
864+ assert_eq ! ( & now_ts, exemplar. timestamp. as_ref( ) . unwrap( ) ) ;
865+
866+ let expected_label = {
867+ openmetrics_data_model:: Label {
868+ name : "user_id" . to_string ( ) ,
869+ value : "99" . to_string ( ) ,
870+ }
871+ } ;
872+ assert_eq ! ( vec![ expected_label] , exemplar. label) ;
873+ }
874+ _ => panic ! ( "wrong value type" ) ,
875+ }
848876 }
849877
850878 #[ test]
0 commit comments