8
8
use std:: collections:: BTreeMap ;
9
9
use std:: ops:: AddAssign ;
10
10
use std:: time:: Duration ;
11
+ use tracing:: error;
11
12
12
13
use lgalloc:: { FileStats , SizeClassStats } ;
13
14
use mz_ore:: cast:: CastFrom ;
14
15
use mz_ore:: metrics:: { raw, MetricsRegistry } ;
15
16
use paste:: paste;
16
17
use prometheus:: core:: { AtomicU64 , GenericGauge } ;
17
18
19
+ /// Error during FileStats
20
+ #[ derive( Debug , thiserror:: Error ) ]
21
+ #[ error( transparent) ]
22
+ pub struct Error {
23
+ /// Kind of error
24
+ #[ from]
25
+ pub kind : ErrorKind ,
26
+ }
27
+
28
+ /// Kind of error during FileStats
29
+ #[ derive( Debug , thiserror:: Error ) ]
30
+ pub enum ErrorKind {
31
+ /// Failed to get file stats
32
+ #[ error( "Failed to get file stats: {0}" ) ]
33
+ FileStatsFailed ( String ) ,
34
+ }
35
+
36
+ impl Error {
37
+ /// Create a new error
38
+ pub fn new ( kind : ErrorKind ) -> Error {
39
+ Error { kind }
40
+ }
41
+ }
42
+
18
43
/// An accumulator for [`FileStats`].
19
44
#[ derive( Default ) ]
20
45
struct FileStatsAccum {
@@ -57,7 +82,6 @@ macro_rules! metrics_size_class {
57
82
) => {
58
83
paste! {
59
84
struct LgMetrics {
60
- stats: lgalloc:: LgAllocStats ,
61
85
size_class: BTreeMap <usize , LgMetricsSC >,
62
86
$( $metric: raw:: UIntGaugeVec , ) *
63
87
$( $f_metric: raw:: UIntGaugeVec , ) *
@@ -70,7 +94,6 @@ macro_rules! metrics_size_class {
70
94
fn new( registry: & MetricsRegistry ) -> Self {
71
95
Self {
72
96
size_class: BTreeMap :: default ( ) ,
73
- stats: lgalloc:: LgAllocStats :: default ( ) ,
74
97
$( $metric: registry. register( mz_ore:: metric!(
75
98
name: concat!( stringify!( $namespace) , "_" , stringify!( $metric) ) ,
76
99
help: $desc,
@@ -92,23 +115,29 @@ macro_rules! metrics_size_class {
92
115
}
93
116
} )
94
117
}
95
- fn update( & mut self ) {
96
- let mut stats = std:: mem:: take( & mut self . stats) ;
97
- lgalloc:: lgalloc_stats( & mut stats) ;
118
+ fn update( & mut self ) -> Result <( ) , Error > {
119
+ let stats = lgalloc:: lgalloc_stats( ) ;
98
120
for sc in & stats. size_class {
99
121
let sc_stats = self . get_size_class( sc. size_class) ;
100
122
$( sc_stats. $metric. set( ( $conv) ( u64 :: cast_from( sc. $name) , sc) ) ; ) *
101
123
}
102
124
let mut accums = BTreeMap :: new( ) ;
103
- for file_stat in & stats. file_stats {
104
- let accum: & mut FileStatsAccum = accums. entry( file_stat. size_class) . or_default( ) ;
105
- accum. add_assign( file_stat) ;
125
+ match & stats. file_stats {
126
+ Ok ( file_stats) => {
127
+ for file_stat in file_stats {
128
+ let accum: & mut FileStatsAccum = accums. entry( file_stat. size_class) . or_default( ) ;
129
+ accum. add_assign( file_stat) ;
130
+ }
131
+ }
132
+ Err ( err) => {
133
+ return Err ( Error :: new( ErrorKind :: FileStatsFailed ( err. to_string( ) ) ) ) ;
134
+ }
106
135
}
107
136
for ( size_class, accum) in accums {
108
137
let sc_stats = self . get_size_class( size_class) ;
109
138
$( sc_stats. $f_metric. set( u64 :: cast_from( accum. $f_name) ) ; ) *
110
139
}
111
- self . stats = stats ;
140
+ Ok ( ( ) )
112
141
}
113
142
}
114
143
}
@@ -164,7 +193,10 @@ pub async fn register_metrics_into(metrics_registry: &MetricsRegistry) {
164
193
interval. set_missed_tick_behavior ( tokio:: time:: MissedTickBehavior :: Skip ) ;
165
194
loop {
166
195
interval. tick ( ) . await ;
167
- lgmetrics. update ( ) ;
196
+ if let Err ( err) = lgmetrics. update ( ) {
197
+ error ! ( "{err}" ) ;
198
+ break ;
199
+ }
168
200
}
169
201
} ) ;
170
202
}
0 commit comments