1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use mackerel_plugin::{graph, Graph, Plugin};
use std::collections::HashMap;

pub struct LoadavgPlugin {}

impl Plugin for LoadavgPlugin {
    fn fetch_metrics(&self) -> Result<HashMap<String, f64>, String> {
        let mut loadavgs: [f64; 3] = [0.0, 0.0, 0.0];
        if unsafe { libc::getloadavg(loadavgs.as_mut_ptr(), 3) } != 3 {
            return Err("failed to get load averages".to_owned());
        }
        Ok(HashMap::from([
            ("loadavg.loadavg1".to_owned(), loadavgs[0]),
            ("loadavg.loadavg5".to_owned(), loadavgs[1]),
            ("loadavg.loadavg15".to_owned(), loadavgs[2]),
        ]))
    }

    fn graph_definition(&self) -> Vec<Graph> {
        vec![graph! {
            name: "loadavg",
            label: "Load averages",
            unit: "float",
            metrics: [
                { name: "loadavg15", label: "loadavg15" },
                { name: "loadavg5", label: "loadavg5" },
                { name: "loadavg1", label: "loadavg1" },
            ],
        }]
    }
}