arthur-1 Mackerel Advent Calendar 2023 マラソン20日目の記事です。Mackerel Meetup #15 が盛況のうちに終わって運営としてはほっと一息。ということで一日遅れてしまっていますがやっていきます。
自宅のIoT機器の監視
Mackerelのdogfoodingの一環として、私は自宅のIoT機器やネットワーク機器の監視をMackerelを利用して行っています。今回はIoT機器の監視の取り組みについてご紹介します。
システム概説
IoT機器のベンダーが提供するAPIにアクセスし、その結果をサービスメトリックとしてMackerelに投稿するアプリケーションを作りました。これはコンテナで動くようになっていて、Raspberry Piを組み合わせて作ったKubernetesクラスタ上でCronJobとして動かしています。
また、これらのアプリケーションを動かすのに必要な基盤の監視も必要です。各ノードにmackerel-agentを入れてシステムメトリックを収集しています。また、最近はOpenTelemetry Collectorを入れて、クラスタのメトリックをMackerelのラベル付きメトリック機能で見られるようにしています。
ダッシュボード
これがIoT監視のためのダッシュボードです。現在はスマートロックのSESAMEとスマートリモコンのNature Remoを監視しています。
mackerel-sesame
Arthur1/mackerel-sesameは、SESAME Web APIにアクセスして、スマートロック機器の電池残量や電圧を取得し、サービスメトリックとして投稿するツールです。
Go言語で作られており、一般的なOSに向けてbuildして動かせるようになっています。また、マルチアーキテクチャのコンテナも用意しており、こちらはGitHubのコンテナレジストリにアップロードしています:Package mackerel-sesame · GitHub
まだREADMEが整備されておらず申し訳ないです。動作させるのには以下の環境変数が必要です。
cmd/mackerel-sesame/main.go#L12-L18
type config struct { MackerelAPIKey string `env:"MACKEREL_API_KEY"` MackerelServiceName string `env:"MACKEREL_SERVICE_NAME"` SesameAPIKey string `env:"SESAME_API_KEY"` SesameDeviceUUID string `env:"SESAME_DEVICE_UUID"` SesameDeviceNameForMetric string `env:"SESAME_DEVICE_NAME_FOR_METRIC"` }
daemonとして動かすようには作っていないので、利用する際にはsystemdのタイマーやKubernetesのCronJobで定期実行させてください。
mackerel-remo
Arthur1/mackerel-remoは、Nature Remo Cloud APIにアクセスして温度や湿度センサーの計測値を取得し、サービスメトリックとしてMackerelに投稿するツールです。
こちらも動作させるには以下の環境変数が必要です。
type RunnerConfig struct { MackerelAPIKey string `env:"MACKEREL_API_KEY"` MackerelServiceName string `env:"MACKEREL_SERVICE_NAME"` NatureAccessToken string `env:"NATURE_ACCESS_TOKEN"` RemoDeviceID string `env:"REMO_DEVICE_ID"` RemoDeviceNameForExport string `env:"REMO_DEVICE_NAME_FOR_EXPORT"` }
温度や湿度をメトリック化しているものの、実はそれらの環境の監視がしたいわけでありません。我が家のNature Remoはたまにインターネットにアクセスできなくなることがある(外出先からエアコンをつけられず困る)ので、サービスメトリックの途切れ監視機能を利用することでNature RemoがCloudと通信できているかを監視できないか試しています。
監視ツールの動作基盤
先ほど紹介したようなツールをKubernetes上で動かしています。KubernetesクラスタにはArgo CDを導入しており、GitOpsでのリリースを実現しています。以下のリポジトリでmanifestを管理しています。
アプリケーションリポジトリにpushするとコンテナをbuildしてレジストリにpushし、その後さらに上記のマニフェストリポジトリでコンテナのタグを更新するPull Requestを自動で作る機構をGitHub Actionsで構築しています。あとはPull RequestをマージしてしまえばArgo CDの力て自動でクラスタに設定が反映される仕組みです。
CronJobのマニフェストファイルを以下に挙げておきます。Kubernetes上で拙作ツールを動かしたい方は参考にしてみてください。
manifests/iot-monitor/mackerel-remo/cronjob.yml
apiVersion: batch/v1 kind: CronJob metadata: name: mackerel-remo namespace: iot-monitor spec: schedule: "*/5 * * * *" jobTemplate: spec: template: spec: containers: - name: mackerel-remo image: ghcr.io/arthur1/mackerel-remo:sha-04ea23f env: - name: MACKEREL_API_KEY valueFrom: secretKeyRef: name: mackerel-arthur-1 key: apikey - name: MACKEREL_SERVICE_NAME value: home - name: NATURE_ACCESS_TOKEN valueFrom: secretKeyRef: name: nature-api key: access-token - name: REMO_DEVICE_ID valueFrom: secretKeyRef: name: nature-remo-mini key: device-id - name: REMO_DEVICE_NAME_FOR_EXPORT value: remoMini-living restartPolicy: OnFailure
クラスタの監視
Raspberry Piで作ったクラスタの監視もMackerelで行っています。
配線をシンプルにするためにPoEで給電しているのですが、PoE+ hatのファンがデフォルトの設定だとうるさくて仕事に困るので、ファンコントローラでかなり絞って運用しています。そこで、CPU温度が上がりすぎていないかを一番気にして監視しています。
いかがでしたか?IoT機器を監視するダッシュボードや自作ツールのご紹介でした。IoT機器に囲まれて暮らしている皆さまもぜひ試してみてください。