dbt-elementaryを使ってデータ品質を可視化する
最近業務でデータの品質チェックや管理必要が出てきて、豊富なテスト種類やその結果、モニタリングとかできるいいツールがないか調べていたら
dbt-elementaryと言うOSSのツールがあるらしくチョッコラ触ってみました。
1. elementaryとは
Elementary は、データおよび分析エンジニア向けのオープンソースのデータ可観測性ソリューションです。
dbt プロジェクトとデータを数分で監視し、データの問題を誰よりも早く知ることができます。
即座に可視化してデータの問題を検出し、実用的なアラートを送信して、影響と根本原因を理解します。
1-1. 主な機能
- データ観測可能性レポート
- モデルの性能
異常検知を含む、データ品質メトリクス、鮮度、ボリューム、スキーマ変更の監視。
初歩的なデータモニターは、dbtプロジェクトのネイティブテストのように構成され、実行されます。 - dbtの成果物と実行結果
- Slackアラート
- データリネージ
1-2. サポートしているDWH
- Snowflake
- BigWuery
- Redshift
- Databricks
- Postgres
1-3. 動作環境
ElementaryはElementary Cloudと呼ばれるクラウドサービスと、ローカルで動かす用のElementary CLIがサポートされています。
今回はElementary CLIを試してみます。
2. Elementaryの環境構築
2-1. 検証環境
- DWH : Snowflake
- dbt core : 1.5.4
- データシソース : jaffle_shop
2-2. 前提のお話
※dbt coreはインストール済み
2-3. Elementaryパッケージの追加
packages.ymlに以下を記載します。
packages.ymlはdbt-project.ymlと同階層に配置します。
packages:
- package: elementary-data/elementary
version: 0.10.0
dbt depsコマンドを実行する。
# dbt deps
2-4. Elementary CLIのインストール
pip3 install elementary-data
もしくは各DWHのプラットフォームを指定してもOK
pip3 install 'elementary-data[snowflake]'
pip3 install 'elementary-data[bigquery]'
pip3 install 'elementary-data[redshift]'
pip3 install 'elementary-data[databricks]'
インストーできたらedrコマンドが使えるか確認する。
以下のような結果となればOK
# edr --version
________ __
/ ____/ /__ ____ ___ ___ ____ / /_____ ________ __
/ __/ / / _ \/ __ `__ \/ _ \/ __ \/ __/ __ `/ ___/ / / /
/ /___/ / __/ / / / / / __/ / / / /_/ /_/ / / / /_/ /
/_____/_/\___/_/ /_/ /_/\___/_/ /_/\__/\__,_/_/ \__, /
/____/
Elementary version 0.10.0.
2-5. プロフェクト名を変更する
詳しく調べきれていないのですが、プロジェクト名はelementaryでないとダメっぽいです。
以下のエラーが出ちゃいます。
ERROR — Failed to parse Elementary's database and schema.エラー
# edr report
________ __
/ ____/ /__ ____ ___ ___ ____ / /_____ ________ __
/ __/ / / _ \/ __ `__ \/ _ \/ __ \/ __/ __ `/ ___/ / / /
/ /___/ / __/ / / / / / __/ / / / /_/ /_/ / / / /_/ /
/_____/_/\___/_/ /_/ /_/\___/_/ /_/\__/\__,_/_/ \__, /
/____/
Any feedback and suggestions are welcomed! join our community here - https://bit.ly/slack-elementary
2023-08-27 08:53:01 — INFO — Running with edr=0.10.0
2023-08-27 08:53:01 — INFO — Downloading edr internal dbt package
2023-08-27 08:53:01 — INFO — Running dbt deps --project-dir /usr/local/lib/python3.9/dist-packages/elementary/monitor/dbt_project
23:53:03 Running with dbt=1.5.4
23:53:04 Installing dbt-labs/dbt_utils
23:53:05 Installed from version 0.8.6
23:53:05 Updated version available: 1.1.1
23:53:05 Installing elementary-data/elementary
23:53:06 Installed from version 0.10.0
23:53:06 Up to date!
23:53:06
23:53:06 Updates available for packages: ['dbt-labs/dbt_utils']
Update your versions in packages.yml, then run dbt deps
2023-08-27 08:53:10 — ERROR — Unable to get the latest invocation: Failed to run dbt command.
Encountered an error:
Runtime Error
Could not find profile named 'elementary'
2023-08-27 08:53:17 — ERROR — Failed to parse Elementary's database and schema.
2023-08-27 08:53:17 — INFO — Running dbt --log-format json run-operation elementary.log_macro_results --args {"macro_name": "get_test_results", "macro_args": {"days_back": 7, "invocations_per_test": 720, "disable_passed_test_metrics": false}} --project-dir /usr/local/lib/python3.9/dist-packages/elementary/monitor/dbt_project
2023-08-27 08:53:29 — ERROR — Could not generate the report - Error: Failed to run dbt command.
Encountered an error:
Runtime Error
Could not find profile named 'elementary'
Please reach out to our community for help with this issue.
NoneType: None
でも、もうすでにプロジェクト名を変更できない場合もあると思うので、暫定対応として以下のようにしました。
snowflake_pjは元々開発していたプロジェクト、今回elementaryを追加しました。
「〜略〜」の部分は両プロジェクト内容と全く同じです。
snowflake_pj:
outputs:
dev:
〜略〜
target: dev
elementary:
outputs:
dev:
〜略〜
target: dev
3. dbt runの実行
dbt runを実行してモデルを構築します。
# dbt run
すると、いくつかのアーティファクトが生成されています。
これらのアーティファクトは、Elementary テストおよび Elementary CLI によって使用され、dbt test、dbt run、およびdbt buildを実行すると更新されます。
4. レポートの生成
最後にレポートを生成してみます。
4-1. dbt testの実行
# dbt test
4-2. レポートの生成
edr reportコマンドを実行します。
# edr report
レポート生成が上手くいくと、edr_targetディレクトリが作成され、中にhtmlファイルでレポートが生成されています。
# ls edr_target/*.html
edr_target/elementary_report.html
4-3. htmlファイルをブラウザで表示してみる
レポートの内容
- Dashboard
ダッシュボード画面では、テスト結果やテーブルの状態、実行スケジュールなどが確認できます。
- Test Resutls
テスト結果では、より詳細に各モデル毎にテスト結果、テスト種類などを確認できます。
- Test Runs
テスト実行では、テスト結果画面と似ています。テストの失敗率項目が追加でみれます。
- Model Runs
モデル毎にテストにかかった時間を確認できます。
- Lineage
リネージ画面では、失敗したテストやノード別にフィルタリングもできるので、dbt docsのリネージよりもテスト結果に適した参照方法があっていいと思いました。
5. 通知機能
Elementary OSSはSlackとTeamsへの通知機能をサポートしています。
次の内容(一部抜粋)のアラートが上がると、SlackもしくはTeamsへ通知を行います。
- dbtテストとElementaryテストの失敗および/または警告
- モデル実行の失敗
今回はテストを失敗させ、Slack通知の検証をしてみたいと思います。
5-1. テスト失敗時のSlack通知
Slack通知へのセットアップは公式ドキュメント通りに実施しました。
Tokenを取得できたら、HOME_DIR/.edr/config.yml
ファイルを作成し、Token設定を行います。
slack:
token: xoxb-5633880**************P
channel_name: elementary_alert
通知を行うにはedr monitor
コマンドを実行します。
コマンド実行後、Slackにアラートが届きました。↓↓
アラート通知の設定をカスタマイズできるので、興味がある方は以下ドキュメントをご確認ください。
5-2. Elementaryレポートの通知
続けて、ElementaryのレポートをSlackのチャンネルへ送付する方法を試してみます。
公式ドキュメントがあるので、参照しつつ確認していきます。
基本的にSlackのTokenの設定を行なっていれば、あとはedr send-report
コマンド一発でSlackにレポートを送付可能です。
実行後、以下のスクショのように指定したチャンネル宛にレポートが届きます。
まとめ
導入からテストまでやってみました。可視化できるのはいいですね。他のツールでもテストの可視化はできるかもしれませんが、導入方法が簡単なので、とりあえず可視化したい!って方にはおすすめです〜!
Discussion