监视无服务器计算的成本

本文介绍如何使用可计费用量系统表(公共预览版)来监视无服务器计算用量成本。

可以通过查询可计费使用情况系统表 (system.billing.usage) 来监视笔记本和作业的无服务器计算使用情况,该表包括与无服务器计算成本相关的用户和工作负载属性。 适用字段包括:

  • identity_metadata 列包括 run_as 字段,其中显示了其凭据用于运行工作负载的用户或服务主体。
  • usage_metadata 列包含描述工作负载的字段:job_run_idjob_namenotebook_id notebook_path

无服务器使用情况记录的注意事项

分析无服务器使用情况时,请考虑以下事项:

  • 你可能会在某一给定小时内看到与给定无服务器计算工作负载关联的多条记录。 例如,可能会看到具有相同 job_idjob_run_id 和 job_name` 的多条记录,但每个记录的 DBU 使用量值却不同。 这些 DBU 的总和共同表示给定作业运行的每小时 DBU 使用量。

注意

有关 null 工作负载归因的最新信息,请参阅即将推出的功能

使用预算监视支出

帐户管理员可设置预算来对成本进行分组和设置警报。 请参阅使用预算监视帐户支出

导入使用情况仪表板

帐户管理员可将成本管理仪表板导入其帐户中任何已启用 Unity Catalog 的工作区。 请参阅导入使用情况仪表板

在 UI 中查找作业或笔记本

若要基于计费记录在 UI 中查找作业或笔记本,请从使用情况记录复制 usage_metadata.job_idusage_metadata.notebook_id 值。 这些 ID 是不可变的,即使作业名称或笔记本路径发生更改也可以使用。

若要在 UI 中根据 job_id 查找作业,请运行:

  1. 从使用情况记录中复制 job_id。 对于本示例,假设 ID 为 700809544510906
  2. 导航到作业所在的同一 Azure Databricks 工作区中的“工作流”UI
  3. 确保未选中“仅我拥有的作业”筛选器
  4. 将 ID (700809544510906) 粘贴到“筛选作业”搜索栏中

若要在 UI 中根据 notebook_id 查找笔记本,请按以下说明操作:

  1. 从使用情况记录中复制 notebook_id。 对于本示例,假设 ID 为 700809544510906
  2. 导航到笔记本所在的同一 Azure Databricks 工作区中的“工作区”UI
  3. 单击列表中的任意笔记本。
  4. 打开笔记本后,检查浏览器地址栏中的 URL。 它看起来应该类似于:https://<account-console-url>/?o=<workspace ID>#notebook/<notebook ID>/command/<command ID>
  5. 在浏览器地址栏中,将笔记本 ID 替换为在第一步中复制的 ID,然后删除笔记本 ID 后面的所有内容。 它看起来应该类似于:https://<account-console-url>/?o=<workspace ID>#notebook/700809544510906
  6. 打开笔记本后,可以单击“共享”按钮查看笔记本所有者。

使用警报跟踪无服务器支出

警报是随时了解无服务器支出的强大方法。 使用警报,可以在查询结果中满足某些条件时收到通知。 若要了解如何创建警报,请参阅创建警报

可将警报添加到以下查询来监视预算。 在每个查询中,将 {budget} 替换为所选的预算。

当有工作区支出在过去 30 天内超过阈值时发出警报

可将警报设置为每当此查询返回行时都触发。 将 {budget} 替换为所选的预算。

SELECT
   t1.workspace_id,
   SUM(t1.usage_quantity * list_prices.pricing.default) as list_cost
FROM system.billing.usage t1
INNER JOIN system.billing.list_prices on
   t1.cloud = list_prices.cloud and
   t1.sku_name = list_prices.sku_name and
   t1.usage_start_time >= list_prices.price_start_time and
   (t1.usage_end_time <= list_prices.price_end_time or list_prices.price_end_time is null)
WHERE
   t1.sku_name LIKE '%SERVERLESS%'
   AND billing_origin_product IN ("JOBS", "INTERACTIVE")
   AND t1.usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
GROUP BY
   t1.workspace_id
HAVING
   list_cost > {budget}

当用户在过去 30 天内超过阈值时发出警报

可将警报设置为每当此查询返回行时都触发。 将 {budget} 替换为所选的预算。

SELECT
   t1.identity_metadata.run_as,
   SUM(t1.usage_quantity * list_prices.pricing.default) as list_cost
FROM system.billing.usage t1
INNER JOIN system.billing.list_prices on
   t1.cloud = list_prices.cloud and
   t1.sku_name = list_prices.sku_name and
   t1.usage_start_time >= list_prices.price_start_time and
   (t1.usage_end_time <= list_prices.price_end_time or list_prices.price_end_time is null)
WHERE
   t1.sku_name LIKE '%SERVERLESS%'
   AND billing_origin_product IN ("JOBS", "INTERACTIVE")
   AND t1.usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
GROUP BY
   t1.identity_metadata.run_as
HAVING
   list_cost > {budget}

当作业在过去 30 天内超过阈值时发出警报

可将警报设置为每当此查询返回行时都触发。 将 {budget} 替换为所选的预算。

SELECT
   t1.workspace_id,
   t1.usage_metadata.job_id,
   SUM(t1.usage_quantity * list_prices.pricing.default) as list_cost
FROM system.billing.usage t1
INNER JOIN system.billing.list_prices on
   t1.cloud = list_prices.cloud and
   t1.sku_name = list_prices.sku_name and
   t1.usage_start_time >= list_prices.price_start_time and
   (t1.usage_end_time <= list_prices.price_end_time or list_prices.price_end_time is null)
WHERE
   t1.sku_name LIKE '%SERVERLESS%'
   AND billing_origin_product IN ("JOBS")
   AND t1.usage_date >= CURRENT_DATE() - INTERVAL 30 DAYS
GROUP BY
   t1.workspace_id, t1.usage_metadata.job_id,
HAVING
   list_cost > {budget}

示例查询

使用以下查询深入了解帐户中的无服务器使用情况:

找出高成本的无服务器计算笔记本

此查询按 DBU 使用量的降序返回笔记本列表以及每个笔记本使用的 DBU 数:

SELECT
  usage_metadata.notebook_id,
  SUM(usage_quantity) as total_dbu
FROM
  system.billing.usage
WHERE
  usage_metadata.notebook_id is not null
  and billing_origin_product = 'INTERACTIVE'
  and product_features.is_serverless
  and usage_unit = 'DBU'
  and usage_date >= DATEADD(day, -30, current_date)
GROUP BY
  1
ORDER BY
  total_dbu DESC

找出高成本的无服务器计算作业

此查询按 DBU 使用量的降序返回作业列表以及每个作业使用的 DBU 数:

SELECT
  usage_metadata.job_id,
  SUM(usage_quantity) as total_dbu
FROM
  system.billing.usage
WHERE
  usage_metadata.job_id is not null
  and billing_origin_product = 'JOBS'
  and product_features.is_serverless
  and usage_unit = 'DBU'
  and usage_date >= DATEADD(day, -30, current_date)
GROUP BY
  1
ORDER BY
  total_dbu DESC

报告特定用户使用的 DBU

此查询返回使用无服务器计算且由特定用户或服务主体运行的笔记本和作业列表,以及每个工作负载使用的 DBU 数:

SELECT
  usage_metadata.job_id,
  usage_metadata.notebook_id,
  SUM(usage_quantity) as total_dbu
FROM
  system.billing.usage
WHERE
  identity_metadata.run_as = '<emailaddress@domain.com>'
  and billing_origin_product in ('JOBS','INTERACTIVE')
  and product_features.is_serverless
  and usage_unit = 'DBU'
  and usage_date >= DATEADD(day, -30, current_date)
GROUP BY
  1,2
ORDER BY
  total_dbu DESC

报告共享自定义标记的工作负载使用的无服务器计算 DBU

此查询返回使用无服务器计算且共享同一自定义标记的作业列表,以及每个工作负载使用的 DBU 数:

SELECT
  usage_metadata.job_id,
  usage_metadata.notebook_id,
  SUM(usage_quantity) as total_dbu
FROM
  system.billing.usage
WHERE
  custom_tags.<key> = '<value>'
  and billing_origin_product in ('JOBS','INTERACTIVE')
  and product_features.is_serverless
  and usage_unit = 'DBU'
  and usage_date >= DATEADD(day, -30, current_date)
GROUP BY
  1,2
ORDER BY
  total_dbu DESC