@cryptotaxi247 / netdata-1 / commits / aaf91b6cb

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 }