Skip to content

Commit e11bf4d

Browse files
committed
feat: handle error
1 parent 2bcb7e5 commit e11bf4d

File tree

2 files changed

+182
-89
lines changed

2 files changed

+182
-89
lines changed

process-collector/src/lib.rs

+89-44
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,47 @@
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

93
mod 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)]
1226
pub struct ProcessCollector {
13-
namespace: String,
1427
#[cfg(target_os = "linux")]
1528
system: linux::System,
1629
}
1730

1831
impl 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

3843
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> {
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

Comments
 (0)