--- /dev/null +++ b/src/ipstatistics.c @@ -0,0 +1,104 @@ +/* + This Plugin is based opn the interface.c Plugin. +*/ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "plugin.h" +#include "utils/cmds/putval.h" +#include "utils/common/common.h" + +/* Copied from interface.c */ +static void ipstatistics_submit(const char *type, derive_t ip4rx, + derive_t ip4tx, derive_t ip6rx, derive_t ip6tx) { + value_list_t vl = VALUE_LIST_INIT; + value_t values[] = { + {.derive = ip4rx}, + {.derive = ip4tx}, + {.derive = ip6rx}, + {.derive = ip6tx} + }; + + vl.values = values; + vl.values_len = STATIC_ARRAY_SIZE(values); + sstrncpy(vl.plugin, "ipstatistics", sizeof(vl.plugin)); + sstrncpy(vl.plugin_instance, "all", sizeof(vl.plugin_instance)); + sstrncpy(vl.type, type, sizeof(vl.type)); + + plugin_dispatch_values(&vl); +} /* void if_submit */ + +int ipstatistics_read() { + FILE *fh; + char buffer[1024]; + char *fields[19]; + int numfields; + + derive_t ip4_in = 0; + derive_t ip4_out = 0; + derive_t ip6_in = 0; + derive_t ip6_out = 0; + + if ((fh = fopen("/proc/net/snmp6", "r")) == NULL) { + WARNING("ipstatistics plugin: try opening %s : fopen: %s", "/proc/net/snmp6", + STRERRNO); + return -1; + } + + while (fgets(buffer, 1024, fh) != NULL) { + numfields = strsplit(buffer, fields, 2); + + if (numfields < 2) + return -1; + + if (strcasecmp(fields[0], "Ip6OutOctets") == 0) { + ip6_out = atoll(fields[1]); + } + + if (strcasecmp(fields[0], "Ip6InOctets") == 0) { + ip6_in = atoll(fields[1]); + } + } + + fclose(fh); + + if ((fh = fopen("/proc/net/netstat", "r")) == NULL) { + WARNING("ipstatistics plugin: try opening %s : fopen: %s", "/proc/net/netstat", + STRERRNO); + return -1; + } + + int count_ipext = 0; + while (fgets(buffer, 1024, fh) != NULL) { + numfields = strsplit(buffer, fields, 19); + + if (numfields < 8) + return -1; + + if (strcasecmp(fields[0], "IpExt:") == 0) { + count_ipext++; + if (count_ipext == 2) { + ip4_in = atoll(fields[7]); + ip4_out = atoll(fields[8]); + } + } + } + + fclose(fh); + + ipstatistics_submit("ip_stats_octets", ip4_in, ip4_out, ip6_in, ip6_out); + return 0; +} + +void module_register(void) { + plugin_register_read("ipstatistics", ipstatistics_read); +} /* void module_register */ + --- a/src/types.db +++ b/src/types.db @@ -148,6 +148,7 @@ invocations value:DERIVE:0:U io_octets rx:DERIVE:0:U, tx:DERIVE:0:U io_ops read:DERIVE:0:U, write:DERIVE:0:U io_packets rx:DERIVE:0:U, tx:DERIVE:0:U +ip_stats_octets ip4rx:DERIVE:0:U, ip4tx:DERIVE:0:U, ip6rx:DERIVE:0:U, ip6tx:DERIVE:0:U ipc value:GAUGE:0:U ipt_bytes value:DERIVE:0:U ipt_packets value:DERIVE:0:U --- a/Makefile.am +++ b/Makefile.am @@ -1239,6 +1239,12 @@ ipstats_la_SOURCES = src/ipstats.c ipstats_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif +if BUILD_PLUGIN_IPSTATISTICS +pkglib_LTLIBRARIES += ipstatistics.la +ipstatistics_la_SOURCES = src/ipstatistics.c +ipstatistics_la_LDFLAGS = $(PLUGIN_LDFLAGS) +endif + if BUILD_PLUGIN_IPVS pkglib_LTLIBRARIES += ipvs.la ipvs_la_SOURCES = src/ipvs.c --- a/configure.ac +++ b/configure.ac @@ -7091,6 +7091,7 @@ AC_PLUGIN([ipc], [$plugi AC_PLUGIN([ipmi], [$plugin_ipmi], [IPMI sensor statistics]) AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters]) AC_PLUGIN([ipstats], [$plugin_ipstats], [IP packet statistics]) +AC_PLUGIN([ipstatistics], [yes], [IP4 and IP6 statistics]) AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics]) AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics]) AC_PLUGIN([iwinfo], [$with_iwinfo], [Common iwinfo wireless statistics]) @@ -7542,6 +7543,7 @@ AC_MSG_RESULT([ ipc . . . . . . . . . AC_MSG_RESULT([ ipmi . . . . . . . . $enable_ipmi]) AC_MSG_RESULT([ iptables . . . . . . $enable_iptables]) AC_MSG_RESULT([ ipstats . . . . . . . $enable_ipstats]) +AC_MSG_RESULT([ ipstatistics . . . . $enable_ipstatistics]) AC_MSG_RESULT([ ipvs . . . . . . . . $enable_ipvs]) AC_MSG_RESULT([ irq . . . . . . . . . $enable_irq]) AC_MSG_RESULT([ iwinfo . . . . . . . $enable_iwinfo]) --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -145,6 +145,7 @@ #@BUILD_PLUGIN_IPC_TRUE@LoadPlugin ipc #@BUILD_PLUGIN_IPMI_TRUE@LoadPlugin ipmi #@BUILD_PLUGIN_IPSTATS_TRUE@LoadPlugin ipstats +#@BUILD_PLUGIN_IPSTATISTICS_TRUE@LoadPlugin ipstatistics #@BUILD_PLUGIN_IPTABLES_TRUE@LoadPlugin iptables #@BUILD_PLUGIN_IPVS_TRUE@LoadPlugin ipvs #@BUILD_PLUGIN_IRQ_TRUE@LoadPlugin irq