]> arthur.barton.de Git - netdata.git/blob - src/freebsd_loadavg.c
Add some basic system stats - load, cpu, interrupts, processes
[netdata.git] / src / freebsd_loadavg.c
1 #include "common.h"
2 #include <sys/vmmeter.h>
3
4 // FreeBSD calculates this once every 5 seconds
5 #define MIN_LOADAVG_UPDATE_EVERY 5
6
7 int do_proc_loadavg(int update_every, unsigned long long dt) {
8     (void)dt;
9
10     static int do_loadavg = -1, do_all_processes = -1;
11     static unsigned long long last_loadavg_usec = 0;
12     static RRDSET *load_chart = NULL, *processes_chart = NULL;
13
14     if(unlikely(do_loadavg == -1)) {
15         do_loadavg          = config_get_boolean("plugin:proc:/proc/loadavg", "enable load average", 1);
16         do_all_processes    = config_get_boolean("plugin:proc:/proc/loadavg", "enable total processes", 1);
17     }
18
19     struct loadavg sysload;
20     
21     if (unlikely(GETSYSCTL("vm.loadavg", sysload)))
22         return 1;
23     
24     double load1 = (double)sysload.ldavg[0] / sysload.fscale;
25     double load5 = (double)sysload.ldavg[1] / sysload.fscale;
26     double load15 = (double)sysload.ldavg[2] / sysload.fscale;
27
28     struct vmtotal total;
29     
30     if (unlikely(GETSYSCTL("vm.vmtotal", total)))
31         return 1;
32     
33     unsigned long long active_processes     = total.t_rq + total.t_dw + total.t_pw + total.t_sl + total.t_sw;
34
35     // --------------------------------------------------------------------
36
37     if(last_loadavg_usec <= dt) {
38         if(likely(do_loadavg)) {
39             if(unlikely(!load_chart)) {
40                 load_chart = rrdset_find_byname("system.load");
41                 if(unlikely(!load_chart)) {
42                     load_chart = rrdset_create("system", "load", NULL, "load", NULL, "System Load Average", "load", 100, (update_every < MIN_LOADAVG_UPDATE_EVERY) ? MIN_LOADAVG_UPDATE_EVERY : update_every, RRDSET_TYPE_LINE);
43                     rrddim_add(load_chart, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
44                     rrddim_add(load_chart, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
45                     rrddim_add(load_chart, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
46                 }
47             }
48             else
49                 rrdset_next(load_chart);
50
51             rrddim_set(load_chart, "load1", (collected_number) (load1 * 1000));
52             rrddim_set(load_chart, "load5", (collected_number) (load5 * 1000));
53             rrddim_set(load_chart, "load15", (collected_number) (load15 * 1000));
54             rrdset_done(load_chart);
55         }
56
57         last_loadavg_usec = load_chart->update_every * 1000000ULL;
58     }
59     else last_loadavg_usec -= dt;
60
61     // --------------------------------------------------------------------
62
63     if(likely(do_all_processes)) {
64         if(unlikely(!processes_chart)) {
65             processes_chart = rrdset_find_byname("system.active_processes");
66             if(unlikely(!processes_chart)) {
67                 processes_chart = rrdset_create("system", "active_processes", NULL, "processes", NULL, "System Active Processes", "processes", 750, update_every, RRDSET_TYPE_LINE);
68                 rrddim_add(processes_chart, "active", NULL, 1, 1, RRDDIM_ABSOLUTE);
69             }
70         }
71         else rrdset_next(processes_chart);
72
73         rrddim_set(processes_chart, "active", active_processes);
74         rrdset_done(processes_chart);
75     }
76
77     return 0;
78 }