こんにちは、Mackerel CRE の
id:kmuto です。
この記事はMackerel Advent Calendar 2025 21日目の記事です。昨日20日は @kga さんでした。
我が家のお掃除ロボットとして愛用しているルンバ。メーカーのiRobot社は大変そうですが、ルンバには引き続き現役で掃除をがんばってもらうことに変わりはありません。
さて、以前、このルンバの制御のために「hi-gregor」というNode.jsアプリケーションを作っていました。
当時もバッテリー残量をJSONで取得できるところまで作っていましたが、現在はその値をMackerelのサービスメトリックとして投稿し、「充電不良がないか」を常時監視しています。今回はその仕組みを紹介してみます。
バッテリー残量をサービスメトリックとして投稿する
hi-gregorをセットアップすると、npm run statusコマンドで次のようなJSONを取得できます。
{"phase":"charge","battery":100}
phaseはルンバの状態(run・hmUsrDock・charge・stop・stuckのいずれか)、batteryはバッテリー残量(%)を示します。
この値をMackerelに送るため、次のような投稿スクリプトを作りました。
#!/bin/sh set -e API_KEY="《MackerelのAPIキー》" SERVICE_NAME="home" METRIC_NAME="samsa.battery" EPOCH=$(date +%s) BATTERY=$(npm run status | jq '.battery') if [ -n "$BATTERY" ] && [ "$BATTERY" != "null" ]; then curl -X POST "https://api.mackerelio.com/api/v0/services/${SERVICE_NAME}/tsdb" \ -H "X-Api-Key: ${API_KEY}" \ -H 'Content-Type: application/json' \ -d "[{\"name\": \"${METRIC_NAME}\", \"time\": $EPOCH, \"value\": $BATTERY }]" >/dev/null fi
API_KEY(MackerelのAPIキー)、SERVICE_NAME(投稿先のサービス名)、METRIC_NAME(メトリック名)の値は実際にご利用の環境に合わせて適宜調整してください。
スクリプトを実行し、MackerelのWebコンソール(該当サービスの「サービスメトリック」タブ)でグラフが表示されることを確認します。
自宅の環境では、このスクリプトを5分間隔でcron実行しています。
*/5 * * * * kmuto cd /home/kmuto/hi-gregor && ./battery.sh >/dev/null 2>&1
5分間隔にしているのはルンバへのポーリング頻度を上げすぎないため(あまり頻繁だとルンバからの返答が詰まる)ですが、もし多くのサービスメトリックを使っている場合には、コスト効果も得られます。
Mackerelのサービスメトリックの課金は月間の投稿データ数に基づいており、投稿間隔を広げることで費用を削減できる効果があります(たとえば1,000本のグラフのメトリックを投稿している場合、1分間隔だと1,000メトリックぶんの課金ですが、5分間隔だと200メトリックぶんの課金になります)。
これでサービスメトリックでルンバのバッテリー残量の監視ができるようになりました!

閾値によるアラートを設定する
メトリック化できれば、あとはアラートを設定するだけです。「バッテリー残量が10%を切ったらWarning、5%を切ったらCritical」という設定にすることにしましょう。
ただし、掃除中は当然バッテリーが減っていくため、そのたびにアラートが鳴るのはノイズになるので避けたいところです。そこで、「アラート発生までの最大試行回数」は「3」に設定しています。これにより、ドックに戻っているはずなのに回復していない、充電不良になっている状態を検知することを狙います。

通知先チャンネルとしてSlack通知を設定しているので、バッテリー残量が低下したときにアラート通知がSlackに届くようになりました!

途切れ監視を設定する
バッテリーが完全に切れてルンバが応答しなくなったり、hi-gregorの動作に異常があったりする場合、メトリックの投稿自体が止まってしまいます。
これを検知するために、Mackerelの「途切れ監視」を有効にします。

これもSlackに通知されます。

サービスメトリックはこのように値の異常だけでなく、途切れ監視を使ってデータの欠損も発見できるのがメリットですね。なお、ホストメトリックで同様の監視をしたい場合は、拙作の「check-mackerel-metric」プラグインを併用するのがお勧めです。
まとめ
今回はルンバを例に挙げましたが、APIで「値」が取れるものなら何でもMackerelで可視化・監視できます。
- スクリプトで値を取得する
- サービスメトリックとして投稿する
- 投稿間隔を調整しながら定期実行する
- 「継続回数」と「途切れ監視」でノイズを減らしながら監視する
今後ルンバを別製品に買い換えるにしても、APIで遊べるものを選びたいですね。
以上、Mackerel Advent Calendar 2025 21日目の記事でした。明日22日は @inommm さんです。