Treasure Dataのスケジュールジョブをコードで管理するPendulumというgemをつくった
Treasure Dataに収集したデータを集計・出力するためにジョブをスケジュール登録するにあたり、ブラウザコンソールやAPIから直接行うと履歴管理やレビューができないといった課題を解決するために Pendulum というgemをつくりました。
PendulumはDSLで記述された定義に従い、Treasure Dataのスケジュールジョブを管理します。 定義ファイルをGit管理することで、履歴管理やGitHubと連携したコードレビューが可能になります。
余談ですが、Pendulumは振り子という意味で、定期的な実行という意味と宝探しのダウジング的な意味から連想しています。ペンデュラム。響きがカッコイイ。
使い方
Schedfileという名前で定義ファイルを用意して、
schedule 'my-schedule-job' do
database 'db_name'
query 'select count(time) from access;'
cron '30 0 * * *'
result 'td://@/db_name/count'
end
pendulumコマンドを実行するだけです。
# dry-run で 適用内容を確認
$ pendulum --apikey='...' -a --dry-run
# 適用
$ pendulum --apikey='...' -a
AWSのRoute53に対するRoadworker的なものを想像してもらえるとよいかと思います。
エクスポート
既存のスケジュールジョブがある場合はエクスポートもできます。
$ pendulum --apikey='...' -e
実行ディレクトリに Schedfile と queries ディレクトリが生成されジョブの定義とクエリが出力されています。
修正後、dry-runによるapplyを行ってみると、差分が検出されていることがわかります。
$ pendulum --apikey='...' -a --dry-run
Update schedule: my-scheduled-job (dry-run)
set cron=@hourly
Schedfile
APIで利用する名称と同じものが使えます。
schedule 'test-scheduled-job' do
database 'db_name'
query 'select count(time) from access;'
retry_limit 0
priority :normal
cron '30 0 * * *'
timezone 'Asia/Tokyo'
delay 0
result_url 'td://@/db_name/count'
end
priorityは:very_highなど、cronは:dailyといった読みやすい値も使えます。
query_file
クエリはquery_fileを使って別ファイルのクエリを読み込めます。
query_file 'queries/test-scheduled-job.hql'
集計用のクエリは長くなることが多いと思うので、こちらを使っていくことになるでしょう。
result
Result Exportの先を定義する、result_url をわかりやすくするための result もあります。
schedule 'test-scheduled-job' do
database 'db_name'
...
result :td do
database 'db_name'
table 'table_name'
end
end
現時点では出力先としてTreasure DataとPostgreSQL、カスタムのresultをサポートしています。他の出力先をresult記法で書きたいときはPullRequestをお待ちしております。
force
Schedfileに定義されていないスケジュールジョブは通常はUndefined scheduleとなり削除対象とはなりません。削除が必要な場合は--forceオプションを使ってください。
また、Treasure DataのAPI都合上、result_url内のパスワードは***とマスキングされており差分が比較できません。もしパスワードを変更した場合も同様に--forceオプションを使って適用してください。
config
environments/default.ymlなどを用意することで、DSL内でsettings経由で取得することができます。
...
result :postgresql do
...
password settings.password
end
また、-E オプションによる環境ごとの設定ファイルにも対応しています。
まとめ
コード管理により履歴管理やレビューといったフローに乗せることができるので大変便利になりました。そのあたりの運用で困っているかたは使ってみてはどうでしょうか。