在边缘和云端监控网络中断

导航至

本文最初发表于 The New Stack,并经许可在此处转载。

收集数据以探索电力中断导致连接问题并最终耗尽笔记本电脑电池的问题。

监控具有间歇性电源和/或连接中断的位置可能具有挑战性。在本文中,我将展示如何使用 InfluxDB(一个开源时间序列数据库)、InfluxDB Cloud 和 边缘数据复制 在本地存储数据并在可能的情况下将其发送到中心位置。我还将使用 Telegraf(一个开源数据收集代理)来检索此目的所需的一些数据。

连接问题

在本例中,我与一台运行 Windows 的笔记本电脑共享一个偏远位置的小壁橱。这台机器允许我的朋友打印和扫描文档,我用它来收集空气质量数据。大多数时候设置工作正常;但是,偶尔的电源和互联网中断限制了我的朋友处理文档以及我收集空气质量数据的能力。

故障可能有多种原因。第一个明显的问题可能是计算机关机。这里最可能的根本原因是电源中断,但也可能存在其他因素,例如其他硬件或软件问题。此外,网络设备可能存在问题。原始设置包括互联网服务提供商 (ISP) 提供的本地交换机和路由器。

我怀疑电源中断导致了最初的问题,这导致了连接问题,并最终导致笔记本电脑电池耗尽。但是,我需要更多数据来验证我的假设。

我着手更新我的设置有两个原因:1) 避免或最大限度地减少电源中断时的数据丢失,以及 2) 收集更多数据以验证我对根本原因的假设。为此,我决定收集有关笔记本电脑电池及其与交换机和路由器的连接的数据。

之前的设置

最初,笔记本电脑运行 Telegraf 并将数据发送到 InfluxDB Cloud。但我更改了设置以改进它并排除这些连接问题。默认情况下,Telegraf 在可以访问互联网时发送数据,并在连接失败时将数据缓冲在内存中。但是,如果网络中断并且发生电源中断,那会耗尽笔记本电脑的电池,并且我会丢失所有数据。

这是之前的设置

Monitoring-Network-Outages-at-the-Edge-and-in-the-Cloud-OG

新设置

为了解决这种情况,笔记本电脑现在运行 InfluxDB 2.0 (OSS) 的本地实例。Telegraf 过去直接将指标输出到 InfluxDB Cloud,现在将其所有数据发送到 InfluxDB 的本地实例。我为本地 InfluxDB 实例配置了 边缘数据复制,这允许我设置一个存储桶以在有连接时自动将该存储桶中的数据发送到 InfluxDB Cloud 的实例。

此设置更能抵抗电源中断。Telegraf 现在将数据发送到本地 InfluxDB OSS 实例,因此它会立即持久保存在笔记本电脑上。然后,OSS 将该数据发送到我的 InfluxDB Cloud 帐户,在那里我可以轻松地通过互联网查询数据并在其之上构建警报。

这是新设置,包括 边缘数据 复制

The-New-Setup

该图还包括有助于排除原始问题故障的其他数据。

配置新设置

笔记本电脑在开机时自动登录并启动多个应用程序,包括 Telegraf。

我按照 InfluxDB 下载页面 上的说明设置了我的 InfluxDB OSS 实例和 InfluxDB CLI,并将它们安装到 C:\Program Files\InfluxData\influxdb。

然后我在 Startup 文件夹中创建了一个新快捷方式(例如 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUpC:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)以运行 cmd.exe /c “c:\Program Files\InfluxData\influxdb\influxdb2_windows_amd64\influxd.exe” 并将 Run 选项设置为 Minimized,这将使 InfluxDB 在下次计算机启动时启动。

为了开始设置 InfluxDB,我手动运行了快捷方式。使用我之前安装的 InfluxDB CLI,我运行了 influx setup 命令来设置本地实例。我提供了我的本地用户、组织 ID、存储桶名称和密码。

我已经有一个 InfluxDB Cloud 帐户,因此我在那里为所有复制的数据创建了一个新存储桶。我还在我的云帐户中创建了一个 API 令牌,该令牌具有对此新存储桶的写入权限。稍后在设置复制时我将需要该令牌。

接下来,我需要设置边缘数据复制 (EDR),以便本地存储桶中的所有数据都复制到我在云帐户中创建的存储桶。

此时,我需要创建一个“远程”,告诉我的本地 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 ....

**remote-id** 值必须是上面 **influx remote create** 命令输出中的 ID。**local-bucket-id****remote-bucket-id** 的值需要分别是 InfluxDB OSS 和 InfluxDB Cloud 中存储桶的 ID(16 位十六进制数)。您可以在 InfluxDB UI 中找到存储桶 ID。只需转到“加载数据”部分,然后单击“存储桶”选项卡。

数据复制正在运行

拥有更具弹性的设置使我能够收集有关中断的数据,并有望获得有关潜在问题的更多数据。

因此,除了空气质量数据外,我还开始收集网络数据。我将 Ping Input 插件 添加到我的 Telegraf,以定期检查以下连接性

  • 将壁橱与建筑物其他部分连接的交换机(交换机有自己的 IP 地址)
  • 提供互联网连接的路由器的本地 IP 地址
  • 互联网服务提供商的远程 IP 地址

我将 Ping Input 插件配置更新为以下内容

[[inputs.ping]]
  urls = ["(switch IP)", "(ISP local ip)", "(ISP remote IP)"]
  count = 3
  timeout = 2.0
  deadline = 10
  interval = "300s"

这每五分钟检查一次与所有三个 IP 地址的连接,并将结果存储在 InfluxDB 的本地实例中。EDR 将该数据复制到云端。

我还开始收集有关笔记本电脑的电源和电池状态的数据。我可以知道笔记本电脑是否已插入交流电源、电池是否正在耗尽以及剩余电量。Telegraf 没有提供在 Windows 上检索此数据的内置方法;但是,我所要做的就是编写一个 PowerShell 脚本,该脚本查询 Windows Management Instrumentation (WMI) 并将此数据报告给 Telegraf。

这种方法非常通用,您可以使用它来监控可以从 PowerShell 查询的任何自定义指标或数据。使用 Exec Telegraf Input 插件将这些指标发送到 InfluxDB。

我们可以从 BatteryStatus 类中使用 PowerOnline 属性检索指示笔记本电脑当前是否正在使用交流电源供电的数据。

我们可以从 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。

结果

在收集数据数周并发生几次中断后,我能够获得有意义的数据

  • 壁橱中的电源中断导致使用此设置检测到的五起事件中的四起。
  • 在所有电源中断中,交换机也停止工作。这是互联网连接问题的根本原因。
  • ISP 级别的网络问题导致一次中断,其中 ISP 的本地和远程 IP 地址均未响应 ICMP ping。
  • 与电源相关的四次中断中的两次持续时间足够长,足以完全耗尽笔记本电脑电池,导致其关机。
  • 没有发生笔记本电脑在没有先耗尽电量的情况下停止收集数据的情况 — 排除了计算机或操作系统出现任何问题的可能性。

拥有这些数据使确定后续步骤变得容易得多。本地交换机和打印机现在在不间断电源 (UPS) 后运行,这解决了大多数问题,并使我朋友的生活更轻松。

至于笔记本电脑关机,不幸的是,没有好的解决方案。此笔记本电脑的 BIOS/UEFI 设置未提供在交流电源恢复后自动重启的设置。

对我而言,我学习了如何设置 EDR 以及如何使用 WMI 监控 Windows 设备。我的空气质量数据也更加完整,因为数据复制可以防止笔记本电脑关机时的数据丢失。