我尝试在Grafana上将会场内的CO2浓度可视化
首先
总结
我作为运营方参加了于2022年11月21日和22日举办的CloudNativeDays Tokyo 2022 (CNDT2022)会议。我参加这次会议是为了获取有关Observability的知识,并希望建立社外社群。这是我第二次参加该会议,之前的参加是因为我希望获取有关Prometheus等内容的知识。这次会议期间,我作为主要成员参与了一个可视化会场内CO2浓度的计划,现将其记录下来作为备忘。
目标读者
我想写的内容包括:“虽然有文章可以获取二氧化碳浓度的数据,但很少有文章涵盖将获取的数据制成图表的部分,我希望写一篇有参考价值的文章。”和 “由于我是第一次接触树莓派和传感器,所以我希望写一篇对于初学者有学习意义的文章”。
-
- 同じようなことを考えている企画者
-
- Prometheus,Grafanaを勉強したい初級者
- Raspberry Pi, CO2センサーを触ってみたい初級者
希望这对这些人有所帮助。
直到获取CO2浓度为止
准备
首先,我们寻找了与本次要求“获取会场内一间房间的二氧化碳浓度并与现有的Prometheus和Grafana进行集成”相近的文章,并购买了可能需要的设备。
-
- 必要なもの
Raspberry Pi 4
(昔見た時より高くなっているのにびっくりした。。今後もちょっと勉強用で使えると思って仕方なく購入。。)
MH-Z19C
参考記事はMH-Z19Bだったが、今はCの模様
mh-z19bで調べるとexporterを作っている人もいるみたいだしできるだろう
秋月電子で購入
ジャンパー線(メスメス)
ラズパイとセンサーをつなげる線
秋月電子でついでに購入
参考記事
Raspberry Pi 4とMH-Z19Bで二酸化炭素濃度を計測してみた
Raspberry Pi 4 でスマートメータ電気使用量・CO2センサ・温湿度計をグラフ化
树莓派的配置。
購買后的安装可以通过在YouTube上搜索来轻松找到详细的步骤,所以我不会详细解释。主要就是做了以下几件事情:
-
- ヒートシンクをつける
-
- OSインストール
-
- Wifiの設定
- SSHの有効化
设置CO2传感器
在MZ-H19C上有一个Python库,使用它可以轻松地获取二氧化碳浓度。
只要成功连接并且传感器会闪烁,就可以了。
当执行库时,如果返回二氧化碳浓度的值,那就说明成功完成了。
$ sudo pip install mh_z19
$ sudo python -m mh_z19
{"co2": 851}
在Grafana上展示
组成
这次我们使用了Prometheus的Pushgateway。Pushgateway可以看作是一个指标缓存,当监控目标将指标信息推送到Pushgateway时,它只保留最后推送的信息。通过让Prometheus定期抓取Pushgateway中保存的指标,我们可以将这些指标信息保存在内部,并与Grafana等工具进行协作以实现图形化显示。由于Prometheus是一种拉取(Pull)型架构,定期从监控目标抓取指标,因此不适合常驻不断运行的批处理作业等场景,而这正是Pushgateway的作用所在。
环境的建设
实际上,它是在Kubernetes环境中运行的,但为了方便在本地测试,我们将使用Docker进行操作。
由于在“尝试使用Prometheus和Grafana”文章中已经写出了所有所需的组件,因此这次我们将运行这个。需要准备的是以下两个文件。
-
- docker-compose.yaml
prometheus,pushgateway,grafanaのコンテナを使用する
基本設定・ポートはデフォルトのもので良い
grafanaのコンテナだけ参考記事とは別のものを使う
prometheus/prometheus.yaml
pushgatewayをスクレイプする設定を追加する
version: '3.1'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- 9090:9090
networks:
- public
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
pushgateway:
image: prom/pushgateway
container_name: pushgateway
ports:
- 9091:9091
networks:
- public
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
networks:
- public
networks:
public:
scrape_configs:
- job_name: 'pushgateway'
scrape_interval: 1s
static_configs:
- targets: ['pushgateway:9091']
labels:
environment: "hoge"
category: "pushgateway"
当文件创建完成后,启动。
$ docker-compose up -d
根据需要,将在Raspberry Pi上开放9091端口,以便访问Pushgateway。
编写脚本
-
- 前述したmh-z19ライブラリを使ってCO2濃度を取得します
- prometheus_clientライブラリを使って取得したメトリクスをpushgatewayへ送信します
prometheus_client
mh-z19
import time
import os
import mh_z19
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
# 送信先と送信間隔を環境変数として読み込む
PUSHGATEWAY_ADDRESS = os.getenv("PUSHGATEWAY_ADDRESS", "localhost:9091")
INTERVAL_SEC = int(os.getenv("INTERVAL_SEC", "10"))
# メイン関数
def main():
print(f"PUSHGATEWAY_ADDRESS = {PUSHGATEWAY_ADDRESS}")
print(f"INTERVAL_SEC = {INTERVAL_SEC} second")
while True:
# mh-z19ライブラリを使ってCO2濃度を取得
co2_conce = mh_z19.read_all()["co2"]
send_co2_conce(co2_conce)
time.sleep(INTERVAL_SEC)
# https://github.com/prometheus/client_python に従って記載する
def send_co2_conce(co2_conce: int):
registry = CollectorRegistry()
g = Gauge("co2_conce", "CO2 Conce", registry=registry)
g.set(co2_conce)
push_to_gateway(PUSHGATEWAY_ADDRESS, job="co2", registry=registry)
if __name__ == "__main__":
main()
安装所需的库。
$ python -m venv venv
$ . venv/bin/activate
$ pip install -r requirements.txt
服务化
通过上述脚本的无限循环,可以持续获取CO2浓度,但是当与Pushgateway无法连接时,脚本会异常结束。这样的话,如果没有意识到它已经崩溃,或者如果它失败了就重新启动,会产生很麻烦的操作。因此,我们将自动将其服务化,以便自动重新启动。
(非常感谢同一团队的成员为此提供了帮助。。)
我会准备systemd的配置文件。
-
- PUSHGATEWAY_ADDRESSを適宜変更する
- 下記は前述のスクリプト類を/home/observability/observability/co2-sensorというディレクトリに置いた例
[Unit]
Description=Measure co2 and upload data
After=network.target
[Service]
Environment=PUSHGATEWAY_ADDRESS=<自分の端末IP>:9091
Environment=PYTHONUNBUFFERED=1
WorkingDirectory=/home/observability/observability/co2-sensor
ExecStart=/home/observability/observability/co2-sensor/venv/bin/python -u /home/observability/observability/co2-sensor/main.py
Restart=on-failure
StartLimitBurst=0
[Install]
WantedBy=default.target
注册到systemd中,并实现自动启动和启动进程。
$ sudo cp co2-sensor.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable co2-sensor
$ sudo systemctl start co2-sensor
使用Grafana绘制
由于成功获取并保存了CO2浓度数据至Prometheus,最后将在Grafana中进行展示。
由于容器已经启动,您可以在浏览器中打开http://localhost:3000,并使用初始用户/密码admin/admin登录。系统会要求您更改密码,请随意设置密码。
首先,设置数据源。选择左侧选项卡的“齿轮” > “添加数据源” > “Prometheus”,即可进入Prometheus的设置页面。
-
- URLでPrometheusを指定する。
今回はdocker環境で作ったので、http://host.docker.internal:9090を指定した
他はデフォルト値で良い
必要に応じてスクレイピングの間隔を変えてもいい
会议当天
当天,我将会场的主要活动安排在边缘位置。
在上图中,CO2浓度在12点前后发生了显著变化,这是因为工作人员从准备室这个小房间搬到了A厅造成的。在小房间里,CO2浓度大约为700ppm左右,而在大房间里,大约为400ppm左右。在会议当天我们也进行了观察,但不知道是设备位置不好还是通风不良,CO2浓度保持在400ppm至500ppm的稳定数值,这对我们来说不太有意思,所以我们发布了准备时的图片。如果非要说的话,我们可以观察到在主题演讲开始拥挤时,CO2浓度逐渐上升的现象。
最后
首先,经过三天的正常运行让我感到放心。由于脚本负载较小,我们在准备和实际运行期间都让它连续运行了三天,而单台树莓派完全没有问题。然而,网络通信有时会变差,这让我再次深刻认识到在这类项目中,网络的配置和重试处理非常重要。将来是否会扩大规模还不确定,但鉴于树莓派的价格上涨,可能需要考虑一些降低成本的措施。
这个项目最初是出于个人兴趣开始的,但我很高兴通过学习Prometheus、Grafana、Raspberry Pi和传感器入门知识。另外,由于这是一个会议的组织活动,目标和截止日期都很明确,不仅仅是自学而不是停留在自我满足中的学习,这也很好。最重要的是,我非常感谢运营团队给予我的各种反馈。既然最初的学习目标已经实现,我希望将来能够在开发方面提供帮助。如果对组织等方面感兴趣的人,随时都可以与我联系。
最後我必須強調,這篇文章確實是我個人學習內容的關聯。請諒解這與公司或本次會議無關,只代表個人觀點。