[dbt]elementaryを入れてdbt testの結果をslack通知
目的
dbt testの結果をslack通知で受け取り、早く対応できるようにしたい。
背景
自分で作っている分析環境(いつかまとめる)で、dbt testを使っている。
この分析環境は、Google Sheetsで手入力した内容から、集計処理を行っていて、
かなりの頻度でAceepetd Valueが引っかかっていた。
環境としては以下。
- DWH: Google BigQuery
- 実行環境: GCP Cloud Scheduler
dbt testの結果は、Cloud MonitoringのAlertとしてSlackに連携していたが、いくつか課題があった。
課題感
出てきたLogに情報が少なく、以下の手順でエラー内容を確認していた。
- Schedulerのエラーを見る(dbtを動かしている.shの実行結果エラーしかわからない)
- ログエクスプローラーにて標準出力された内容を辿る
- 具体的にどこの行で検知されたか分からないので、ローカル環境でdbt testを実行し内容確認する
調べるまでにかなり手間がかかっていた。
解決策
elementaryを使えば、Slack通知も詳細な内容で送ってもらえると見聞きし、試してみた。
OSSなのも嬉しいし、導入当時(2024.1)時点でelementary関連の記事も多く、取り組みやすかった。
導入
導入までの手順は以下。
- ローカル環境でelementaryのインストール
- dbtを実行しているシェルスクリプト内にelementaryのSlack通知コマンドを追加
- Dockerfileやcloudbuild.yamlを修正
いくつか工夫したポイントを後述します。
1. elementary のセットアップ
profiles.yamlにelementary用の情報を追記する。
elementaryは導入すると、BigQuery内にデータセットとテーブルが作られ、自動的にテスト結果や通知用に情報をまとめたものを作る。
そのため、profiles.yamlにelementray用のBigQueryへの接続情報を追記しました。(これはdbtのものと同じ)
2. Slack通知
こちらの公式が一番でした。
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
を使った、シェルスクリプト実行方式にしないといけない
参考)
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