监控您的无线接口
作者:David G. Simmons / 产品
2018 年 1 月 16 日
导航至
如果您关注了我之前的几篇文章,您会看到我一直在深入研究路由器和无线相关内容。我正在为使用 InfluxDB 的物联网监控构建一个更大、更复杂的“参考架构”,为此,我使用了各种不同的设备。我正在重复使用我的 Pine-64 设备(参见此处),并且我希望能够监控无线接口的统计信息。结果发现,没有 Telegraf 插件来做这件事!什么??!?!所以我自己写了一个。
如果您曾经执行过 `cat /proc/net/wireless`,您就会知道,虽然输出直接且有帮助,但有人认为 2 行的标头是个好主意。事实并非如此。
ubuntu@pine64:~$ cat /proc/net/wireless Inter-| sta-| Quality | Discarded packets | Missed | WE face | tus | link level noise | nwid crypt frag retry misc | beacon | 22 wlan0: 0000 0. -256. -256. 0 0 0 0 0 0 wlan1: 0000 42. -73. -256. 0 0 0 0 0 0 ubuntu@pine64:~$
我的意思是,它看起来不错,但实际上它并不是为了易于解析成有意义的内容而设计的。无论如何,由于我正在着手编写另一个 Telegraf 插件,因此解析它正是我需要做的事情。这就是我为了解析该标头并将其组合成可以有意义地存储在 InfluxDB 中的内容而编写的意大利面条代码:x
func loadWirelessTable(table []byte, dumpZeros bool) (map[string]interface{}, map[string]string, error) {
metrics := map[string]interface{}{}
tags := map[string]string{}
myLines := strings.Split(string(table), "\n")
for x := 0; x < len(myLines)-1; x++ {
f := strings.SplitN(myLines[x], ":", 2)
f[0] = strings.Trim(f[0], " ")
f[1] = strings.Trim(f[1], " ")
if f[0] == "BSSID" {
tags[strings.Replace(strings.Trim(f[0], " "), " ", "_", -1)] = strings.Replace(strings.Trim(string(f[1]), " "), " ", "_", -1)
continue
}
n, err := strconv.ParseInt(strings.Trim(f[1], " "), 10, 64)
if err != nil {
tags[strings.Replace(strings.Trim(f[0], " "), " ", "_", -1)] = strings.Replace(strings.Trim(f[1], " "), " ", "_", -1)
continue
}
if n == 0 {
if dumpZeros {
continue
}
}
metrics[strings.Trim(f[0], " ")] = n
}
tags["interface"] = "airport"
return metrics, tags, nil
}
所有这些都是为了让我们能够看到这个
在 Chronograf 中!太棒了!请注意,我是如何将多行标头转换为 'quality_level' 等不同的值,并通过用下划线等替换空格使其对 InfluxDB 友好。我们现在可以监控无线接口的各个方面了!所以,由于我运行的是最新版本的 Chronograf
我有一个方便的仪表盘,显示我的活动无线接口的 RSSI!当然,由于这个新插件(将在某个时候出现在 Telegraf 的某个版本中!)依赖于 `/proc/net/wireless`,它将仅适用于 Linux。
但是等等,我没有忘记你们所有的 Mac 用户。经过一番谷歌搜索,我找到了大致类似的方法来从 Mac OS 获取无线信息。它被隐藏起来且不易访问,但我为您挖掘出来了。它以更合理的方式格式化输出,使其非常容易进入 InfluxDB
$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I agrCtlRSSI: -63 agrExtRSSI: 0 agrCtlNoise: -95 agrExtNoise: 0 state: running op mode: station lastTxRate: 65 maxRate: 72 lastAssocStatus: 0 802.11 auth: open link auth: wpa2-psk BSSID: 36:c3:d2:e3:ed:8e SSID: Influx-IoT2 MCS: 7 channel: 3 $
这大大减少了使代码有用的工作量
func loadWirelessTable(table []byte, dumpZeros bool) (map[string]interface{}, map[string]string, error) {
metrics := map[string]interface{}{}
tags := map[string]string{}
myLines := strings.Split(string(table), "\n")
for x := 0; x < len(myLines)-1; x++ {
f := strings.SplitN(myLines[x], ":", 2)
f[0] = strings.Trim(f[0], " ")
f[1] = strings.Trim(f[1], " ")
if f[0] == "BSSID" {
tags[strings.Replace(strings.Trim(f[0], " "), " ", "_", -1)] = strings.Replace(strings.Trim(string(f[1]), " "), " ", "_", -1)
continue
}
n, err := strconv.ParseInt(strings.Trim(f[1], " "), 10, 64)
if err != nil {
tags[strings.Replace(strings.Trim(f[0], " "), " ", "_", -1)] = strings.Replace(strings.Trim(f[1], " "), " ", "_", -1)
continue
}
if n == 0 {
if dumpZeros {
continue
}
}
metrics[strings.Trim(f[0], " ")] = n
}
tags["interface"] = "airport"
return metrics, tags, nil
}
更合理,您不觉得吗?它将所有这些读数转换为漂亮的标签和字段
并在我的 Mac 上给了我类似的仪表盘
非常漂亮!
现在,您可能想知道为什么我费了这么大劲才能够监控无线接口的 RSSI。这是一个很好的问题!您看,在物联网世界中,您将拥有网关设备,这些设备将通过无线接口收集数据——您知道,与无线传感器连接。因此,能够监控这些无线接口的健康状况和活动非常重要。我添加 Mac 版本只是因为它很容易,而且我想要它。
所以,请继续关注。我将添加一些关于我连接到这个无线网关数据收集器的传感器的博客文章。它实际上是构建一个更大、更以工业为重点的物联网演示平台的更大项目的一部分。