forked from immortalwrt/packages
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
collectd: add plugin to compare ipv4,ipv6 stats
Add "ipstatistics"-plugin. This plugin parses "/proc/net/netstat" and "/proc/net/snmp6" to get the overall ipv4 and ipv6 usage. Signed-off-by: Nick Hainke <[email protected]>
- Loading branch information
1 parent
2bbfe1e
commit 93ff4cc
Showing
2 changed files
with
163 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
--- /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 |