Add network interfaces charts to macOS plugin
Vladimir Kobal committed
Jan 13, 2017 at 08:03 UTC
83df7878b2a8e61d8dcf1b0e1a9cb37b35e9cea0
1 file changed
+114
-3
src/macos_fw.c
+114
-3
@@ -5,6 +5,12 @@
5
#include <IOKit/IOBSD.h>
6
// NEEDED BY do_space, do_inodes
7
#include <sys/mount.h>
8
+// NEEDED BY: struct ifaddrs, getifaddrs()
9
+#include <net/if.h>
10
+#include <ifaddrs.h>
11
+
12
+// NEEDED BY: do_bandwidth
13
+#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
14
15
#define MAXDRIVENAME 31
16
@@ -15,12 +21,13 @@
21
int do_macos_iokit(int update_every, usec_t dt) {
22
(void)dt;
23
18
- static int do_io = -1, do_space = -1, do_inodes = -1;
24
+ static int do_io = -1, do_space = -1, do_inodes = -1, do_bandwidth = -1;
25
26
if (unlikely(do_io == -1)) {
21
- do_io = config_get_boolean("plugin:macos:iokit", "disk i/o", 1);
27
+ do_io = config_get_boolean("plugin:macos:iokit", "disk i/o", 1);
28
do_space = config_get_boolean("plugin:macos:sysctl", "space usage for all disks", 1);
29
do_inodes = config_get_boolean("plugin:macos:sysctl", "inodes usage for all disks", 1);
30
+ do_bandwidth = config_get_boolean("plugin:macos:sysctl", "bandwidth", 1);
31
}
32
33
RRDSET *st;
@@ -66,6 +73,9 @@ int do_macos_iokit(int update_every, usec_t dt) {
73
char mntonname[MNAMELEN + 1];
74
char title[4096 + 1];
75
76
+ // NEEDED BY: do_bandwidth
77
+ struct ifaddrs *ifa, *ifap;
78
+
79
/* Get ports and services for drive statistics. */
80
if (unlikely(IOMasterPort(bootstrap_port, &master_port))) {
81
error("MACOS: IOMasterPort() failed");
@@ -304,12 +314,13 @@ int do_macos_iokit(int update_every, usec_t dt) {
314
rrdset_done(st);
315
}
316
317
+ // Can be merged with FreeBSD plugin
318
// --------------------------------------------------------------------------
319
320
if (likely(do_space || do_inodes)) {
321
// there is no mount info in sysctl MIBs
322
if (unlikely(!(mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)))) {
312
- error("FREEBSD: getmntinfo() failed");
323
+ error("MACOS: getmntinfo() failed");
324
do_space = 0;
325
error("DISABLED: disk_space.X");
326
do_inodes = 0;
@@ -372,5 +383,105 @@ int do_macos_iokit(int update_every, usec_t dt) {
383
}
384
}
385
386
+ // Can be merged with FreeBSD plugin
387
+ // --------------------------------------------------------------------
388
+
389
+ if (likely(do_bandwidth)) {
390
+ if (unlikely(getifaddrs(&ifap))) {
391
+ error("MACOS: getifaddrs()");
392
+ do_bandwidth = 0;
393
+ error("DISABLED: system.ipv4");
394
+ } else {
395
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
396
+ if (ifa->ifa_addr->sa_family != AF_LINK)
397
+ continue;
398
+
399
+ // --------------------------------------------------------------------
400
+
401
+ st = rrdset_find_bytype("net", ifa->ifa_name);
402
+ if (unlikely(!st)) {
403
+ st = rrdset_create("net", ifa->ifa_name, NULL, ifa->ifa_name, "net.net", "Bandwidth", "kilobits/s", 7000, update_every, RRDSET_TYPE_AREA);
404
+
405
+ rrddim_add(st, "received", NULL, 8, 1024, RRDDIM_INCREMENTAL);
406
+ rrddim_add(st, "sent", NULL, -8, 1024, RRDDIM_INCREMENTAL);
407
+ }
408
+ else rrdset_next(st);
409
+
410
+ rrddim_set(st, "received", IFA_DATA(ibytes));
411
+ rrddim_set(st, "sent", IFA_DATA(obytes));
412
+ rrdset_done(st);
413
+
414
+ // --------------------------------------------------------------------
415
+
416
+ st = rrdset_find_bytype("net_packets", ifa->ifa_name);
417
+ if (unlikely(!st)) {
418
+ st = rrdset_create("net_packets", ifa->ifa_name, NULL, ifa->ifa_name, "net.packets", "Packets", "packets/s", 7001, update_every, RRDSET_TYPE_LINE);
419
+ st->isdetail = 1;
420
+
421
+ rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
422
+ rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
423
+ rrddim_add(st, "multicast_received", NULL, 1, 1, RRDDIM_INCREMENTAL);
424
+ rrddim_add(st, "multicast_sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
425
+ }
426
+ else rrdset_next(st);
427
+
428
+ rrddim_set(st, "received", IFA_DATA(ipackets));
429
+ rrddim_set(st, "sent", IFA_DATA(opackets));
430
+ rrddim_set(st, "multicast_received", IFA_DATA(imcasts));
431
+ rrddim_set(st, "multicast_sent", IFA_DATA(omcasts));
432
+ rrdset_done(st);
433
+
434
+ // --------------------------------------------------------------------
435
+
436
+ st = rrdset_find_bytype("net_errors", ifa->ifa_name);
437
+ if (unlikely(!st)) {
438
+ st = rrdset_create("net_errors", ifa->ifa_name, NULL, ifa->ifa_name, "net.errors", "Interface Errors", "errors/s", 7002, update_every, RRDSET_TYPE_LINE);
439
+ st->isdetail = 1;
440
+
441
+ rrddim_add(st, "inbound", NULL, 1, 1, RRDDIM_INCREMENTAL);
442
+ rrddim_add(st, "outbound", NULL, -1, 1, RRDDIM_INCREMENTAL);
443
+ }
444
+ else rrdset_next(st);
445
+
446
+ rrddim_set(st, "inbound", IFA_DATA(ierrors));
447
+ rrddim_set(st, "outbound", IFA_DATA(oerrors));
448
+ rrdset_done(st);
449
+
450
+ // --------------------------------------------------------------------
451
+
452
+ st = rrdset_find_bytype("net_drops", ifa->ifa_name);
453
+ if (unlikely(!st)) {
454
+ st = rrdset_create("net_drops", ifa->ifa_name, NULL, ifa->ifa_name, "net.drops", "Interface Drops", "drops/s", 7003, update_every, RRDSET_TYPE_LINE);
455
+ st->isdetail = 1;
456
+
457
+ rrddim_add(st, "inbound", NULL, 1, 1, RRDDIM_INCREMENTAL);
458
+ }
459
+ else rrdset_next(st);
460
+
461
+ rrddim_set(st, "inbound", IFA_DATA(iqdrops));
462
+ rrdset_done(st);
463
+
464
+ // --------------------------------------------------------------------
465
+
466
+ st = rrdset_find_bytype("net_events", ifa->ifa_name);
467
+ if (unlikely(!st)) {
468
+ st = rrdset_create("net_events", ifa->ifa_name, NULL, ifa->ifa_name, "net.events", "Network Interface Events", "events/s", 7006, update_every, RRDSET_TYPE_LINE);
469
+ st->isdetail = 1;
470
+
471
+ rrddim_add(st, "frames", NULL, 1, 1, RRDDIM_INCREMENTAL);
472
+ rrddim_add(st, "collisions", NULL, -1, 1, RRDDIM_INCREMENTAL);
473
+ rrddim_add(st, "carrier", NULL, -1, 1, RRDDIM_INCREMENTAL);
474
+ }
475
+ else rrdset_next(st);
476
+
477
+ rrddim_set(st, "collisions", IFA_DATA(collisions));
478
+ rrdset_done(st);
479
+ }
480
+
481
+ freeifaddrs(ifap);
482
+ }
483
+ }
484
+
485
+
486
return 0;
487
}