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 } ;
82
93mod linux;
104
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+
1125#[ derive( Debug ) ]
1226pub struct ProcessCollector {
13- namespace : String ,
1427 #[ cfg( target_os = "linux" ) ]
1528 system : linux:: System ,
1629}
1730
1831impl ProcessCollector {
19- pub fn new ( namespace : Option < String > ) -> std :: io :: Result < Self > {
32+ pub fn new ( config : CollectorConfig ) -> Self {
2033 #[ 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 {
3237 #[ cfg( target_os = "linux" ) ]
3338 system,
34- } )
39+ }
3540 }
3641}
3742
3843impl 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 > {
5345 #[ cfg( target_os = "linux" ) ]
5446 self . system . encode ( encoder) ?;
5547
@@ -65,7 +57,7 @@ mod tests {
6557 #[ test]
6658 fn register_start_time ( ) {
6759 let mut registry = Registry :: default ( ) ;
68- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
60+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
6961 registry. register_collector ( Box :: new ( processor_collector) ) ;
7062 let mut encoded = String :: new ( ) ;
7163 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -84,7 +76,7 @@ mod tests {
8476 #[ test]
8577 fn register_resident_memory ( ) {
8678 let mut registry = Registry :: default ( ) ;
87- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
79+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
8880 registry. register_collector ( Box :: new ( processor_collector) ) ;
8981 let mut encoded = String :: new ( ) ;
9082 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -104,7 +96,7 @@ mod tests {
10496 #[ test]
10597 fn register_virtual_memory ( ) {
10698 let mut registry = Registry :: default ( ) ;
107- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
99+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
108100 registry. register_collector ( Box :: new ( processor_collector) ) ;
109101 let mut encoded = String :: new ( ) ;
110102 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -124,7 +116,7 @@ mod tests {
124116 #[ test]
125117 fn register_virtual_memory_max ( ) {
126118 let mut registry = Registry :: default ( ) ;
127- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
119+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
128120 registry. register_collector ( Box :: new ( processor_collector) ) ;
129121 let mut encoded = String :: new ( ) ;
130122 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -142,7 +134,7 @@ mod tests {
142134 #[ test]
143135 fn register_open_fds ( ) {
144136 let mut registry = Registry :: default ( ) ;
145- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
137+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
146138 registry. register_collector ( Box :: new ( processor_collector) ) ;
147139 let mut encoded = String :: new ( ) ;
148140 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -160,7 +152,7 @@ mod tests {
160152 #[ test]
161153 fn register_max_fds ( ) {
162154 let mut registry = Registry :: default ( ) ;
163- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
155+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
164156 registry. register_collector ( Box :: new ( processor_collector) ) ;
165157 let mut encoded = String :: new ( ) ;
166158 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -179,7 +171,7 @@ mod tests {
179171 #[ test]
180172 fn register_cpu_seconds ( ) {
181173 let mut registry = Registry :: default ( ) ;
182- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
174+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
183175 registry. register_collector ( Box :: new ( processor_collector) ) ;
184176 let mut encoded = String :: new ( ) ;
185177 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -200,7 +192,7 @@ mod tests {
200192 #[ test]
201193 fn register_network_receive ( ) {
202194 let mut registry = Registry :: default ( ) ;
203- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
195+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
204196 registry. register_collector ( Box :: new ( processor_collector) ) ;
205197 let mut encoded = String :: new ( ) ;
206198 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -219,7 +211,7 @@ mod tests {
219211 #[ test]
220212 fn register_network_transmit ( ) {
221213 let mut registry = Registry :: default ( ) ;
222- let processor_collector = ProcessCollector :: new ( None ) . unwrap ( ) ;
214+ let processor_collector = ProcessCollector :: new ( CollectorConfig :: default ( ) ) ;
223215 registry. register_collector ( Box :: new ( processor_collector) ) ;
224216 let mut encoded = String :: new ( ) ;
225217 encode ( & mut encoded, & registry) . unwrap ( ) ;
@@ -234,4 +226,57 @@ mod tests {
234226 "encoded does not contain expected network_transmit"
235227 ) ;
236228 }
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+ }
237282}
0 commit comments