【物联网监控】尝试使用Grafana和Prometheus进行安装设定
首先,
物联网(Internet of Things,IoT)是指连接到一个网络中的多个物理设备,使系统能够与外部世界进行交互。由于无法在没有了解情况的情况下进行适应,因此围绕物联网的许多工作都变成了监控。
假设需要建立一个可以维持作物栽培的最佳条件的农业温室系统。为了达到这个目的,需要获取温度和湿度相关的信息的传感器,并且所有这些数据会自动保存和处理,从而使得供水和加热成为可能。
最适合物联网监控的堆栈是Prometheus和Grafana,或者由MetricFire托管的Prometheus和Grafana。
在这篇文章中,我们不会详细解释Prometheus和Grafana的基础知识,而是着重讲解使用这些工具来创建出色的物联网仪表板所需知道的内容。数据的收集,存储和处理可以通过Prometheus来进行,而可视化则可通过Grafana来实现。
请阅读这篇关于Prometheus基础解释的文章以及这篇关于Grafana基础解释和实际部署的文章,以详细了解基本知识。
请参阅有关如何将MetricFire连接到物联网设备的方式在Raspberry Pi 4监控相关的文章中,本文不涉及将边缘设备连接到Prometheus和Grafana的方法。
特别是在大规模物联网监测的情况下,需要考虑使用MetricFire的Hosted Prometheus进行监测。Hosted Prometheus提供自动扩展、更新、插件和Grafana仪表板等功能。在这里,需要注册MetricFire的免费试用账户,并开始构建物联网仪表板。
现在让我们来看一下互联网物联网监控背后的核心概念,并学习如何在Grafana上构建仪表板来监控物联网系统。
为什么需要IoT监测?
如果我们的IoT系统完全自动化,不需要人类干预,您觉得这不是太棒了吗?这样一来,就不再需要仪表盘了。
理想情况下,我们的物联网系统应该是零人参与的。然而,大家都知道这个世界并不完美。由于物联网系统由数百个敏感组件组成,对天气、机械损坏甚至电池供电都非常脆弱,因此在目前阶段,很难做到无人参与。
生产流水线的其他部分也有可能出现故障,这是很常见的。这可能是人类和机器都可能引起的。并且,由于完全自动化的企业几乎没有,所以人类需要参与监控和操作物联网系统。
#智能家居监测
作为一个例子,监测家庭中的压力、温度和湿度的系统,并将所有数据存储在Prometheus中,并通过Grafana进行可视化。以下是实现这一方案的可能方法。
就像您所见,我们将来自三个传感器的数据通过中心枢节点,并通过MQTT或HTTPS将其发送到API终端点。

您可以使用云服务或Prometheus Pushgateway将数据保存到数据库。对于更复杂的任务,可能需要使用StatsD来聚合数据。接下来,您可以将Grafana连接到Prometheus并创建仪表板。
#物联网监控架构
监控策略可分为两个主要类别:情况逻辑和基础设施。
## 基础设施
让我们首先解释一下基础设施的部分。传感器设备很容易损坏,可能由于网络问题或架构故障而导致放电或丢失数据包。因此,我们需要监控来自每个传感器的频率、数量和数据。
使用这种类型的数据,可以检测出损坏的传感器、放电的传感器或丢失数据的传感器。同时,通知专家解决问题的警报也是很有帮助的。通过这些分析,还可以估计处理这些数据所真正需要的基础设施(对于拥有数千个传感器的大型系统来说尤为重要)。
只要有适当的情景逻辑,就可以帮助监控情景中的重要事项。例如,如果通过智能家居监控数据,那么这些数据计算只在您在家的时候才是合理的(如果没有人在家,就没有必要冷却空气或加热到适当的温度)。
此外,即使在夜间等温度较低的时候,降低家庭温度也是有意义的。这样计算特定时间段的数值也是有意义的。
在某些度量值上创建警报也是有意义的。例如,适宜湿度的最小值为40%,最大值约为70%。如果测量到超过70%的湿度值,则需要在仪表板上进行通知。
要构建最适合的仪表盘,您需要确定要监视的设备数量和提取的数据。在智能家居的例子中,拥有温度和湿度的历史记录并不是非常重要。
在这里,我们主要关注当前的温度,或者至少是当天的当前温度。在另一种情况下,农业部门的物联网可能需要一个历史趋势仪表板。
监视指标
我們將以以下指標作為例子進行監控。
-
- humidity_gauge_percent
-
- pressure_gauge_pa
- temperature_gauge_c
通常情况下,建议在指标名称中包含指标的单位。这一实践已在上述指标名称中体现。有关详细信息,请参阅Prometheus关于指标命名的文档。
需要将这些指标导入Prometheus,需要配置Prometheus以获取在图表中可视化的API端点。关于如何做到这一点的一种方法,请参阅此教程。
所有数据的查询和操作都使用PromQL。在这里我们将解释一些基本概念,但强烈建议阅读本文章以更好地理解PromQL。
那么,让我们从创建仪表板开始吧。
构建物联网(IoT)仪表板
要开始创建仪表板,请点击首页左侧的加号图标,然后添加新的仪表板。接下来,添加一个新的面板,并添加查询。您可以在下方的图像中看到新仪表板的起始位置。

请阅读完整的教程,了解如何从头开始创建Grafana仪表板的详细方法。
在IoT仪表板查询中,使用上述指标名称来执行对Prometheus数据库的查询。
通过仅查询度量名称,开始创建“humidity_gauge_percent”的查询。根据条件和传感器的不同,仅执行“humidity_gauge_percent”的基本PromQL查询可能会导致数据中包含噪音,并可能得到以下结果。

如果想要去除噪音,您可以在查询指标时应用以下的PromQL函数。只需将以下查询写入查询表达式字段即可。
avg_over_time(humidity_gauge_percent[5m])
这个PromQL表达式会通过两种方法将查询进行转换。
-
- 第一个选项是将数据向量分割为范围向量。 在每个时间点上,范围向量将保持一个值数组,该数组的长度为5m。 (正如您可能已经知道的那样,由于这不是带有时间标记的时间序列,因此无法只显示湿度仪表百分比[5m]的值。值是分组的子序列。)
- 然后,计算随时间变化的平均值。
结果将如下。

如果不指定查询图例,则会显示如下所示的自动生成图例。

可以通过直接在Prometheus中执行查询来找到完全相同的信息。转到Prometheus的查询浏览器,并转到“标签”列的“Prometheus状态”>“目标”页面,即可显示相同的指标。

由于显示与该度量标准相关联的标签,这是值得关注的。
使用PromQL查询进行函数的过滤、聚合和使用。
###查询筛选
您可以通过标签对指标进行筛选,例如显示在前一部分最后的图像中的内容。要查询特定实例,只需要在指标名称后面加上括号,在等号处指定要搜索的键值对。 例如:
humidity_gauge_percent{instance="localhost:8000"}
请注意,可以使用变量来确定要在当前时间可视化的实例。有关详细信息,请参阅文档。变量可以根据需要进行自定义或预先定义。这是一个非常强大的工具,可用于创建按房间或区域汇总的仪表板。但是,在此示例中,由于每个传感器只有一个实例,所以此应用程序目前不使用。
根据查询,可以使用函数来应用简单的线性回归模型,以预测未来的价值。
predict_linear(humidity_gauge_percent [10m]、300)
在这个例子中,我们在未来的300秒内以10分钟的范围进行预测。predict_linear函数只能在仪表盘中使用。请确保仪表盘以now +(预测间隔)的上限运行,否则预测将丢失。此外,还需要注意边界是安装在整个仪表盘而不是每个面板。
另一个出色的功能是修改功能。
changes(humidity_gauge_percent[1m])
这个函数会展示在指定的时间范围内(这种情况下是1分钟)的变化数。你可以从中得到什么?如果数据在较长时间内没有变化,那可能就意味着有问题。
另外,建议收集与网络信息相关的一些度量指标,如电力量感应器的状态信息等。这些指标有助于检测位于危险区域的感应器是否损坏。
###查询聚合
在许多情况下,需要每个实例的数据和聚合数据。以下是一些PromQL的聚合操作符。
-
- sum – calculate sum over dimensions
-
- min – select minimum over dimensions
-
- max – select maximum over dimensions
-
- avg – calculate the average over dimensions
-
- stddev – calculate population standard deviation over dimensions
-
- stdvar – calculate population standard variance over dimensions
-
- count – count number of elements in the vector
-
- count_values – count number of elements with the same value
-
- bottomk – smallest k elements by sample value
-
- topk – largest k elements by sample value
- quantile – calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions
举个例子,如果使用bottomk,可以从房子里最冷的房间中选择一个序列(如果有多个温度计传感器)。语法在官方文件中有介绍,使用示例如下:
bottomk (2, temperature_gauge_c)
通过这种方式,会返回两个最低温度的系列。您也可以使用包含关键字「without」或「by」的标签对聚合进行分组。
注意:聚合运算符与之前提到的查询函数不同。这些运算符按维度(也就是标签)对数据进行聚合。而查询功能则在时间范围内(例如每5分钟)操作数据。
###阈值设定
下一步是设置图表的阈值。移至[可视化]选项卡,并进行以下配置。
如果设置了阈值,当值超过特定限制时,仪表的颜色会改变。最好设置警报规则以尽快做出反应。
你可以使用以下查询来检测实例是否正常运行。
up {job = "<job-name>"、instance = "<instance-id>"}
使用此查询来确认实例是否正常,即是否可达,或者如果网页抓取失败,则确认是否为0。
###合适的可视化类型
请记得使用适合数据和需求的可视化类型。例如,图表适合显示多个值、检测趋势和进行比较。仪表盘适合显示一些汇总数据和当前值,并最佳地可视化当前值与阈值的关系。

总结
传感器会产生大量有用的信息,处理这些信息需要一个仪表盘。由于在物联网规范中,有些设备会有多个实例,因此我们需要针对每个组和实例进行单独监视,以便尽可能地获取多个变量,从而应用特定的变量。
由于传感器容易损坏,因此除了监视环境指标外,还需要仔细监控传感器本身。重要的是不仅要检测问题,还要尽快采取措施。因此,需要设置警报系统,以始终接收系统状态的通知。
就像您所见,系统设置需要一定的工作量。为了缩短配置时间,您可以使用MetricFire的免费试用版来运行Prometheus和Grafana。预约演示,直接联系我们,了解如何最佳设置IoT仪表板。