]> arthur.barton.de Git - netdata.git/blob - src/proc_net_snmp.c
Merge remote-tracking branch 'upstream/master' into health
[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