@@ -22,7 +22,10 @@ use common_util::{define_result, error::GenericError};
22
22
use futures:: { future:: try_join_all, StreamExt } ;
23
23
use log:: { debug, info, trace} ;
24
24
use snafu:: { ensure, Backtrace , ResultExt , Snafu } ;
25
- use table_engine:: { predicate:: PredicateRef , table:: TableId } ;
25
+ use table_engine:: {
26
+ predicate:: PredicateRef ,
27
+ table:: { Metric , ReadMetricsCollector , TableId } ,
28
+ } ;
26
29
27
30
use crate :: {
28
31
row_iter:: {
@@ -83,6 +86,7 @@ define_result!(Error);
83
86
#[ derive( Debug ) ]
84
87
pub struct MergeConfig < ' a > {
85
88
pub request_id : RequestId ,
89
+ pub metrics_collector : Option < ReadMetricsCollector > ,
86
90
/// None for background jobs, such as: compaction
87
91
pub deadline : Option < Instant > ,
88
92
pub space_id : SpaceId ,
@@ -228,6 +232,7 @@ impl<'a> MergeBuilder<'a> {
228
232
self . config . merge_iter_options ,
229
233
self . config . reverse ,
230
234
Metrics :: new ( self . memtables . len ( ) , sst_streams_num, sst_ids) ,
235
+ self . config . metrics_collector ,
231
236
) )
232
237
}
233
238
}
@@ -556,14 +561,15 @@ impl Ord for HeapBufferedStream {
556
561
}
557
562
}
558
563
564
+ /// Metrics for merge iterator.
559
565
pub struct Metrics {
560
566
num_memtables : usize ,
561
567
num_ssts : usize ,
562
568
sst_ids : Vec < FileId > ,
563
- /// Times to fetch rows from one stream.
564
- times_fetch_rows_from_one : usize ,
565
569
/// Total rows collected using fetch_rows_from_one_stream().
566
570
total_rows_fetch_from_one : usize ,
571
+ /// Times to fetch rows from one stream.
572
+ times_fetch_rows_from_one : usize ,
567
573
/// Times to fetch one row from multiple stream.
568
574
times_fetch_row_from_multiple : usize ,
569
575
/// Create time of the metrics.
@@ -591,6 +597,37 @@ impl Metrics {
591
597
scan_count : 0 ,
592
598
}
593
599
}
600
+
601
+ fn collect ( & self , collector : & ReadMetricsCollector ) {
602
+ // TODO: maybe we can define a macro to generate the code.
603
+ collector. collect ( Metric :: counter (
604
+ "num_memtables" . to_string ( ) ,
605
+ self . num_memtables ,
606
+ ) ) ;
607
+
608
+ collector. collect ( Metric :: counter ( "num_ssts" . to_string ( ) , self . num_ssts ) ) ;
609
+ collector. collect ( Metric :: counter (
610
+ "times_fetch_rows_from_one" . to_string ( ) ,
611
+ self . times_fetch_rows_from_one ,
612
+ ) ) ;
613
+ collector. collect ( Metric :: counter (
614
+ "times_rows_fetch_from_one" . to_string ( ) ,
615
+ self . times_fetch_row_from_multiple ,
616
+ ) ) ;
617
+ collector. collect ( Metric :: counter (
618
+ "total_rows_fetch_from_one" . to_string ( ) ,
619
+ self . total_rows_fetch_from_one ,
620
+ ) ) ;
621
+ collector. collect ( Metric :: elapsed (
622
+ "init_duration" . to_string ( ) ,
623
+ self . init_duration ,
624
+ ) ) ;
625
+ collector. collect ( Metric :: elapsed (
626
+ "scan_duration" . to_string ( ) ,
627
+ self . scan_duration ,
628
+ ) ) ;
629
+ collector. collect ( Metric :: counter ( "scan_count" . to_string ( ) , self . scan_count ) ) ;
630
+ }
594
631
}
595
632
596
633
impl fmt:: Debug for Metrics {
@@ -630,6 +667,7 @@ pub struct MergeIterator {
630
667
iter_options : IterOptions ,
631
668
reverse : bool ,
632
669
metrics : Metrics ,
670
+ metrics_collector : Option < ReadMetricsCollector > ,
633
671
}
634
672
635
673
impl MergeIterator {
@@ -643,6 +681,7 @@ impl MergeIterator {
643
681
iter_options : IterOptions ,
644
682
reverse : bool ,
645
683
metrics : Metrics ,
684
+ metrics_collector : Option < ReadMetricsCollector > ,
646
685
) -> Self {
647
686
let heap_cap = streams. len ( ) ;
648
687
let record_batch_builder =
@@ -660,6 +699,7 @@ impl MergeIterator {
660
699
iter_options,
661
700
reverse,
662
701
metrics,
702
+ metrics_collector,
663
703
}
664
704
}
665
705
@@ -855,6 +895,10 @@ impl MergeIterator {
855
895
856
896
impl Drop for MergeIterator {
857
897
fn drop ( & mut self ) {
898
+ if let Some ( collector) = & self . metrics_collector {
899
+ self . metrics . collect ( collector) ;
900
+ }
901
+
858
902
info ! (
859
903
"Merge iterator dropped, table_id:{:?}, request_id:{}, metrics:{:?}, iter_options:{:?}," ,
860
904
self . table_id, self . request_id, self . metrics, self . iter_options,
@@ -925,6 +969,7 @@ mod tests {
925
969
IterOptions :: default ( ) ,
926
970
false ,
927
971
Metrics :: new ( 1 , 1 , vec ! [ ] ) ,
972
+ None ,
928
973
) ;
929
974
930
975
check_iterator (
@@ -978,6 +1023,7 @@ mod tests {
978
1023
IterOptions :: default ( ) ,
979
1024
true ,
980
1025
Metrics :: new ( 1 , 1 , vec ! [ ] ) ,
1026
+ None ,
981
1027
) ;
982
1028
983
1029
check_iterator (
0 commit comments