11 #include "plugin_proc.h"
13 #define RRD_TYPE_NET_SNMP "ipv4"
14 #define RRD_TYPE_NET_SNMP_LEN strlen(RRD_TYPE_NET_SNMP)
16 int do_proc_net_snmp(int update_every, unsigned long long dt) {
17 static procfile *ff = NULL;
18 static int do_ip_packets = -1, do_ip_fragsout = -1, do_ip_fragsin = -1, do_ip_errors = -1,
19 do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
20 do_udp_packets = -1, do_udp_errors = -1;
22 if(do_ip_packets == -1) do_ip_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 packets", 1);
23 if(do_ip_fragsout == -1) do_ip_fragsout = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragrments sent", 1);
24 if(do_ip_fragsin == -1) do_ip_fragsin = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragments assembly", 1);
25 if(do_ip_errors == -1) do_ip_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 errors", 1);
26 if(do_tcp_sockets == -1) do_tcp_sockets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP connections", 1);
27 if(do_tcp_packets == -1) do_tcp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP packets", 1);
28 if(do_tcp_errors == -1) do_tcp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP errors", 1);
29 if(do_tcp_handshake == -1) do_tcp_handshake = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP handshake issues", 1);
30 if(do_udp_packets == -1) do_udp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP packets", 1);
31 if(do_udp_errors == -1) do_udp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP errors", 1);
35 if(!ff) ff = procfile_open("/proc/net/snmp", " \t:", PROCFILE_FLAG_DEFAULT);
38 ff = procfile_readall(ff);
39 if(!ff) return 0; // we return 0, so that we will retry to open it next time
41 uint32_t lines = procfile_lines(ff), l;
46 for(l = 0; l < lines ;l++) {
47 if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) {
50 if(strcmp(procfile_lineword(ff, l, 0), "Ip") != 0) {
51 error("Cannot read Ip line from /proc/net/snmp.");
55 words = procfile_linewords(ff, l);
57 error("Cannot read /proc/net/snmp Ip line. Expected 20 params, read %d.", words);
61 // see also http://net-snmp.sourceforge.net/docs/mibs/ip.html
62 unsigned long long Forwarding, DefaultTTL, InReceives, InHdrErrors, InAddrErrors, ForwDatagrams, InUnknownProtos, InDiscards, InDelivers,
63 OutRequests, OutDiscards, OutNoRoutes, ReasmTimeout, ReasmReqds, ReasmOKs, ReasmFails, FragOKs, FragFails, FragCreates;
65 Forwarding = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
66 DefaultTTL = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
67 InReceives = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
68 InHdrErrors = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
69 InAddrErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
70 ForwDatagrams = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
71 InUnknownProtos = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
72 InDiscards = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
73 InDelivers = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
74 OutRequests = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
75 OutDiscards = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
76 OutNoRoutes = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
77 ReasmTimeout = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
78 ReasmReqds = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
79 ReasmOKs = strtoull(procfile_lineword(ff, l, 15), NULL, 10);
80 ReasmFails = strtoull(procfile_lineword(ff, l, 16), NULL, 10);
81 FragOKs = strtoull(procfile_lineword(ff, l, 17), NULL, 10);
82 FragFails = strtoull(procfile_lineword(ff, l, 18), NULL, 10);
83 FragCreates = strtoull(procfile_lineword(ff, l, 19), NULL, 10);
85 // these are not counters
86 if(Forwarding) {}; // is forwarding enabled?
87 if(DefaultTTL) {}; // the default ttl on packets
88 if(ReasmTimeout) {}; // reassemply timeout
90 // this counter is not used
91 if(InDelivers) {}; // total number of packets delivered to IP user-protcols
93 // --------------------------------------------------------------------
96 st = rrdset_find(RRD_TYPE_NET_SNMP ".packets");
98 st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, RRD_TYPE_NET_SNMP, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE);
100 rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
101 rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
102 rrddim_add(st, "forwarded", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
104 else rrdset_next(st);
106 rrddim_set(st, "sent", OutRequests);
107 rrddim_set(st, "received", InReceives);
108 rrddim_set(st, "forwarded", ForwDatagrams);
112 // --------------------------------------------------------------------
115 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout");
117 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE);
120 rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
121 rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
122 rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
124 else rrdset_next(st);
126 rrddim_set(st, "ok", FragOKs);
127 rrddim_set(st, "failed", FragFails);
128 rrddim_set(st, "all", FragCreates);
132 // --------------------------------------------------------------------
135 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin");
137 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE);
140 rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
141 rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
142 rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
144 else rrdset_next(st);
146 rrddim_set(st, "ok", ReasmOKs);
147 rrddim_set(st, "failed", ReasmFails);
148 rrddim_set(st, "all", ReasmReqds);
152 // --------------------------------------------------------------------
155 st = rrdset_find(RRD_TYPE_NET_SNMP ".errors");
157 st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, RRD_TYPE_NET_SNMP, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE);
160 rrddim_add(st, "InDiscards", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
161 rrddim_add(st, "OutDiscards", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
163 rrddim_add(st, "InHdrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
164 rrddim_add(st, "InAddrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
165 rrddim_add(st, "InUnknownProtos", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
167 rrddim_add(st, "OutNoRoutes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
169 else rrdset_next(st);
171 rrddim_set(st, "InDiscards", InDiscards);
172 rrddim_set(st, "OutDiscards", OutDiscards);
173 rrddim_set(st, "InHdrErrors", InHdrErrors);
174 rrddim_set(st, "InAddrErrors", InAddrErrors);
175 rrddim_set(st, "InUnknownProtos", InUnknownProtos);
176 rrddim_set(st, "OutNoRoutes", OutNoRoutes);
180 else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) {
183 if(strcmp(procfile_lineword(ff, l, 0), "Tcp") != 0) {
184 error("Cannot read Tcp line from /proc/net/snmp.");
188 words = procfile_linewords(ff, l);
190 error("Cannot read /proc/net/snmp Tcp line. Expected 15 params, read %d.", words);
194 unsigned long long RtoAlgorithm, RtoMin, RtoMax, MaxConn, ActiveOpens, PassiveOpens, AttemptFails, EstabResets,
195 CurrEstab, InSegs, OutSegs, RetransSegs, InErrs, OutRsts;
197 RtoAlgorithm = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
198 RtoMin = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
199 RtoMax = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
200 MaxConn = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
201 ActiveOpens = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
202 PassiveOpens = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
203 AttemptFails = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
204 EstabResets = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
205 CurrEstab = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
206 InSegs = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
207 OutSegs = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
208 RetransSegs = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
209 InErrs = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
210 OutRsts = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
212 // these are not counters
218 // --------------------------------------------------------------------
220 // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
222 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock");
224 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE);
226 rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
228 else rrdset_next(st);
230 rrddim_set(st, "connections", CurrEstab);
234 // --------------------------------------------------------------------
237 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets");
239 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE);
241 rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
242 rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
244 else rrdset_next(st);
246 rrddim_set(st, "received", InSegs);
247 rrddim_set(st, "sent", OutSegs);
251 // --------------------------------------------------------------------
254 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors");
256 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE);
259 rrddim_add(st, "InErrs", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
260 rrddim_add(st, "RetransSegs", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
262 else rrdset_next(st);
264 rrddim_set(st, "InErrs", InErrs);
265 rrddim_set(st, "RetransSegs", RetransSegs);
269 // --------------------------------------------------------------------
271 if(do_tcp_handshake) {
272 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake");
274 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE);
277 rrddim_add(st, "EstabResets", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
278 rrddim_add(st, "OutRsts", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
279 rrddim_add(st, "ActiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
280 rrddim_add(st, "PassiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
281 rrddim_add(st, "AttemptFails", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
283 else rrdset_next(st);
285 rrddim_set(st, "EstabResets", EstabResets);
286 rrddim_set(st, "OutRsts", OutRsts);
287 rrddim_set(st, "ActiveOpens", ActiveOpens);
288 rrddim_set(st, "PassiveOpens", PassiveOpens);
289 rrddim_set(st, "AttemptFails", AttemptFails);
293 else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) {
296 if(strcmp(procfile_lineword(ff, l, 0), "Udp") != 0) {
297 error("Cannot read Udp line from /proc/net/snmp.");
301 words = procfile_linewords(ff, l);
303 error("Cannot read /proc/net/snmp Udp line. Expected 7 params, read %d.", words);
307 unsigned long long InDatagrams, NoPorts, InErrors, OutDatagrams, RcvbufErrors, SndbufErrors;
309 InDatagrams = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
310 NoPorts = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
311 InErrors = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
312 OutDatagrams = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
313 RcvbufErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
314 SndbufErrors = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
316 // --------------------------------------------------------------------
318 // see http://net-snmp.sourceforge.net/docs/mibs/udp.html
320 st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets");
322 st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE);
324 rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
325 rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
327 else rrdset_next(st);
329 rrddim_set(st, "received", InDatagrams);
330 rrddim_set(st, "sent", OutDatagrams);
334 // --------------------------------------------------------------------
337 st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors");
339 st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE);
342 rrddim_add(st, "RcvbufErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
343 rrddim_add(st, "SndbufErrors", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
344 rrddim_add(st, "InErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
345 rrddim_add(st, "NoPorts", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
347 else rrdset_next(st);
349 rrddim_set(st, "InErrors", InErrors);
350 rrddim_set(st, "NoPorts", NoPorts);
351 rrddim_set(st, "RcvbufErrors", RcvbufErrors);
352 rrddim_set(st, "SndbufErrors", SndbufErrors);