我尝试在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库,使用它可以轻松地获取二氧化碳浓度。

 

CO2センサー回路

只要成功连接并且传感器会闪烁,就可以了。

ラズパイ

当执行库时,如果返回二氧化碳浓度的值,那就说明成功完成了。

$ 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和传感器入门知识。另外,由于这是一个会议的组织活动,目标和截止日期都很明确,不仅仅是自学而不是停留在自我满足中的学习,这也很好。最重要的是,我非常感谢运营团队给予我的各种反馈。既然最初的学习目标已经实现,我希望将来能够在开发方面提供帮助。如果对组织等方面感兴趣的人,随时都可以与我联系。

最後我必須強調,這篇文章確實是我個人學習內容的關聯。請諒解這與公司或本次會議無關,只代表個人觀點。

广告
将在 10 秒后关闭
bannerAds