Add disk space and inodes utilization charts to FreeBSD plugin
Vladimir Kobal committed
Jan 6, 2017 at 01:17 UTC
aaf91b6cb02d4b621cc5c816bbaeb706f265b537
1 file changed
+99
-17
src/freebsd_sysctl.c
+99
-17
@@ -33,6 +33,12 @@
33
#include <netinet6/ip6_var.h>
34
// NEEDED BY do_icmp6...
35
#include <netinet/icmp6.h>
36
+// NEEDED BY do_space, do_inodes
37
+#include <sys/mount.h>
38
+
39
+#define KILO_FACTOR 1024
40
+#define MEGA_FACTOR 1048576 // 1024 * 1024
41
+#define GIGA_FACTOR 1073741824 // 1024 * 1024 * 1024
42
43
// NEEDED BY: do_disk_io
44
#define RRD_TYPE_DISK "disk"
@@ -56,7 +62,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
62
do_ip_packets = -1, do_ip_fragsout = -1, do_ip_fragsin = -1, do_ip_errors = -1,
63
do_ip6_packets = -1, do_ip6_fragsout = -1, do_ip6_fragsin = -1, do_ip6_errors = -1,
64
do_icmp6 = -1, do_icmp6_redir = -1, do_icmp6_errors = -1, do_icmp6_echos = -1, do_icmp6_router = -1,
59
- do_icmp6_neighbor = -1, do_icmp6_types = -1;
65
+ do_icmp6_neighbor = -1, do_icmp6_types = -1, do_space = -1, do_inodes = -1;
66
67
if (unlikely(do_cpu == -1)) {
68
do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -99,13 +105,15 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
105
do_ip6_fragsout = config_get_boolean_ondemand("plugin:freebsd:sysctl", "ipv6 fragments sent", CONFIG_ONDEMAND_ONDEMAND);
106
do_ip6_fragsin = config_get_boolean_ondemand("plugin:freebsd:sysctl", "ipv6 fragments assembly", CONFIG_ONDEMAND_ONDEMAND);
107
do_ip6_errors = config_get_boolean_ondemand("plugin:freebsd:sysctl", "ipv6 errors", CONFIG_ONDEMAND_ONDEMAND);
102
- do_icmp6 = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp", CONFIG_ONDEMAND_ONDEMAND);
103
- do_icmp6_redir = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp redirects", CONFIG_ONDEMAND_ONDEMAND);
104
- do_icmp6_errors = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp errors", CONFIG_ONDEMAND_ONDEMAND);
105
- do_icmp6_echos = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp echos", CONFIG_ONDEMAND_ONDEMAND);
106
- do_icmp6_router = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp router", CONFIG_ONDEMAND_ONDEMAND);
107
- do_icmp6_neighbor = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp neighbor", CONFIG_ONDEMAND_ONDEMAND);
108
- do_icmp6_types = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp types", CONFIG_ONDEMAND_ONDEMAND);
108
+ do_icmp6 = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp", CONFIG_ONDEMAND_ONDEMAND);
109
+ do_icmp6_redir = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp redirects", CONFIG_ONDEMAND_ONDEMAND);
110
+ do_icmp6_errors = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp errors", CONFIG_ONDEMAND_ONDEMAND);
111
+ do_icmp6_echos = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp echos", CONFIG_ONDEMAND_ONDEMAND);
112
+ do_icmp6_router = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp router", CONFIG_ONDEMAND_ONDEMAND);
113
+ do_icmp6_neighbor = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp neighbor", CONFIG_ONDEMAND_ONDEMAND);
114
+ do_icmp6_types = config_get_boolean_ondemand("plugin:freebsd:sysctl", "icmp types", CONFIG_ONDEMAND_ONDEMAND);
115
+ do_space = config_get_boolean("plugin:freebsd:sysctl", "space usage for all disks", 1);
116
+ do_inodes = config_get_boolean("plugin:freebsd:sysctl", "inodes usage for all disks", 1);
117
}
118
119
RRDSET *st;
@@ -116,6 +124,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
124
void *p;
125
int common_error = 0;
126
size_t size;
127
+ char title[4096 + 1];
128
129
// NEEDED BY: do_loadavg
130
static usec_t last_loadavg_usec = 0;
@@ -253,6 +262,11 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
262
u_long msgs_out;
263
} icmp6_total = {0, 0};
264
265
+ // NEEDED BY: do_space, do_inodes
266
+ struct statfs *mntbuf;
267
+ int mntsize;
268
+ char mntonname[MNAMELEN + 1];
269
+
270
// --------------------------------------------------------------------
271
272
if (last_loadavg_usec <= dt) {
@@ -332,7 +346,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
346
st = rrdset_create("mem", "committed", NULL, "system", NULL, "Committed (Allocated) Memory", "MB", 5000, update_every, RRDSET_TYPE_AREA);
347
st->isdetail = 1;
348
335
- rrddim_add(st, "Committed_AS", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
349
+ rrddim_add(st, "Committed_AS", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
350
}
351
else rrdset_next(st);
352
@@ -786,8 +800,8 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
800
st = rrdset_create("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
801
st->isdetail = 1;
802
789
- rrddim_add(st, "free", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
790
- rrddim_add(st, "used", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
803
+ rrddim_add(st, "free", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
804
+ rrddim_add(st, "used", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
805
}
806
else rrdset_next(st);
807
@@ -814,12 +828,12 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
828
if (unlikely(!st)) {
829
st = rrdset_create("system", "ram", NULL, "ram", NULL, "System RAM", "MB", 200, update_every, RRDSET_TYPE_STACKED);
830
817
- rrddim_add(st, "active", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
818
- rrddim_add(st, "inactive", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
819
- rrddim_add(st, "wired", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
820
- rrddim_add(st, "cache", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
821
- rrddim_add(st, "buffers", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
822
- rrddim_add(st, "free", NULL, system_pagesize, 1048576, RRDDIM_ABSOLUTE);
831
+ rrddim_add(st, "active", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
832
+ rrddim_add(st, "inactive", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
833
+ rrddim_add(st, "wired", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
834
+ rrddim_add(st, "cache", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
835
+ rrddim_add(st, "buffers", NULL, 1, MEGA_FACTOR, RRDDIM_ABSOLUTE);
836
+ rrddim_add(st, "free", NULL, system_pagesize, MEGA_FACTOR, RRDDIM_ABSOLUTE);
837
}
838
else rrdset_next(st);
839
@@ -2082,5 +2096,73 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
2096
}
2097
}
2098
2099
+ // --------------------------------------------------------------------------
2100
+
2101
+ if (likely(do_space || do_inodes)) {
2102
+ // there is no mount info in sysctl MIBs
2103
+ if (unlikely(!(mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)))) {
2104
+ error("FREEBSD: getmntinfo() failed");
2105
+ do_space = 0;
2106
+ error("DISABLED: disk_space.X");
2107
+ do_inodes = 0;
2108
+ error("DISABLED: disk_inodes.X");
2109
+ } else {
2110
+ for (i = 0; i < mntsize; i++) {
2111
+ if (mntbuf[i].f_flags == MNT_RDONLY ||
2112
+ mntbuf[i].f_blocks == 0 ||
2113
+ // taken from gnulib/mountlist.c and shortened to FreeBSD related fstypes
2114
+ strcmp(mntbuf[i].f_fstypename, "autofs") == 0 ||
2115
+ strcmp(mntbuf[i].f_fstypename, "procfs") == 0 ||
2116
+ strcmp(mntbuf[i].f_fstypename, "subfs") == 0 ||
2117
+ strcmp(mntbuf[i].f_fstypename, "devfs") == 0 ||
2118
+ strcmp(mntbuf[i].f_fstypename, "none") == 0)
2119
+ continue;
2120
+
2121
+ // --------------------------------------------------------------------------
2122
+
2123
+ if (likely(do_space)) {
2124
+ st = rrdset_find_bytype("disk_space", mntbuf[i].f_mntonname);
2125
+ if (unlikely(!st)) {
2126
+ snprintfz(title, 4096, "Disk Space Usage for %s [%s]", mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
2127
+ st = rrdset_create("disk_space", mntbuf[i].f_mntonname, NULL, mntbuf[i].f_mntonname, "disk.space", title, "GB", 2023,
2128
+ update_every,
2129
+ RRDSET_TYPE_STACKED);
2130
+
2131
+ rrddim_add(st, "avail", NULL, mntbuf[i].f_bsize, GIGA_FACTOR, RRDDIM_ABSOLUTE);
2132
+ rrddim_add(st, "used", NULL, mntbuf[i].f_bsize, GIGA_FACTOR, RRDDIM_ABSOLUTE);
2133
+ rrddim_add(st, "reserved_for_root", "reserved for root", mntbuf[i].f_bsize, GIGA_FACTOR,
2134
+ RRDDIM_ABSOLUTE);
2135
+ } else
2136
+ rrdset_next(st);
2137
+
2138
+ rrddim_set(st, "avail", (collected_number) mntbuf[i].f_bavail);
2139
+ rrddim_set(st, "used", (collected_number) (mntbuf[i].f_blocks - mntbuf[i].f_bfree));
2140
+ rrddim_set(st, "reserved_for_root", (collected_number) (mntbuf[i].f_bfree - mntbuf[i].f_bavail));
2141
+ rrdset_done(st);
2142
+ }
2143
+
2144
+ // --------------------------------------------------------------------------
2145
+
2146
+ if (likely(do_inodes)) {
2147
+ st = rrdset_find_bytype("disk_inodes", mntbuf[i].f_mntonname);
2148
+ if (unlikely(!st)) {
2149
+ snprintfz(title, 4096, "Disk Files (inodes) Usage for %s [%s]", mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
2150
+ st = rrdset_create("disk_inodes", mntbuf[i].f_mntonname, NULL, mntbuf[i].f_mntonname, "disk.inodes", title, "Inodes", 2024,
2151
+ update_every, RRDSET_TYPE_STACKED);
2152
+
2153
+ rrddim_add(st, "avail", NULL, 1, 1, RRDDIM_ABSOLUTE);
2154
+ rrddim_add(st, "used", NULL, 1, 1, RRDDIM_ABSOLUTE);
2155
+ rrddim_add(st, "reserved_for_root", "reserved for root", 1, 1, RRDDIM_ABSOLUTE);
2156
+ } else
2157
+ rrdset_next(st);
2158
+
2159
+ rrddim_set(st, "avail", (collected_number) mntbuf[i].f_ffree);
2160
+ rrddim_set(st, "used", (collected_number) (mntbuf[i].f_files - mntbuf[i].f_ffree));
2161
+ rrdset_done(st);
2162
+ }
2163
+ }
2164
+ }
2165
+ }
2166
+
2167
return 0;
2168
}