使用 Raspberry Pi 和开源工具测量您的物联网

设置环境监控系统演示了如何使用开源工具来监控温度、湿度等。
84 位读者喜欢这篇文章。
3 warning flags of DevOps metrics

Opensource.com

如果您有兴趣通过物联网 (IoT) 测量和与您周围的世界互动,您可以使用各种廉价的微控制器和微型计算机。还有许多传感器可连接到这些设备,以测量物理世界的许多方面。

这些传感器使用 I2C 消息总线与微控制器板接口,运行在板上的程序可以使用 MicroPython、Java、C# 和其他流行的编程语言中的开源库访问该总线。这些设备和库使创建复杂的数据收集系统变得非常容易。

为了演示这有多么容易和强大,我使用以下组件构建了一个温室监控系统,这些组件是我从 SparkFun 购买的

Adafruit 也有非常相似的产品和连接系统。

了解 Prometheus

您可以开始与世界互动的第一件事是收集和分析传感器获取的数据。开源软件使收集、分析、显示甚至对您的数据采取行动变得容易。

Prometheus 系列应用程序使收集、存储和分析数据作为单个事件的时间序列变得容易。我将简要介绍 Prometheus 架构的相关部分;如果您想了解更多信息,Opensource.com 上有很多关于 Prometheus 的优秀文章,包括 Prometheus 监控入门使用 Prometheus 实现大规模应用程序监控

Prometheus 套件包括以下应用程序,它们可以以各种方式组合在一起。

Prometheus

主 Prometheus 服务是一个强大的时间序列数据库,它运行在通用计算机上,例如 Linux 机器、云服务或 Raspberry Pi(建议使用 Raspberry Pi 4)。可以将 Prometheus 实例配置为定期“抓取”各种文件和网络连接的导出器服务(例如,HTTP、TCP 等),格式为 Prometheus 公开格式。单个 Prometheus 服务可以配置为抓取多个目标,每个目标都有唯一的作业名称。抓取目标以事件形式发布数据,事件具有用户定义的名称、时间戳、值和可选的键值注释集。如果数据源发布的数据没有时间戳,则在存储事件时,抓取的准确时间将自动添加到事件中。它还可以配置为与一个或多个 Alertmanager 实例通信,这些实例运行在同一主机或同一网络上的另一主机上。

一旦事件发布到 Prometheus 服务中,就可以使用 Prometheus 查询语言 进行查询。PromQL 查询可用于创建事件表和图表。它们还可以用于配置警报,其中 PromQL 查询条件的真值会导致 Prometheus 服务将配置的警报的触发状态设置为 true;只要条件为真,此警报将保持触发状态。一旦条件变为假,警报触发状态将设置为 false

导出服务的多个实例可以发布相同的指标,但通过注释进行区分以识别传感器。例如,如果您有三个温室监控器,每个监控器都可以发布其温度、湿度和其他指标,并使用诸如 greenhouse=1greenhouse=2greenhouse=3 之类的注释进行注释。可以配置图表、表格和警报以显示特定指标的所有实例,或者仅显示具有特定注释的指标。

存储在 Prometheus 中的所有指标都使用在配置中为抓取目标定义的作业进行注释。在 Prometheus 服务中配置的每个抓取目标都有一个名为 up 的布尔指标,每次服务成功抓取目标时,该指标都设置为 true,当服务无法抓取目标时,该指标设置为 false。这是一个有用的指标,可在 PromQL 查询中使用它来定义服务宕机时的警报。

Alertmanager

主 Prometheus 服务不会对警报采取行动——它只是在任何特定时刻将警报的状态保持为触发或未触发。Alertmanager 服务与 Prometheus 服务协同工作,以在 Prometheus 中定义的警报触发时设置通知。可以配置一个或多个 Alertmanager 服务以在与 Prometheus 服务相同的网络中的通用计算机上运行。

可以将 Alertmanager 通知配置为与各种外部系统通信,包括电子邮件网关、Web 服务端点、聊天服务和流行的票务系统。每个通知都可以模板化,以使用有关事件的各种属性,包括其所有注释,以生成通知消息。

Node Exporter

Node Exporter 是一个非常简单的守护程序,它作为 Web 服务在通用计算机主机上运行,并通过 HTTP 以 Prometheus 公开格式导出关于该主机的数据。它被编程为生成关于其主机的许多不同指标,例如 CPU 和内存利用率,使用为每个特定主机架构定义的逻辑(例如,proc 文件系统、Windows 注册表等)。

Node Exporter 实例也可以配置为在主机文件系统上呈现一个或多个符合 Prometheus 公开格式的文件。这使得它对于发布在同一主机上运行的另一个应用程序生成的指标很有用。示例温室监控系统使用 Python 程序从传感器收集数据并生成 Prometheus 格式的导出文件,Node Exporter 发布这些指标。

Pushgateway

Raspberry Pi Zero、3 或 4 可以托管 Node Exporter,但其他微控制器(例如 Arduino 或 Raspberry Pi Pico)不能。Pushgateway 使这些设备能够发布其指标。它是一个微服务,可以在另一个通用计算机主机(例如桌面、云,甚至 Rasberry Pi Zero、3 或 4)上运行,并为 Prometheus 服务抓取提供 Prometheus 公开格式的提要,以及一个 REST API,连接到其网络的其他进程可以使用该 API 报告自定义指标。

Pushgateway 实例可以在与 Prometheus 服务相同的主机或同一网络上的不同主机上运行。如果微处理器可以使用 Pushgateway 和 Prometheus 服务与网络通信(例如,以太网电缆、WiFi 或 LoRaWAN),则在微控制器上运行的进程可以使用标准 HTTP 库,以使用 Pushgateway REST API 作为其进程循环的一部分来报告指标。

Grafana

Grafana 不是 Prometheus 套件的一部分。它是一个开源可观察性系统,旨在从多个外部数据源提取数据,并将数据集成到可自定义的可视化仪表板中。Grafana 可以从各种外部系统类型中提取数据,包括 Prometheus。它是另一个强大的开源应用程序,您可以使用它来创建带有设备生成数据的复杂仪表板。Grafana 也可以安装到通用计算机上,例如桌面或 Raspberry Pi Zero、3 或 4。(我将其安装在托管 Prometheus 和 Alertmanager 服务的 Raspberry Pi 4 上。)

有很多教程可以帮助您开始使用 Grafana,包括 Opensource.com 上的几个教程,例如 Prometheus 和 Grafana 的完美组合,以及更多行业趋势使用 Grafana 监控 Linux 性能

安装 Grafana 后,使用浏览器导航到 Grafana 主机的主机名或互联网协议地址 (IP) 的 3000 端口,并使用默认凭据(空白 / admin)登录。确保更改管理员密码。然后,您可以添加数据源,并使用菜单选择 Prometheus 主服务器的 IP 或主机和端口。添加数据源后,您可以开始绘制 Prometheus 中的数据图或创建仪表板。

如果您要在 Raspberry Pi 上安装以上任何内容,请确保下载适用于您的 CPU 架构的 PrometheusGrafana 二进制发行版。在运行的 Raspberry Pi 上,您可以使用以下任一命令

  • uname -m
  • cat /proc/cpuinfo

来获取 CPU 架构。它会显示类似 armv7 的内容。

连接 Raspberry Pi Zero 的传感器

一旦您有了存储数据的地方,您就可以组装和配置温室监控设备。我使用 Raspberry Pi OS Lite 镜像刷新了 MicroSD 卡,并将其配置为 通过 WiFi 进行无头连接。我将 Qwiiic pHAT 插入 Pi Zero 排针,并将 Qwiic 电缆从 Qwiic pHAT 连接到每个光照和环境组合传感器。(务必将黄色电缆插入 Qwiic pHAT 上带有 Pi 排针连接的一侧,以及传感器上带有 I2C 焊接连接孔的一侧。)如果您的 Raspberry Pi 只有一个 Qwiic 连接,也可以菊花链连接传感器。

将 Raspberry Pi 连接到传感器后,将 SD 卡插入其插槽,连接电源,然后启动电源。它将启动,然后您应该能够使用以下命令连接到 Raspberry Pi

ssh pi@raspbberrypi.local

默认密码是 raspberry,但使用 passwd 命令将其更改为更安全的密码。您还可以使用桌面上的 ping 来获取主机的 IP 地址,并使用它代替 raspberrypi.local 地址。(如果您在网络上有多个 Pi,这很有用。)

安装 Node Exporter

通过从 Prometheus 网站 下载 适用于您的架构的二进制发行版,在您的 Raspberry Pi Zero 上安装 Node Exporter 应用程序。安装后,将其配置为 systemd 服务,以便它随 Raspberry Pi 自动启动和停止。

安装 Python 传感器库

Raspberry Pi OS 附带 Python 3,但不包括与传感器交互所需的库。幸运的是,有可用的 Python 库。

安装 SparkFun 的官方 Qwiic_Py 库 以访问环境组合分线板上的传感器。如果您使用的是 Raspberry Pi OS Lite,则必须为 Python 3 安装 pip(Python 包安装程序)

sudo apt install python3-pip

光传感器尚没有官方的 SparkFun 或 Adafruit Python 包,但您可以从其 GitHub 仓库获取开源 vml6030.py 包 并将其复制到 /home/pi 以在您的监控应用程序中使用它。它基于官方的 SparkFun Arduino 库。

安装温室监控器代码

此项目的 GitHub 仓库 中的 greenhouse_monitor.py 脚本使用 Python 传感器库每 11 秒将 ambient_temperatureambient_humidityambient_light 的指标附加到名为 /home/pi/metrics.prom 的文件中,格式符合 Prometheus 的预期

#!/usr/bin/python3

from veml6030 import VEML6030
import smbus2
import qwiic_bme280
import time
import sys

def instrument_metrics(light,temp,humidity):
  metrics_out = open('/home/pi/metrics.prom', 'w+')
  print('# HELP ambient_temperature temperature in fahrenheit', flush=True, file=metrics_out)
  print('# TYPE ambient_temperature gauge', flush=True, file=metrics_out)
  print(f'ambient_temperature {temp}', flush=True, file=metrics_out)
  print('# HELP ambient_light light in lux', flush=True, file=metrics_out)
  print('# TYPE ambient_light gauge', flush=True, file=metrics_out)
  print(f'ambient_light {light}', flush=True, file=metrics_out)
  print('# HELP ambient_humidity humidity in %RH', flush=True, file=metrics_out)
  print('# TYPE ambient_humidity gauge', flush=True, file=metrics_out)
  print(f'ambient_humidity {humidity}', flush=True, file=metrics_out)
  metrics_out.close()

print("Starting Greenhouse Monitor")
bus = smbus2.SMBus(1)  # For Raspberry Pi
light_sensor = VEML6030(bus)
environment_sensor = qwiic_bme280.QwiicBme280()

if environment_sensor.is_connected() == False:
	print("The Environment Sensor isn't connected to the system. Please check your connection", file=sys.stderr)
	exit(1)
environment_sensor.begin()
while True:
	light = light_sensor.read_light()
	temp = environment_sensor.temperature_fahrenheit
	humidity = environment_sensor.humidity
	instrument_metrics(light, temp, humidity)
	time.sleep(11)

这可以设置为 systemd 服务,/etc/systemd/system/greenhouse_montor.service

[Unit]
Description=Greenhouse Monitor
Documentation=https://github.com/prometheus/node_exporter
After=network-online.target

[Service]
User=pi
Restart=on-failure

ExecStart=/home/pi/greenhouse_monitor.py

[Install]
WantedBy=multi-user.target

Node Exporter 也可以配置为 systemd 服务,以发布 greenhouse_montitor.py 脚本在 /etc/systemd/system/node_exporter.service 生成的指标文件

[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network-online.target

[Service]
User=pi
Restart=on-failure

ExecStart=/usr/local/bin/node_exporter \
  --no-collector.arp \
  --no-collector.bcache \
  --no-collector.bonding \
  --no-collector.btrfs \
  --no-collector.cpu --no-collector.cpufreq --no-collector.edac --no-collector.entropy --no-collector.filefd --no-collector.hwmon --no-collector.ipvs \
  --no-collector.loadavg \
  --no-collector.mdadm \
  --no-collector.meminfo \
  --no-collector.netdev \
  --no-collector.netstat \
  --no-collector.nfs \
  --no-collector.nfsd \
  --no-collector.rapl \
  --no-collector.softnet \
  --no-collector.stat \
  --no-collector.time \
  --no-collector.timex \
  --no-collector.uname \
  --no-collector.vmstat \
  --no-collector.xfs \
  --no-collector.zfs \
  --no-collector.netclass \
  --no-collector.powersupplyclass \
  --no-collector.pressure \
  --no-collector.diskstats \
  --no-collector.filesystem \
  --no-collector.conntrack \
  --no-collector.infiniband \
  --no-collector.schedstat \
  --no-collector.sockstat \
  --no-collector.thermal_zone \
  --no-collector.udp_queues \
  --collector.textfile.directory=/home/pi

[Install]
WantedBy=multi-user.target

请注意,您可以省略所有 --nocollector.* 参数,node_exporter 将导出关于 Raspberry Pi 主机和 greenhouse_monitor 数据的大量指标。

一旦 systemd 服务定义到位,您可以使用 systemctl 添加并启用它们,它们将在您的 Raspberry Pi 启动并具有网络后立即启动

sudo systemctl enable greenhouse_monitor.py
sudo systemctl enable node_exporter

您可以使用以下命令对这些服务进行故障排除

sudo systemctl status $servicename

Python 脚本和 systemd 服务定义文件可在 项目的 GitHub 仓库 中找到。

重启 Raspberry Pi Zero 并开始监控

当 Raspberry Pi 启动时,它将启动 greenhouse_monitor.pynode_exporter 服务。您可以使用运行温室监控器的 Raspberry Pi 的 IP 或主机名在端口 9100(例如,http://$ip:9100)访问 node_exporter 服务。每 11 秒刷新一次以查看新条目。

配置 Prometheus 服务器抓取端点

一旦您的温室监控器的 Node Exporter 正在导出指标,您就可以配置 Prometheus 服务来抓取它。将以下行添加到 prometheus.yml 配置文件中的 scrape_configs 部分(将 targets 中的 IP 替换为您网络上运行 greenhouse_monitoring 服务的设备的 IP)

  - job_name: 'greenhouse_monitor'
 
	# metrics_path defaults to '/metrics'
	# scheme defaults to 'http'.
 
	static_configs:
	- targets: ['192.168.1.12:9100']

Prometheus 将每隔几秒自动加载配置文件并开始抓取您的温室监控器。您可以通过访问 Prometheus Web 用户界面 (UI) 目标页面 http://$prometheus_host:9090/targets 来验证它是否已开始抓取(并获取其启动/关闭状态)。

如果它已启动(并且是绿色的),您可以在 Prometheus Web UI 图形页面 http://$prometheus_host:9090/graph 中查询指标。

一旦您在 Prometheus 中获取了数据,您就可以访问 http://$graphana_host:3000 的 Grafana 服务。我创建了一个名为 Greenhouse 的仪表板,其中包含温室监控器导出的三个指标的面板。您可以使用时间控件设置 Grafana 以在面板中显示数据。我能够使用格式 from: YYYY-MM-DD 00:00:00To: YYYY-MM-DD 23:59:59 获取同一天从午夜到晚上 11:59:59 的 24 小时期间的值。

注意到阳光透过窗户照射到设备上的时间了吗?

接下来您应该测量什么?

您拥有触手可及的数据宝库,可以检查物理世界。接下来,您可以 配置 Alertmanager 以通过各种通信技术(例如,webhook、Slack、Gmail、PagerDuty 等)在 Prometheus 中配置的警报触发时发送通知。

既然您知道如何测量您的世界,那么问题就变成了:您想测量什么?

接下来阅读什么
User profile image.
我的主要经验是使用编程为研究人员在进行研究工作时遇到的问题提供工业强度解决方案。

2 条评论

我会试试看。我希望这些信息对我有帮助。

您可能也会对关于在云中托管 grafana 的文章感兴趣。
https://open-source.net.cn/article/21/3/raspberry-pi-grafana-cloud

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.