dbt cloudのジョブの実行時間の推移をelementaryで可視化する

dbt cloudのジョブの実行時間の推移を把握したい

DWHやデータマートの作成をdbtでやっていて、それをさらに後段の処理が参照している場合「7時までにdbt buildの処理が終わっている必要がある!」などの何らかの時間的な制約がある場合が多いと思います。dbt cloudを使っている場合、あるジョブが実行された(dbt cloudではrunと呼ばれる)時間が分かります。例えばこういう感じ。

dbt cloud上でのジョブの実行時間の推移

しかし、この結果は直近のN件しか出ないですし、テキストで表示されているだけなので増加傾向にあるのか?などは分かりにくいですね。

elementaryでdbt cloudのジョブの実行時間の推移を可視化する

elementaryを使っていると、dbtのジョブの実行結果(実行時間やjob_id / run_idなどを含む)を保存してくれます。これを使うと、dbt cloudのジョブの実行時間の推移を可視化できます。抽出するSQLは例えばこんな感じ。

SELECT
  "https://cloud.getdbt.com/deploy/1234/projects/5678/runs/" || job_run_id AS url,
  MIN(DATETIME(PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", run_started_at), "Asia/Tokyo")) AS start_time,
  MAX(DATETIME(PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", run_completed_at), "Asia/Tokyo")) AS end_time,
  DATETIME_DIFF(
    MAX(DATETIME(PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", run_completed_at), "Asia/Tokyo")),
    MIN(DATETIME(PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", run_started_at), "Asia/Tokyo")),
    MINUTE
  ) AS duration,
FROM
  `my-project.my_elementary.dbt_invocations`
WHERE job_id = "9999"
GROUP BY
  job_run_id
ORDER BY end_time DESC

これを可視化すると、例えばこういうグラフを得ることができます。これは実際の例ではなく、ChatGPTにそれっぽいデータを生成してもらったものになります。ChatGPT、それっぽいデータを作ってもらうのが簡単でいいっすね。

dbt cloudのジョブの実行時間の可視化の例

これを見ると、例えば以下のようなことが分かります。

  • 前半は実行時間が線形に伸びていて、データ量の増加などにモロに影響を受けている
    • このままいくと、予定時刻までにdbtのジョブの実行が完了されないことが予想できる
  • 途中で何らかの要因で実行時間が爆発的に増えてしまっている
  • 後半は実行時間の改善が見られ、落ち着いてそう

チームで見る定期的に見るダッシュボードに仕込んでもいいですし、この値自体を監視に仕込んで気付けるようにしておいたりするとよさそうですね。