Redash のクエリーの変更履歴を管理する工夫

先日「Redash でクエリーの変更履歴管理ってやってますか?」というような質問をいただいたので、その時話したことと、その後調べたことなどをメモとして書いておきます。

あくまで個人の意見として読んでいただきたいのですが、なにか参考になることがあればうれしいです。

クエリーの変更履歴を管理する工夫

API からクエリー情報を取得し、その値を利用する

私が実務で使用している方法はこのやりかたです。

Redash はほとんどすべての操作を API から呼び出すことができるので、ちょっとしたスクリプトを書いてクエリーの情報を取得し、自動的かつ定期的に Git にコミットするような運用をしています(実行間隔は5分毎ぐらい)

私は以前に記事で紹介した redashman を使用していますが、 現時点では redash-toolbelt が良い選択肢になるかもしれません。サンプルコードにはクエリーをエクスポートするような例もあるので、Python を読み書きしたことがあればすぐに理解できると思います。

ディスクのスナップショットを取得し、必要なときにリストアして履歴を追う

これは変更履歴の管理方法といえないようなものですが、案外見落とされている事かもしれないので書いておきます。

Redash は AMI などから気軽に立ち上げられる一方で、Redash が稼働しているサーバーの監視設定などが見落とされるケースもあるようです。

API から情報を取得する方法と違い、短い間隔で履歴を取得するのは難しくなりますが、IaaS 上のサーバーであれば、簡単にディスクイメージの定期的なスナップショットを取得できることが多いので、可能な限り1日1回はディスクのスナップショットを取得しておきましょう。

Redash が使用している PostgreSQL サーバーを RDS など外部に切り出している場合は、それぞれのサービスや環境でスナップショットなどの取得を検討してみてください。

この方法では、過去の状態を確認するためにリストアが必要になるため、気軽に履歴が確認することはできませんが「前日の状態でもいいから戻したい・比較したい」という状況には対応できます。

PostgreSQL のバックアップを取得し、必要なときにリストアして履歴を追う

こちらはディスクのスナップショットと似ていますが、Redash は内部的に PostgreSQL を使用していますので、ディスクのスナップショットが気軽に取れない環境では、PosrgreSQL のデータベースをバックアップしておくという方法もとることができます。

具体的な方法については PostgreSQL の話になるので割愛しますが、Redash のクエリーを保持している queries テーブルのみを指定して pg_dump でバックアップを取れば、ディスクのスナップショットより高頻度にバックアップを残すこともできますし、少し見づらさはありますが SQL として残しておくことで、リストアせずとも(ある程度は)バックアップ取得時点のクエリーを確認することもできると思います。

ディスクのスナップショットよりは少し手間になりますが、用途に合うようであれば検討する価値はあると思います。

PostgreSQL のトリガーを使って変更履歴を残す

これは手元の環境で試してみた程度のものではありますが、PostgreSQL のトリガーで queries の更新時に変更履歴を取得することもできます。

トリガーの具体的な設定については割愛しますが、比較的簡単に設定できるという利点もありながら、Redash のメタデータの理解や、今後の Redash アップデートの影響を受ける可能性がありますので、そういったリスクを考慮した上で導入を検討したほうがよいでしょう。

Redash の changes テーブルは使えないか?

Redash には changes というテーブルがあり、中を除くとクエリーの履歴が入っているように見えます。

実は変更履歴についての相談をいただいたときに changes を使うという方法もあるとお伝えしてしまったのですが、その後改めて確認してみると、少なくとも 8.0.09.0.0-beta ではクエリーを変更しても changes テーブルが更新されないので、現時点では changes を使ってクエリーの変更履歴を追うことはできないということがわかりました。

(クエリーの作成時、アーカイブ時は changes に履歴が残りますが、肝心のクエリー変更時の履歴が残らないようです)

もし、changes が利用できるようになるとクエリーの変更履歴はかなり追いやすくなると思います。

まとめ

残念ながら現時点で Redash においてクエリーの変更履歴を管理する方法において「たったひとつの冴えたやりかた」はなく、実現するにはなんらかの運用上の工夫が必要だと考えています。

クエリーの変更履歴を管理したい場合もそうでない場合も、スナップショットはとっておきましょう。何か問題が起こったときに、そのスナップショットが助けてくれるかもしれません。