From a8a3dae610765b23bf1fca55e2ded96efe0bb94c Mon Sep 17 00:00:00 2001 From: rinigus Date: Wed, 13 Jul 2016 14:55:44 +0300 Subject: [PATCH] add ActiveInterfaceOnly option to interface plugin --- src/collectd.conf.in | 1 + src/collectd.conf.pod | 12 +++++++++++ src/interface.c | 56 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 54072d0f..bf9e8e6f 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -582,6 +582,7 @@ # # Interface "eth0" # IgnoreSelected false +# ActiveInterfaceOnly false # UniqueName false # diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 24dc59db..5bbbf5db 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -2735,6 +2735,18 @@ This will ignore the loopback interface, all interfaces with names starting with I and all interfaces with names starting with I followed by at least one digit. +=item B I|I + +When set to I, only interfaces with non-zero traffic will be +reported. Note that the check is done by looking into whether a +package was sent at any time from boot and the corresponding counter +is non-zero. So, if the interface has been sending data in the past +since boot, but not during the reported time-interval, it will still +be reported. + +The default value is I and results in collection of the data +from all interfaces that are selected by B and +B options. =item B I|I diff --git a/src/interface.c b/src/interface.c index d05dd723..2a6a027d 100644 --- a/src/interface.c +++ b/src/interface.c @@ -84,12 +84,15 @@ static const char *config_keys[] = { "Interface", "IgnoreSelected", + "ActiveInterfaceOnly", NULL }; -static int config_keys_num = 2; +static int config_keys_num = 3; static ignorelist_t *ignorelist = NULL; +static _Bool active_interface_only = 0; + #ifdef HAVE_LIBKSTAT #define MAX_NUMIF 256 extern kstat_ctl_t *kc; @@ -114,6 +117,13 @@ static int interface_config (const char *key, const char *value) invert = 0; ignorelist_set_invert (ignorelist, invert); } + else if (strcasecmp (key, "ActiveInterfaceOnly") == 0) + { + if (IS_TRUE (value)) + active_interface_only = 1; + else + active_interface_only = 0; + } else if (strcasecmp (key, "UniqueName") == 0) { #ifdef HAVE_LIBKSTAT @@ -223,6 +233,9 @@ static int interface_read (void) if (if_ptr->ifa_addr != NULL && if_ptr->ifa_addr->sa_family == AF_LINK) { if_data = (struct IFA_DATA *) if_ptr->ifa_data; + if ( active_interface_only && if_data->IFA_RX_PACKT == 0 && if_data->IFA_TX_PACKT == 0 ) + continue; + if_submit (if_ptr->ifa_name, "if_octets", if_data->IFA_RX_BYTES, if_data->IFA_TX_BYTES); @@ -275,14 +288,17 @@ static int interface_read (void) if (numfields < 11) continue; - incoming = atoll (fields[0]); - outgoing = atoll (fields[8]); - if_submit (device, "if_octets", incoming, outgoing); - incoming = atoll (fields[1]); outgoing = atoll (fields[9]); + if ( active_interface_only && incoming == 0 && outgoing == 0 ) + continue; + if_submit (device, "if_packets", incoming, outgoing); + incoming = atoll (fields[0]); + outgoing = atoll (fields[8]); + if_submit (device, "if_octets", incoming, outgoing); + incoming = atoll (fields[2]); outgoing = atoll (fields[10]); if_submit (device, "if_errors", incoming, outgoing); @@ -315,26 +331,28 @@ static int interface_read (void) sstrncpy(iname, ksp[i]->ks_name, sizeof(iname)); /* try to get 64bit counters */ - rx = get_kstat_value (ksp[i], "rbytes64"); - tx = get_kstat_value (ksp[i], "obytes64"); + rx = get_kstat_value (ksp[i], "ipackets64"); + tx = get_kstat_value (ksp[i], "opackets64"); /* or fallback to 32bit */ if (rx == -1LL) - rx = get_kstat_value (ksp[i], "rbytes"); + rx = get_kstat_value (ksp[i], "ipackets"); if (tx == -1LL) - tx = get_kstat_value (ksp[i], "obytes"); + tx = get_kstat_value (ksp[i], "opackets"); + if ( active_interface_only && rx == 0 && tx == 0 ) + continue; if ((rx != -1LL) || (tx != -1LL)) - if_submit (iname, "if_octets", rx, tx); + if_submit (iname, "if_packets", rx, tx); /* try to get 64bit counters */ - rx = get_kstat_value (ksp[i], "ipackets64"); - tx = get_kstat_value (ksp[i], "opackets64"); + rx = get_kstat_value (ksp[i], "rbytes64"); + tx = get_kstat_value (ksp[i], "obytes64"); /* or fallback to 32bit */ if (rx == -1LL) - rx = get_kstat_value (ksp[i], "ipackets"); + rx = get_kstat_value (ksp[i], "rbytes"); if (tx == -1LL) - tx = get_kstat_value (ksp[i], "opackets"); + tx = get_kstat_value (ksp[i], "obytes"); if ((rx != -1LL) || (tx != -1LL)) - if_submit (iname, "if_packets", rx, tx); + if_submit (iname, "if_octets", rx, tx); /* no 64bit error counters yet */ rx = get_kstat_value (ksp[i], "ierrors"); @@ -350,8 +368,11 @@ static int interface_read (void) ios = sg_get_network_io_stats (&num); - for (i = 0; i < num; i++) + for (i = 0; i < num; i++) { + if ( active_interface_only && ios[i].rx == 0 && ios[i].tx == 0 ) + continue; if_submit (ios[i].interface_name, "if_octets", ios[i].rx, ios[i].tx); + } /* #endif HAVE_LIBSTATGRAB */ #elif defined(HAVE_PERFSTAT) @@ -384,6 +405,9 @@ static int interface_read (void) for (i = 0; i < ifs; i++) { + if ( active_interface_only && ifstat[i].ipackets == 0 && ifstat[i].opackets == 0 ) + continue; + if_submit (ifstat[i].name, "if_octets", ifstat[i].ibytes, ifstat[i].obytes); if_submit (ifstat[i].name, "if_packets", ifstat[i].ipackets ,ifstat[i].opackets); if_submit (ifstat[i].name, "if_errors", ifstat[i].ierrors, ifstat[i].oerrors ); -- 2.11.0