@@ -590,6 +590,113 @@ mod tests {
590
590
) ;
591
591
}
592
592
593
+ // "multi_thread" tokio flavor must be used else flush won't
594
+ // be able to make progress!
595
+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
596
+ #[ ignore = "Bug bug." ]
597
+ async fn delta_memory_efficiency_test ( ) {
598
+ // Run this test with stdout enabled to see output.
599
+ // cargo test delta_memory_efficiency_test --features=metrics,testing -- --nocapture
600
+
601
+ // Arrange
602
+ let exporter = InMemoryMetricsExporterBuilder :: new ( ) . with_temporality_selector ( DeltaTemporalitySelector ( ) ) . build ( ) ;
603
+ let reader = PeriodicReader :: builder ( exporter. clone ( ) , runtime:: Tokio ) . build ( ) ;
604
+ let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
605
+
606
+ // Act
607
+ let meter = meter_provider. meter ( "test" ) ;
608
+ let counter = meter
609
+ . u64_counter ( "my_counter" )
610
+ . with_unit ( Unit :: new ( "my_unit" ) )
611
+ . init ( ) ;
612
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value1" ) ] ) ;
613
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value1" ) ] ) ;
614
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value1" ) ] ) ;
615
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value1" ) ] ) ;
616
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value1" ) ] ) ;
617
+
618
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value2" ) ] ) ;
619
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value2" ) ] ) ;
620
+ counter. add ( 1 , & [ KeyValue :: new ( "key1" , "value2" ) ] ) ;
621
+
622
+ meter_provider. force_flush ( ) . unwrap ( ) ;
623
+
624
+ // Assert
625
+ let resource_metrics = exporter
626
+ . get_finished_metrics ( )
627
+ . expect ( "metrics are expected to be exported." ) ;
628
+ assert ! ( !resource_metrics. is_empty( ) ) ;
629
+ let metric = & resource_metrics[ 0 ] . scope_metrics [ 0 ] . metrics [ 0 ] ;
630
+ assert_eq ! ( metric. name, "my_counter" ) ;
631
+ assert_eq ! ( metric. unit. as_str( ) , "my_unit" ) ;
632
+ let sum = metric
633
+ . data
634
+ . as_any ( )
635
+ . downcast_ref :: < data:: Sum < u64 > > ( )
636
+ . expect ( "Sum aggregation expected for Counter instruments by default" ) ;
637
+
638
+ // Expecting 2 time-series.
639
+ assert_eq ! ( sum. data_points. len( ) , 2 ) ;
640
+ assert ! ( sum. is_monotonic, "Counter should produce monotonic." ) ;
641
+ assert_eq ! (
642
+ sum. temporality,
643
+ data:: Temporality :: Delta ,
644
+ "Should produce Delta as configured"
645
+ ) ;
646
+
647
+ // find and validate key1=value1 datapoint
648
+ let mut data_point1 = None ;
649
+ for datapoint in & sum. data_points {
650
+ if datapoint
651
+ . attributes
652
+ . iter ( )
653
+ . any ( |( k, v) | k. as_str ( ) == "key1" && v. as_str ( ) == "value1" )
654
+ {
655
+ data_point1 = Some ( datapoint) ;
656
+ }
657
+ }
658
+ assert_eq ! (
659
+ data_point1
660
+ . expect( "datapoint with key1=value1 expected" )
661
+ . value,
662
+ 5
663
+ ) ;
664
+
665
+ // find and validate key1=value2 datapoint
666
+ let mut data_point1 = None ;
667
+ for datapoint in & sum. data_points {
668
+ if datapoint
669
+ . attributes
670
+ . iter ( )
671
+ . any ( |( k, v) | k. as_str ( ) == "key1" && v. as_str ( ) == "value2" )
672
+ {
673
+ data_point1 = Some ( datapoint) ;
674
+ }
675
+ }
676
+ assert_eq ! (
677
+ data_point1
678
+ . expect( "datapoint with key1=value2 expected" )
679
+ . value,
680
+ 3
681
+ ) ;
682
+
683
+ // flush again, and validate that nothing is flushed
684
+ // as delta temporality.
685
+ meter_provider. force_flush ( ) . unwrap ( ) ;
686
+ let resource_metrics = exporter
687
+ . get_finished_metrics ( )
688
+ . expect ( "metrics are expected to be exported." ) ;
689
+ println ! ( "resource_metrics: {:?}" , resource_metrics) ;
690
+ assert ! ( resource_metrics. is_empty( ) , "No metrics should be exported as no new measurements were recorded since last collect." ) ;
691
+ }
692
+
693
+ struct DeltaTemporalitySelector ( ) ;
694
+ impl TemporalitySelector for DeltaTemporalitySelector {
695
+ fn temporality ( & self , _kind : InstrumentKind ) -> Temporality {
696
+ Temporality :: Delta
697
+ }
698
+ }
699
+
593
700
struct TestContext {
594
701
exporter : InMemoryMetricsExporter ,
595
702
meter_provider : SdkMeterProvider ,
0 commit comments