hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

三度の飯より監視と通知!Mackerelで自分の心拍数を監視しよう

この記事ははてなスタッフアドベントカレンダー2015の23日目です.前日はid:id:t_kytの「カマルについて」でした.今日はid:amariaの「わたしと働きやすい編集部と舞台」もあります.

この記事はMackerel Advent Calendar 2015の23日目でもあります.前日はid:buty4649さんの「mackerelでSNMPな機器をホストとして管理する」でした.

自分の心拍数をMackerelで監視しよう

こんにちは,id:hitode909です.先月ごろから,fitbitのChargeHRという活動量計を使っています.
これは腕時計型の活動量計で,腕につけておくと,歩数や移動距離,消費カロリーや,おもしろいことに,心拍数も計測してくれるものです.
ジョギング中のペース配分や,ふだんの暮らしでも,寝ている間に心拍数が低ければ体調が良い,お酒を飲みすぎて心拍数がこれ以上になるとよくないことが起きる,など,なにかと役立っています.

三度の飯より監視が好き,そこに数字があったら監視したい!!ということで,この記事では,fitbitで計測した心拍数をMackerelで監視する方法をご紹介します.

Mackerelについて

Mackerelは,はてなが作っているサーバー監視サービスです.アプリケーションが正しく動いているか監視するためのサービスで,サーバーの状態をグラフで見れたり,異常が起きたらメールやSlackなどで通知してくれたり,という機能があります.
心拍数をグラフで見たり,異常が起きたら教えてもらうにもぴったりなサービスですね.
mackerel.io

Mackerelに心拍数を投稿しよう

fitbitのデータをMackerelに流しこむため,fitbitのAPIと,MackerelのAPIを順に使っていきます.
fitbitはAPIを公開しているので,OAuth 2.0で認証して,いろいろなデータを取ってくることができます.毎分ごとの心拍数を返してくれるAPIがあるので,ここからデータを取ってくることにします.
Mackerelには値を投稿するためのAPIがあり,こちらはAPIキーで認証します.

fitbitにアプリケーションを登録しよう

fitbitのAPIを利用するために,アプリケーションを登録しましょう.

このさい,毎分の心拍数をAPIから取得するために,アプリケーションタイプををpersonalにする必要があります.
callback URLは,実際のコールバックのURLと一致させる必要があり,9003番ポートで動かすときは,http://localhost:9003/auth/fitbit_oauth2/callbackのような形になります.

Mackerelにサービスを作ろう

Mackerelには,特定のホストにひもづいた値(メトリック)と,特定のホストにひもづかない値(サービスメトリック)があります.心拍数は特定のホストとひもづかない情報なので,サービスメトリックとして投稿します.
生体データを保存するための,vitalというサービスを作りました.バイオデータという感じでわくわくします.

f:id:hitode909:20151222120738p:plain

さっそくできたものがこちら

動けば良いという精神で,vital2mackerelという名前の簡単なウェブアプリケーションを作ってました.ソースコードはこちらです.

fitbitのOAuth情報と,MackerelのAPIキーを用意して起動します.
ブラウザからアクセスすると,OAuthの認証画面が開きます.

f:id:hitode909:20151222120831p:plain

許可すると,このようなシンプルな画面に遷移し,Mackerelに心拍数が投稿されます.

f:id:hitode909:20151222120847p:plain

meta refreshによるオートリロード

今回作ったアプリケーションは,ブラウザからアクセスがあるたびに働くようになっているので,常に最新のデータを取得してMackerelに投稿するには,このページを定期的に開く必要があります.
丁寧なアプリケーションではcronなどを使うところですが,動けば良いという精神で,今回はmeta refreshによるオートリロードを実現しました.
このmetaタグを置いておくと,ブラウザが自動的に60杪ごとにページをリロードしてくれるので,cronがなくても大丈夫というわけです.便利ですね(プロダクションのコードでは絶対に真似しないでください).

<meta http-equiv="refresh" content="60;URL=/">


ブラウザでページを開いたあと,Mackerelを見てみると,無事グラフが出ました. 自分の心拍数が巡り巡ってここまで届くのは生きてるって感じがします.

f:id:hitode909:20151222120914p:plain

アラートを設定しよう

データは集まったので,アラートを設定してみましょう.80を越えたらWARNING,100を越えたらCRITICALを出してみます.
メールとSlackで通知が来るようにしました.

f:id:hitode909:20151222120925p:plain:w400

走り出そう

アラートを受け取るには,当然ながら心拍数を上げる必要があります.心拍数を上げるには運動するしかないので,アラートが来るまで,会社の周りをぐるぐる走ってきましょう.
fitbitはスマートフォンと連携しているので,携帯電話のネットワークを通じてデータを更新します.会社のMacBookでさきほどのアプリケーションが動いていて,会社のWiFiを通じてfitbitのAPIにアクセスする,という形です.
よくわからない図にすると,このような関係になります.
f:id:hitode909:20151222150330p:plain


それでは会社の周りを走ってみます.夕方の5時だというのに,最近は日の暮れるのが早いですね.

f:id:hitode909:20151222121025j:plain


たまに立ち止まってはSlackを眺めています.これでなにも出なかったらただ外を走り回ってるだけなので悲惨です.

f:id:hitode909:20151222121540p:plain

出た!!!

f:id:hitode909:20151222121551p:plain

ChatOpsというかんじでチームメンバーが僕の心拍数について議論している様子です.

f:id:hitode909:20151222121644p:plain

普段監視しているサーバーやサービスのアラートが出たときも,このようにグラフを見ながら冷静に対処しています.

CRITICAL!!!!!!

御所のあたりまで辿りついたころ,無事CRITICALのメールが届きました.実験成功です.

f:id:hitode909:20151222121400p:plain:w320

Slackにも流れます.

f:id:hitode909:20151222121707p:plain

会社に戻ってひといきついたところ,OKが届きました.これで安心ですね.

f:id:hitode909:20151222121757p:plain

OKです.

今回のワークアウトを振り返ろう

アラートページを見ると,今回のワークアウトがいい感じに可視化されました.もっと長時間運動すると,山あり谷ありという感じでおもしろくなりそうです.

f:id:hitode909:20151222121835p:plain:w600

今後の課題

今の実装はあまりに手抜きなので,MacBookのふたを閉じると計測が止まってしまう,HTMLを返せずにエラーが出るとオートリロードが止まってしまう,などの問題があります.日々安定して運用するには,たとえばサーバー上でcronで動かすなど,もうすこし堅牢な仕組みで計測したいところです.
また,データには毎分の心拍数が記録されているのですが,API経由で値を取れるまでには少し時間かかります.fitbitのサーバーに上がったデータをHTTP APIで取りに行ってるので,データを得られるまでに,数分ほど時差があるようでした.心拍数が上限を超えたので休む,といった用途には向かないかもしれません.

まとめ

簡単なコードでfitbitとMackerelを連携し,心拍数を監視することができました.
はてなでは,数字があったらなんでも監視したいスタッフを募集しています.採用情報はこちらです.
hatenacorp.jp