]> arthur.barton.de Git - netdata.git/blob - src/proc_net_snmp.c
Merge remote-tracking branch 'firehol/master'
[netdata.git] / src / proc_net_snmp.c
1 #include "common.h"
2
3 #define RRD_TYPE_NET_SNMP           "ipv4"
4 #define RRD_TYPE_NET_SNMP_LEN       strlen(RRD_TYPE_NET_SNMP)
5
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;
11
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);
22
23     if(dt) {};
24
25     if(!ff) {
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);
29     }
30     if(!ff) return 1;
31
32     ff = procfile_readall(ff);
33     if(!ff) return 0; // we return 0, so that we will retry to open it next time
34
35     uint32_t lines = procfile_lines(ff), l;
36     uint32_t words;
37
38     RRDSET *st;
39
40     for(l = 0; l < lines ;l++) {
41         if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) {
42             l++;
43
44             if(strcmp(procfile_lineword(ff, l, 0), "Ip") != 0) {
45                 error("Cannot read Ip line from /proc/net/snmp.");
46                 break;
47             }
48
49             words = procfile_linewords(ff, l);
50             if(words < 20) {
51                 error("Cannot read /proc/net/snmp Ip line. Expected 20 params, read %u.", words);
52                 continue;
53             }
54
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;
58
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);
78
79             // these are not counters
80             if(Forwarding) {};      // is forwarding enabled?
81             if(DefaultTTL) {};      // the default ttl on packets
82             if(ReasmTimeout) {};    // Reassembly timeout
83
84             // this counter is not used
85             if(InDelivers) {};      // total number of packets delivered to IP user-protocols
86
87             // --------------------------------------------------------------------
88
89             if(do_ip_packets) {
90                 st = rrdset_find(RRD_TYPE_NET_SNMP ".packets");
91                 if(!st) {
92                     st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, "packets", NULL, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE);
93
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);
97                 }
98                 else rrdset_next(st);
99
100                 rrddim_set(st, "sent", OutRequests);
101                 rrddim_set(st, "received", InReceives);
102                 rrddim_set(st, "forwarded", ForwDatagrams);
103                 rrdset_done(st);
104             }
105
106             // --------------------------------------------------------------------
107
108             if(do_ip_fragsout) {
109                 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout");
110                 if(!st) {
111                     st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, "fragments", NULL, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE);
112                     st->isdetail = 1;
113
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);
117                 }
118                 else rrdset_next(st);
119
120                 rrddim_set(st, "ok", FragOKs);
121                 rrddim_set(st, "failed", FragFails);
122                 rrddim_set(st, "all", FragCreates);
123                 rrdset_done(st);
124             }
125
126             // --------------------------------------------------------------------
127
128             if(do_ip_fragsin) {
129                 st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin");
130                 if(!st) {
131                     st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, "fragments", NULL, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE);
132                     st->isdetail = 1;
133
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);
137                 }
138                 else rrdset_next(st);
139
140                 rrddim_set(st, "ok", ReasmOKs);
141                 rrddim_set(st, "failed", ReasmFails);
142                 rrddim_set(st, "all", ReasmReqds);
143                 rrdset_done(st);
144             }
145
146             // --------------------------------------------------------------------
147
148             if(do_ip_errors) {
149                 st = rrdset_find(RRD_TYPE_NET_SNMP ".errors");
150                 if(!st) {
151                     st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, "errors", NULL, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE);
152                     st->isdetail = 1;
153
154                     rrddim_add(st, "InDiscards", NULL, 1, 1, RRDDIM_INCREMENTAL);
155                     rrddim_add(st, "OutDiscards", NULL, -1, 1, RRDDIM_INCREMENTAL);
156
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);
160
161                     rrddim_add(st, "OutNoRoutes", NULL, -1, 1, RRDDIM_INCREMENTAL);
162                 }
163                 else rrdset_next(st);
164
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);
171                 rrdset_done(st);
172             }
173         }
174         else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) {
175             l++;
176
177             if(strcmp(procfile_lineword(ff, l, 0), "Tcp") != 0) {
178                 error("Cannot read Tcp line from /proc/net/snmp.");
179                 break;
180             }
181
182             words = procfile_linewords(ff, l);
183             if(words < 15) {
184                 error("Cannot read /proc/net/snmp Tcp line. Expected 15 params, read %u.", words);
185                 continue;
186             }
187
188             unsigned long long RtoAlgorithm, RtoMin, RtoMax, MaxConn, ActiveOpens, PassiveOpens, AttemptFails, EstabResets,
189                 CurrEstab, InSegs, OutSegs, RetransSegs, InErrs, OutRsts;
190
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);
205
206             // these are not counters
207             if(RtoAlgorithm) {};
208             if(RtoMin) {};
209             if(RtoMax) {};
210             if(MaxConn) {};
211
212             // --------------------------------------------------------------------
213
214             // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
215             if(do_tcp_sockets) {
216                 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock");
217                 if(!st) {
218                     st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", NULL, "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE);
219
220                     rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
221                 }
222                 else rrdset_next(st);
223
224                 rrddim_set(st, "connections", CurrEstab);
225                 rrdset_done(st);
226             }
227
228             // --------------------------------------------------------------------
229
230             if(do_tcp_packets) {
231                 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets");
232                 if(!st) {
233                     st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", NULL, "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE);
234
235                     rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
236                     rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
237                 }
238                 else rrdset_next(st);
239
240                 rrddim_set(st, "received", InSegs);
241                 rrddim_set(st, "sent", OutSegs);
242                 rrdset_done(st);
243             }
244
245             // --------------------------------------------------------------------
246
247             if(do_tcp_errors) {
248                 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors");
249                 if(!st) {
250                     st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", NULL, "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE);
251                     st->isdetail = 1;
252
253                     rrddim_add(st, "InErrs", NULL, 1, 1, RRDDIM_INCREMENTAL);
254                     rrddim_add(st, "RetransSegs", NULL, -1, 1, RRDDIM_INCREMENTAL);
255                 }
256                 else rrdset_next(st);
257
258                 rrddim_set(st, "InErrs", InErrs);
259                 rrddim_set(st, "RetransSegs", RetransSegs);
260                 rrdset_done(st);
261             }
262
263             // --------------------------------------------------------------------
264
265             if(do_tcp_handshake) {
266                 st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake");
267                 if(!st) {
268                     st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", NULL, "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE);
269                     st->isdetail = 1;
270
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);
276                 }
277                 else rrdset_next(st);
278
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);
284                 rrdset_done(st);
285             }
286         }
287         else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) {
288             l++;
289
290             if(strcmp(procfile_lineword(ff, l, 0), "Udp") != 0) {
291                 error("Cannot read Udp line from /proc/net/snmp.");
292                 break;
293             }
294
295             words = procfile_linewords(ff, l);
296             if(words < 7) {
297                 error("Cannot read /proc/net/snmp Udp line. Expected 7 params, read %u.", words);
298                 continue;
299             }
300
301             unsigned long long InDatagrams, NoPorts, InErrors, OutDatagrams, RcvbufErrors, SndbufErrors;
302
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);
309
310             // --------------------------------------------------------------------
311
312             // see http://net-snmp.sourceforge.net/docs/mibs/udp.html
313             if(do_udp_packets) {
314                 st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets");
315                 if(!st) {
316                     st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", NULL, "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE);
317
318                     rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
319                     rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
320                 }
321                 else rrdset_next(st);
322
323                 rrddim_set(st, "received", InDatagrams);
324                 rrddim_set(st, "sent", OutDatagrams);
325                 rrdset_done(st);
326             }
327
328             // --------------------------------------------------------------------
329
330             if(do_udp_errors) {
331                 st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors");
332                 if(!st) {
333                     st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", NULL, "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE);
334                     st->isdetail = 1;
335
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);
340                 }
341                 else rrdset_next(st);
342
343                 rrddim_set(st, "InErrors", InErrors);
344                 rrddim_set(st, "NoPorts", NoPorts);
345                 rrddim_set(st, "RcvbufErrors", RcvbufErrors);
346                 rrddim_set(st, "SndbufErrors", SndbufErrors);
347                 rrdset_done(st);
348             }
349         }
350     }
351
352     return 0;
353 }
354