Open12

【dbt】dbt-metabase

YuichiYuichi

https://github.com/gouline/dbt-metabase

$ dbt-metabase --help
Usage: dbt-metabase [OPTIONS] COMMAND [ARGS]...

Options:
  --version           Show the version and exit.
  --config-path PATH  Path to config.yml file with default values.  [default:
                      ~/.dbt-metabase/config.yml]
  --help              Show this message and exit.

Commands:
  exposures  Extract dbt exposures from Metabase.
  models     Export dbt models to Metabase.

dbt compileを先にしないといけないっぽい

メタベースAPI

すべてのコマンドには、次のいずれかの方法を使用してMetabase APIに対する認証が必要です。

  • APIキー(--metabase-api-key)
    自動化を強く推奨します。ドキュメントを参照してください(Metabase 49 以降)。
  • ユーザー名とパスワード ( --metabase-username/ --metabase-password)
    Metabase の古いバージョンおよび小さいインスタンス用のフォールバック。
dbt-metabase models \
    --manifest-path target/manifest.json \
    --metabase-url https://metabase.example.com \
    --metabase-api-key mb_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= \
    --metabase-database business \
    --include-schemas public
YuichiYuichi

Metabase エクスポージャーを抽出するときにコレクションを除外できません

https://stackoverflow.com/questions/75749491/unable-to-exclude-collections-when-extracting-metabase-exposures

dbt-metabase exposures \
    --dbt_manifest_path ./target/manifest.json \
    --dbt_database {db name} \
    --metabase_host metabase.{myhost}.com \
    --metabase_user {myuser}@{domain}.com \
    --metabase_password {my password} \
    --metabase_database {db name} \
    --output_path ./models/ \
    --output_name metabase_exposures \
    --collection_excludes 'Our analytics' ABI-queries_SiHay_DEPRECATED Dashboards_2-1_DEPRECATED Old_KiWi_DEPRECATED x_Dashboards_2-0_DEPRECATED
YuichiYuichi

Concerning your last question first: We deploy on production using a Bitbucket Pipeline (= basically Github Actions) every time we merge into our dbt master branch. We run both dbt-metabase models and exposures.
Concerning parameters, from what I remember / can read quickly from our code:
dbt_database: This is the name of your DWH database = what you run dbt on = what you run analyses on in Metabase. So this is what you probably see in Admin Settitngs > Databases tab.
metabase_database: This is the name of Metabase’s own “meta DB”, or its own production database. If you haven’t explicitly connected this to your Metabase instance, you won’t see it in Admin Settings. (I’ve included a screenshot of some of the tables in this DB so you can check which is which!)

  • dbt_database: これは、DWH データベースの名前です = dbt を実行する対象 = Metabase で分析を実行する対象です。したがって、これはおそらく、[管理設定] > [データベース] タブに表示されるものです。
  • metabase_database: これは、Metabase 独自の「メタ DB」、つまり独自の本番データベースの名前です。これを Metabase インスタンスに明示的に接続していない場合は、管理設定に表示されません。(どのテーブルがどれであるかを確認できるように、この DB のいくつかのテーブルのスクリーンショットを含めました。)
YuichiYuichi
dbt compile && dbt-metabase exposures \
    --manifest-path target/manifest.json \
    --metabase-url https://metabase.example.com \
    --metabase-api-key mb_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= \
    --dbt_database {db name} \
    --metabase_database {db name} \
    --output_path models \
    --output_name exposure_metabase 
YuichiYuichi

$ dbt-metabase exposures --help
Usage: dbt-metabase exposures [OPTIONS]

  Metabase から dbt の exposure を抽出します。

Options:
  --manifest-path FILE            dbt の manifest.json のパス。通常はコンパイル後に
                                  target/ ディレクトリにあります。  [環境変数:
                                  MANIFEST_PATH; 必須]
  --metabase-url URL              Metabase の URL 例:
                                  'https://metabase.example.com'。  [環境変数:
                                  METABASE_URL; 必須]
  --metabase-api-key API_KEY      Metabase の API キー (ユーザー名/パスワードを
                                  提供しない場合は必須)。  [環境変数:                                  METABASE_API_KEY]
  --metabase-username USERNAME    Metabase のユーザー名 (API キーを提供しない
                                  場合は必須)。  [環境変数: METABASE_USERNAME]
  --metabase-password PASSWORD    Metabase のパスワード (API キーを提供しない
                                  場合は必須)。  [環境変数: METABASE_PASSWORD]
  --skip-verify TEXT              TLS 証明書の検証をスキップ (推奨しません)。  [環境                                  変数: SKIP_VERIFY]
  --cert CERT                     TLS 証明書バンドルのパス。  [環境変数:                                  CERT]
  --http-timeout SECS             HTTP タイムアウト(秒)。  [環境変数:                                  HTTP_TIMEOUT; デフォルト: 15]
  --http-header <TEXT TEXT>...    追加の HTTP リクエストヘッダー。
  -v, --verbose                   詳細なログを有効にします。
  --output-path DIRECTORY         exposure YAML ファイルの出力パス。  [環境変数:                                  OUTPUT_PATH; デフォルト: .]
  --output-grouping [collection|type]
                                  exposure YAML ファイルのグループ化キー。  [環境                                  変数: OUTPUT_GROUPING]
  --include-collections COLLECTIONS
                                  特定の Metabase コレクションのみを含めます。
                                  [環境変数: INCLUDE_COLLECTIONS]
  --exclude-collections COLLECTIONS
                                  特定の Metabase コレクションを除外します。  [環境                                  変数: EXCLUDE_COLLECTIONS]
  --allow-personal-collections    個人用 Metabase コレクションを含めます。  [環境                                  変数: ALLOW_PERSONAL_COLLECTIONS]
  --exclude-unverified            未検証の項目を除外します。検証をサポートしている
                                  エンティティタイプにのみ適用されます。  [環境変数:                                  EXCLUDE_UNVERIFIED]
  --help                          このヘルプメッセージを表示して終了します。
Usage: dbt-metabase models [OPTIONS]

  Export dbt models to Metabase.

Options:
  --manifest-path FILE            dbtの`manifest.json`のパスを指定します。通常、`target/`ディレクトリにあります。
                                  [環境変数: MANIFEST_PATH; 必須]
  --metabase-url URL              MetabaseのURLを指定します。例: 'https://metabase.example.com'
                                  [環境変数: METABASE_URL; 必須]
  --metabase-api-key API_KEY      Metabase APIキーを指定します。(ユーザー名/パスワードを指定しない場合は必須)
                                  [環境変数: METABASE_API_KEY]
  --metabase-username USERNAME    Metabaseのユーザー名を指定します。(APIキーを指定しない場合は必須)
                                  [環境変数: METABASE_USERNAME]
  --metabase-password PASSWORD    Metabaseのパスワードを指定します。(APIキーを指定しない場合は必須)
                                  [環境変数: METABASE_PASSWORD]
  --skip-verify TEXT              TLS証明書の検証をスキップします。(推奨されません)
                                  [環境変数: SKIP_VERIFY]
  --cert CERT                     TLS証明書バンドルのパスを指定します。
                                  [環境変数: CERT]
  --http-timeout SECS             HTTPのタイムアウト秒数を指定します。
                                  [環境変数: HTTP_TIMEOUT; デフォルト: 15]
  --http-header KEY VALUE         追加のHTTPリクエストヘッダーを指定します。
  -v, --verbose                   詳細なログを有効にします。
  --metabase-database METABASE_DATABASE
                                  Metabase内のターゲットデータベースを指定します。
                                  [環境変数: METABASE_DATABASE; 必須]
  --include-databases DATABASES   特定のdbtデータベースのみを含めます。
                                  [環境変数: INCLUDE_DATABASES]
  --exclude-databases DATABASES   特定のdbtデータベースを除外します。
                                  [環境変数: EXCLUDE_DATABASES]
  --include-schemas SCHEMAS       特定のdbtスキーマのみを含めます。
                                  [環境変数: INCLUDE_SCHEMAS]
  --exclude-schemas SCHEMAS       特定のdbtスキーマを除外します。
                                  [環境変数: EXCLUDE_SCHEMAS]
  --include-models MODELS         特定のdbtモデルのみを含めます。
                                  [環境変数: INCLUDE_MODELS]
  --exclude-models MODELS         特定のdbtモデルを除外します。
                                  [環境変数: EXCLUDE_MODELS]
  --sync-timeout SECS             Metabaseのスキーマがdbtプロジェクトと一致するまで待機する秒数を指定します。
                                  同期をスキップする場合は0を設定してください。
                                  [環境変数: SYNC_TIMEOUT]
  --skip-sources                  dbtソースをエクスポートから除外します。
                                  [環境変数: SKIP_SOURCES]
  --append-tags                   dbtタグをテーブル説明文に追加します。
                                  [環境変数: APPEND_TAGS]
  --docs-url URL                  テーブル説明文にモデルリンクを追加するためのdbtドキュメントホスティングURLを指定します。
                                  [環境変数: DOCS_URL]
  --order-fields                  dbtプロジェクト内の列順を維持します。
                                  [環境変数: ORDER_FIELDS]
  --help                          このヘルプメッセージを表示して終了します。
YuichiYuichi

depends_onが取得できない問題→isuue立てて改善済み

-- `がついてるとdepends_on取得できないっぽい
select * from `dataset.table`
-- 正しくは↓
select * from dataset.table

elif query.get("type") == "native":
https://github.com/gouline/dbt-metabase/blob/59cb87db36648b79691ac9b2d7640e3c4a0e234f/dbtmetabase/_exposures.py#L280

# Extracting table in `from` and `join` clauses (won't recognize some valid SQL, e.g. `from "table with spaces"`)
_EXPOSURE_PARSER = re.compile(r"[FfJj][RrOo][OoIi][MmNn]\s+([\w.\"`]+)")
_CTE_PARSER = re.compile(
    r"[Ww][Ii][Tt][Hh]\s+\b(\w+)\b\s+as|[)]\s*[,]\s*\b(\w+)\b\s+as"
)
YuichiYuichi
dbt compile && 
dbt-metabase exposures \
    --manifest-path target/manifest.json \
    --metabase-url https://~ \
    --metabase-api-key mb_xxxxxxxxx \
    --output-path models/exposure_metabase  \
    --include-collections ~
YuichiYuichi

https://github.com/gouline/dbt-metabase/issues/282

#286 (コメント)で気づいたように、競合するテーブル名はサポートされていません。依存関係はネイティブ SQL クエリを含むメタベース カードから手動で解析され、どのテーブルを参照しているかを区別する方法はありませんselect * from subscriptions。

YuichiYuichi

出力されるファイル名について

  • 指定なし
    • exposures.yml
  • --output-grouping collection
    • collection_name.yml : コレクションごとにファイル分割される
  • --output-grouping type
      card                # フォルダ
        L 999.yml     # クエリごと
    

--output_nameは昔あったが、今はないので任意のファイル名にするのはできなさそう
https://github.com/gouline/dbt-metabase/issues/225

YuichiYuichi

https://github.com/gouline/dbt-metabase/issues/282
の対応ログ

pip install git+ssh://git@github.com/gouline/dbt-metabase.git@d45c0df

SSH を使わず HTTPS を使用して dbt-metabase をインストールする場合

pip install git+https://github.com/gouline/dbt-metabase.git@d45c0df
$ pip list
dbt-bigquery              1.8.0
dbt-core                  1.8.3
dbt-metabase              1.3.12.dev6+gd45c0df

サンドボックスのデータセットを使う
https://github.com/gouline/dbt-metabase/tree/c2ba2fbfb39cde830b21e6bcdbfdadaea69b5db3/sandbox
metabasで作成

  SELECT *
  FROM work.transactions

以前のバージョン(行けたやつ):a2b0617

pip uninstall dbt-metabase 
pip install git+https://github.com/gouline/dbt-metabase.git@a2b061785a2d3f83d9a55f7c5e077c11c32e658f
pip list
YuichiYuichi
dbt-metabase_config
config:
  manifest_path: target/manifest.json
  metabase_url: https://metabase.example.com
  metabase_api_key: mb_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
  # Configuration specific to models command
  models:
    metabase_database: cookbiz-data
    # Metabaseで読み込み対象のデータベースが増えたら追記する
    include_schemas:
      - mrt_~~
      - mrt_~~~

  # Configuration specific to exposures command
  exposures:
    output_path: models/exposures/metabase
    # 除外するコレクション
    exclude_collections: ~~~~~
    # コレクション単位でymlを分割保存
    output_grouping: collection

下記のように実行
--metabase-databasemetabase_database:に書き換え、ハイフンがアンダーバーに変わってるのにしばらく気づかんかった泣

dbt-metabase --config-path dbt/dbt_metabase_config.yml models
dbt-metabase --config-path ../.github/setting/dbt-metabase_config.yml models
YuichiYuichi

output_grouping: collectionだと
不要ファイルが貯まるので、出力先のフォルダをクリアする必要あり、、、