3 #define RRD_TYPE_NET_SNMP "ipv4"
4 #define RRD_TYPE_NET_SNMP_LEN strlen(RRD_TYPE_NET_SNMP)
6 int do_proc_net_snmp(int update_every, unsigned long long dt) {
7 static procfile *ff = NULL;
8 static int do_ip_packets = -1, do_ip_fragsout = -1, do_ip_fragsin = -1, do_ip_errors = -1,
9 do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
10 do_udp_packets = -1, do_udp_errors = -1;
12 if(do_ip_packets == -1) do_ip_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 packets", 1);
13 if(do_ip_fragsout == -1) do_ip_fragsout = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragments sent", 1);
14 if(do_ip_fragsin == -1) do_ip_fragsin = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 fragments assembly", 1);
15 if(do_ip_errors == -1) do_ip_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 errors", 1);
16 if(do_tcp_sockets == -1) do_tcp_sockets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP connections", 1);
17 if(do_tcp_packets == -1) do_tcp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP packets", 1);
18 if(do_tcp_errors == -1) do_tcp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP errors", 1);
19 if(do_tcp_handshake == -1) do_tcp_handshake = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 TCP handshake issues", 1);
20 if(do_udp_packets == -1) do_udp_packets = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP packets", 1);
21 if(do_udp_errors == -1) do_udp_errors = config_get_boolean("plugin:proc:/proc/net/snmp", "ipv4 UDP errors", 1);
26 char filename[FILENAME_MAX + 1];
27 snprintfz(filename, FILENAME_MAX, "%s%s", global_host_prefix, "/proc/net/snmp");
28 ff = procfile_open(config_get("plugin:proc:/proc/net/snmp", "filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
32 ff = procfile_readall(ff);
33 if(!ff) return 0; // we return 0, so that we will retry to open it next time
35 uint32_t lines = procfile_lines(ff), l;
40 for(l = 0; l < lines ;l++) {
41 if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) {
44 if(strcmp(procfile_lineword(ff, l, 0), "Ip") != 0) {
45 error("Cannot read Ip line from /proc/net/snmp.");
49 words = procfile_linewords(ff, l);
51 error("Cannot read /proc/net/snmp Ip line. Expected 20 params, read %u.", words);
55 // see also http://net-snmp.sourceforge.net/docs/mibs/ip.html
56 unsigned long long Forwarding, DefaultTTL, InReceives, InHdrErrors, InAddrErrors, ForwDatagrams, InUnknownProtos, InDiscards, InDelivers,
57 OutRequests, OutDiscards, OutNoRoutes, ReasmTimeout, ReasmReqds, ReasmOKs, ReasmFails, FragOKs, FragFails, FragCreates;
59 Forwarding = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
60 DefaultTTL = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
61 InReceives = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
62 InHdrErrors = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
63 InAddrErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
64 ForwDatagrams = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
65 InUnknownProtos = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
66 InDiscards = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
67 InDelivers = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
68 OutRequests = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
69 OutDiscards = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
70 OutNoRoutes = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
71 ReasmTimeout = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
72 ReasmReqds = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
73 ReasmOKs = strtoull(procfile_lineword(ff, l, 15), NULL, 10);
74 ReasmFails = strtoull(procfile_lineword(ff, l, 16), NULL, 10);
75 FragOKs = strtoull(procfile_lineword(ff, l, 17), NULL, 10);
76 FragFails = strtoull(procfile_lineword(ff, l, 18), NULL, 10);
77 FragCreates = strtoull(procfile_lineword(ff, l, 19), NULL, 10);
79 // these are not counters
80 if(Forwarding) {}; // is forwarding enabled?
81 if(DefaultTTL) {}; // the default ttl on packets
82 if(ReasmTimeout) {}; // Reassembly timeout
84 // this counter is not used
85 if(InDelivers) {}; // total number of packets delivered to IP user-protocols
87 // --------------------------------------------------------------------
90 st = rrdset_find(RRD_TYPE_NET_SNMP ".packets");
92 st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, "packets", NULL, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE);
94 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
95 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
96 rrddim_add(st, "forwarded", NULL, 1, 1, RRDDIM_INCREMENTAL);
100 rrddim_set(st, "sent", OutRequests);
101 rrddim_set(st, "received", InReceives);
102 rrddim_set(st, "forwarded", ForwDatagrams);
106 // --------------------------------------------------------------------
109 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout");
111 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, "fragments", NULL, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE);
114 rrddim_add(st, "ok", NULL, 1, 1, RRDDIM_INCREMENTAL);
115 rrddim_add(st, "failed", NULL, -1, 1, RRDDIM_INCREMENTAL);
116 rrddim_add(st, "all", NULL, 1, 1, RRDDIM_INCREMENTAL);
118 else rrdset_next(st);
120 rrddim_set(st, "ok", FragOKs);
121 rrddim_set(st, "failed", FragFails);
122 rrddim_set(st, "all", FragCreates);
126 // --------------------------------------------------------------------
129 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin");
131 st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, "fragments", NULL, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE);
134 rrddim_add(st, "ok", NULL, 1, 1, RRDDIM_INCREMENTAL);
135 rrddim_add(st, "failed", NULL, -1, 1, RRDDIM_INCREMENTAL);
136 rrddim_add(st, "all", NULL, 1, 1, RRDDIM_INCREMENTAL);
138 else rrdset_next(st);
140 rrddim_set(st, "ok", ReasmOKs);
141 rrddim_set(st, "failed", ReasmFails);
142 rrddim_set(st, "all", ReasmReqds);
146 // --------------------------------------------------------------------
149 st = rrdset_find(RRD_TYPE_NET_SNMP ".errors");
151 st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, "errors", NULL, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE);
154 rrddim_add(st, "InDiscards", NULL, 1, 1, RRDDIM_INCREMENTAL);
155 rrddim_add(st, "OutDiscards", NULL, -1, 1, RRDDIM_INCREMENTAL);
157 rrddim_add(st, "InHdrErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
158 rrddim_add(st, "InAddrErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
159 rrddim_add(st, "InUnknownProtos", NULL, 1, 1, RRDDIM_INCREMENTAL);
161 rrddim_add(st, "OutNoRoutes", NULL, -1, 1, RRDDIM_INCREMENTAL);
163 else rrdset_next(st);
165 rrddim_set(st, "InDiscards", InDiscards);
166 rrddim_set(st, "OutDiscards", OutDiscards);
167 rrddim_set(st, "InHdrErrors", InHdrErrors);
168 rrddim_set(st, "InAddrErrors", InAddrErrors);
169 rrddim_set(st, "InUnknownProtos", InUnknownProtos);
170 rrddim_set(st, "OutNoRoutes", OutNoRoutes);
174 else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) {
177 if(strcmp(procfile_lineword(ff, l, 0), "Tcp") != 0) {
178 error("Cannot read Tcp line from /proc/net/snmp.");
182 words = procfile_linewords(ff, l);
184 error("Cannot read /proc/net/snmp Tcp line. Expected 15 params, read %u.", words);
188 unsigned long long RtoAlgorithm, RtoMin, RtoMax, MaxConn, ActiveOpens, PassiveOpens, AttemptFails, EstabResets,
189 CurrEstab, InSegs, OutSegs, RetransSegs, InErrs, OutRsts;
191 RtoAlgorithm = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
192 RtoMin = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
193 RtoMax = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
194 MaxConn = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
195 ActiveOpens = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
196 PassiveOpens = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
197 AttemptFails = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
198 EstabResets = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
199 CurrEstab = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
200 InSegs = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
201 OutSegs = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
202 RetransSegs = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
203 InErrs = strtoull(procfile_lineword(ff, l, 13), NULL, 10);
204 OutRsts = strtoull(procfile_lineword(ff, l, 14), NULL, 10);
206 // these are not counters
212 // --------------------------------------------------------------------
214 // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
216 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock");
218 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", NULL, "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE);
220 rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
222 else rrdset_next(st);
224 rrddim_set(st, "connections", CurrEstab);
228 // --------------------------------------------------------------------
231 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets");
233 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", NULL, "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE);
235 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
236 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
238 else rrdset_next(st);
240 rrddim_set(st, "received", InSegs);
241 rrddim_set(st, "sent", OutSegs);
245 // --------------------------------------------------------------------
248 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors");
250 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", NULL, "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE);
253 rrddim_add(st, "InErrs", NULL, 1, 1, RRDDIM_INCREMENTAL);
254 rrddim_add(st, "RetransSegs", NULL, -1, 1, RRDDIM_INCREMENTAL);
256 else rrdset_next(st);
258 rrddim_set(st, "InErrs", InErrs);
259 rrddim_set(st, "RetransSegs", RetransSegs);
263 // --------------------------------------------------------------------
265 if(do_tcp_handshake) {
266 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake");
268 st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", NULL, "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE);
271 rrddim_add(st, "EstabResets", NULL, 1, 1, RRDDIM_INCREMENTAL);
272 rrddim_add(st, "OutRsts", NULL, -1, 1, RRDDIM_INCREMENTAL);
273 rrddim_add(st, "ActiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
274 rrddim_add(st, "PassiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
275 rrddim_add(st, "AttemptFails", NULL, 1, 1, RRDDIM_INCREMENTAL);
277 else rrdset_next(st);
279 rrddim_set(st, "EstabResets", EstabResets);
280 rrddim_set(st, "OutRsts", OutRsts);
281 rrddim_set(st, "ActiveOpens", ActiveOpens);
282 rrddim_set(st, "PassiveOpens", PassiveOpens);
283 rrddim_set(st, "AttemptFails", AttemptFails);
287 else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) {
290 if(strcmp(procfile_lineword(ff, l, 0), "Udp") != 0) {
291 error("Cannot read Udp line from /proc/net/snmp.");
295 words = procfile_linewords(ff, l);
297 error("Cannot read /proc/net/snmp Udp line. Expected 7 params, read %u.", words);
301 unsigned long long InDatagrams, NoPorts, InErrors, OutDatagrams, RcvbufErrors, SndbufErrors;
303 InDatagrams = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
304 NoPorts = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
305 InErrors = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
306 OutDatagrams = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
307 RcvbufErrors = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
308 SndbufErrors = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
310 // --------------------------------------------------------------------
312 // see http://net-snmp.sourceforge.net/docs/mibs/udp.html
314 st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets");
316 st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", NULL, "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE);
318 rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
319 rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
321 else rrdset_next(st);
323 rrddim_set(st, "received", InDatagrams);
324 rrddim_set(st, "sent", OutDatagrams);
328 // --------------------------------------------------------------------
331 st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors");
333 st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", NULL, "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE);
336 rrddim_add(st, "RcvbufErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
337 rrddim_add(st, "SndbufErrors", NULL, -1, 1, RRDDIM_INCREMENTAL);
338 rrddim_add(st, "InErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
339 rrddim_add(st, "NoPorts", NULL, 1, 1, RRDDIM_INCREMENTAL);
341 else rrdset_next(st);
343 rrddim_set(st, "InErrors", InErrors);
344 rrddim_set(st, "NoPorts", NoPorts);
345 rrddim_set(st, "RcvbufErrors", RcvbufErrors);
346 rrddim_set(st, "SndbufErrors", SndbufErrors);