| --- /dev/null |
| +++ b/src/ipstatistics.c |
| @@ -0,0 +1,104 @@ |
| +/* |
| + This Plugin is based opn the interface.c Plugin. |
| +*/ |
| +#include <errno.h> |
| +#include <stdbool.h> |
| +#include <stdint.h> |
| +#include <stdio.h> |
| +#include <stdlib.h> |
| +#include <string.h> |
| + |
| +#include <ifaddrs.h> |
| +#include <net/if.h> |
| +#include <sys/types.h> |
| + |
| +#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 |