边缘和云中的网络中断监控
作者:Wojciech Kocjan / 产品,用例
2022年11月22日
导航至
本文最初发表在The New Stack上,并在此获得授权转载。
收集数据以探索停电导致的连接问题以及最终耗尽笔记本电脑电池的问题。
监控间歇性停电和/或连接中断的位置可能具有挑战性。在这篇文章中,我将展示如何使用开源时序数据库InfluxDB、InfluxDB Cloud和边缘数据复制来本地存储数据并在可能的情况下将其发送到中央位置。我还会使用开源数据收集代理Telegraf来检索一些所需数据。
连接问题
在这种情况下,我与一台运行Windows的笔记本电脑共享一个位于偏远地点的小储藏室。这台电脑可以让我的朋友打印和扫描文档,而我用它来收集空气质量数据。该配置大多数时候工作正常;然而,偶尔的电源和互联网中断限制了朋友处理文档的能力,以及我收集空气质量数据的能力。
故障可能有多个原因。首先显然的问题是电脑可能已关闭。最有可能的根本原因是停电,但其他因素也可能在发挥作用,例如其他硬件或软件问题。此外,还可能存在网络设备的故障。原始配置包括互联网服务提供商(ISP)提供的本地交换机和路由器。
我怀疑停电是造成最初问题的原因,这导致了连接问题,最终导致笔记本电脑电量耗尽。然而,我需要更多的数据来验证我的假设。
我更新了我的配置有两个原因:1) 避免或最小化停电事件中的数据丢失,2) 收集更多数据以验证我对根本原因的假设。为此,我决定收集笔记本电脑电池及其与交换机和路由器连接的数据。
之前的配置
最初,笔记本电脑运行Telegraf并将数据发送到InfluxDB Cloud。但我更改了配置以改进它并解决这些连接问题。默认情况下,Telegraf在有互联网访问时发送数据,在网络连接失败的情况下将数据缓存在内存中。然而,如果网络中断并且发生停电,这会耗尽笔记本电脑的电池,我就会丢失所有数据。
以下是之前的配置
新的配置
为了解决这个问题,笔记本电脑现在运行本地实例的InfluxDB 2.0(开源版)。之前将指标直接输出到InfluxDB Cloud的Telegraf现在将所有数据发送到本地的InfluxDB实例。我配置了本地的InfluxDB实例进行边缘数据复制,这允许我设置一个bucket,在有任何连接时自动将bucket中的数据发送到InfluxDB Cloud的一个实例。
这种配置对停电更具弹性。现在Telegraf将数据发送到本地的InfluxDB OSS实例,因此数据会立即持久化在笔记本电脑上。然后OSS会将这些数据发送到我的InfluxDB Cloud账户,我在那里可以轻松地通过互联网查询数据并在其上构建警报。
以下是新的配置,包括边缘数据复制
该图还包括其他数据以帮助排除原始问题。
配置新的设置
当笔记本电脑开机时,它会自动登录并启动多个应用程序,包括Telegraf。
我根据InfluxDB 下载页面上的说明设置了InfluxDB OSS实例和InfluxDB CLI,并将它们安装到了C:\Program Files\InfluxData\influxdb。
然后我在启动文件夹中创建了一个新的快捷方式(例如 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 或 C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup),运行 cmd.exe /c “c:\Program Files\InfluxData\influxdb\influxdb2_windows_amd64\influxd.exe”,并将 运行 选项设置为 最小化,这样在下次计算机启动时就会启动InfluxDB。
要开始设置InfluxDB,我手动运行了快捷方式。使用我之前安装的InfluxDB CLI,我运行了influx setup
命令来设置本地实例。我提供了本地用户、组织ID、bucket名称和密码。
我已经有一个InfluxDB Cloud账户,所以我创建了一个新的bucket用于所有复制的数据。我还在我的云账户中创建了一个API令牌,它对此新bucket有写访问权限。我稍后会需要这个令牌来设置复制。
接下来,我需要设置边缘数据复制(EDR),以便所有本地bucket中的数据都复制到我在云账户中创建的bucket。
在这个时候,我需要创建一个“远程”来告诉本地InfluxDB实例它想要写入数据的InfluxDB Cloud实例。对于这个远程,我需要提供一个URL、云账户的组织ID(一个16位的十六进制数)和之前创建的API令牌。执行此操作的命令是
influx remote create --name cloud --remote-url https://eu-central-1-1.aws.cloud2.influxdata.com --remote-api-token "...." --remote-org-id ....
在这种情况下,我的云账户位于AWS的欧洲中央区域。显然,对于其他区域或其他云提供商的InfluxDB Cloud账户,这会有所不同。
重要提示:remote-org-id必须是InfluxDB Cloud账户的组织ID,而不是从 influx setup 步骤中的本地组织ID。
执行远程命令将输出有关新创建的远程的信息。复制 Remote ID(一个16位的十六进制数)非常重要,因为我们在下一步需要它。
在此阶段,我们已经拥有了创建复制所需的一切。在这里,我指定了我本地InfluxDB OSS实例上的一个存储桶,以复制到我的InfluxDB Cloud账户。命令如下
influx replication create --name cloud-mybucket --remote-id .... --local-bucket-id ....--remote-bucket-id ....
必须使用上述**influx remote create**
命令的输出中的ID作为**remote-id**
的值。对于**local-bucket-id**
和**remote-bucket-id**
的值,需要分别使用InfluxDB OSS和InfluxDB Cloud中存储桶的ID(16位十六进制数)。您可以在InfluxDB UI中找到存储桶ID。只需转到“加载数据”部分并点击“存储桶”标签即可。
数据复制进行中
拥有更具弹性的设置使我能够收集有关故障的信息,并希望收集更多关于潜在问题的信息。
因此,除了空气质量数据外,我还开始收集网络数据。我将Ping输入插件添加到Telegraf中,以定期检查以下内容的连通性:
- 连接衣帽间与其他建筑部分的交换机(该交换机有自己的IP地址)
- 提供互联网连接的本地路由器的IP地址
- 互联网服务提供商的远程IP地址
我将Ping输入插件配置更新如下
[[inputs.ping]]
urls = ["(switch IP)", "(ISP local ip)", "(ISP remote IP)"]
count = 3
timeout = 2.0
deadline = 10
interval = "300s"
这每五分钟检查一次所有三个IP地址的连通性,并将结果存储在本地的InfluxDB实例中。EDR将此数据复制到云中。
我还开始收集有关笔记本电脑电源和电池状态的数据。我可以判断笔记本电脑是否插上了AC电源,电池是否在放电以及剩余多少电池电量。Telegraf在Windows上没有提供内置的方法来检索此数据;然而,我只需要编写一个PowerShell脚本,该脚本查询Windows Management Instrumentation (WMI)并将此数据报告给Telegraf。
这种方法相当通用,您可以使用它来监控您可以从PowerShell查询的任何自定义指标或数据。使用Exec Telegraf输入插件将那些指标发送到InfluxDB。
我们可以使用**BatteryStatus
类的**PowerOnline
属性从**BatteryStatus
类检索表示笔记本电脑当前是否使用AC电源的数据。
我们可以从**Win32_Battery
WMI类和**EstimatedChargeRemaining
属性获取有关电池的数据,该属性返回剩余电池电量的百分比。
为了确保脚本支持具有多个电池的笔记本电脑,我编写了脚本以迭代所有行。
此PowerShell脚本是:
# Determine if at least one battery reports that it is on AC power
$power = 0
Foreach ($row in @(Get-CimInstance -class "BatteryStatus" -namespace root\wmi)) {
if ($row.PowerOnline -eq $true) {
$power = 1
}
}
# Calculate sum of percentage of all batteries and divide by number of batteries
$battery = 0
$count = 0
Foreach ($row in @(Get-CimInstance -classname Win32_Battery -property EstimatedChargeRemaining)) {
$battery = $battery + $row.EstimatedChargeRemaining
$count = $count + 1
}
$battery = $battery / $count
# Write results as very minimal implementation of line protocol
Write-Output ("batterystatus online={0}i,battery={1}" -f @($power,$battery))
您可以通过PowerShell手动调用该脚本
PS> PowerShell .\batterystatus.ps1
batterystatus online=1i,battery=100
注意:PowerShell的执行策略可能不允许运行文件。如果出现这种情况,请使用Unblock-File PowerShell命令允许单个文件运行。
要将此脚本添加到Telegraf,我们需要在配置中添加一个inputs.exec语句,例如
[[inputs.exec]]
interval = "60s"
commands = ["powershell C:/trex/batterystatus-telegraf.ps1"]
data_format = "influx"
这将每分钟运行一次脚本,将结果存储在本地并将它们复制到InfluxDB Cloud。
结果
经过几周的数据收集,发生了一些故障后,我能够收集到有意义的数据
- 衣帽间中的电力中断导致该设置检测到五起事件中的四起。
- 在所有电力中断中,交换机也停止了工作,这是互联网连接问题的主要原因。
- 由于互联网服务提供商级别的网络问题,导致一次故障,其中本地和远程IP地址均未对ICMP ping做出响应。
- 四起电力中断中有两起持续的时间足够长,以至于笔记本电脑的电池完全耗尽,导致其关闭。
- 没有出现笔记本电脑在没有耗尽电量之前停止收集数据的情况——排除了计算机或操作系统的问题。
有了这些数据,确定下一步行动变得容易多了。当地的交换机和打印机现在由不间断电源(UPS)供电,这解决了大部分问题,让我的朋友的生活变得更轻松。
至于笔记本电脑关机的问题,很遗憾,没有好的解决方案。这款笔记本电脑的BIOS/UEFI设置没有提供在恢复交流电源时自动重启的设置。
对我来说,我学会了如何设置EDR以及如何使用WMI监控Windows设备。由于数据复制,我的空气质量数据也更加完整,即使笔记本电脑关机也不会丢失数据。