1
- use prometheus_client:: {
2
- collector:: Collector ,
3
- encoding:: { DescriptorEncoder , EncodeMetric } ,
4
- metrics:: gauge:: ConstGauge ,
5
- registry:: Unit ,
6
- } ;
7
- use std:: time:: { SystemTime , UNIX_EPOCH } ;
1
+ use prometheus_client:: { collector:: Collector , encoding:: DescriptorEncoder } ;
8
2
9
3
mod linux;
10
4
5
+ #[ derive( Debug , Default ) ]
6
+ pub struct CollectorConfig {
7
+ namespace : Option < String > ,
8
+ report_error : bool ,
9
+ }
10
+
11
+ impl CollectorConfig {
12
+ pub fn with_namespace ( mut self , namespace : Option < String > ) -> Self {
13
+ self . namespace = namespace;
14
+
15
+ self
16
+ }
17
+
18
+ pub fn with_report_error ( mut self , report_error : bool ) -> Self {
19
+ self . report_error = report_error;
20
+
21
+ self
22
+ }
23
+ }
24
+
11
25
#[ derive( Debug ) ]
12
26
pub struct ProcessCollector {
13
- namespace : String ,
14
27
#[ cfg( target_os = "linux" ) ]
15
28
system : linux:: System ,
16
29
}
17
30
18
31
impl ProcessCollector {
19
- pub fn new ( namespace : Option < String > ) -> std :: io :: Result < Self > {
32
+ pub fn new ( config : CollectorConfig ) -> Self {
20
33
#[ cfg( target_os = "linux" ) ]
21
- let system = linux:: System :: load ( namespace. clone ( ) ) ?;
22
- let namespace = match namespace {
23
- Some ( mut n) => {
24
- n. push ( '_' ) ;
25
- n
26
- }
27
- None => "" . to_string ( ) ,
28
- } ;
29
-
30
- Ok ( ProcessCollector {
31
- namespace,
34
+ let system = linux:: System :: load ( config. namespace . clone ( ) , config. report_error ) ;
35
+
36
+ ProcessCollector {
32
37
#[ cfg( target_os = "linux" ) ]
33
38
system,
34
- } )
39
+ }
35
40
}
36
41
}
37
42
38
43
impl Collector for ProcessCollector {
39
- fn encode ( & self , mut encoder : DescriptorEncoder ) -> Result < ( ) , std:: fmt:: Error > {
40
- let start_time_from_epoch = SystemTime :: now ( )
41
- . duration_since ( UNIX_EPOCH )
42
- . map_err ( |_| std:: fmt:: Error ) ?;
43
- let start_time = ConstGauge :: new ( start_time_from_epoch. as_secs_f64 ( ) ) ;
44
- let metric_name = format ! ( "{}process_start_time" , self . namespace) ;
45
- let start_time_metric = encoder. encode_descriptor (
46
- & metric_name,
47
- "Start time of the process since unix epoch in seconds." ,
48
- Some ( & Unit :: Seconds ) ,
49
- start_time. metric_type ( ) ,
50
- ) ?;
51
- start_time. encode ( start_time_metric) ?;
52
-
44
+ fn encode ( & self , encoder : DescriptorEncoder ) -> Result < ( ) , std:: fmt:: Error > {
53
45
#[ cfg( target_os = "linux" ) ]
54
46
self . system . encode ( encoder) ?;
55
47
@@ -65,7 +57,7 @@ mod tests {
65
57
#[ test]
66
58
fn register_start_time ( ) {
67
59
let mut registry = Registry :: default ( ) ;
68
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
60
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
69
61
registry. register_collector ( Box :: new ( processor_collector) ) ;
70
62
let mut encoded = String :: new ( ) ;
71
63
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -84,7 +76,7 @@ mod tests {
84
76
#[ test]
85
77
fn register_resident_memory ( ) {
86
78
let mut registry = Registry :: default ( ) ;
87
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
79
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
88
80
registry. register_collector ( Box :: new ( processor_collector) ) ;
89
81
let mut encoded = String :: new ( ) ;
90
82
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -104,7 +96,7 @@ mod tests {
104
96
#[ test]
105
97
fn register_virtual_memory ( ) {
106
98
let mut registry = Registry :: default ( ) ;
107
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
99
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
108
100
registry. register_collector ( Box :: new ( processor_collector) ) ;
109
101
let mut encoded = String :: new ( ) ;
110
102
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -124,7 +116,7 @@ mod tests {
124
116
#[ test]
125
117
fn register_virtual_memory_max ( ) {
126
118
let mut registry = Registry :: default ( ) ;
127
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
119
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
128
120
registry. register_collector ( Box :: new ( processor_collector) ) ;
129
121
let mut encoded = String :: new ( ) ;
130
122
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -142,7 +134,7 @@ mod tests {
142
134
#[ test]
143
135
fn register_open_fds ( ) {
144
136
let mut registry = Registry :: default ( ) ;
145
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
137
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
146
138
registry. register_collector ( Box :: new ( processor_collector) ) ;
147
139
let mut encoded = String :: new ( ) ;
148
140
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -160,7 +152,7 @@ mod tests {
160
152
#[ test]
161
153
fn register_max_fds ( ) {
162
154
let mut registry = Registry :: default ( ) ;
163
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
155
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
164
156
registry. register_collector ( Box :: new ( processor_collector) ) ;
165
157
let mut encoded = String :: new ( ) ;
166
158
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -179,7 +171,7 @@ mod tests {
179
171
#[ test]
180
172
fn register_cpu_seconds ( ) {
181
173
let mut registry = Registry :: default ( ) ;
182
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
174
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
183
175
registry. register_collector ( Box :: new ( processor_collector) ) ;
184
176
let mut encoded = String :: new ( ) ;
185
177
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -200,7 +192,7 @@ mod tests {
200
192
#[ test]
201
193
fn register_network_receive ( ) {
202
194
let mut registry = Registry :: default ( ) ;
203
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
195
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
204
196
registry. register_collector ( Box :: new ( processor_collector) ) ;
205
197
let mut encoded = String :: new ( ) ;
206
198
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -219,7 +211,7 @@ mod tests {
219
211
#[ test]
220
212
fn register_network_transmit ( ) {
221
213
let mut registry = Registry :: default ( ) ;
222
- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
214
+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
223
215
registry. register_collector ( Box :: new ( processor_collector) ) ;
224
216
let mut encoded = String :: new ( ) ;
225
217
encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -234,4 +226,57 @@ mod tests {
234
226
"encoded does not contain expected network_transmit"
235
227
) ;
236
228
}
229
+
230
+ #[ test]
231
+ fn include_namespace ( ) {
232
+ let mut registry = Registry :: default ( ) ;
233
+ let namespace = "namespace" ;
234
+ let config = CollectorConfig :: default ( ) . with_namespace ( Some ( namespace. to_string ( ) ) ) ;
235
+ let processor_collector = ProcessCollector :: new ( config) ;
236
+ registry. register_collector ( Box :: new ( processor_collector) ) ;
237
+ let mut encoded = String :: new ( ) ;
238
+ encode ( & mut encoded, & registry) . unwrap ( ) ;
239
+
240
+ let network_transmit = format ! ( "{}_process_network_transmit_bytes_total " , namespace) ;
241
+ let network_receive = format ! ( "{}_process_network_receive_bytes_total " , namespace) ;
242
+ let max_fds = format ! ( "{}_process_max_fds " , namespace) ;
243
+ let open_fds = format ! ( "{}_process_open_fds_total " , namespace) ;
244
+ let virtual_memory_max = format ! ( "{}_process_virtual_memory_max " , namespace) ;
245
+ let virtual_memory = format ! ( "{}_process_virtual_memory_bytes " , namespace) ;
246
+ let resident_memory = format ! ( "{}_process_resident_memory_bytes " , namespace) ;
247
+ let start_time = format ! ( "{}_process_start_time_seconds " , namespace) ;
248
+
249
+ assert ! (
250
+ encoded. contains( & network_transmit) ,
251
+ "encoded does not contain expected network_transmit with namespace attached"
252
+ ) ;
253
+ assert ! (
254
+ encoded. contains( & network_receive) ,
255
+ "encoded does not contain expected network_transmit with namespace attached"
256
+ ) ;
257
+ assert ! (
258
+ encoded. contains( & max_fds) ,
259
+ "encoded does not contain expected network_transmit with namespace attached"
260
+ ) ;
261
+ assert ! (
262
+ encoded. contains( & open_fds) ,
263
+ "encoded does not contain expected network_transmit with namespace attached"
264
+ ) ;
265
+ assert ! (
266
+ encoded. contains( & virtual_memory_max) ,
267
+ "encoded does not contain expected network_transmit with namespace attached"
268
+ ) ;
269
+ assert ! (
270
+ encoded. contains( & virtual_memory) ,
271
+ "encoded does not contain expected network_transmit with namespace attached"
272
+ ) ;
273
+ assert ! (
274
+ encoded. contains( & resident_memory) ,
275
+ "encoded does not contain expected network_transmit with namespace attached"
276
+ ) ;
277
+ assert ! (
278
+ encoded. contains( & start_time) ,
279
+ "encoded does not contain expected network_transmit with namespace attached"
280
+ ) ;
281
+ }
237
282
}
0 commit comments