🦔

[dbt]elementaryを入れてdbt testの結果をslack通知

2024/04/19に公開

目的

dbt testの結果をslack通知で受け取り、早く対応できるようにしたい。

背景

自分で作っている分析環境(いつかまとめる)で、dbt testを使っている。

この分析環境は、Google Sheetsで手入力した内容から、集計処理を行っていて、
かなりの頻度でAceepetd Valueが引っかかっていた。

環境としては以下。

  • DWH: Google BigQuery
  • 実行環境: GCP Cloud Scheduler

dbt testの結果は、Cloud MonitoringのAlertとしてSlackに連携していたが、いくつか課題があった。

課題感

出てきたLogに情報が少なく、以下の手順でエラー内容を確認していた。

  1. Schedulerのエラーを見る(dbtを動かしている.shの実行結果エラーしかわからない)
  2. ログエクスプローラーにて標準出力された内容を辿る
  3. 具体的にどこの行で検知されたか分からないので、ローカル環境でdbt testを実行し内容確認する

調べるまでにかなり手間がかかっていた。

解決策

elementaryを使えば、Slack通知も詳細な内容で送ってもらえると見聞きし、試してみた。

OSSなのも嬉しいし、導入当時(2024.1)時点でelementary関連の記事も多く、取り組みやすかった。

導入

導入までの手順は以下。

  1. ローカル環境でelementaryのインストール
  2. dbtを実行しているシェルスクリプト内にelementaryのSlack通知コマンドを追加
  3. Dockerfileやcloudbuild.yamlを修正

いくつか工夫したポイントを後述します。

1. elementary のセットアップ

profiles.yamlにelementary用の情報を追記する。
https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package

elementaryは導入すると、BigQuery内にデータセットとテーブルが作られ、自動的にテスト結果や通知用に情報をまとめたものを作る。
そのため、profiles.yamlにelementray用のBigQueryへの接続情報を追記しました。(これはdbtのものと同じ)

2. Slack通知

こちらの公式が一番でした。
https://docs.elementary-data.com/oss/guides/alerts/send-slack-alerts

Slack側でToken取得のAlert送付先のチャンネルを作って、あとはコマンド実行するだけ。

tokenは、Secret Managerで管理しました。

3. デプロイ

ここが一番苦労した。

やったこと

  • Dockerfile
    • elementary CLIのインストール ⇒ requirements.txtを作り、pip install
  • cloudbuild.yamlの修正
    • slack tokenをSecret Managerから取得し、環境変数に突っ込む。

特に、Secret Managerのtokenの受け渡しには苦労した。

gcloud run deploy 部分にて --set-env-varsを使い、環境変数を設定したかった。

これを満たすためには、

  • entrypoint: bash にする
  • -c を使った、シェルスクリプト実行方式にしないといけない

参考)
https://zenn.dev/catnose99/articles/6cb0fc434a4a62
https://int128.hatenablog.com/entry/2018/12/27/095633

Before

# Deploy container image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'run'
  - 'deploy'
  - 'xxx'
  - '--image'
  - 'gcr.io/$PROJECT_ID/imagename:$COMMIT_SHA'
  - '--region'
  - 'asia-northeast1'
images:
- 'gcr.io/$PROJECT_ID/imagename:$COMMIT_SHA'

After

# Deploy container image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: bash
  args: [
    '-c',
    'gcloud run deploy xxx --image gcr.io/$PROJECT_ID/imagename:$COMMIT_SHA --region asia-northeast1 --set-env-vars SLACK_TOKEN_ELEMENTARY=$$SLACK_TOKEN_ELEMENTARY'
  ]
  secretEnv: [ 'SLACK_TOKEN_ELEMENTARY' ]

まとめ

cloudbuild.yamlの設定で試行錯誤しながら、なんとかCloud Schedulerの定期実行でもSlack通知できるようになった。

Slack通知を見れば、該当レコードやTest時に実行されたSQLも掲載されているので、調査がめちゃくちゃ捗りました。

Discussion