Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

自宅のIoT監視をMackerelで!

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のラベル付きメトリック機能で見られるようにしています。

blog.arthur1.dev

ダッシュボード

これがIoT監視のためのダッシュボードです。現在はスマートロックのSESAMEとスマートリモコンのNature Remoを監視しています。

mackerel-sesame

Arthur1/mackerel-sesameは、SESAME Web APIにアクセスして、スマートロック機器の電池残量や電圧を取得し、サービスメトリックとして投稿するツールです。

github.com

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に投稿するツールです。

github.com

こちらも動作させるには以下の環境変数が必要です。

runner.go#L7-L13

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を管理しています。

github.com

アプリケーションリポジトリに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機器に囲まれて暮らしている皆さまもぜひ試してみてください。