THINKING MEGANE

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

実行ディレクトリに Schedfilequeries ディレクトリが生成されジョブの定義とクエリが出力されています。

修正後、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 DataPostgreSQL、カスタムの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 オプションによる環境ごとの設定ファイルにも対応しています。

まとめ

コード管理により履歴管理やレビューといったフローに乗せることができるので大変便利になりました。そのあたりの運用で困っているかたは使ってみてはどうでしょうか。

このエントリーをはてなブックマークに追加