10 #include "appconfig.h"
13 #include "plugin_proc.h"
15 #define RRD_TYPE_NET_SNMP "ipv4"
16 #define RRD_TYPE_NET_SNMP_LEN strlen(RRD_TYPE_NET_SNMP)
18 int do_proc_net_snmp(int update_every, unsigned long long dt) {
19 static procfile *ff = NULL;
20 static int do_ip_packets = -1, do_ip_fragsout = -1, do_ip_fragsin = -1, do_ip_errors = -1,
21 do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
22 do_udp_packets = -1, do_udp_errors = -1;
24 if(do_ip_packets == -1) do_ip_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 packets", 1);
25 if(do_ip_fragsout == -1) do_ip_fragsout = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragments sent", 1);
26 if(do_ip_fragsin == -1) do_ip_fragsin = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragments assembly", 1);
27 if(do_ip_errors == -1) do_ip_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 errors", 1);
28 if(do_tcp_sockets == -1) do_tcp_sockets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP connections", 1);
29 if(do_tcp_packets == -1) do_tcp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP packets", 1);
30 if(do_tcp_errors == -1) do_tcp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP errors", 1);
31 if(do_tcp_handshake == -1) do_tcp_handshake = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP handshake issues", 1);
32 if(do_udp_packets == -1) do_udp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP packets", 1);
33 if(do_udp_errors == -1) do_udp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP errors", 1);
38 char filename[FILENAME_MAX + 1];
39 snprintfz(filename, FILENAME_MAX, "%s%s", global_host_prefix, "/proc/net/snmp");
40 ff = procfile_open(config_get("plugin:proc:/proc/net/snmp", "filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
44 ff = procfile_readall(ff);
45 if(!ff) return 0; // we return 0, so that we will retry to open it next time
47 uint32_t lines = procfile_lines(ff), l;
52 for(l = 0; l < lines ;l++) {
53 if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) {
56 if(strcmp(procfile_lineword(ff, l, 0), "Ip") != 0) {
57 error("Cannot read Ip line from /proc/net/snmp.");
61 words = procfile_linewords(ff, l);
63 error("Cannot read /proc/net/snmp Ip line. Expected 20 params, read %d.", words);
67 // see also http://net-snmp.sourceforge.net/docs/mibs/ip.html
68 unsigned long long Forwarding, DefaultTTL, InReceives, InHdrErrors, InAddrErrors, ForwDatagrams, InUnknownProtos, InDiscards, InDelivers,
69 OutRequests, OutDiscards, OutNoRoutes, ReasmTimeout, ReasmReqds, ReasmOKs, ReasmFails, FragOKs, FragFails, FragCreates;
71 Forwarding = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
72 DefaultTTL = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
73 InReceives = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
74 InHdrErrors = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
75 InAddrErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
76 ForwDatagrams = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
77 InUnknownProtos = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
78 InDiscards = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
79 InDelivers = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
80 OutRequests = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
81 OutDiscards = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
82 OutNoRoutes = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
83 ReasmTimeout = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
84 ReasmReqds = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
85 ReasmOKs = strtoull(procfile_lineword(ff, l, 15), NULL, 10);
86 ReasmFails = strtoull(procfile_lineword(ff, l, 16), NULL, 10);
87 FragOKs = strtoull(procfile_lineword(ff, l, 17), NULL, 10);
88 FragFails = strtoull(procfile_lineword(ff, l, 18), NULL, 10);
89 FragCreates = strtoull(procfile_lineword(ff, l, 19), NULL, 10);
91 // these are not counters
92 if(Forwarding) {}; // is forwarding enabled?
93 if(DefaultTTL) {}; // the default ttl on packets
94 if(ReasmTimeout) {}; // Reassembly timeout
96 // this counter is not used
97 if(InDelivers) {}; // total number of packets delivered to IP user-protocols
99 // --------------------------------------------------------------------
102 st = rrdset_find(RRD_TYPE_NET_SNMP ".packets");
104 st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, "packets", NULL, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE);
106 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
107 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
108 rrddim_add(st, "forwarded", NULL, 1, 1, RRDDIM_INCREMENTAL);
110 else rrdset_next(st);
112 rrddim_set(st, "sent", OutRequests);
113 rrddim_set(st, "received", InReceives);
114 rrddim_set(st, "forwarded", ForwDatagrams);
118 // --------------------------------------------------------------------
121 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout");
123 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, "fragments", NULL, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE);
126 rrddim_add(st, "ok", NULL, 1, 1, RRDDIM_INCREMENTAL);
127 rrddim_add(st, "failed", NULL, -1, 1, RRDDIM_INCREMENTAL);
128 rrddim_add(st, "all", NULL, 1, 1, RRDDIM_INCREMENTAL);
130 else rrdset_next(st);
132 rrddim_set(st, "ok", FragOKs);
133 rrddim_set(st, "failed", FragFails);
134 rrddim_set(st, "all", FragCreates);
138 // --------------------------------------------------------------------
141 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin");
143 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, "fragments", NULL, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE);
146 rrddim_add(st, "ok", NULL, 1, 1, RRDDIM_INCREMENTAL);
147 rrddim_add(st, "failed", NULL, -1, 1, RRDDIM_INCREMENTAL);
148 rrddim_add(st, "all", NULL, 1, 1, RRDDIM_INCREMENTAL);
150 else rrdset_next(st);
152 rrddim_set(st, "ok", ReasmOKs);
153 rrddim_set(st, "failed", ReasmFails);
154 rrddim_set(st, "all", ReasmReqds);
158 // --------------------------------------------------------------------
161 st = rrdset_find(RRD_TYPE_NET_SNMP ".errors");
163 st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, "errors", NULL, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE);
166 rrddim_add(st, "InDiscards", NULL, 1, 1, RRDDIM_INCREMENTAL);
167 rrddim_add(st, "OutDiscards", NULL, -1, 1, RRDDIM_INCREMENTAL);
169 rrddim_add(st, "InHdrErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
170 rrddim_add(st, "InAddrErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
171 rrddim_add(st, "InUnknownProtos", NULL, 1, 1, RRDDIM_INCREMENTAL);
173 rrddim_add(st, "OutNoRoutes", NULL, -1, 1, RRDDIM_INCREMENTAL);
175 else rrdset_next(st);
177 rrddim_set(st, "InDiscards", InDiscards);
178 rrddim_set(st, "OutDiscards", OutDiscards);
179 rrddim_set(st, "InHdrErrors", InHdrErrors);
180 rrddim_set(st, "InAddrErrors", InAddrErrors);
181 rrddim_set(st, "InUnknownProtos", InUnknownProtos);
182 rrddim_set(st, "OutNoRoutes", OutNoRoutes);
186 else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) {
189 if(strcmp(procfile_lineword(ff, l, 0), "Tcp") != 0) {
190 error("Cannot read Tcp line from /proc/net/snmp.");
194 words = procfile_linewords(ff, l);
196 error("Cannot read /proc/net/snmp Tcp line. Expected 15 params, read %d.", words);
200 unsigned long long RtoAlgorithm, RtoMin, RtoMax, MaxConn, ActiveOpens, PassiveOpens, AttemptFails, EstabResets,
201 CurrEstab, InSegs, OutSegs, RetransSegs, InErrs, OutRsts;
203 RtoAlgorithm = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
204 RtoMin = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
205 RtoMax = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
206 MaxConn = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
207 ActiveOpens = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
208 PassiveOpens = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
209 AttemptFails = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
210 EstabResets = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
211 CurrEstab = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
212 InSegs = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
213 OutSegs = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
214 RetransSegs = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
215 InErrs = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
216 OutRsts = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
218 // these are not counters
224 // --------------------------------------------------------------------
226 // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
228 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock");
230 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", NULL, "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE);
232 rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
234 else rrdset_next(st);
236 rrddim_set(st, "connections", CurrEstab);
240 // --------------------------------------------------------------------
243 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets");
245 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", NULL, "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE);
247 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
248 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
250 else rrdset_next(st);
252 rrddim_set(st, "received", InSegs);
253 rrddim_set(st, "sent", OutSegs);
257 // --------------------------------------------------------------------
260 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors");
262 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", NULL, "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE);
265 rrddim_add(st, "InErrs", NULL, 1, 1, RRDDIM_INCREMENTAL);
266 rrddim_add(st, "RetransSegs", NULL, -1, 1, RRDDIM_INCREMENTAL);
268 else rrdset_next(st);
270 rrddim_set(st, "InErrs", InErrs);
271 rrddim_set(st, "RetransSegs", RetransSegs);
275 // --------------------------------------------------------------------
277 if(do_tcp_handshake) {
278 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake");
280 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", NULL, "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE);
283 rrddim_add(st, "EstabResets", NULL, 1, 1, RRDDIM_INCREMENTAL);
284 rrddim_add(st, "OutRsts", NULL, -1, 1, RRDDIM_INCREMENTAL);
285 rrddim_add(st, "ActiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
286 rrddim_add(st, "PassiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
287 rrddim_add(st, "AttemptFails", NULL, 1, 1, RRDDIM_INCREMENTAL);
289 else rrdset_next(st);
291 rrddim_set(st, "EstabResets", EstabResets);
292 rrddim_set(st, "OutRsts", OutRsts);
293 rrddim_set(st, "ActiveOpens", ActiveOpens);
294 rrddim_set(st, "PassiveOpens", PassiveOpens);
295 rrddim_set(st, "AttemptFails", AttemptFails);
299 else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) {
302 if(strcmp(procfile_lineword(ff, l, 0), "Udp") != 0) {
303 error("Cannot read Udp line from /proc/net/snmp.");
307 words = procfile_linewords(ff, l);
309 error("Cannot read /proc/net/snmp Udp line. Expected 7 params, read %d.", words);
313 unsigned long long InDatagrams, NoPorts, InErrors, OutDatagrams, RcvbufErrors, SndbufErrors;
315 InDatagrams = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
316 NoPorts = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
317 InErrors = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
318 OutDatagrams = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
319 RcvbufErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
320 SndbufErrors = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
322 // --------------------------------------------------------------------
324 // see http://net-snmp.sourceforge.net/docs/mibs/udp.html
326 st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets");
328 st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", NULL, "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE);
330 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
331 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
333 else rrdset_next(st);
335 rrddim_set(st, "received", InDatagrams);
336 rrddim_set(st, "sent", OutDatagrams);
340 // --------------------------------------------------------------------
343 st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors");
345 st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", NULL, "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE);
348 rrddim_add(st, "RcvbufErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
349 rrddim_add(st, "SndbufErrors", NULL, -1, 1, RRDDIM_INCREMENTAL);
350 rrddim_add(st, "InErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
351 rrddim_add(st, "NoPorts", NULL, 1, 1, RRDDIM_INCREMENTAL);
353 else rrdset_next(st);
355 rrddim_set(st, "InErrors", InErrors);
356 rrddim_set(st, "NoPorts", NoPorts);
357 rrddim_set(st, "RcvbufErrors", RcvbufErrors);
358 rrddim_set(st, "SndbufErrors", SndbufErrors);