Raspberry Pi Pico Wと Prometheus Pushgateway で IoT(DeNA24新卒アドカレ25日目)
本稿は DeNA 24 新卒 Advent Calendar 2023 の 25 日目の記事です.
背景 (戯言)
興味ない人は #Architecture まで飛ばしてください.
私は大学で,IoT やスマートシティ系の研究室に所属しています.研究室のサーバ管理を行っている中で,GPU サーバのリソース使用率とかモニタリングしたいと考え,Prometheus と Grafana を使用してメトリクスを監視するためのダッシュボードを作成してみたことがありました.
Prometheus はサーバやソフトウェア,サービスの監視システムを構築するための,OSS です.監視対象のメトリクスを収集・蓄積し,設定に応じてアラートの発行も行うことができます.
Prometheus の詳細については以下の記事等を参考にしてください.
Prometheus のことを調べている際に気になったのが,Prometheus が Pull 型のアーキテクチャ (後述) を採用しているという点です.Pull 型のアーキテクチャを採用しているということは,IoT 系のモニタリングに使用するのは厳しそうだと考え色々調べ始めたのが本稿の執筆動機です.
Prometheusは Pull型
モニタリングシステムが監視対象からメトリクスを取得するアーキテクチャには Push 型と Pull 型が存在しますが,Prometheus は Pull型を採用しています.Pull 型とは Prometheus (監視システム)側に監視対象についての設定を行い,メトリクス取得時は Prometheus から監視対象へとアクセスしてメトリクスを取得するアーキテクチャです.Pull 型だと何故 IoT に使用するのが厳しいかというと,IP アドレスの問題で監視対象に直接アクセスできないことが多いからです.
例えば,一般的な家庭向けの IoT サービスを構築することを考えます.ざっくりしたイメージですが,下図のように,家庭の LAN 内に設置された様々なセンサや制御機器とサーバがネットワークを介してやりとりします.詳細は割愛しますが,このような状況でクラウド上のサーバからエンドデバイスに直接アクセスするためには以下のような理由でアクセス先の IP アドレスを知ることができず,Prometheus のような Pull 型のアーキテクチャを採用したシステムを直接使用することができません.
- そもそも家庭に固定されたグローバル IP アドレスが存在しない
- 家庭内に配置されたデバイスの IP アドレスが固定されていない
Prometheus では, Pull できない状況下でも使用できるようなコンポーネントが提供されています.それが Pushgateway です.下図のように,Prometheus と監視対象の間に Pushgateway を配置することで,エンドデバイスは Pushgateway にデータを Push し,Prometheus は Pushgateway にデータを Pull しに行くという構図が出来上がります.
そもそも Prometheus を IoT 向けに使用するべきかどうかという議論はさておき,Pushgateway を使用することで,Prometheus がエンドデバイスに直接アクセスできない問題を解決することができそうです.ちなみに,先述のような,エンドデバイスの IP アドレスを管理しきれないような状況では Push 型のアーキテクチャを採用したシステムを使用したり,エンドデバイスとサーバで相互にアクセスすることが必要な場合は間に Pub/Sub を挟むことが一般的なようです.(知らんけど)
自宅の温度モニタリングに使用してみる
Prometheus, Pushgateway を使用して何か IoT っぽいことをしたいと思います.といっても,このためだけにセンサやらマシンやらを調達するのは面倒なので,家にあるもので出来ることを考えました.
というわけで家にあったものがこちらになります.
Raspberry Pi Pico W
Raspberry Pi Pico W は従来モデルである Raspberry Pi Pico に無線 LAN や Bluetooth での無線通信機能を追加したマイコンボードです.
Pico には温度センサが付いているので,これを使用して温度モニタリングができそうです.
(貰いものの)さくらの VPS のクーポン券
ISUCON 夏祭り 2023 に参加した際に,事前練習用として頂いたクーポンです.私たちのチームでは事前練習をオンプレ環境で行ったため,本クーポンは使用されずに残っていました.
私自身さくらの VPS を使ったことがないのと,せっかく頂いたものを無駄にしてしまうのも良くないので,今回はさくらの VPS でレンタルサーバを借りて,サーバサイドを構築します.
Architecture
作業
さくらの VPS のセットアップ
トップページにある「初めて VPS をご利用の方へ」というボタンから誘導に従って VPS を契約しました.セットアップが分かりやすかったので気づいたらサーバのセットアップが完了していました.
hoge GB プランで,OS には Ubuntu 22.04 を使用しました.
Prometheus のセットアップ
今回はビルド済みバイナリをダウンロードします.公式のダウンロードページから prometheus-2.45.1.linux-amd64.tar.gz
をダウンロードしました.
wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-2.45.1.linux-amd64.tar.gz
tar -xvf prometheus-2.45.1.linux-amd64.tar.gz
sudo mv prometheus-2.45.1.linux-amd64.tar.gz /usr/local/prometheus
サーバ起動時に Prometheus を自動で起動したいなと思ったので Systemd で起動するように Prometheus をサービス化します.以下のような Prometheus のユニットファイルを /etc/systemd/system/prometheus.service
に作成しました.
[Unit]
Description=Prometheus Server
[Service]
User=prometheus
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/data
[Install]
WantedBy=multi-user.target
以下のコマンドを叩いて Prometheus を有効化します.
# Prometheus を実行するユーザの作成
sudo useradd -U -s /sbin/nologin -M -d / prometheus
# Prometheth がデータを保存するディレクトリの作成
sudo mkdir -p /var/lib/prometheus/data
sudo chown -R prometheus:prometheus /var/lib/prometheus
# service の有効化と起動
sudo systemctl daemon-reload
sudo systemctl enable prometheus
これで Prometheus のインストールは完了です.
http://<サーバのIP>:9090
にアクセスすると Prometheus の WebUI が表示されるはずです.
Prometheus Push Gateway のセットアップ
こちらも同様に公式の GitHubを参考にダウンロードします.今回は pushgateway-1.6.2.linux-amd64.tar.gz
をダウンロードしました.
# download pushgateway binary
wget https://github.com/prometheus/pushgateway/releases/download/v1.6.2/pushgateway-1.6.2.linux-amd64.tar.gz
tar -xf pushgateway-1.6.2.linux-amd64.tar.gz
# configuration for systemd
sudo mv pushgateway-1.6.2.linux-amd64 /usr/local/pushgateway
sudo useradd -U -s /sbin/nologin -M -d / pushgateway
sudo vim /etc/systemd/system/pushgateway.service
# start pushgateway with systemd
sudo systemctl daemon-reload
sudo systemctl enable pushgateway
これでインストールは完了です.http://<サーバのIP>:9091
にアクセスすると pushgateway の WebUI が表示されるはずです.
試しに curl を使用してメトリクスを push してみます.
echo "test_metrics 0.1234" | curl --data-binary @- http://<サーバのIP>:9091/metrics/job/test_job
WebUI から保存されたメトリクスを確認することができます.
Prometheus が Pushgateway にスクレイピングしに行くように,設定ファイルを記述します./usr/local/prometheus/prometheus.yml
に以下を追記しました.
scrape_configs:
- job_name: 'pushgateway'
honor_labels: true
static_configs:
- targets: ['localhost:9091']
Prometheus を再起動すると,先ほど curl を使用して Pushgateway に push したデータが Prometheus に格納されていることが確認できます.
RaspberryPi Pico W setup
Pico のセットアップや Micro Python についてのドキュメントは豊富にあり,付属する温度センサを使用しての温度を取得するサンプルコードも公開されています.
- https://datasheets.raspberrypi.com/pico/getting-started-with-pico-JP.pdf
- https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-python-sdk.pdf
- https://github.com/raspberrypi/pico-micropython-examples/blob/master/adc/temperature.py
これらを参考に Pico で取得した温度を Pushgateway に push するプログラムを実装しました.最終的にできたコードが以下になります.
Pushgateway と Prometheus の接続は完了しているので,Prometheus から温度を確認することができます.センサに温風を当てたりするとちゃんと温度が変化するのでちゃんと動作していることが確認できます.
おわりに
本稿では,Raspberry Pi Pico W, Prometheus, Push Gateway を使用して室内温度のモニタリングを行いました.Push Gateway を使ってみたいという動機ではありますが,なんとか動くものがつくれたかと思います.
さて,本稿にて DeNA 24 新卒 Advent Calendar 2023 は最後となります.
ジャンルを問わず様々な記事が投稿されていますので,ぜひご覧ください.
ここまでお付き合いいただきありがとうございました.
Discussion