システムテーブルを使用したコストの監視

この記事では、system.billing.usageテーブルを単独で使用したり、他のシステムテーブルと結合して使用したりして、アカウントの Databricks 使用状況を把握する方法について説明します。 次の機能固有の記事も利用できます。

使用量表の読み方

システムテーブルデータへのアクセス許可を持つユーザーは、 system.billing.usageにあるアカウントの請求ログを表示およびクエリできます。 すべての請求レコードには、関連する特定のリソース、ID、および製品に使用量を割り当てる列が含まれています。

  • usage_metadata列には、使用に関連するリソースまたはオブジェクトに関する情報を含む構造体が含まれています。

  • identity_metadata列には、使用量の原因となったユーザーまたはサービスプリンシパルに関する情報が含まれます。

  • custom_tags 列には、使用状況に関連付けられているコンピュート リソースに適用されたタグが含まれます。これには、予算ポリシーによって追加されたタグも含まれており、サーバレスの使用状況を帰属させることができます。

  • billing_origin_product列とproduct_features列には、使用されている正確な製品と機能に関する情報が表示されます。

usage テーブルの完全なリファレンスについては、 課金利用 システムテーブル リファレンスを参照してください。

請求データの運用化

Databricks AI/BI ダッシュボードを使用して、システムテーブルの請求データを使用してコスト モニタリング ダッシュボードを作成することをお勧めします。新しいダッシュボードを作成することも、アカウント管理者が事前に作成されたカスタマイズ可能なコストモニタリングダッシュボードをインポートすることもできます。 使用状況ダッシュボードを参照してください。

また、クエリにアラートを追加して、使用状況データに関する情報を入手することもできます。 「アラートを作成する」を参照してください

サンプルクエリー

次のクエリは、 system.billing.usage テーブルデータを使用してアカウントの使用状況を把握する方法の例を示しています。

今月は各製品のDBUがいくつ使用されましたか?

SELECT
    billing_origin_product,
    usage_date,
    sum(usage_quantity) as usage_quantity
FROM system.billing.usage
WHERE
    month(usage_date) = month(NOW())
    AND year(usage_date) = year(NOW())
GROUP BY billing_origin_product, usage_date

DBUを最も多く消費したジョブはどれですか?

SELECT
  usage_metadata.job_id as `Job ID`, sum(usage_quantity) as `Usage`
FROM
  system.billing.usage
WHERE
  usage_metadata.job_id IS NOT NULL
GROUP BY
  `Job ID`
ORDER BY
  `Usage` DESC

特定のタグを持つリソースにどれだけの使用量を帰属させることができますか?

コストはさまざまな方法で分割できます。 この例では、カスタムタグでコストを分類する方法を示します。 クエリ内のカスタムタグのキーと値を必ず置き換えてください。

SELECT
  sku_name, usage_unit, SUM(usage_quantity) as `Usage`
FROM
  system.billing.usage
WHERE
  custom_tags [:key] = :value
GROUP BY 1, 2

利用が伸びている製品を見る

SELECT
  after.billing_origin_product, before_dbus, after_dbus, ((after_dbus - before_dbus)/before_dbus * 100) AS growth_rate
FROM
  (SELECT
     billing_origin_product, sum(usage_quantity) as before_dbus
   FROM
     system.billing.usage
   WHERE
     usage_date BETWEEN "2024-04-01" and "2024-04-30"
   GROUP BY
     billing_origin_product
  ) as before
JOIN
  (SELECT
     billing_origin_product, sum(usage_quantity) as after_dbus
   FROM
     system.billing.usage
   WHERE
     usage_date
   BETWEEN
     "2024-05-01" and "2024-05-30"
   GROUP BY
     billing_origin_product
  ) as after
WHERE
  before.billing_origin_product = after.billing_origin_product
SORT BY
  growth_rate DESC

オールパーパスコンピュート(Photon)の利用動向は?

SELECT
  sku_name,
  usage_date,
  sum(usage_quantity) as `DBUs consumed`
FROM
  system.billing.usage
WHERE
  year(usage_date) = year(CURRENT_DATE)
AND
  sku_name = "ENTERPRISE_ALL_PURPOSE_COMPUTE_(PHOTON)"
AND
  usage_date > "2024-04-15"
GROUP BY
  sku_name, usage_date

マテリアライズドビューまたはストリーミングテーブルのDBU消費量はどれくらいですか?

特定のマテリアライズドビューまたはストリーミングテーブルの DBU 使用量と SKU を取得するには、マテリアライズドビューまたはストリーミングテーブルに関連付けられたパイプラインの ID に usage_metadata.dlt_pipeline_id が設定されているレコードのクエリを課金利用システムテーブルに送信します。 パイプライン ID は、マテリアライズド ビューまたはストリーミング テーブルを表示するときに、カタログ エクスプローラーの [詳細 ] タブで確認できます。 日付で消費を制限するには、開始日、終了日、または日付範囲を指定します。 次のクエリは、ID が 00732f83-cd59-4c76-ac0d-57958532ab5b で使用開始日が 2024-05-30のパイプラインの DBU 使用量を取得します。

SELECT
  sku_name,
  usage_date,
  SUM(usage_quantity) AS `DBUs`
FROM
  system.billing.usage
WHERE
  usage_metadata.dlt_pipeline_id = :dlt_pipeline_id
  AND usage_start_time > :usage_start_time
GROUP BY
  ALL

サーバレス DLT パイプラインの DBU 消費量はどれくらいですか?

サーバレス DLT パイプラインの DBU 使用量と SKU を取得するには、usage_metadata.dlt_pipeline_id がパイプラインの ID に設定されているレコードのクエリを課金利用 システムテーブルに送信します。 パイプライン ID は、 Delta Live TablesUI でパイプラインを表示するときに、 パイプラインの [詳細] タブで確認できます。日付で消費を制限するには、開始日、終了日、または日付範囲を指定します。 次のクエリは、ID が ID が 00732f83-cd59-4c76-ac0d-57958532ab5bのパイプラインの 2024 年 12 月からの DBU 使用量を取得します。

SELECT
  sku_name,
  usage_date,
  SUM(usage_quantity) AS `DBUs`
FROM
  system.billing.usage
WHERE
  usage_metadata.dlt_pipeline_id = :dlt_pipeline_id
  AND usage_start_time >= :usage_start_time
  AND usage_end_time < :usage_end_time
GROUP BY
  ALL

DBUの消費の日々の傾向は?

SELECT
  usage_date as `Date`, sum(usage_quantity) as `DBUs Consumed`
FROM
  system.billing.usage
WHERE
  sku_name = "STANDARD_ALL_PURPOSE_COMPUTE"
GROUP BY
  usage_date
ORDER BY
  usage_date ASC

使用テーブル・ジョインの例

次の例は、usage テーブルを他のシステムテーブルと結合して、さらに理解を深める方法を示しています。

コンピュートオーナーにコストの帰属

コンピュートのコストを削減したい場合は、このクエリを使用して、アカウント内のどのクラスタリング所有者が最も多くの DBU を使用しているかを確認できます。

SELECT
  u.record_id record_id,
  c.cluster_id cluster_id,
  max_by(c.owned_by, c.change_time) owned_by,
  max(c.change_time) change_time,
  any_value(u.usage_start_time) usage_start_time,
  any_value(u.usage_quantity) usage_quantity
FROM
  system.billing.usage u
  JOIN system.compute.clusters c
WHERE
  u.usage_metadata.cluster_id is not null
  and u.usage_start_time >= '2023-01-01'
  and u.usage_metadata.cluster_id = c.cluster_id
  and c.change_time <= u.usage_start_time
GROUP BY 1, 2
ORDER BY cluster_id, usage_start_time desc;

ジョブ名による使用量の充実

with jobs as (
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY workspace_id, job_id ORDER BY change_time DESC) as rn
  FROM system.lakeflow.jobs QUALIFY rn=1
)
SELECT
  usage.*,
  coalesce(usage_metadata.job_name, jobs.name) as job_name
FROM system.billing.usage
  LEFT JOIN jobs ON usage.workspace_id=jobs.workspace_id AND usage.usage_metadata.job_id=jobs.job_id
WHERE
  billing_origin_product="JOBS"

価格を使用量テーブルと結合する

list_prices表には、利用可能な各SKUの経時的な定価が含まれています。usageテーブルを結合して、特定の使用量のリストコストを表示できます。

たとえば、次のクエリは、特定のタグに関連付けられた月の合計コストを返します。

SELECT
 SUM(usage.usage_quantity * list_prices.pricing.effective_list.default)
 as `Total Dollar Cost`
FROM system.billing.usage
JOIN system.billing.list_prices ON list_prices.sku_name = usage.sku_name
WHERE usage.custom_tags [:key] = :value
AND usage.usage_end_time >= list_prices.price_start_time
AND (list_prices.price_end_time IS NULL OR usage.usage_end_time < list_prices.price_end_time)
AND usage.usage_date BETWEEN "2024-05-01" AND "2024-05-31"

前月の使用に対する追加コストを見積もります

このクエリは、期間内のすべての使用量に単純な割合を適用します。 これは、一部のアドオンのエンタイトルメントの管理方法により、実際の収益化とは若干異なる場合があることに注意してください。 アドオン料金をアカウントの料金に置き換えます。

SELECT SUM(usage.usage_quantity * list_prices.pricing.effective_list.default) * :add_on_rate as `Total Add-On Dollar Cost`
FROM system.billing.usage
JOIN system.billing.list_prices ON list_prices.sku_name = usage.sku_name
  WHERE usage.usage_end_time >= list_prices.price_start_time
  AND (list_prices.price_end_time IS NULL OR usage.usage_end_time < list_prices.price_end_time)
  AND usage.usage_date BETWEEN "2024-02-01" AND "2024-02-29"