Code

add ActiveInterfaceOnly option to interface plugin
authorrinigus <rinigus.git@gmail.com>
Wed, 13 Jul 2016 11:55:44 +0000 (14:55 +0300)
committerrinigus <rinigus.git@gmail.com>
Wed, 13 Jul 2016 13:10:59 +0000 (16:10 +0300)
src/collectd.conf.in
src/collectd.conf.pod
src/interface.c

index 54072d0fe63feec2a60f6711929c70cafda8c92e..bf9e8e6f3c267953fcd52bfc01d35269bfdb4d1c 100644 (file)
 #<Plugin interface>
 #      Interface "eth0"
 #      IgnoreSelected false
+#      ActiveInterfaceOnly false
 #      UniqueName false
 #</Plugin>
 
index 24dc59dbfd019c89e2359fb54ba7167d225ba7e8..5bbbf5db1c4ebed6f7c18e2aa5be6849cc893f82 100644 (file)
@@ -2735,6 +2735,18 @@ This will ignore the loopback interface, all interfaces with names starting
 with I<veth> and all interfaces with names starting with I<tun> followed by
 at least one digit.
 
+=item B<ActiveInterfaceOnly> I<true>|I<false>
+
+When set to I<true>, 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<false> and results in collection of the data
+from all interfaces that are selected by B<Interface> and
+B<IgnoreSelected> options.
 
 =item B<UniqueName> I<true>|I<false>
 
index d05dd72309f80ffd79c6e94fbe2c9509d962afce..2a6a027ddcda64d4e3511c53802906d1c605a2ad 100644 (file)
@@ -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 );