Wireless statistics (#10052)
Co-authored-by: Ilya Mashchenko <ilya@netdata.cloud> Co-authored-by: Joel Hans <joel.g.hans@gmail.com> Co-authored-by: ladakis <vaggosbboy@gmail.com>
thiagoftsm committed
Oct 20, 2020 at 11:04 UTC
31b045aa3c290d1fdc25edf03721a24c38fd303e
8 files changed
+509
CMakeLists.txt
+1
@@ -501,6 +501,7 @@ set(PROC_PLUGIN_FILES
501
collectors/proc.plugin/proc_meminfo.c
502
collectors/proc.plugin/proc_pagetypeinfo.c
503
collectors/proc.plugin/proc_net_dev.c
504
+ collectors/proc.plugin/proc_net_wireless.c
505
collectors/proc.plugin/proc_net_ip_vs_stats.c
506
collectors/proc.plugin/proc_net_netstat.c
507
collectors/proc.plugin/proc_net_rpc_nfs.c
Makefile.am
+1
@@ -305,6 +305,7 @@ PROC_PLUGIN_FILES = \
305
collectors/proc.plugin/proc_pressure.c \
306
collectors/proc.plugin/proc_pressure.h \
307
collectors/proc.plugin/proc_net_dev.c \
308
+ collectors/proc.plugin/proc_net_wireless.c \
309
collectors/proc.plugin/proc_net_ip_vs_stats.c \
310
collectors/proc.plugin/proc_net_netstat.c \
311
collectors/proc.plugin/proc_net_rpc_nfs.c \
collectors/all.h
+6
@@ -312,11 +312,17 @@
312
#define NETDATA_CHART_PRIO_MDSTAT_SPEED 9006
313
314
// Linux Power Supply
315
+
316
#define NETDATA_CHART_PRIO_POWER_SUPPLY_CAPACITY 9500 // 4 charts per power supply
317
#define NETDATA_CHART_PRIO_POWER_SUPPLY_CHARGE 9501
318
#define NETDATA_CHART_PRIO_POWER_SUPPLY_ENERGY 9502
319
#define NETDATA_CHART_PRIO_POWER_SUPPLY_VOLTAGE 9503
320
321
+
322
+// Wireless
323
+
324
+#define NETDATA_CHART_PRIO_WIRELESS_IFACE 7110
325
+
326
// CGROUPS
327
328
#define NETDATA_CHART_PRIO_CGROUPS_SYSTEMD 19000 // many charts
collectors/proc.plugin/README.md
+40
@@ -13,6 +13,7 @@ custom_edit_url: https://github.com/netdata/netdata/edit/master/collectors/proc.
13
- `/proc/net/snmp` (total IPv4, TCP and UDP usage)
14
- `/proc/net/snmp6` (total IPv6 usage)
15
- `/proc/net/netstat` (more IPv4 usage)
16
+- `/proc/net/wireless` (wireless extension)
17
- `/proc/net/stat/nf_conntrack` (connection tracking performance)
18
- `/proc/net/stat/synproxy` (synproxy performance)
19
- `/proc/net/ip_vs/stats` (IPVS connection statistics)
@@ -322,6 +323,45 @@ each state.
323
324
By default Netdata will enable monitoring metrics only when they are not zero. If they are constantly zero they are ignored. Metrics that will start having values, after Netdata is started, will be detected and charts will be automatically added to the dashboard (a refresh of the dashboard is needed for them to appear though).
325
326
+### Monitoring wireless network interfaces
327
+
328
+The settings for monitoring wireless is in the `[plugin:proc:/proc/net/wireless]` section of your `netdata.conf` file.
329
+
330
+```conf
331
+ status for all interfaces = yes
332
+ quality for all interfaces = yes
333
+ discarded packets for all interfaces = yes
334
+ missed beacon for all interface = yes
335
+```
336
+
337
+You can set the following values for each configuration option:
338
+
339
+- `auto` = enable monitoring if the collected values are not zero
340
+- `yes` = enable monitoring
341
+- `no` = disable monitoring
342
+
343
+#### Monitored wireless interface metrics
344
+
345
+- **Status**
346
+ The current state of the interface. This is a device-dependent option.
347
+
348
+- **Link**
349
+ Overall quality of the link.
350
+
351
+- **Level**
352
+ Received signal strength (RSSI), which indicates how strong the received signal is.
353
+
354
+- **Noise**
355
+ Background noise level.
356
+
357
+- **Discarded packets**
358
+ Discarded packets for: Number of packets received with a different NWID or ESSID (`nwid`), unable to decrypt (`crypt`), hardware was not able to properly re-assemble the link layer fragments (`frag`), packets failed to deliver (`retry`), and packets lost in relation with specific wireless operations (`misc`).
359
+
360
+- **Missed beacon**
361
+ Number of periodic beacons from the cell or the access point the interface has missed.
362
+
363
+#### Wireless configuration
364
+
365
#### alarms
366
367
There are several alarms defined in `health.d/net.conf`.
collectors/proc.plugin/plugin_proc.c
+1
@@ -39,6 +39,7 @@ static struct proc_module {
39
40
// network metrics
41
{ .name = "/proc/net/dev", .dim = "netdev", .func = do_proc_net_dev },
42
+ { .name = "/proc/net/wireless", .dim = "netwireless", .func = do_proc_net_wireless },
43
{ .name = "/proc/net/sockstat", .dim = "sockstat", .func = do_proc_net_sockstat },
44
{ .name = "/proc/net/sockstat6", .dim = "sockstat6", .func = do_proc_net_sockstat6 },
45
{ .name = "/proc/net/netstat", .dim = "netstat", .func = do_proc_net_netstat }, // this has to be before /proc/net/snmp, because there is a shared metric
collectors/proc.plugin/plugin_proc.h
+1
@@ -25,6 +25,7 @@
25
extern void *proc_main(void *ptr);
26
27
extern int do_proc_net_dev(int update_every, usec_t dt);
28
+extern int do_proc_net_wireless(int update_every, usec_t dt);
29
extern int do_proc_diskstats(int update_every, usec_t dt);
30
extern int do_proc_mdstat(int update_every, usec_t dt);
31
extern int do_proc_net_snmp(int update_every, usec_t dt);
collectors/proc.plugin/proc_net_wireless.c
new
+453
@@ -0,0 +1,453 @@
1
+#include <stdbool.h>
2
+#include "plugin_proc.h"
3
+
4
+#define PLUGIN_PROC_MODULE_NETWIRELESS_NAME "/proc/net/wireless"
5
+
6
+#define CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS "plugin:" PLUGIN_PROC_CONFIG_NAME ":" PLUGIN_PROC_MODULE_NETWIRELESS_NAME
7
+
8
+
9
+static struct netwireless {
10
+ char *name;
11
+ uint32_t hash;
12
+
13
+ //flags
14
+ bool configured;
15
+ struct timeval updated;
16
+
17
+ int do_status;
18
+ int do_quality;
19
+ int do_discarded_packets;
20
+ int do_missed_beacon;
21
+
22
+ // Data collected
23
+ // status
24
+ kernel_uint_t status;
25
+
26
+ // Quality
27
+ calculated_number link;
28
+ calculated_number level;
29
+ calculated_number noise;
30
+
31
+ // Discarded packets
32
+ kernel_uint_t nwid;
33
+ kernel_uint_t crypt;
34
+ kernel_uint_t frag;
35
+ kernel_uint_t retry;
36
+ kernel_uint_t misc;
37
+
38
+ // missed beacon
39
+ kernel_uint_t missed_beacon;
40
+
41
+ const char *chart_id_net_status;
42
+ const char *chart_id_net_link;
43
+ const char *chart_id_net_level;
44
+ const char *chart_id_net_noise;
45
+ const char *chart_id_net_discarded_packets;
46
+ const char *chart_id_net_missed_beacon;
47
+
48
+ const char *chart_family;
49
+
50
+ // charts
51
+ // satus
52
+ RRDSET *st_status;
53
+
54
+ // Quality
55
+ RRDSET *st_link;
56
+ RRDSET *st_level;
57
+ RRDSET *st_noise;
58
+
59
+ // Discarded Packets
60
+ RRDSET *st_discarded_packets;
61
+ // Missed beacon
62
+ RRDSET *st_missed_beacon;
63
+
64
+ // Dimensions
65
+ // status
66
+ RRDDIM *rd_status;
67
+
68
+ // Quality
69
+ RRDDIM *rd_link;
70
+ RRDDIM *rd_level;
71
+ RRDDIM *rd_noise;
72
+
73
+ // Discarded packets
74
+ RRDDIM *rd_nwid;
75
+ RRDDIM *rd_crypt;
76
+ RRDDIM *rd_frag;
77
+ RRDDIM *rd_retry;
78
+ RRDDIM *rd_misc;
79
+
80
+ // missed beacon
81
+ RRDDIM *rd_missed_beacon;
82
+
83
+ struct netwireless *next;
84
+} *netwireless_root = NULL;
85
+
86
+static void netwireless_free_st(struct netwireless *wireless_dev)
87
+{
88
+ if (wireless_dev->st_status) rrdset_is_obsolete(wireless_dev->st_status);
89
+ if (wireless_dev->st_link) rrdset_is_obsolete(wireless_dev->st_link);
90
+ if (wireless_dev->st_level) rrdset_is_obsolete(wireless_dev->st_level);
91
+ if (wireless_dev->st_noise) rrdset_is_obsolete(wireless_dev->st_noise);
92
+ if (wireless_dev->st_discarded_packets) rrdset_is_obsolete(wireless_dev->st_discarded_packets);
93
+ if (wireless_dev->st_missed_beacon) rrdset_is_obsolete(wireless_dev->st_missed_beacon);
94
+
95
+ wireless_dev->st_status = NULL;
96
+ wireless_dev->st_link = NULL;
97
+ wireless_dev->st_level = NULL;
98
+ wireless_dev->st_noise = NULL;
99
+ wireless_dev->st_discarded_packets = NULL;
100
+ wireless_dev->st_missed_beacon = NULL;
101
+}
102
+
103
+static void netwireless_free(struct netwireless *wireless_dev)
104
+{
105
+ wireless_dev->next = NULL;
106
+ freez((void *)wireless_dev->name);
107
+ netwireless_free_st(wireless_dev);
108
+ freez((void *)wireless_dev->chart_id_net_status);
109
+ freez((void *)wireless_dev->chart_id_net_link);
110
+ freez((void *)wireless_dev->chart_id_net_level);
111
+ freez((void *)wireless_dev->chart_id_net_noise);
112
+ freez((void *)wireless_dev->chart_id_net_discarded_packets);
113
+ freez((void *)wireless_dev->chart_id_net_missed_beacon);
114
+
115
+ freez((void *)wireless_dev);
116
+}
117
+
118
+static void netwireless_cleanup(struct timeval *timestamp)
119
+{
120
+ struct netwireless *previous = NULL;
121
+ struct netwireless *current;
122
+ // search it, from begining to the end
123
+ for (current = netwireless_root; current;) {
124
+
125
+ if (timercmp(¤t->updated, timestamp, <)) {
126
+ struct netwireless *to_free = current;
127
+ current = current->next;
128
+ netwireless_free(to_free);
129
+
130
+ if (previous) {
131
+ previous->next = current;
132
+ } else {
133
+ netwireless_root = current;
134
+ }
135
+ } else {
136
+ previous = current;
137
+ current = current->next;
138
+ }
139
+ }
140
+}
141
+
142
+// finds an existing interface or creates a new entry
143
+static struct netwireless *find_or_create_wireless(const char *name)
144
+{
145
+ struct netwireless *wireless;
146
+ uint32_t hash = simple_hash(name);
147
+
148
+ // search it, from begining to the end
149
+ for (wireless = netwireless_root ; wireless ; wireless = wireless->next) {
150
+ if (unlikely(hash == wireless->hash && !strcmp(name, wireless->name))) {
151
+ return wireless;
152
+ }
153
+ }
154
+
155
+ // create a new one
156
+ wireless = callocz(1, sizeof(struct netwireless));
157
+ wireless->name = strdupz(name);
158
+ wireless->hash = hash;
159
+
160
+ // link it to the end
161
+ if (netwireless_root) {
162
+ struct netwireless *last_node;
163
+ for (last_node = netwireless_root; last_node->next ; last_node = last_node->next);
164
+
165
+ last_node->next = wireless;
166
+ } else
167
+ netwireless_root = wireless;
168
+
169
+ return wireless;
170
+}
171
+
172
+static void configure_device(int do_status, int do_quality, int do_discarded_packets, int do_missed,
173
+ struct netwireless *wireless_dev) {
174
+ wireless_dev->do_status = do_status;
175
+ wireless_dev->do_quality = do_quality;
176
+ wireless_dev->do_discarded_packets = do_discarded_packets;
177
+ wireless_dev->do_missed_beacon = do_missed;
178
+ wireless_dev->configured = true;
179
+
180
+ char buffer[RRD_ID_LENGTH_MAX + 1];
181
+
182
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_status", wireless_dev->name);
183
+ wireless_dev->chart_id_net_status = strdupz(buffer);
184
+
185
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_link_quality", wireless_dev->name);
186
+ wireless_dev->chart_id_net_link = strdupz(buffer);
187
+
188
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_signal_level", wireless_dev->name);
189
+ wireless_dev->chart_id_net_level = strdupz(buffer);
190
+
191
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_noise_level", wireless_dev->name);
192
+ wireless_dev->chart_id_net_noise = strdupz(buffer);
193
+
194
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_discarded_packets", wireless_dev->name);
195
+ wireless_dev->chart_id_net_discarded_packets = strdupz(buffer);
196
+
197
+ snprintfz(buffer, RRD_ID_LENGTH_MAX, "%s_missed_beacon", wireless_dev->name);
198
+ wireless_dev->chart_id_net_missed_beacon = strdupz(buffer);
199
+}
200
+
201
+int do_proc_net_wireless(int update_every, usec_t dt)
202
+{
203
+ UNUSED(dt);
204
+ static procfile *ff = NULL;
205
+ static int do_status, do_quality = -1, do_discarded_packets, do_beacon;
206
+ static char *proc_net_wireless_filename = NULL;
207
+
208
+ if (unlikely(do_quality == -1)) {
209
+ char filename[FILENAME_MAX + 1];
210
+ snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/net/wireless");
211
+
212
+ proc_net_wireless_filename = config_get(CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS,"filename to monitor",
213
+ filename);
214
+
215
+ do_status = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS,
216
+ "status for all interfaces", CONFIG_BOOLEAN_AUTO);
217
+
218
+ do_quality = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS,
219
+ "quality for all interfaces", CONFIG_BOOLEAN_AUTO);
220
+
221
+ do_discarded_packets = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS,
222
+ "discarded packets for all interfaces",
223
+ CONFIG_BOOLEAN_AUTO);
224
+
225
+ do_beacon = config_get_boolean_ondemand(CONFIG_SECTION_PLUGIN_PROC_NETWIRELESS,
226
+ "missed beacon for all interface", CONFIG_BOOLEAN_AUTO);
227
+ }
228
+
229
+ if (unlikely(!ff)) {
230
+ ff = procfile_open(proc_net_wireless_filename, " \t,|", PROCFILE_FLAG_DEFAULT);
231
+ if (unlikely(!ff)) return 1;
232
+ }
233
+
234
+ ff = procfile_readall(ff);
235
+ if (unlikely(!ff)) return 1;
236
+
237
+ size_t lines = procfile_lines(ff);
238
+ struct timeval timestamp;
239
+ size_t l;
240
+ gettimeofday(×tamp, NULL);
241
+ for (l = 2; l < lines; l++) {
242
+ if (unlikely(procfile_linewords(ff, l) < 11)) continue;
243
+
244
+ char *name = procfile_lineword(ff, l, 0);
245
+ size_t len = strlen(name);
246
+ if (name[len - 1] == ':') name[len - 1] = '\0';
247
+
248
+ struct netwireless *wireless_dev = find_or_create_wireless(name);
249
+
250
+ if (unlikely(!wireless_dev->configured)) {
251
+ configure_device(do_status, do_quality, do_discarded_packets, do_beacon, wireless_dev);
252
+ }
253
+
254
+ if (likely(do_status != CONFIG_BOOLEAN_NO)) {
255
+ wireless_dev->status = str2kernel_uint_t(procfile_lineword(ff, l, 1));
256
+
257
+ if (unlikely(!wireless_dev->st_status)) {
258
+ wireless_dev->st_status = rrdset_create_localhost("wireless",
259
+ wireless_dev->chart_id_net_status,
260
+ NULL,
261
+ wireless_dev->name,
262
+ "wireless.status",
263
+ "Internal status reported by interface.",
264
+ "status",
265
+ PLUGIN_PROC_NAME,
266
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
267
+ NETDATA_CHART_PRIO_WIRELESS_IFACE,
268
+ update_every,
269
+ RRDSET_TYPE_LINE);
270
+ rrdset_flag_set(wireless_dev->st_status, RRDSET_FLAG_DETAIL);
271
+
272
+ wireless_dev->rd_status = rrddim_add(wireless_dev->st_status, "status", NULL, 1,
273
+ 1, RRD_ALGORITHM_ABSOLUTE);
274
+ } else {
275
+ rrdset_next(wireless_dev->st_status);
276
+ }
277
+
278
+ rrddim_set_by_pointer(wireless_dev->st_status, wireless_dev->rd_status,
279
+ (collected_number)wireless_dev->status);
280
+ rrdset_done(wireless_dev->st_status);
281
+ }
282
+
283
+ if (likely(do_quality != CONFIG_BOOLEAN_NO)) {
284
+ wireless_dev->link = str2ld(procfile_lineword(ff, l, 2), NULL);
285
+ wireless_dev->level = str2ld(procfile_lineword(ff, l, 3), NULL);
286
+ wireless_dev->noise = str2ld(procfile_lineword(ff, l, 4), NULL);
287
+
288
+ if (unlikely(!wireless_dev->st_link)) {
289
+ wireless_dev->st_link = rrdset_create_localhost("wireless",
290
+ wireless_dev->chart_id_net_link,
291
+ NULL,
292
+ wireless_dev->name,
293
+ "wireless.link_quality",
294
+ "Overall quality of the link. This is an aggregate value, and depends on the driver and hardware.",
295
+ "value",
296
+ PLUGIN_PROC_NAME,
297
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
298
+ NETDATA_CHART_PRIO_WIRELESS_IFACE + 1,
299
+ update_every,
300
+ RRDSET_TYPE_LINE);
301
+ rrdset_flag_set(wireless_dev->st_link, RRDSET_FLAG_DETAIL);
302
+
303
+ wireless_dev->rd_link = rrddim_add(wireless_dev->st_link, "link_quality", NULL, 1, 1,
304
+ RRD_ALGORITHM_ABSOLUTE);
305
+ } else {
306
+ rrdset_next(wireless_dev->st_link);
307
+ }
308
+
309
+ if (unlikely(!wireless_dev->st_level)) {
310
+ wireless_dev->st_level = rrdset_create_localhost("wireless",
311
+ wireless_dev->chart_id_net_level,
312
+ NULL,
313
+ wireless_dev->name,
314
+ "wireless.signal_level",
315
+ "The signal level is the wireless signal power level received by the wireless client. The closer the value is to 0, the stronger the signal.",
316
+ "dBm",
317
+ PLUGIN_PROC_NAME,
318
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
319
+ NETDATA_CHART_PRIO_WIRELESS_IFACE + 2,
320
+ update_every,
321
+ RRDSET_TYPE_LINE);
322
+ rrdset_flag_set(wireless_dev->st_level, RRDSET_FLAG_DETAIL);
323
+
324
+ wireless_dev->rd_level = rrddim_add(wireless_dev->st_level, "signal_level", NULL, 1, 1,
325
+ RRD_ALGORITHM_ABSOLUTE);
326
+ } else {
327
+ rrdset_next(wireless_dev->st_level);
328
+ }
329
+
330
+ if (unlikely(!wireless_dev->st_noise)) {
331
+ wireless_dev->st_noise = rrdset_create_localhost("wireless",
332
+ wireless_dev->chart_id_net_noise,
333
+ NULL,
334
+ wireless_dev->name,
335
+ "wireless.noise_level",
336
+ "The noise level indicates the amount of background noise in your environment. The closer the value to 0, the greater the noise level.",
337
+ "dBm",
338
+ PLUGIN_PROC_NAME,
339
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
340
+ NETDATA_CHART_PRIO_WIRELESS_IFACE + 3,
341
+ update_every,
342
+ RRDSET_TYPE_LINE);
343
+ rrdset_flag_set(wireless_dev->st_noise, RRDSET_FLAG_DETAIL);
344
+
345
+ wireless_dev->rd_noise = rrddim_add(wireless_dev->st_noise, "noise_level", NULL, 1, 1,
346
+ RRD_ALGORITHM_ABSOLUTE);
347
+ } else {
348
+ rrdset_next(wireless_dev->st_noise);
349
+ }
350
+
351
+ rrddim_set_by_pointer(wireless_dev->st_link, wireless_dev->rd_link,
352
+ (collected_number)wireless_dev->link);
353
+ rrdset_done(wireless_dev->st_link);
354
+
355
+ rrddim_set_by_pointer(wireless_dev->st_level, wireless_dev->rd_level,
356
+ (collected_number)wireless_dev->level);
357
+ rrdset_done(wireless_dev->st_level);
358
+
359
+ rrddim_set_by_pointer(wireless_dev->st_noise, wireless_dev->rd_noise,
360
+ (collected_number)wireless_dev->noise);
361
+ rrdset_done(wireless_dev->st_noise);
362
+ }
363
+
364
+ if (likely(do_discarded_packets)) {
365
+ wireless_dev->nwid = str2kernel_uint_t(procfile_lineword(ff, l, 5));
366
+ wireless_dev->crypt = str2kernel_uint_t(procfile_lineword(ff, l, 6));
367
+ wireless_dev->frag = str2kernel_uint_t(procfile_lineword(ff, l, 7));
368
+ wireless_dev->retry = str2kernel_uint_t(procfile_lineword(ff, l, 8));
369
+ wireless_dev->misc = str2kernel_uint_t(procfile_lineword(ff, l, 9));
370
+
371
+ if (unlikely(!wireless_dev->st_discarded_packets)) {
372
+ wireless_dev->st_discarded_packets = rrdset_create_localhost("wireless",
373
+ wireless_dev->chart_id_net_discarded_packets,
374
+ NULL,
375
+ wireless_dev->name,
376
+ "wireless.discarded_packets",
377
+ "Packet discarded in the wireless adapter due to \"wireless\" specific problems.",
378
+ "packets/s",
379
+ PLUGIN_PROC_NAME,
380
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
381
+ NETDATA_CHART_PRIO_WIRELESS_IFACE + 4,
382
+ update_every,
383
+ RRDSET_TYPE_LINE);
384
+
385
+ rrdset_flag_set(wireless_dev->st_discarded_packets, RRDSET_FLAG_DETAIL);
386
+
387
+ wireless_dev->rd_nwid = rrddim_add(wireless_dev->st_discarded_packets, "nwid", NULL, 1,
388
+ 1, RRD_ALGORITHM_INCREMENTAL);
389
+ wireless_dev->rd_crypt = rrddim_add(wireless_dev->st_discarded_packets, "crypt", NULL, 1,
390
+ 1, RRD_ALGORITHM_INCREMENTAL);
391
+ wireless_dev->rd_frag = rrddim_add(wireless_dev->st_discarded_packets, "frag", NULL, 1,
392
+ 1, RRD_ALGORITHM_INCREMENTAL);
393
+ wireless_dev->rd_retry = rrddim_add(wireless_dev->st_discarded_packets, "retry", NULL, 1,
394
+ 1, RRD_ALGORITHM_INCREMENTAL);
395
+ wireless_dev->rd_misc = rrddim_add(wireless_dev->st_discarded_packets, "misc", NULL, 1,
396
+ 1, RRD_ALGORITHM_INCREMENTAL);
397
+ } else {
398
+ rrdset_next(wireless_dev->st_discarded_packets);
399
+ }
400
+
401
+ rrddim_set_by_pointer(wireless_dev->st_discarded_packets, wireless_dev->rd_nwid,
402
+ (collected_number)wireless_dev->nwid);
403
+
404
+ rrddim_set_by_pointer(wireless_dev->st_discarded_packets, wireless_dev->rd_crypt,
405
+ (collected_number)wireless_dev->crypt);
406
+
407
+ rrddim_set_by_pointer(wireless_dev->st_discarded_packets, wireless_dev->rd_frag,
408
+ (collected_number)wireless_dev->frag);
409
+
410
+ rrddim_set_by_pointer(wireless_dev->st_discarded_packets, wireless_dev->rd_retry,
411
+ (collected_number)wireless_dev->retry);
412
+
413
+ rrddim_set_by_pointer(wireless_dev->st_discarded_packets, wireless_dev->rd_misc,
414
+ (collected_number)wireless_dev->misc);
415
+
416
+ rrdset_done(wireless_dev->st_discarded_packets);
417
+ }
418
+
419
+ if (likely(do_beacon)) {
420
+ wireless_dev->missed_beacon = str2kernel_uint_t(procfile_lineword(ff, l, 10));
421
+
422
+ if (unlikely(!wireless_dev->st_missed_beacon)) {
423
+ wireless_dev->st_missed_beacon = rrdset_create_localhost("wireless",
424
+ wireless_dev->chart_id_net_missed_beacon,
425
+ NULL,
426
+ wireless_dev->name,
427
+ "wireless.missed_beacons",
428
+ "Number of missed beacons.",
429
+ "frames/s",
430
+ PLUGIN_PROC_NAME,
431
+ PLUGIN_PROC_MODULE_NETWIRELESS_NAME,
432
+ NETDATA_CHART_PRIO_WIRELESS_IFACE + 5,
433
+ update_every,
434
+ RRDSET_TYPE_LINE);
435
+ rrdset_flag_set(wireless_dev->st_missed_beacon, RRDSET_FLAG_DETAIL);
436
+
437
+ wireless_dev->rd_missed_beacon = rrddim_add(wireless_dev->st_missed_beacon, "missed_beacons",
438
+ NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
439
+ } else {
440
+ rrdset_next(wireless_dev->st_missed_beacon);
441
+ }
442
+
443
+ rrddim_set_by_pointer(wireless_dev->st_missed_beacon, wireless_dev->rd_missed_beacon,
444
+ (collected_number)wireless_dev->missed_beacon);
445
+ rrdset_done(wireless_dev->st_missed_beacon);
446
+ }
447
+
448
+ wireless_dev->updated = timestamp;
449
+ }
450
+
451
+ netwireless_cleanup(×tamp);
452
+ return 0;
453
+}
web/gui/dashboard_info.js
+6
@@ -50,6 +50,12 @@ netdataDashboard.menu = {
50
info: 'Performance metrics for network interfaces.'
51
},
52
53
+ 'wireless': {
54
+ title: 'Wireless Interfaces',
55
+ icon: '<i class="fas fa-wifi"></i>',
56
+ info: 'Performance metrics for wireless interfaces.'
57
+ },
58
+
59
'ip': {
60
title: 'Networking Stack',
61
icon: '<i class="fas fa-cloud"></i>',