@cryptotaxi247 / netdata-1 / commits / 83df7878b

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 }