]> arthur.barton.de Git - netdata.git/blob - src/proc_net_netstat.c
0b5c3938dccecb73efcadd4c8650b1f83428589b
[netdata.git] / src / proc_net_netstat.c
1 #include <inttypes.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "common.h"
7 #include "log.h"
8 #include "config.h"
9 #include "procfile.h"
10 #include "rrd.h"
11 #include "plugin_proc.h"
12
13 int do_proc_net_netstat(int update_every, unsigned long long dt) {
14         static int do_bandwidth = -1, do_inerrors = -1, do_mcast = -1, do_bcast = -1, do_mcast_p = -1, do_bcast_p = -1;
15         static procfile *ff = NULL;
16
17         if(do_bandwidth == -1)  do_bandwidth    = config_get_boolean("plugin:proc:/proc/net/netstat", "bandwidth", 1);
18         if(do_inerrors == -1)   do_inerrors             = config_get_boolean("plugin:proc:/proc/net/netstat", "input errors", 1);
19         if(do_mcast == -1)              do_mcast                = config_get_boolean("plugin:proc:/proc/net/netstat", "multicast bandwidth", 1);
20         if(do_bcast == -1)              do_bcast                = config_get_boolean("plugin:proc:/proc/net/netstat", "broadcast bandwidth", 1);
21         if(do_mcast_p == -1)    do_mcast_p              = config_get_boolean("plugin:proc:/proc/net/netstat", "multicast packets", 1);
22         if(do_bcast_p == -1)    do_bcast_p              = config_get_boolean("plugin:proc:/proc/net/netstat", "broadcast packets", 1);
23
24         if(dt) {};
25
26         if(!ff) ff = procfile_open("/proc/net/netstat", " \t:", PROCFILE_FLAG_DEFAULT);
27         if(!ff) return 1;
28
29         ff = procfile_readall(ff);
30         if(!ff) return 0; // we return 0, so that we will retry to open it next time
31
32         uint32_t lines = procfile_lines(ff), l;
33         uint32_t words;
34
35         for(l = 0; l < lines ;l++) {
36                 if(strcmp(procfile_lineword(ff, l, 0), "IpExt") == 0) {
37                         l++; // we need the next line
38
39                         if(strcmp(procfile_lineword(ff, l, 0), "IpExt") != 0) {
40                                 error("Cannot read IpExt line from /proc/net/netstat.");
41                                 break;
42                         }
43                         words = procfile_linewords(ff, l);
44                         if(words < 12) {
45                                 error("Cannot read /proc/net/netstat IpExt line. Expected 12 params, read %d.", words);
46                                 continue;
47                         }
48
49                         unsigned long long
50                                 InNoRoutes = 0, InTruncatedPkts = 0,
51                                 InOctets = 0,  InMcastPkts = 0,  InBcastPkts = 0,  InMcastOctets = 0,  InBcastOctets = 0,
52                                 OutOctets = 0, OutMcastPkts = 0, OutBcastPkts = 0, OutMcastOctets = 0, OutBcastOctets = 0;
53                         
54                         InNoRoutes                      = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
55                         InTruncatedPkts         = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
56                         InMcastPkts             = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
57                         OutMcastPkts            = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
58                         InBcastPkts             = strtoull(procfile_lineword(ff, l, 5), NULL, 10);
59                         OutBcastPkts            = strtoull(procfile_lineword(ff, l, 6), NULL, 10);
60                         InOctets                        = strtoull(procfile_lineword(ff, l, 7), NULL, 10);
61                         OutOctets                       = strtoull(procfile_lineword(ff, l, 8), NULL, 10);
62                         InMcastOctets           = strtoull(procfile_lineword(ff, l, 9), NULL, 10);
63                         OutMcastOctets          = strtoull(procfile_lineword(ff, l, 10), NULL, 10);
64                         InBcastOctets           = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
65                         OutBcastOctets          = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
66
67                         RRDSET *st;
68
69                         // --------------------------------------------------------------------
70
71                         if(do_bandwidth) {
72                                 st = rrdset_find("system.ipv4");
73                                 if(!st) {
74                                         st = rrdset_create("system", "ipv4", NULL, "ipv4", "IPv4 Bandwidth", "kilobits/s", 2000, update_every, RRDSET_TYPE_AREA);
75
76                                         rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
77                                         rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
78                                 }
79                                 else rrdset_next(st);
80
81                                 rrddim_set(st, "sent", OutOctets);
82                                 rrddim_set(st, "received", InOctets);
83                                 rrdset_done(st);
84                         }
85
86                         // --------------------------------------------------------------------
87
88                         if(do_inerrors) {
89                                 st = rrdset_find("ipv4.inerrors");
90                                 if(!st) {
91                                         st = rrdset_create("ipv4", "inerrors", NULL, "ipv4", "IPv4 Input Errors", "packets/s", 4000, update_every, RRDSET_TYPE_LINE);
92                                         st->isdetail = 1;
93
94                                         rrddim_add(st, "noroutes", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
95                                         rrddim_add(st, "trunkated", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
96                                 }
97                                 else rrdset_next(st);
98
99                                 rrddim_set(st, "noroutes", InNoRoutes);
100                                 rrddim_set(st, "trunkated", InTruncatedPkts);
101                                 rrdset_done(st);
102                         }
103
104                         // --------------------------------------------------------------------
105
106                         if(do_mcast) {
107                                 st = rrdset_find("ipv4.mcast");
108                                 if(!st) {
109                                         st = rrdset_create("ipv4", "mcast", NULL, "ipv4", "IPv4 Multicast Bandwidth", "kilobits/s", 9000, update_every, RRDSET_TYPE_AREA);
110                                         st->isdetail = 1;
111
112                                         rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
113                                         rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
114                                 }
115                                 else rrdset_next(st);
116
117                                 rrddim_set(st, "sent", OutMcastOctets);
118                                 rrddim_set(st, "received", InMcastOctets);
119                                 rrdset_done(st);
120                         }
121
122                         // --------------------------------------------------------------------
123
124                         if(do_bcast) {
125                                 st = rrdset_find("ipv4.bcast");
126                                 if(!st) {
127                                         st = rrdset_create("ipv4", "bcast", NULL, "ipv4", "IPv4 Broadcast Bandwidth", "kilobits/s", 8000, update_every, RRDSET_TYPE_AREA);
128                                         st->isdetail = 1;
129
130                                         rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
131                                         rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
132                                 }
133                                 else rrdset_next(st);
134
135                                 rrddim_set(st, "sent", OutBcastOctets);
136                                 rrddim_set(st, "received", InBcastOctets);
137                                 rrdset_done(st);
138                         }
139
140                         // --------------------------------------------------------------------
141
142                         if(do_mcast_p) {
143                                 st = rrdset_find("ipv4.mcastpkts");
144                                 if(!st) {
145                                         st = rrdset_create("ipv4", "mcastpkts", NULL, "ipv4", "IPv4 Multicast Packets", "packets/s", 9500, update_every, RRDSET_TYPE_LINE);
146                                         st->isdetail = 1;
147
148                                         rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
149                                         rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
150                                 }
151                                 else rrdset_next(st);
152
153                                 rrddim_set(st, "sent", OutMcastPkts);
154                                 rrddim_set(st, "received", InMcastPkts);
155                                 rrdset_done(st);
156                         }
157
158                         // --------------------------------------------------------------------
159
160                         if(do_bcast_p) {
161                                 st = rrdset_find("ipv4.bcastpkts");
162                                 if(!st) {
163                                         st = rrdset_create("ipv4", "bcastpkts", NULL, "ipv4", "IPv4 Broadcast Packets", "packets/s", 8500, update_every, RRDSET_TYPE_LINE);
164                                         st->isdetail = 1;
165
166                                         rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
167                                         rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
168                                 }
169                                 else rrdset_next(st);
170
171                                 rrddim_set(st, "sent", OutBcastPkts);
172                                 rrddim_set(st, "received", InBcastPkts);
173                                 rrdset_done(st);
174                         }
175                 }
176         }
177         
178         return 0;
179 }