🙌

dbt-elementaryを使ってデータ品質を可視化する

2023/08/27に公開

最近業務でデータの品質チェックや管理必要が出てきて、豊富なテスト種類やその結果、モニタリングとかできるいいツールがないか調べていたら
dbt-elementaryと言うOSSのツールがあるらしくチョッコラ触ってみました。

1. elementaryとは

https://docs.elementary-data.com/introduction

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.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を追加しました。
「〜略〜」の部分は両プロジェクト内容と全く同じです。

profiles.yml
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設定を行います。

HOME_DIR/.edr/config.yml
slack:
  token: xoxb-5633880**************P
  channel_name: elementary_alert

通知を行うにはedr monitorコマンドを実行します。
コマンド実行後、Slackにアラートが届きました。↓↓

アラート通知の設定をカスタマイズできるので、興味がある方は以下ドキュメントをご確認ください。
https://docs.elementary-data.com/oss/guides/alerts/send-slack-alerts

5-2. Elementaryレポートの通知

続けて、ElementaryのレポートをSlackのチャンネルへ送付する方法を試してみます。
公式ドキュメントがあるので、参照しつつ確認していきます。
基本的にSlackのTokenの設定を行なっていれば、あとはedr send-reportコマンド一発でSlackにレポートを送付可能です。
実行後、以下のスクショのように指定したチャンネル宛にレポートが届きます。

まとめ

導入からテストまでやってみました。可視化できるのはいいですね。他のツールでもテストの可視化はできるかもしれませんが、導入方法が簡単なので、とりあえず可視化したい!って方にはおすすめです〜!

Discussion