
Grafana Cloud + PlanetScale(MySQL)で自分を監視するダッシュボードを構築する
[2024.03.09 追記]
PlanetScaleの無料プランが4月上旬で終了するため、自分はNAS上にMariaDBを構築 + ローカルでGrafana(on Docker)を起動、データの定期取得とDBバックアップはPC起動中にcronで実行する運用に切り替えましたので本noteは参考程度にしてください。
---
睡眠は大事である。
禍以降、体力不足を実感するので運動したい。
やりたいことに時間を割きたい。
反対に、控えたいことに割く時間を減らしたい。
と毎年思いながら、結局あまり睡眠時間取れてないな〜とか年末になって今年もやりたいことあまり出来なかったな〜と振り返る。
なぜなのか。
人間(自分)が管理しているからだ。
ならば機械に自分を監視させれば解決するのでは?
よし、可視化して見えるようにしよう。

以下の記事を参考にして作りつつ、構築のきっかけを得た。
ダッシュボード構築にあたり、以下の記事から刺激と着想を得た。
骨しゃぶり氏のブログはとてもおもしろいのでおすすめです。
監視項目
読書時間、楽器の練習時間
Pixe.laからデータを取得している。
積読の消化を今年の目標にしていたのに全然読めていなかったので、読書に費やした時間を記録することで間接的に積読の消化を促す作戦。
楽器の練習時間も同様に記録する。
0が並んで怠惰が可視化される前にやらねばという気持ちを掻き立てる。
あとゲーマーなので数字は大きいほどよい。
アラートを設定し、閾値を下回ったら活動しろ通知が飛ぶ。
アラートを解決できるかどうかは自分の行動次第である。
これが機械に自分を監視させる1つのメリットであり、意思ではなく数字という現実が自分を動かす。
ラジオ体操の実行有無
Pixe.laからデータを取得。
小学生の頃は難なくできたラジオ体操、運動不足&齢を重ねてからやるとなかなかしんどいし肩や腰周りのストレッチにちょうどよい。
考案者はすごい。第1・第2合わせて7分くらいなので仕事の合間にできるのもよい。
少し前まで毎日やるようにしていたけど、すっかりサボってしまったので可視化して再開。
やっていない日は赤、やった日は緑に色塗りがされる。
緑に染め上げることで達成感を得る。
ラジオ体操のスタンプってそういうことだったのか。
「反復・継続・丁寧」は心地ええんや🏐
平均就寝時間
健康や睡眠時間の確保のために日が変わる前に寝たい。
24(0)時を過ぎていると文字色が黄色・1時を過ぎると赤色になるようにして寝る時間を常に気にかける。
就寝時間はいつも身に着けているOura Ringから取得していて、Oura Ringが寝たと判断した時刻が反映される。
Readiness、睡眠時間
ReadinessはOura Ringが起床時に算出してくれる数値で、その日の健康状態の総合スコア的なもの。
自分のこれまでの傾向から60を切るとのんびり過ごす・60-69は平常だけど気をつける・70以上は問題なしくらいにざっくり閾値を設定してグラフを色分けしている。
客観的に体調を判断するのに使う。
睡眠時間もOura Ringから取得している。
Oura Ringでは睡眠を覚醒・浅い睡眠・レム睡眠・深い睡眠の4段階で計測しているので、覚醒を除いた3つの合計値を用いる。
睡眠時間が平均6hを切るとプッシュ通知が飛ぶようにアラートを設定。
覚醒を除いた睡眠時間が6h以上なので、長時間寝ても覚醒の時間が長いとアラートが飛ぶ。なので睡眠の質も高めないといけない。
睡眠は技術。
「睡眠時間を確保する」「睡眠の質を上げる」
「両方」やらなくっちゃあならないってのが「幹部」のつらいところだな
覚悟はいいか?
オレはできてる
Build Status
ダッシュボード運用のために動かしている処理が正常に動作しているかを確認する枠。
処理が失敗すると運用も止まるため一緒の画面に置いている。
今のところプライベートリポジトリだとGithub ActionsのStatus Badgeが表示できない。CircleCIだと表示できる。
そのため現状は導線を設置し、グラフが更新されなければ確認する運用。
ログ集計とは別のCIも回しているので、毎日ダッシュボード見るしとそれのBuild状況もついでにここに記載。
備考
Pixe.laはwebでデータを確認できるし、Ouraもweb/アプリどちらでも日々の数値やグラフは閲覧できる。
ただアラートの設定や多種多様な可視化ができないし一元化したいのでGrafanaを使ってダッシュボードを構築した。
いや、それもあるけど純粋にこういうのってやっている時めちゃめちゃ楽しいというのも8割くらいありました。
技術構成
色々なところにあるデータを
MySQL (DB)にまとめて
Grafana Cloud (ダッシュボード)で可視化
の流れ。
ダッシュボード
Grafana Cloudを利用。
無料プランあり。使える機能や範囲も今回の用途では申し分なし。
ただしRetentionが14日なので、より長い期間で監視をしたい場合は別案を検討する必要あり。
SafariからダッシュボードのURLをそのままiPhoneのホーム画面に追加するとアプリっぽい使い心地になって良い。
アラート発生時の通知先
プッシュ通知を使いたいのでPushoverを利用。
現代の通知は電話orスマホへのプッシュ通知が1番便利だと思う。
ただプッシュ通知を送るとなると自前だと準備がめんどくさいな、と思っていた矢先にPushoverを見つけた。
プッシュ通知を受け取ってメッセージを振り返ることができるだけのアプリで、APIを使って色々やりたいことができる。
Grafanaにはデフォルトで連携機能があるので設定も簡単。
料金はOS単位(iOS, Android, デスクトップ)で5USD買い切り。最高。推す。
データを保存するもの
PlanetScaleを利用。
MySQLのDBaaSで無料プランあり。
こういった類のことをやる時、最近はちょっとした処理ならサーバレスな何かしらで実現できるけど、データを保存する部分の環境構築は相変わらず手間だったので無料かつ充分な利用範囲を備えるPlanetScaleが現代にあって助かった。推す。
保存するデータの元
Oura Ring (健康のデータ)
https://ouraring.com/ja/raf/81bf2ed4c7?utm_medium=iac 経由だと割引で買えます!!!!
指輪をつけているだけで定期的にデータが取り込まれるのでそれを利用
APIあり & OAuthの他にPersonal Access Token形式で使えるので、自分のデータだけなら簡単に取得できる
Pixe.la (習慣のデータ)
Pixe.laで時間や数値を計測・保存し、別途MySQLに保存
iOSのショートカット + NFCタグでお手軽にデータを計測→流用
Pixe.la は基本がAPIでやり取りする仕様なのでOura同様に簡単にデータが取得できる
データを取り込む処理
Github Actionsを利用。
今(231206時点)の利用規約だとサーバレスコンピューティング目的での利用が可能らしいので使わせてもらっている。
やりたかったけどやれていないこと
好きなので家系を食べた回数も可視化したい。
食べられなくなった時に加齢・老化という言葉で片付けたくないのでデータにしていきたい。
食べた回数 = Swarm(foursquare)でチェックインした回数とみなしてZapierでwebhookかMySQL連携で保存しようと思ったけど、どちらも有料プランじゃないと使えなかった🥺
構築・テストまでは使えるの策士だな (有効化したら使える状態までやった)
資産の監視もしたい。
Moneyforwardを使っているので総資産を保存して増減率とか出したかったけどAPIを提供していなかった。
提供していないというか、存在はするけど一般利用できない。
ゲームだとFF14の上限付きトームストーンの週の取得状況も監視したかったけど、ロードストーンからデータを取るまで骨が折れそう。
iOSのスクリーンタイムからアプリの起動時間を取ったりヘルスケアから健康データも取得していきたいけどこちらもめんどくさそうな予感。
運用から数日経過
計測している項目が軒並み良い方向に進んでいるので、これを1週間・1ヶ月・1年とちゃんと続けていきたい。
ここまで作ってもちゃんと運用しないとすぐ形骸化する。
ほら日記を書いたはよいけど全然見返さないとかあるじゃないですか (n敗)
数年前はElasticsearchに自分のTwitter(現X)の投稿内容を入れて言語処理して、頻出単語から興味・関心を見たり文章の癖を見る試みとかもしていたのでこういうのが好きなんだと思う。
データは嘘をつかない👓