123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- #include "plugin_macos.h"
- #include <CoreFoundation/CoreFoundation.h>
- #include <IOKit/IOKitLib.h>
- #include <IOKit/storage/IOBlockStorageDriver.h>
- #include <IOKit/IOBSD.h>
- // NEEDED BY do_space, do_inodes
- #include <sys/mount.h>
- // NEEDED BY: struct ifaddrs, getifaddrs()
- #include <net/if.h>
- #include <ifaddrs.h>
- // NEEDED BY: do_bandwidth
- #define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
- #define MAXDRIVENAME 31
- #define KILO_FACTOR 1024
- #define MEGA_FACTOR 1048576 // 1024 * 1024
- #define GIGA_FACTOR 1073741824 // 1024 * 1024 * 1024
- int do_macos_iokit(int update_every, usec_t dt) {
- (void)dt;
- static int do_io = -1, do_space = -1, do_inodes = -1, do_bandwidth = -1;
- if (unlikely(do_io == -1)) {
- do_io = config_get_boolean("plugin:macos:iokit", "disk i/o", 1);
- do_space = config_get_boolean("plugin:macos:sysctl", "space usage for all disks", 1);
- do_inodes = config_get_boolean("plugin:macos:sysctl", "inodes usage for all disks", 1);
- do_bandwidth = config_get_boolean("plugin:macos:sysctl", "bandwidth", 1);
- }
- RRDSET *st;
- mach_port_t main_port;
- io_registry_entry_t drive, drive_media;
- io_iterator_t drive_list;
- CFDictionaryRef properties, statistics;
- CFStringRef name;
- CFNumberRef number;
- kern_return_t status;
- collected_number total_disk_reads = 0;
- collected_number total_disk_writes = 0;
- struct diskstat {
- char name[MAXDRIVENAME];
- collected_number bytes_read;
- collected_number bytes_write;
- collected_number reads;
- collected_number writes;
- collected_number time_read;
- collected_number time_write;
- collected_number latency_read;
- collected_number latency_write;
- } diskstat;
- struct cur_diskstat {
- collected_number duration_read_ns;
- collected_number duration_write_ns;
- collected_number busy_time_ns;
- } cur_diskstat;
- struct prev_diskstat {
- collected_number bytes_read;
- collected_number bytes_write;
- collected_number operations_read;
- collected_number operations_write;
- collected_number duration_read_ns;
- collected_number duration_write_ns;
- collected_number busy_time_ns;
- } prev_diskstat;
- // NEEDED BY: do_space, do_inodes
- struct statfs *mntbuf;
- int mntsize, i;
- char title[4096 + 1];
- // NEEDED BY: do_bandwidth
- struct ifaddrs *ifa, *ifap;
- #if !defined(MAC_OS_VERSION_12_0) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_VERSION_12_0)
- #define IOMainPort IOMasterPort
- #endif
- /* Get ports and services for drive statistics. */
- if (unlikely(IOMainPort(bootstrap_port, &main_port))) {
- collector_error("MACOS: IOMasterPort() failed");
- do_io = 0;
- collector_error("DISABLED: system.io");
- /* Get the list of all drive objects. */
- } else if (unlikely(IOServiceGetMatchingServices(main_port, IOServiceMatching("IOBlockStorageDriver"), &drive_list))) {
- collector_error("MACOS: IOServiceGetMatchingServices() failed");
- do_io = 0;
- collector_error("DISABLED: system.io");
- } else {
- while ((drive = IOIteratorNext(drive_list)) != 0) {
- properties = 0;
- statistics = 0;
- number = 0;
- bzero(&diskstat, sizeof(diskstat));
- /* Get drive media object. */
- status = IORegistryEntryGetChildEntry(drive, kIOServicePlane, &drive_media);
- if (unlikely(status != KERN_SUCCESS)) {
- IOObjectRelease(drive);
- continue;
- }
- /* Get drive media properties. */
- if (likely(!IORegistryEntryCreateCFProperties(drive_media, (CFMutableDictionaryRef *)&properties, kCFAllocatorDefault, 0))) {
- /* Get disk name. */
- if (likely(name = (CFStringRef)CFDictionaryGetValue(properties, CFSTR(kIOBSDNameKey)))) {
- CFStringGetCString(name, diskstat.name, MAXDRIVENAME, kCFStringEncodingUTF8);
- }
- }
- /* Release. */
- CFRelease(properties);
- IOObjectRelease(drive_media);
- if(unlikely(!*diskstat.name)) {
- IOObjectRelease(drive);
- continue;
- }
- /* Obtain the properties for this drive object. */
- if (unlikely(IORegistryEntryCreateCFProperties(drive, (CFMutableDictionaryRef *)&properties, kCFAllocatorDefault, 0))) {
- IOObjectRelease(drive);
- collector_error("MACOS: IORegistryEntryCreateCFProperties() failed");
- do_io = 0;
- collector_error("DISABLED: system.io");
- break;
- } else if (likely(properties)) {
- /* Obtain the statistics from the drive properties. */
- if (likely(statistics = (CFDictionaryRef)CFDictionaryGetValue(properties, CFSTR(kIOBlockStorageDriverStatisticsKey)))) {
- // --------------------------------------------------------------------
- /* Get bytes read. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.bytes_read);
- total_disk_reads += diskstat.bytes_read;
- }
- /* Get bytes written. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.bytes_write);
- total_disk_writes += diskstat.bytes_write;
- }
- st = rrdset_find_active_bytype_localhost("disk", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.io"
- , "Disk I/O Bandwidth"
- , "KiB/s"
- , "macos.plugin"
- , "iokit"
- , 2000
- , update_every
- , RRDSET_TYPE_AREA
- );
- rrddim_add(st, "reads", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "writes", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
- }
- prev_diskstat.bytes_read = rrddim_set(st, "reads", diskstat.bytes_read);
- prev_diskstat.bytes_write = rrddim_set(st, "writes", diskstat.bytes_write);
- rrdset_done(st);
- /* Get number of reads. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsReadsKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.reads);
- }
- /* Get number of writes. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsWritesKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.writes);
- }
- st = rrdset_find_active_bytype_localhost("disk_ops", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_ops"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.ops"
- , "Disk Completed I/O Operations"
- , "operations/s"
- , "macos.plugin"
- , "iokit"
- , 2001
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- }
- prev_diskstat.operations_read = rrddim_set(st, "reads", diskstat.reads);
- prev_diskstat.operations_write = rrddim_set(st, "writes", diskstat.writes);
- rrdset_done(st);
- /* Get reads time. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsTotalReadTimeKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.time_read);
- }
- /* Get writes time. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsTotalWriteTimeKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.time_write);
- }
- st = rrdset_find_active_bytype_localhost("disk_util", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_util"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.util"
- , "Disk Utilization Time"
- , "% of time working"
- , "macos.plugin"
- , "iokit"
- , 2004
- , update_every
- , RRDSET_TYPE_AREA
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "utilization", NULL, 1, 10000000, RRD_ALGORITHM_INCREMENTAL);
- }
- cur_diskstat.busy_time_ns = (diskstat.time_read + diskstat.time_write);
- prev_diskstat.busy_time_ns = rrddim_set(st, "utilization", cur_diskstat.busy_time_ns);
- rrdset_done(st);
- /* Get reads latency. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsLatentReadTimeKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.latency_read);
- }
- /* Get writes latency. */
- if (likely(number = (CFNumberRef)CFDictionaryGetValue(statistics, CFSTR(kIOBlockStorageDriverStatisticsLatentWriteTimeKey)))) {
- CFNumberGetValue(number, kCFNumberSInt64Type, &diskstat.latency_write);
- }
- st = rrdset_find_active_bytype_localhost("disk_iotime", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_iotime"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.iotime"
- , "Disk Total I/O Time"
- , "milliseconds/s"
- , "macos.plugin"
- , "iokit"
- , 2022
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "reads", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "writes", NULL, -1, 1000000, RRD_ALGORITHM_INCREMENTAL);
- }
- cur_diskstat.duration_read_ns = diskstat.time_read + diskstat.latency_read;
- cur_diskstat.duration_write_ns = diskstat.time_write + diskstat.latency_write;
- prev_diskstat.duration_read_ns = rrddim_set(st, "reads", cur_diskstat.duration_read_ns);
- prev_diskstat.duration_write_ns = rrddim_set(st, "writes", cur_diskstat.duration_write_ns);
- rrdset_done(st);
- // calculate differential charts
- // only if this is not the first time we run
- if (likely(dt)) {
- st = rrdset_find_active_bytype_localhost("disk_await", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_await"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.await"
- , "Average Completed I/O Operation Time"
- , "milliseconds/operation"
- , "macos.plugin"
- , "iokit"
- , 2005
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "reads", NULL, 1, 1000000, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "writes", NULL, -1, 1000000, RRD_ALGORITHM_ABSOLUTE);
- }
- rrddim_set(st, "reads", (diskstat.reads - prev_diskstat.operations_read) ?
- (cur_diskstat.duration_read_ns - prev_diskstat.duration_read_ns) / (diskstat.reads - prev_diskstat.operations_read) : 0);
- rrddim_set(st, "writes", (diskstat.writes - prev_diskstat.operations_write) ?
- (cur_diskstat.duration_write_ns - prev_diskstat.duration_write_ns) / (diskstat.writes - prev_diskstat.operations_write) : 0);
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("disk_avgsz", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_avgsz"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.avgsz"
- , "Average Completed I/O Operation Bandwidth"
- , "KiB/operation"
- , "macos.plugin"
- , "iokit"
- , 2006
- , update_every
- , RRDSET_TYPE_AREA
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "reads", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "writes", NULL, -1, 1024, RRD_ALGORITHM_ABSOLUTE);
- }
- rrddim_set(st, "reads", (diskstat.reads - prev_diskstat.operations_read) ?
- (diskstat.bytes_read - prev_diskstat.bytes_read) / (diskstat.reads - prev_diskstat.operations_read) : 0);
- rrddim_set(st, "writes", (diskstat.writes - prev_diskstat.operations_write) ?
- (diskstat.bytes_write - prev_diskstat.bytes_write) / (diskstat.writes - prev_diskstat.operations_write) : 0);
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("disk_svctm", diskstat.name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "disk_svctm"
- , diskstat.name
- , NULL
- , diskstat.name
- , "disk.svctm"
- , "Average Service Time"
- , "milliseconds/operation"
- , "macos.plugin"
- , "iokit"
- , 2007
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "svctm", NULL, 1, 1000000, RRD_ALGORITHM_ABSOLUTE);
- }
- rrddim_set(st, "svctm", ((diskstat.reads - prev_diskstat.operations_read) + (diskstat.writes - prev_diskstat.operations_write)) ?
- (cur_diskstat.busy_time_ns - prev_diskstat.busy_time_ns) / ((diskstat.reads - prev_diskstat.operations_read) + (diskstat.writes - prev_diskstat.operations_write)) : 0);
- rrdset_done(st);
- }
- }
- /* Release. */
- CFRelease(properties);
- }
- /* Release. */
- IOObjectRelease(drive);
- }
- IOIteratorReset(drive_list);
- /* Release. */
- IOObjectRelease(drive_list);
- }
- if (likely(do_io)) {
- st = rrdset_find_active_bytype_localhost("system", "io");
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "system"
- , "io"
- , NULL
- , "disk"
- , NULL
- , "Disk I/O"
- , "KiB/s"
- , "macos.plugin"
- , "iokit"
- , 150
- , update_every
- , RRDSET_TYPE_AREA
- );
- rrddim_add(st, "in", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "out", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "in", total_disk_reads);
- rrddim_set(st, "out", total_disk_writes);
- rrdset_done(st);
- }
- // Can be merged with FreeBSD plugin
- if (likely(do_space || do_inodes)) {
- // there is no mount info in sysctl MIBs
- if (unlikely(!(mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)))) {
- collector_error("MACOS: getmntinfo() failed");
- do_space = 0;
- collector_error("DISABLED: disk_space.X");
- do_inodes = 0;
- collector_error("DISABLED: disk_inodes.X");
- } else {
- for (i = 0; i < mntsize; i++) {
- if (mntbuf[i].f_flags == MNT_RDONLY ||
- mntbuf[i].f_blocks == 0 ||
- // taken from gnulib/mountlist.c and shortened to FreeBSD related fstypes
- strcmp(mntbuf[i].f_fstypename, "autofs") == 0 ||
- strcmp(mntbuf[i].f_fstypename, "procfs") == 0 ||
- strcmp(mntbuf[i].f_fstypename, "subfs") == 0 ||
- strcmp(mntbuf[i].f_fstypename, "devfs") == 0 ||
- strcmp(mntbuf[i].f_fstypename, "none") == 0)
- continue;
- // --------------------------------------------------------------------------
- if (likely(do_space)) {
- st = rrdset_find_active_bytype_localhost("disk_space", mntbuf[i].f_mntonname);
- if (unlikely(!st)) {
- snprintfz(title, 4096, "Disk Space Usage for %s [%s]", mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
- st = rrdset_create_localhost(
- "disk_space"
- , mntbuf[i].f_mntonname
- , NULL
- , mntbuf[i].f_mntonname
- , "disk.space"
- , title
- , "GiB"
- , "macos.plugin"
- , "iokit"
- , 2023
- , update_every
- , RRDSET_TYPE_STACKED
- );
- rrddim_add(st, "avail", NULL, mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "used", NULL, mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "reserved_for_root", "reserved for root", mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- }
- rrddim_set(st, "avail", (collected_number) mntbuf[i].f_bavail);
- rrddim_set(st, "used", (collected_number) (mntbuf[i].f_blocks - mntbuf[i].f_bfree));
- rrddim_set(st, "reserved_for_root", (collected_number) (mntbuf[i].f_bfree - mntbuf[i].f_bavail));
- rrdset_done(st);
- }
- // --------------------------------------------------------------------------
- if (likely(do_inodes)) {
- st = rrdset_find_active_bytype_localhost("disk_inodes", mntbuf[i].f_mntonname);
- if (unlikely(!st)) {
- snprintfz(title, 4096, "Disk Files (inodes) Usage for %s [%s]", mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
- st = rrdset_create_localhost(
- "disk_inodes"
- , mntbuf[i].f_mntonname
- , NULL
- , mntbuf[i].f_mntonname
- , "disk.inodes"
- , title
- , "inodes"
- , "macos.plugin"
- , "iokit"
- , 2024
- , update_every
- , RRDSET_TYPE_STACKED
- );
- rrddim_add(st, "avail", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
- rrddim_add(st, "reserved_for_root", "reserved for root", 1, 1, RRD_ALGORITHM_ABSOLUTE);
- }
- rrddim_set(st, "avail", (collected_number) mntbuf[i].f_ffree);
- rrddim_set(st, "used", (collected_number) (mntbuf[i].f_files - mntbuf[i].f_ffree));
- rrdset_done(st);
- }
- }
- }
- }
- // Can be merged with FreeBSD plugin
- if (likely(do_bandwidth)) {
- if (unlikely(getifaddrs(&ifap))) {
- collector_error("MACOS: getifaddrs()");
- do_bandwidth = 0;
- collector_error("DISABLED: system.ipv4");
- } else {
- for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
- if (ifa->ifa_addr->sa_family != AF_LINK)
- continue;
- st = rrdset_find_active_bytype_localhost("net", ifa->ifa_name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "net"
- , ifa->ifa_name
- , NULL
- , ifa->ifa_name
- , "net.net"
- , "Bandwidth"
- , "kilobits/s"
- , "macos.plugin"
- , "iokit"
- , 7000
- , update_every
- , RRDSET_TYPE_AREA
- );
- rrddim_add(st, "received", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "sent", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "received", IFA_DATA(ibytes));
- rrddim_set(st, "sent", IFA_DATA(obytes));
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("net_packets", ifa->ifa_name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "net_packets"
- , ifa->ifa_name
- , NULL
- , ifa->ifa_name
- , "net.packets"
- , "Packets"
- , "packets/s"
- , "macos.plugin"
- , "iokit"
- , 7001
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "multicast_received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "multicast_sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "received", IFA_DATA(ipackets));
- rrddim_set(st, "sent", IFA_DATA(opackets));
- rrddim_set(st, "multicast_received", IFA_DATA(imcasts));
- rrddim_set(st, "multicast_sent", IFA_DATA(omcasts));
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("net_errors", ifa->ifa_name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "net_errors"
- , ifa->ifa_name
- , NULL
- , ifa->ifa_name
- , "net.errors"
- , "Interface Errors"
- , "errors/s"
- , "macos.plugin"
- , "iokit"
- , 7002
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "inbound", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "outbound", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "inbound", IFA_DATA(ierrors));
- rrddim_set(st, "outbound", IFA_DATA(oerrors));
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("net_drops", ifa->ifa_name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "net_drops"
- , ifa->ifa_name
- , NULL
- , ifa->ifa_name
- , "net.drops"
- , "Interface Drops"
- , "drops/s"
- , "macos.plugin"
- , "iokit"
- , 7003
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "inbound", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "inbound", IFA_DATA(iqdrops));
- rrdset_done(st);
- st = rrdset_find_active_bytype_localhost("net_events", ifa->ifa_name);
- if (unlikely(!st)) {
- st = rrdset_create_localhost(
- "net_events"
- , ifa->ifa_name
- , NULL
- , ifa->ifa_name
- , "net.events"
- , "Network Interface Events"
- , "events/s"
- , "macos.plugin"
- , "iokit"
- , 7006
- , update_every
- , RRDSET_TYPE_LINE
- );
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
- rrddim_add(st, "frames", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "collisions", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- rrddim_add(st, "carrier", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
- }
- rrddim_set(st, "collisions", IFA_DATA(collisions));
- rrdset_done(st);
- }
- freeifaddrs(ifap);
- }
- }
- return 0;
- }
|