Metabaseを使ってポケモンGOで孵化したタマゴの情報を可視化する。

旦那さんとポケモンGOをプレイしているのですが、タマゴから孵るポケモンに偏りがあるかを知りたかったので、記録を取るようにしています。
記録の方法は以下の通り。

  1. タマゴが孵化したらLINEグループ宛に報告する
  2. 報告をLINE botが拾ってDB(SQLite3)に書き込む

LINE botと会話して統計を取れるようにはなっているのですが、テキストベースだと情報がデジタルでいまいちピンとこないため、Metabaseで情報を可視化してみることにしました。最初Grafanaが使いたかったのですが、SQLiteに対応していないので自動的にMetabase一択になりました。

動かし方

インストールは以下の記事を参考にしました。
OSSのデータ可視化ツール「Metabase」が超使いやすい
Dockerが多分一番楽に立ち上げられる気がします。私の環境はいろいろあってDockerが動かせないので、jarをそのままOpenJDK 8で動かす方法をとりました。使用したMetabaseのバージョンは0.30.1です。デフォルトだと3000番がMetabaseのポートになります。
セットアップはほんとに楽すぎて何も困ることなかったので割愛。

可視化したいDBの設定

DBの追加画面

ここから解析対象のDBまでのパスを入力すればすぐ解析してくれます。

DBの可視化結果とか

DBの可視化結果
ポケモンの円グラフとかホエルコのグラフとか

お互いが孵したポケモンの円グラフを作ってみました。本当はグラフの横に凡例と値が出力できるのですが、GUIのバグで凡例が多すぎるとグラフが表示できなくなるため、非表示にしています。カーソルを当てると内容がわかるのですが、不便なので次バージョンに期待します。

DBのフィルタリング結果

フィルター機能で期間やタマゴの距離を絞り込むこともできます。めちゃくちゃ楽です。

使ってみた感想

私がQuestionをあまり上手に使いこなせていないので、今の所Kibanaのように息を吸って吐くレベルのグラフ作成には到達できていません。が、最悪SQL文を書いてもグラフは作れるので、可視化するには困らなさそうです。ただ動かすまでの手軽さは、ElasticSearchとFluentdのハードルが高い分、圧倒的にMetabaseのほうが勝ります。java jarコマンド打つだけだったので本当に手軽でした。アクセスログを解析するぐらいであれば、Metabaseで十分用が足りると思います。GUI周りのバグについては今後の修正に期待したいと思います。

あと、旦那さんが使っているブラウザがモダンブラウザではないので、表示がバグったり動作しないスクリプトがあったりするのが悩みどころです。他人とダッシュボードを共有するときは、モダンブラウザの使用ルール化することをおすすめします。

Metabase v0.30.1 でSQLite3のテーブルのFILTERED BYが動作しない

あらまし

Metabase v0.30.1でSQLite3のテーブルを読み込んだのですが、DB追加時にMetabaseが実施してくれるExploreが500を返し続けて永遠に終わらなかったり、FILTERED BYを使おうとしてもfieldの候補が表示されないので原因を調べました。Sample datasetだと問題ないのでインストール時の問題ではなさそうです。

FILTERED BYが選択できない

FILTERED BYが選択できない

調査

logに以下の警告が出ています。Settingsからログが見られるのはありがたいですね。

Aug 26 12:50:00 WARN metabase.driver.generic-sql :: Don't know how to map column type '' to a Field base_type, falling back to :type/*.
(中略)
Aug 26 07:50:04 ERROR metabase.sync.util :: Error running sync step: class java.lang.ClassCastException
[]

テーブル作成時にカラムのデータ型を指定しなかったので、typeが空文字で返ってきてしまって、どの型にキャストしていいのかわからずにエラーを起こしているみたいですね。DBの仕様に合わせてその辺りよろしくやってくれると嬉しいのですが。

対処

カラムの型を定義したテーブルを作り直してMetabaseに登録し直します。SQLiteは途中でカラムの定義が変えられないようなので、create tableし直したあとにinsert intoで元のテーブルの内容をそっくりそのまま挿入する方法でどうにかしました。

結果

無事Exploreが動作してFILTERED BYも選択できるようになりました。SQLiteの時刻表記の文字列が時刻として扱われるのか不安でしたが、きちんと時刻として認識されました。よかったです。