@cryptotaxi247 / netdata-1 / commits / a2aa04487

Add IPv4 and IPv6 bandwidth charts to FreeBSD plugin

Vladimir Kobal committed Dec 14, 2016 at 02:01 UTC a2aa044870b557ab6662b9a1954629f30c49b87a
1 file changed +68 -2
src/freebsd_sysctl.c
+68 -2
@@ -14,6 +14,9 @@
14 #undef _KERNEL
15 // NEEDED BY: struct sysctl_netisr_workstream, struct sysctl_netisr_work
16 #include <net/netisr.h>
17 +// NEEDED BY: struct ifaddrs, getifaddrs()
18 +#include <net/if.h>
19 +#include <ifaddrs.h>
20 // NEEDED BY: do_disk_io
21 #define RRD_TYPE_DISK "disk"
22
@@ -26,7 +29,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
29 static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
30 do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
31 do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1,
29 - do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1;
32 + do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1;
33
34 if (unlikely(do_cpu == -1)) {
35 do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -50,6 +53,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
53 do_ipc_msg_queues = config_get_boolean("plugin:freebsd:sysctl", "ipc message queues", 1);
54 do_netisr = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1);
55 do_netisr_per_core = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1);
56 + do_bandwidth = config_get_boolean("plugin:freebsd:sysctl", "bandwidth", 1);
57 }
58
59 RRDSET *st;
@@ -57,6 +61,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
61 int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
62 int i, n;
63 int common_error = 0;
64 + size_t size;
65
66 // NEEDED BY: do_loadavg
67 static usec_t last_loadavg_usec = 0;
@@ -105,7 +110,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
110 } prev_dstat;
111
112 // NEEDED BY: do_swap
108 - size_t mibsize, size;
113 + size_t mibsize;
114 int mib[3]; // CTL_MAXNAME = 24 maximum mib components (sysctl.h)
115 struct xswdev xsw;
116 struct total_xsw {
@@ -159,6 +164,13 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
164 } *netisr_stats = NULL;
165 char netstat_cpuid[21]; // no more than 4 digits expected
166
167 + // NEEDED BY: do_bandwidth
168 + struct ifaddrs *ifa, *ifap;
169 + struct iftot {
170 + u_long ift_ibytes;
171 + u_long ift_obytes;
172 + } iftot = {0, 0};
173 +
174 // --------------------------------------------------------------------
175
176 if (last_loadavg_usec <= dt) {
@@ -1029,5 +1041,59 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
1041 }
1042 }
1043
1044 + // --------------------------------------------------------------------
1045 +
1046 + if (likely(do_bandwidth)) {
1047 + if (unlikely(getifaddrs(&ifap))) {
1048 + error("FREEBSD: getifaddrs()");
1049 + do_bandwidth = 0;
1050 + error("DISABLED: system.ipv4");
1051 + } else {
1052 + for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
1053 + if (ifa->ifa_addr->sa_family != AF_INET)
1054 + continue;
1055 + iftot.ift_ibytes += (((struct if_data *)ifa->ifa_data)->ifi_ibytes);
1056 + iftot.ift_obytes += (((struct if_data *)ifa->ifa_data)->ifi_obytes);
1057 + }
1058 +
1059 + st = rrdset_find("system.ipv4");
1060 + if (unlikely(!st)) {
1061 + st = rrdset_create("system", "ipv4", NULL, "network", NULL, "IPv4 Bandwidth", "kilobits/s", 500, update_every, RRDSET_TYPE_AREA);
1062 +
1063 + rrddim_add(st, "InOctets", "received", 8, 1024, RRDDIM_INCREMENTAL);
1064 + rrddim_add(st, "OutOctets", "sent", -8, 1024, RRDDIM_INCREMENTAL);
1065 + }
1066 + else rrdset_next(st);
1067 +
1068 + rrddim_set(st, "InOctets", iftot.ift_ibytes);
1069 + rrddim_set(st, "OutOctets", iftot.ift_obytes);
1070 + rrdset_done(st);
1071 +
1072 + // --------------------------------------------------------------------
1073 +
1074 + for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
1075 + if (ifa->ifa_addr->sa_family != AF_INET6)
1076 + continue;
1077 + iftot.ift_ibytes += (((struct if_data *)ifa->ifa_data)->ifi_ibytes);
1078 + iftot.ift_obytes += (((struct if_data *)ifa->ifa_data)->ifi_obytes);
1079 + }
1080 +
1081 + st = rrdset_find("system.ipv6");
1082 + if(unlikely(!st)) {
1083 + st = rrdset_create("system", "ipv6", NULL, "network", NULL, "IPv6 Bandwidth", "kilobits/s", 500, update_every, RRDSET_TYPE_AREA);
1084 +
1085 + rrddim_add(st, "received", NULL, 8, 1024, RRDDIM_INCREMENTAL);
1086 + rrddim_add(st, "sent", NULL, -8, 1024, RRDDIM_INCREMENTAL);
1087 + }
1088 + else rrdset_next(st);
1089 +
1090 + rrddim_set(st, "sent", iftot.ift_obytes);
1091 + rrddim_set(st, "received", iftot.ift_ibytes);
1092 + rrdset_done(st);
1093 +
1094 + freeifaddrs(ifap);
1095 + }
1096 + }
1097 +
1098 return 0;
1099 }