[collectd] [Patch] Netlink plugin: query 64bit counters where possible
Bruno Prémont
bonbons at linux-vserver.org
Sat Nov 15 22:27:19 CET 2014
When 64bit counters can be queried via netlink, query those instead
of short 32bit counters.
Signed-off-by: Bruno Prémont <bonbons at linux-vserver.org>
---
diff --git a/src/netlink.c b/src/netlink.c
--- a/src/netlink.c 2014-01-26 09:09:23.532559941 +0100
+++ b/src/netlink.c 2014-04-06 00:02:57.359894383 +0200
@@ -275,13 +275,59 @@ static void check_ignorelist_and_submit
} /* void check_ignorelist_and_submit */
+#ifdef IFLA_STATS64
+static void check_ignorelist_and_submit64 (const char *dev,
+ struct rtnl_link_stats64 *stats)
+{
+
+ if (check_ignorelist (dev, "interface", NULL) == 0)
+ {
+ submit_two (dev, "if_octets", NULL, stats->rx_bytes, stats->tx_bytes);
+ submit_two (dev, "if_packets", NULL, stats->rx_packets, stats->tx_packets);
+ submit_two (dev, "if_errors", NULL, stats->rx_errors, stats->tx_errors);
+ }
+ else
+ {
+ DEBUG ("netlink plugin: Ignoring %s/interface.", dev);
+ }
+
+ if (check_ignorelist (dev, "if_detail", NULL) == 0)
+ {
+ submit_two (dev, "if_dropped", NULL, stats->rx_dropped, stats->tx_dropped);
+ submit_one (dev, "if_multicast", NULL, stats->multicast);
+ submit_one (dev, "if_collisions", NULL, stats->collisions);
+
+ submit_one (dev, "if_rx_errors", "length", stats->rx_length_errors);
+ submit_one (dev, "if_rx_errors", "over", stats->rx_over_errors);
+ submit_one (dev, "if_rx_errors", "crc", stats->rx_crc_errors);
+ submit_one (dev, "if_rx_errors", "frame", stats->rx_frame_errors);
+ submit_one (dev, "if_rx_errors", "fifo", stats->rx_fifo_errors);
+ submit_one (dev, "if_rx_errors", "missed", stats->rx_missed_errors);
+
+ submit_one (dev, "if_tx_errors", "aborted", stats->tx_aborted_errors);
+ submit_one (dev, "if_tx_errors", "carrier", stats->tx_carrier_errors);
+ submit_one (dev, "if_tx_errors", "fifo", stats->tx_fifo_errors);
+ submit_one (dev, "if_tx_errors", "heartbeat", stats->tx_heartbeat_errors);
+ submit_one (dev, "if_tx_errors", "window", stats->tx_window_errors);
+ }
+ else
+ {
+ DEBUG ("netlink plugin: Ignoring %s/if_detail.", dev);
+ }
+
+} /* void check_ignorelist_and_submit64 */
+#endif
+
static int link_filter_cb (const struct nlmsghdr *nlh,
void *args __attribute__((unused)))
{
struct ifinfomsg *ifm = mnl_nlmsg_get_payload (nlh);
struct nlattr *attr;
- struct rtnl_link_stats *stats = NULL;
const char *dev = NULL;
+ struct rtnl_link_stats *stats = NULL;
+#ifdef IFLA_STATS64
+ struct rtnl_link_stats64 *stats64 = NULL;
+#endif
if (nlh->nlmsg_type != RTM_NEWLINK)
{
@@ -316,21 +362,39 @@ static int link_filter_cb (const struct
mnl_attr_for_each (attr, nlh, sizeof (*ifm))
{
- if (mnl_attr_get_type (attr) != IFLA_STATS)
- continue;
-
- if (mnl_attr_validate2 (attr, MNL_TYPE_UNSPEC, sizeof (*stats)) < 0)
+ if (mnl_attr_get_type (attr) == IFLA_STATS)
{
- ERROR ("netlink plugin: link_filter_cb: IFLA_STATS mnl_attr_validate2 failed.");
- return MNL_CB_ERROR;
+ if (mnl_attr_validate2 (attr, MNL_TYPE_UNSPEC, sizeof (*stats)) < 0)
+ {
+ ERROR ("netlink plugin: link_filter_cb: IFLA_STATS mnl_attr_validate2 failed.");
+ return MNL_CB_ERROR;
+ }
+ stats = mnl_attr_get_payload (attr);
}
- stats = mnl_attr_get_payload (attr);
-
- check_ignorelist_and_submit (dev, stats);
- break;
+#ifdef IFLA_STATS64
+ else
+ if (mnl_attr_get_type (attr) == IFLA_STATS64)
+ {
+ struct rtnl_link_stats64 *stats64;
+ if (mnl_attr_validate2 (attr, MNL_TYPE_UNSPEC, sizeof (*stats64)) < 0)
+ {
+ ERROR ("netlink plugin: link_filter_cb: IFLA_STATS64 mnl_attr_validate2 failed.");
+ return MNL_CB_ERROR;
+ }
+ stats64 = mnl_attr_get_payload (attr);
+ break;
+ }
+#endif
}
- if (stats == NULL)
+#ifdef IFLA_STATS64
+ if (stats64)
+ check_ignorelist_and_submit64 (dev, stats64);
+ else
+#endif
+ if (stats)
+ check_ignorelist_and_submit (dev, stats);
+ else
{
DEBUG ("netlink plugin: link_filter: No statistics for interface %s.", dev);
return MNL_CB_OK;
--
More information about the collectd
mailing list