From fd25825b3c0d61b77cfdeaa4d667875a019d7434 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Mon, 13 Jul 2026 17:33:51 +0000 Subject: [PATCH 1/9] Update Databricks integration setup docs (DOIO-94) Reduce onboarding friction in the Databricks setup docs: - Fold the required workspace entitlements (Workspace access, Databricks SQL access, Admin access) into service principal creation, replacing the separate "add to admins group" steps; note the granular-permissions fallback when Admin access cannot be granted. - Restructure SQL Warehouse setup into a single step with ordered substeps: select a Pro/Serverless warehouse (recommend a dedicated 2XS), copy the ID, grant CAN USE, and grant system-table read access. - Document where to find the SQL Warehouse ID, and note it powers Quality Monitoring, with a cross-link to that page. - Tell users to run the system-table GRANT commands in the SQL Editor, and fix the grant syntax to use the backticked client ID instead of the service principal display name. - Surface the MANAGE-on-CATALOG-system prerequisite as a warning callout. Also updates the Cloud Cost Management (saas_costs) and Quality Monitoring Databricks docs to use the SQL Editor and backticked client ID for the system-table grants. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../cloud_cost_management/setup/saas_costs.md | 8 +-- .../jobs_monitoring/databricks/_index.md | 68 +++++++++++-------- .../data_warehouses/databricks.md | 2 + 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/content/en/cloud_cost_management/setup/saas_costs.md b/content/en/cloud_cost_management/setup/saas_costs.md index 5cf1d5bf8d9..2db6eeaf315 100644 --- a/content/en/cloud_cost_management/setup/saas_costs.md +++ b/content/en/cloud_cost_management/setup/saas_costs.md @@ -120,11 +120,11 @@ Notes: 4. Enter a `System Tables SQL Warehouse ID` corresponding to your Databricks instance's warehouse to query for system table billing data. 5. Click {{< ui >}}Save Databricks Workspace{{< /ui >}}. -Your service principal requires read access to the [system tables](https://docs.databricks.com/aws/en/admin/system-tables/) within Unity Catalog. +Your service principal requires read access to the [system tables](https://docs.databricks.com/aws/en/admin/system-tables/) within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): ```sql -GRANT USE CATALOG ON CATALOG system TO ; -GRANT USE SCHEMA ON CATALOG system TO ; -GRANT SELECT ON CATALOG system TO ; +GRANT USE CATALOG ON CATALOG system TO ``; +GRANT USE SCHEMA ON CATALOG system TO ``; +GRANT SELECT ON CATALOG system TO ``; ``` Your Databricks cost data for the past 15 months can be accessed in Cloud Cost Management after 24 hours. To access the available data collected by each SaaS Cost Integration, see the [Data Collected section](#data-collected). diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 2f84c2b6918..42051ff805d 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -37,9 +37,15 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. 1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. 1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. -1. Enter a name, then click **Add**. +1. Enter a name and enable the following workspace entitlements for the service principal: + - {{< ui >}}Workspace access{{< /ui >}} + - {{< ui >}}Databricks SQL access{{< /ui >}} + - {{< ui >}}Admin access{{< /ui >}}: grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. + +
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration below.
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
+1. Click **Add**. 1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. 1. Set {{< ui >}}Lifetime (days){{< /ui >}} to the maximum value allowed (730). @@ -51,8 +57,6 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. {{< img src="data_jobs/databricks/client-id-secret.png" alt="In Databricks, a modal showing the client ID and secret associated with a new OAuth secret is displayed." style="width:70%;" >}} 1. On the {{< ui >}}Permissions{{< /ui >}} tab, click {{< ui >}}Grant access{{< /ui >}}. Search for the new service principal, grant it the {{< ui >}}Manage{{< /ui >}} permission, and click {{< ui >}}Save{{< /ui >}}. -1. Return to the {{< ui >}}Identity and access{{< /ui >}} tab and click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Groups{{< /ui >}}. -1. Click the {{< ui >}}admins{{< /ui >}} group, then click {{< ui >}}Add members{{< /ui >}} to add the new service principal. #### Add the Databricks workspace to Datadog @@ -60,17 +64,19 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. 1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} -1. To gain visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], provide the ID of a [Databricks SQL Warehouse][19] that Datadog can use to query your [system tables][20]. - - The service principal must have access to the SQL Warehouse. In the Warehouse configuration page, go to {{< ui >}}Permissions{{< /ui >}} (top right) and grant it `CAN USE` permission. - - Grant the service principal read access to the Unity Catalog [system tables][20] by running the following commands: - ```sql - GRANT USE CATALOG ON CATALOG system TO ; - GRANT SELECT ON CATALOG system TO ; - GRANT USE SCHEMA ON CATALOG system TO ; - ``` - The user granting these must have `MANAGE` privilege on `CATALOG system`. - - - The SQL Warehouse must be Pro or Serverless. Classic Warehouses are **NOT** supported. A 2XS warehouse is recommended, with Auto Stop set to 5-10 minutes to reduce cost. +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], and powers [Data Observability: Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless; Classic Warehouses are **NOT** supported. We recommend creating a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes to reduce cost. + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. + 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
1. In the **Select products to set up integration** section, ensure that Data Observability: Jobs Monitoring is {{< ui >}}Enabled{{< /ui >}}. 1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. @@ -79,6 +85,7 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. [18]: https://docs.datadoghq.com/cloud_cost_management/ [19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ [20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ {{% /tab %}} @@ -110,17 +117,19 @@ See [Private Link Connectivity (Preview)][15] for full setup instructions. 1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. 1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} -1. To gain visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], provide the ID of a [Databricks SQL Warehouse][19] that Datadog can use to query your [system tables][20]. - - - The token's principal must have access to the SQL Warehouse. Give it `CAN USE` permission from **Permissions** at the top right of the Warehouse configuration page. - - Grant the service principal read access to the Unity Catalog [system tables][20] by running the following commands:: - ```sql - GRANT USE CATALOG ON CATALOG system TO ; - GRANT SELECT ON CATALOG system TO ; - GRANT USE SCHEMA ON CATALOG system TO ; - ``` - The user granting these must have `MANAGE` privilege on `CATALOG system`. - - The SQL Warehouse must be Pro or Serverless. Classic Warehouses are **NOT** supported. A 2XS size warehouse is recommended, with Auto Stop configured for 5-10 minutes to minimize cost. +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], and powers [Data Observability: Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless; Classic Warehouses are **NOT** supported. We recommend creating a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes to reduce cost. + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. + 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. 1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. @@ -133,6 +142,7 @@ See [Private Link Connectivity (Preview)][15] for full setup instructions. [18]: https://docs.datadoghq.com/cloud_cost_management [19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ [20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ {{% /tab %}} @@ -464,11 +474,11 @@ If you need more granular control, grant these minimal permissions to the follow Additionally, for Datadog to access your Databricks cost data in Data Observability: Jobs Monitoring or [Cloud Cost Management][26], the user or service principal used to query [system tables][27] must have the following permissions: - `CAN USE` permission on the SQL Warehouse. - - Read access to the [system tables][27] within Unity Catalog. This can be granted with: + - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ; - GRANT SELECT ON CATALOG system TO ; - GRANT USE SCHEMA ON CATALOG system TO ; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; ``` The user granting these must have `MANAGE` privilege on `CATALOG system`. diff --git a/content/en/data_observability/quality_monitoring/data_warehouses/databricks.md b/content/en/data_observability/quality_monitoring/data_warehouses/databricks.md index e92086f17d9..18e220c09ca 100644 --- a/content/en/data_observability/quality_monitoring/data_warehouses/databricks.md +++ b/content/en/data_observability/quality_monitoring/data_warehouses/databricks.md @@ -37,6 +37,8 @@ If your Databricks workspace restricts network access by IP, add the Datadog web ### Step 2 - Grant access +In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} to run the following commands. Use the service principal's application (client) ID, not its display name, wherever `` appears. + First, grant access to system schemas for lineage: ```sql GRANT USE CATALOG ON CATALOG system TO ``; From 5c4ff6a2cc923927c3818e9c5095e5109b8e4e68 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 17:23:31 +0000 Subject: [PATCH 2/9] Item 8: drop env-var quotes in Databricks UI fields Databricks does not accept quotes of any kind in the Environment variables textbox (or the cluster-policy spark_env_vars Value field); whitespace in the workspace name is accepted without quoting. Remove the quotes and the "enclose in double quotes" note from those two UI-field contexts. The global init script remains a real shell script, where export VAR="..." quoting is valid and required for whitespace values, so it is left unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../data_observability/jobs_monitoring/databricks/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 42051ff805d..9cd5df1b2d6 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -241,7 +241,7 @@ This approach is recommended for clusters in **Standard** access mode. |----------------------|------------------------------| | DD_API_KEY | Your [Datadog API key][1]. | | DD_SITE | Your [Datadog site][2]. | - | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespaces. | + | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Do not enclose the value in quotes; Databricks does not accept quotes in this field. Whitespace in the name is allowed. | 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. @@ -380,7 +380,7 @@ Optionally, you can also set other init script parameters and Datadog environmen ```text DD_API_KEY= DD_SITE= - DATABRICKS_WORKSPACE="" + DATABRICKS_WORKSPACE= ``` Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: @@ -389,7 +389,7 @@ Optionally, you can also set other init script parameters and Datadog environmen |--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| | DD_API_KEY | Your [Datadog API key][1]. | | | DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespace. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Do not enclose the value in quotes; Databricks does not accept quotes in this field. Whitespace in the name is allowed. | | | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | From dcb889537998e7088fdec01d41f4ec4d271a64c4 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 17:52:05 +0000 Subject: [PATCH 3/9] Drop the "enclose in quotes" note from Databricks UI-field env vars Just remove the quote instruction rather than explaining the behavior; the example already omits the quotes. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../data_observability/jobs_monitoring/databricks/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 9cd5df1b2d6..06a1b171c80 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -241,7 +241,7 @@ This approach is recommended for clusters in **Standard** access mode. |----------------------|------------------------------| | DD_API_KEY | Your [Datadog API key][1]. | | DD_SITE | Your [Datadog site][2]. | - | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Do not enclose the value in quotes; Databricks does not accept quotes in this field. Whitespace in the name is allowed. | + | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. @@ -389,7 +389,7 @@ Optionally, you can also set other init script parameters and Datadog environmen |--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| | DD_API_KEY | Your [Datadog API key][1]. | | | DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Do not enclose the value in quotes; Databricks does not accept quotes in this field. Whitespace in the name is allowed. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | | | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | From ed2e9935d91202ca9127d48f8d53323206ddc45d Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 14:42:15 -0400 Subject: [PATCH 4/9] Update content/en/data_observability/jobs_monitoring/databricks/_index.md Co-authored-by: Bryce Eadie --- .../en/data_observability/jobs_monitoring/databricks/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 06a1b171c80..808dc26d12a 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -40,7 +40,7 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. Enter a name and enable the following workspace entitlements for the service principal: - {{< ui >}}Workspace access{{< /ui >}} - {{< ui >}}Databricks SQL access{{< /ui >}} - - {{< ui >}}Admin access{{< /ui >}}: grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. + - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group.
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration below.
From 81c5dc0432df1a2e538ce987759ac0502c644736 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 14:43:33 -0400 Subject: [PATCH 5/9] Apply suggestions from code review Co-authored-by: Bryce Eadie --- .../cloud_cost_management/setup/saas_costs.md | 6 ++--- .../jobs_monitoring/databricks/_index.md | 22 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/content/en/cloud_cost_management/setup/saas_costs.md b/content/en/cloud_cost_management/setup/saas_costs.md index 2db6eeaf315..568bac23762 100644 --- a/content/en/cloud_cost_management/setup/saas_costs.md +++ b/content/en/cloud_cost_management/setup/saas_costs.md @@ -122,9 +122,9 @@ Notes: Your service principal requires read access to the [system tables](https://docs.databricks.com/aws/en/admin/system-tables/) within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): ```sql -GRANT USE CATALOG ON CATALOG system TO ``; -GRANT USE SCHEMA ON CATALOG system TO ``; -GRANT SELECT ON CATALOG system TO ``; +GRANT USE CATALOG ON CATALOG system TO ``; +GRANT USE SCHEMA ON CATALOG system TO ``; +GRANT SELECT ON CATALOG system TO ``; ``` Your Databricks cost data for the past 15 months can be accessed in Cloud Cost Management after 24 hours. To access the available data collected by each SaaS Cost Integration, see the [Data Collected section](#data-collected). diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 808dc26d12a..cb9e3586d24 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -42,7 +42,7 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. - {{< ui >}}Databricks SQL access{{< /ui >}} - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. -
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration below.
+
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
1. Click **Add**. @@ -64,16 +64,16 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. 1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], and powers [Data Observability: Quality Monitoring][21]. - 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless; Classic Warehouses are **NOT** supported. We recommend creating a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes to reduce cost. +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; ```
The user running these commands must have the MANAGE privilege on CATALOG system.
@@ -117,16 +117,16 @@ See [Private Link Connectivity (Preview)][15] for full setup instructions. 1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. 1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Data Observability: Jobs Monitoring or [Cloud Cost Management][18], and powers [Data Observability: Quality Monitoring][21]. - 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless; Classic Warehouses are **NOT** supported. We recommend creating a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes to reduce cost. +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. Use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes, to reduce cost. 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; ```
The user running these commands must have the MANAGE privilege on CATALOG system.
From b9dde8fb120a033dcdc206782bbc57f3a18a88e4 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 18:59:06 +0000 Subject: [PATCH 6/9] Address review: screenshot, GRANT ordering, callout placement - Repoint the Spark env-vars screenshot to the unquoted-values image (configure-databricks-cluster-init-script.png) so it matches the "do not enclose the value in quotes" guidance - Standardize the Unity Catalog GRANT order to USE CATALOG, USE SCHEMA, SELECT, matching cloud_cost_management/setup/saas_costs.md - Move the Azure "Databricks managed" warning up to the service principal creation step, leaving the entitlements section ending with the Admin access note Co-Authored-By: Claude Opus 4.8 (1M context) --- .../jobs_monitoring/databricks/_index.md | 20 +++++++++--------- ...nfigure-databricks-cluster-init-script.png | Bin 96576 -> 118656 bytes 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index cb9e3586d24..6dedc8da603 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -37,14 +37,14 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. 1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. 1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. + +
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
1. Enter a name and enable the following workspace entitlements for the service principal: - {{< ui >}}Workspace access{{< /ui >}} - {{< ui >}}Databricks SQL access{{< /ui >}} - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group.
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
- -
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
1. Click **Add**. 1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. @@ -71,9 +71,9 @@ Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; ```
The user running these commands must have the MANAGE privilege on CATALOG system.
@@ -124,9 +124,9 @@ See [Private Link Connectivity (Preview)][15] for full setup instructions. 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; ```
The user running these commands must have the MANAGE privilege on CATALOG system.
@@ -373,7 +373,7 @@ Optionally, you can also set other init script parameters and Datadog environmen 1. In Databricks, on the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. 2. At the bottom of the page, go to the {{< ui >}}Spark{{< /ui >}} tab. - {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script-quoted.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} + {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} In the {{< ui >}}Environment variables{{< /ui >}} textbox, provide the values for the init script parameters. @@ -477,8 +477,8 @@ Additionally, for Datadog to access your Databricks cost data in Data Observabil - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): ```sql GRANT USE CATALOG ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; ``` The user granting these must have `MANAGE` privilege on `CATALOG system`. diff --git a/static/images/data_jobs/databricks/configure-databricks-cluster-init-script.png b/static/images/data_jobs/databricks/configure-databricks-cluster-init-script.png index 2bfeb1f6ecac9f7d6cfa0a97b144246edf9abe0e..551a399d91e026b36184344b013b8a8b304ede39 100644 GIT binary patch literal 118656 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 P@Nb8S#kPCK?&1FfitEW2 literal 96576 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 Bw>AI( From f7c36f8f97a057d339dd78afc205cbbde0140ed3 Mon Sep 17 00:00:00 2001 From: Charles Yu Date: Tue, 14 Jul 2026 19:02:49 +0000 Subject: [PATCH 7/9] Standardize client-id placeholder casing to Update the remaining lowercase placeholders in the cost-data GRANT block to match the uppercase used elsewhere. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../data_observability/jobs_monitoring/databricks/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 6dedc8da603..0b7a0f527b2 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -476,9 +476,9 @@ Additionally, for Datadog to access your Databricks cost data in Data Observabil - `CAN USE` permission on the SQL Warehouse. - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; ``` The user granting these must have `MANAGE` privilege on `CATALOG system`. From 6b138dd4eb9773bbc99ef7cd1dbee7cb88e6e106 Mon Sep 17 00:00:00 2001 From: Bryce Eadie Date: Tue, 14 Jul 2026 16:15:46 -0700 Subject: [PATCH 8/9] Update phrasing --- .../jobs_monitoring/databricks/_index.md | 1132 ++++++++--------- 1 file changed, 566 insertions(+), 566 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 0b7a0f527b2..41ac60e40e9 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -1,567 +1,567 @@ ---- -title: "Enable Data Observability: Jobs Monitoring for Databricks" -description: "Enable Data Observability: Jobs Monitoring for Databricks workspaces with OAuth or Personal Access Token authentication and Datadog Agent installation." -aliases: - - /data_jobs/databricks -further_reading: - - link: '/data_jobs' - tag: 'Documentation' - text: 'Data Observability: Jobs Monitoring' - - link: "https://www.datadoghq.com/blog/databricks-serverless-jobs-datadog/" - tag: "Blog" - text: "Detect issues and optimize spend with Databricks serverless job monitoring" ---- - -[Data Observability: Jobs Monitoring][7] gives visibility into the performance and reliability of your Databricks jobs and workflows running on clusters or serverless compute. - -## Setup - - - -Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. - -1. [Configure the Datadog-Databricks integration](#configure-the-datadog-databricks-integration) for a Databricks workspace. -1. [Install the Datadog Agent](#install-the-datadog-agent) on your Databricks cluster(s) in the workspace. - - -### Configure the Datadog-Databricks integration - -{{< tabs >}} - -{{% tab "Use a Service Principal for OAuth" %}} - -
New workspace integrations must authenticate using OAuth. Workspaces already integrated with a Personal Access Token continue to function and can switch to OAuth at any time. After a workspace starts using OAuth, it cannot revert to a Personal Access Token.
- -#### Create and configure the service principal in Databricks - -1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. -1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. -1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. - -
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
-1. Enter a name and enable the following workspace entitlements for the service principal: - - {{< ui >}}Workspace access{{< /ui >}} - - {{< ui >}}Databricks SQL access{{< /ui >}} - - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. - -
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
-1. Click **Add**. - -1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. - 1. Set {{< ui >}}Lifetime (days){{< /ui >}} to the maximum value allowed (730). - - 1. Click {{< ui >}}Generate{{< /ui >}}. - - 1. Take note of your client ID and client secret. - - {{< img src="data_jobs/databricks/client-id-secret.png" alt="In Databricks, a modal showing the client ID and secret associated with a new OAuth secret is displayed." style="width:70%;" >}} - -1. On the {{< ui >}}Permissions{{< /ui >}} tab, click {{< ui >}}Grant access{{< /ui >}}. Search for the new service principal, grant it the {{< ui >}}Manage{{< /ui >}} permission, and click {{< ui >}}Save{{< /ui >}}. - -#### Add the Databricks workspace to Datadog - -1. In Datadog, open the Databricks integration tile. -1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. -1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. - {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. +--- +title: "Enable Data Observability: Jobs Monitoring for Databricks" +description: "Enable Data Observability: Jobs Monitoring for Databricks workspaces with OAuth or Personal Access Token authentication and Datadog Agent installation." +aliases: + - /data_jobs/databricks +further_reading: + - link: '/data_jobs' + tag: 'Documentation' + text: 'Data Observability: Jobs Monitoring' + - link: "https://www.datadoghq.com/blog/databricks-serverless-jobs-datadog/" + tag: "Blog" + text: "Detect issues and optimize spend with Databricks serverless job monitoring" +--- + +[Data Observability: Jobs Monitoring][7] gives visibility into the performance and reliability of your Databricks jobs and workflows running on clusters or serverless compute. + +## Setup + +
If your Databricks workspace has Networking Restrictions enabled, add Datadog's {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP ranges" >}} to your allow-list. If your workspace uses Private Link, see the Private Link Connectivity tab below.
+ +Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. + +1. [Configure the Datadog-Databricks integration](#configure-the-datadog-databricks-integration) for a Databricks workspace. +1. [Install the Datadog Agent](#install-the-datadog-agent) on your Databricks cluster(s) in the workspace. + + +### Configure the Datadog-Databricks integration + +{{< tabs >}} + +{{% tab "Use a Service Principal for OAuth" %}} + +
New workspace integrations must authenticate using OAuth. Workspaces already integrated with a Personal Access Token continue to function and can switch to OAuth at any time. After a workspace starts using OAuth, it cannot revert to a Personal Access Token.
+ +#### Create and configure the service principal in Databricks + +1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. +1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. +1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. + +
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
+1. Enter a name and enable the following workspace entitlements for the service principal: + - {{< ui >}}Workspace access{{< /ui >}} + - {{< ui >}}Databricks SQL access{{< /ui >}} + - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. + +
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
+1. Click **Add**. + +1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. + 1. Set {{< ui >}}Lifetime (days){{< /ui >}} to the maximum value allowed (730). + + 1. Click {{< ui >}}Generate{{< /ui >}}. + + 1. Take note of your client ID and client secret. + + {{< img src="data_jobs/databricks/client-id-secret.png" alt="In Databricks, a modal showing the client ID and secret associated with a new OAuth secret is displayed." style="width:70%;" >}} + +1. On the {{< ui >}}Permissions{{< /ui >}} tab, click {{< ui >}}Grant access{{< /ui >}}. Search for the new service principal, grant it the {{< ui >}}Manage{{< /ui >}} permission, and click {{< ui >}}Save{{< /ui >}}. + +#### Add the Databricks workspace to Datadog + +1. In Datadog, open the Databricks integration tile. +1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. +1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. + {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. - 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. - 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. - 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): - - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - -
The user running these commands must have the MANAGE privilege on CATALOG system.
-1. In the **Select products to set up integration** section, ensure that Data Observability: Jobs Monitoring is {{< ui >}}Enabled{{< /ui >}}. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. - - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. - -[18]: https://docs.datadoghq.com/cloud_cost_management/ -[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ -[20]: https://docs.databricks.com/aws/en/admin/system-tables/ -[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ - -{{% /tab %}} - -{{% tab "Private Link Connectivity" %}} - -If your Databricks workspace is deployed using [Private Link Connectivity][25], Datadog cannot access the Databricks APIs directly. This requires using a [Private Action Runner][26] deployed in your environment. - -See [Private Link Connectivity (Preview)][15] for full setup instructions. - -[15]: /data_observability/jobs_monitoring/databricks/private_link -[25]: https://docs.databricks.com/aws/en/security/network/front-end/front-end-private-connect -[26]: https://docs.datadoghq.com/actions/private_actions/ - -{{% /tab %}} - -{{% tab "Use a Personal Access Token (Legacy)" %}} - -
This option is only available for workspace integrations created before July 7, 2025. New workspace integrations must authenticate using OAuth.
- -1. In your Databricks workspace, click on your profile in the top right corner and go to {{< ui >}}Settings{{< /ui >}}. Select {{< ui >}}Developer{{< /ui >}} in the left side bar. Next to {{< ui >}}Access tokens{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. -1. Click {{< ui >}}Generate new token{{< /ui >}}, enter "Datadog Integration" in the {{< ui >}}Comment{{< /ui >}} field, set the {{< ui >}}Lifetime (days){{< /ui >}} value to the maximum allowed (730 days), and create a reminder to update the token before it expires. Then click {{< ui >}}Generate{{< /ui >}}. Take note of your token. - - **Important:** - * For the [Datadog managed init script install (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent), ensure the token's Principal is a Workspace Admin. - * For manual init script installation, ensure the token's Principal has [CAN VIEW access][9] for the Databricks jobs and clusters you want to monitor. - - As an alternative, follow the [official Databricks documentation][10] to generate an access token for a [service principal][11]. The service principal must have the [Workspace access entitlement][17] enabled and the Workspace Admin or [CAN VIEW access][9] permissions as described above. -1. In Datadog, open the Databricks integration tile. -1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. -1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. - {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. - 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. Use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes, to reduce cost. - 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. - 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. - 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): - - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - -
The user running these commands must have the MANAGE privilege on CATALOG system.
-1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. - - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. - -[9]: https://docs.databricks.com/en/security/auth-authz/access-control/index.html#job-acls -[10]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#manage-personal-access-tokens-for-a-service-principal -[11]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#what-is-a-service-principal -[17]: https://docs.databricks.com/aws/en/security/auth/entitlements#entitlements-overview -[18]: https://docs.datadoghq.com/cloud_cost_management -[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ -[20]: https://docs.databricks.com/aws/en/admin/system-tables/ -[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ - - -{{% /tab %}} - -{{< /tabs >}} - -### Install the Datadog Agent - -The Datadog Agent must be installed on Databricks clusters to monitor Databricks jobs that run on all-purpose or job clusters. This step is not required to monitor jobs on [serverless compute][4]. - -{{< tabs >}} -{{% tab "Datadog managed global init script (Recommended)" %}} - -Datadog can install and manage a global init script in the Databricks workspace. The Datadog Agent is installed on all clusters in the workspace, when they start. - -
-
    -
  • This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy across multiple clusters or Manually install on a specific cluster.
  • -
  • This install option, in which Datadog installs and manages your Datadog global init script, requires a Databricks Access Token with Workspace Admin permissions. A token with CAN VIEW access does not allow Datadog to manage the global init script of your Databricks account.
  • -
-
- -#### When integrating a workspace with Datadog - -1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. -1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. -1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. -1. Click {{< ui >}}Save Databricks Workspace{{< /ui >}}. - {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-new-2.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup when adding a Databricks workspace. Datadog can install and manage a global init script." style="width:100%;" >}} - -#### When adding the init script to a Databricks workspace already integrated with Datadog - -1. On the **Configure** tab, click the workspace in the list of workspaces -1. Click the {{< ui >}}Configured Products{{< /ui >}} tab -1. Make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. -1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. -1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. -1. Click **Save Databricks Workspace** at the bottom of the browser window. - {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-existing.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup for a Databricks workspace already added to the integration. Datadog can install and manage a global init script." style="width:100%;" >}} - -Optionally, you can add tags to your Databricks cluster and Spark performance metrics by configuring the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as [Spark env vars][2] with the Databricks API: - -| Variable | Description | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][1]. For example: `env:staging,team:data_engineering` | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env.| -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][3] for more details. | - - -[1]: /getting_started/tagging/ -[2]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars -[3]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[4]: https://docs.databricks.com/aws/en/compute/serverless/ - -{{% /tab %}} - -{{% tab "Manually configure a cluster policy" %}} - -This approach is recommended for clusters in **Standard** access mode. - -**Create the init script** - -1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). - - ```shell - #!/bin/bash - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. - -1. Grant read-only permissions to the init script: - 1. At the volume level, grant the `READ VOLUME` permission to all account users. - 1. At the catalog level, grant the `USE CATALOG` permission to all account users. - -
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
- -1. **Add the init script to the allowlist**: For clusters in **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. - -**Configure the compute policy** - -1. In {{< ui >}}Compute{{< /ui >}}, navigate to the {{< ui >}}Policies{{< /ui >}} tab. If you already have a cluster policy applied to your clusters, navigate to that existing policy to edit it. This is the simpler approach as the policy automatically applies to all clusters using it. Otherwise, click {{< ui >}}Create Policy{{< /ui >}} to create a new policy. -1. To add the init script to the cluster policy, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: - 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}init_scripts{{< /ui >}}. - 1. In the {{< ui >}}Source{{< /ui >}} dropdown, select {{< ui >}}Volume{{< /ui >}}. - 1. Under {{< ui >}}Destination{{< /ui >}}, enter the volume path to your init script. - 1. Click {{< ui >}}Add{{< /ui >}}. -1. Configure the environment variables. You must add each of the following environment variables to the cluster policy you created: - - | Key | Description | - |----------------------|------------------------------| - | DD_API_KEY | Your [Datadog API key][1]. | - | DD_SITE | Your [Datadog site][2]. | - | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | - - 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: - 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. - 1. In the {{< ui >}}Key{{< /ui >}} field, enter the environment variable key. - 1. In the {{< ui >}}Value{{< /ui >}} field, enter the environment variable value. - 1. Under the {{< ui >}}Type{{< /ui >}} drop-down, select {{< ui >}}Fixed{{< /ui >}}. - 1. Check the {{< ui >}}Hidden{{< /ui >}} checkbox to reduce exposure of sensitive values. - 1. Optionally, set other init script parameters and Datadog environment variables, such as `DD_ENV` and `DD_SERVICE`. You can configure the script using the following parameters: - - | Variable | Description | Default | - |--------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------| - | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | - | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | - | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | - | DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | - | DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - -1. Click {{< ui >}}Create{{< /ui >}} if creating a new policy or {{< ui >}}Save{{< /ui >}} if updating an existing policy. If you update an existing policy, all clusters using that policy automatically apply the changes on their next restart. If you create a new policy, follow the steps below to apply it to your clusters. - -**Apply the cluster policy to clusters** - -1. In {{< ui >}}Compute{{< /ui >}}, select the cluster you want to update or click {{< ui >}}Create Compute{{< /ui >}} for a new cluster. -1. In the {{< ui >}}Policy{{< /ui >}} dropdown at the top, select the policy you created. -1. Click {{< ui >}}Confirm{{< /ui >}} to save the changes. The cluster needs to be restarted for the policy to take effect. - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html -[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist - -{{% /tab %}} - -{{% tab "Manually install a global init script" %}} - -
-This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy or Manually install on a specific cluster. -
- -1. In Databricks, click your display name (email address) in the upper right corner of the page. -1. Select {{< ui >}}Settings{{< /ui >}} and click the {{< ui >}}Compute{{< /ui >}} tab. -1. In the {{< ui >}}All purpose clusters{{< /ui >}} section, next to {{< ui >}}Global init scripts{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. -1. Click {{< ui >}}Add{{< /ui >}}. Name your script. Then, in the {{< ui >}}Script{{< /ui >}} field, copy and paste the following script, remembering to replace the placeholders with your parameter values. - - ```shell - #!/bin/bash - - # Required parameters - export DD_API_KEY= - export DD_SITE= - export DATABRICKS_WORKSPACE="" - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above sets the required parameters, and downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. - -1. To enable the script for all new and restarted clusters, toggle {{< ui >}}Enabled{{< /ui >}}. - {{< img src="data_jobs/databricks/toggle.png" alt="Databricks UI, admin settings, global init scripts. A script called 'install-datadog-agent' is in a list with an enabled toggle." style="width:100%;" >}} -1. Click {{< ui >}}Add{{< /ui >}}. - -#### Set the required init script parameters - -Provide the values for the init script parameters at the beginning of the global init script. - -```bash -export DD_API_KEY= -export DD_SITE= -export DATABRICKS_WORKSPACE="" -``` - -Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: - -| Variable | Description | Default | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| -| DD_API_KEY | Your [Datadog API key][1]. | | -| DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespace. | | -| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | -| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules - -{{% /tab %}} - -{{% tab "Manually install on a specific cluster" %}} - -1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). - - ```shell - #!/bin/bash - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL (for example, `install-databricks-0.14.0.sh` to use version `0.14.0`). You can find the source code used to generate this script, and the changes between script versions, on the [Datadog Agent repository][3]. - -1. Grant read-only permissions to the init script: - 1. At the volume level, grant the `READ VOLUME` permission to all account users. - 1. At the catalog level, grant the `USE CATALOG` permission to all account users. - -
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
- -1. **Add the init script to the allowlist** (required for **Standard** access mode clusters): If your cluster uses **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. - -1. On the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. -1. At the bottom of the page, go to the {{< ui >}}Init Scripts{{< /ui >}} tab. - - {{< img src="data_jobs/databricks/init_scripts.png" alt="Databricks UI, cluster configuration advanced options, Init Scripts tab. A 'Destination' drop-down and an 'Init script path' file selector." style="width:80%;" >}} - - - Under the {{< ui >}}Destination{{< /ui >}} drop-down, select {{< ui >}}Volume{{< /ui >}}. - - Under {{< ui >}}Init script path{{< /ui >}}, enter the volume path to your init script. - - Click {{< ui >}}Add{{< /ui >}}. - -#### Set the required init script parameters - -1. In Databricks, on the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. -2. At the bottom of the page, go to the {{< ui >}}Spark{{< /ui >}} tab. - {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} - - In the {{< ui >}}Environment variables{{< /ui >}} textbox, provide the values for the init script parameters. - - ```text - DD_API_KEY= - DD_SITE= - DATABRICKS_WORKSPACE= - ``` - - Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: - -| Variable | Description | Default | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| -| DD_API_KEY | Your [Datadog API key][1]. | | -| DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | | -| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | -| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html -[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist - -3. Click {{< ui >}}Confirm{{< /ui >}}. - -{{% /tab %}} - -{{< /tabs >}} - -### Restart already-running clusters - -The init script installs the Agent when clusters start. - -Already-running all-purpose clusters or long-lived job clusters must be manually restarted for the init script to install the Datadog Agent. - -For scheduled jobs that run on job clusters, the init script installs the Datadog Agent automatically on the next run. - -## Validation - -In Datadog, view the [Data Observability: Jobs Monitoring][6] page to see a list of all your Databricks jobs. - -If some jobs are not visible, navigate to the [Configuration][9] page to understand why. This page lists all your Databricks jobs not yet configured with the Agent on their clusters, along with guidance for completing setup. - -## Troubleshooting - -If you don't see any data in Jobs Monitoring after installing the product, follow these steps. - -### Init script not running or failing - -1. **Restart the cluster**: The init script is only run on cluster startup. Ensure the cluster has been restarted since the init script was added. -1. **Confirm the init script ran**: In Databricks, click into the cluster and navigate to the {{< ui >}}Event log{{< /ui >}} tab. If `INIT_SCRIPTS_STARTED` is not present, the init script was not picked up by this cluster. Return to the [installation steps](#install-the-datadog-agent) to ensure the init script has been added to the cluster. -1. **Confirm the init script succeeded**: Find the `INIT_SCRIPTS_FINISHED` action in the event log and click into it to inspect the JSON, which indicates whether the init script exited with a failure. -1. **Investigate init script failures**: If `INIT_SCRIPTS_FINISHED` shows a failure, enable [cluster log delivery][29] to send init script logs to your preferred destination. Sending logs to a Unity Catalog volume is recommended. - {{< img src="data_jobs/databricks/compute_logging_config.png" alt="The Databricks cluster configuration page showing the Logging tab with options to configure a log delivery destination." style="width:100%;" >}} - After restarting the cluster with log delivery enabled, navigate to the log destination. The stdout and stderr logs can be found under the following path: - ``` - //init_scripts/_/ - ``` - -### Data not appearing after a successful init script run - -1. **API Key Validation:** If the init script was manually installed, use the [Validate API key endpoint][25] to ensure that the Datadog API key specified in the script is valid. -1. **Agent Validation:** The init script installs the Datadog Agent. To make sure it is properly installed, connect to the cluster with SSH and run the Agent status command: - ```shell - sudo datadog-agent status - ``` - -## Advanced Configuration - -### Filter log collection on clusters - -#### Exclude all log collection from an individual cluster -Configure the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as a [Spark environment variable][18] in the Databricks API. -```bash -DD_LOGS_CONFIG_PROCESSING_RULES=[{\"type\": \"exclude_at_match\",\"name\": \"drop_all_logs\",\"pattern\": \".*\"}] -``` - -### Permissions -Grant {{< ui >}}Workspace Admin{{< /ui >}} privileges to the user or service principal that connects to your Databricks workspace. This allows Datadog to manage init script installations and updates automatically, reducing the risk of misconfiguration. - -If you need more granular control, grant these minimal permissions to the following [workspace level objects][19] to still be able to monitor all jobs, clusters, and queries within a workspace: - -| Object | Permission | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Job | [CAN VIEW][20] -| Compute | [CAN ATTACH TO][21] -| Lakeflow Declarative Pipelines | [CAN VIEW][22] -| Query | [CAN VIEW][23] -| SQL warehouse | [CAN MONITOR][24] - -Additionally, for Datadog to access your Databricks cost data in Data Observability: Jobs Monitoring or [Cloud Cost Management][26], the user or service principal used to query [system tables][27] must have the following permissions: - - `CAN USE` permission on the SQL Warehouse. - - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - The user granting these must have `MANAGE` privilege on `CATALOG system`. - - -### Tag spans at runtime - -{{% djm-runtime-tagging %}} - -### Configure cluster tags - -Databricks custom cluster tags are automatically captured and available across Data Observability: Jobs Monitoring and the Datadog platform. The only exception is tags from Azure resource groups, which are not auto-captured. - -To add tags manually, set the `DD_TAGS` environment variable in the Spark environment variables of your cluster. This has the same effect as Databricks custom cluster tags but requires manual configuration. Use comma or space separated key:value pairs following [Datadog tag conventions][28]: - -```text -DD_TAGS=env:staging,team:data_engineering -``` - -### Aggregate cluster metrics from one-time job runs - This configuration is applicable if you want cluster resource utilization data about your jobs and create a new job and cluster for each run via the [one-time run API endpoint][8] (common when using orchestration tools outside of Databricks such as Airflow or Azure Data Factory). - - If you are submitting Databricks Jobs through the [one-time run API endpoint][8], each job run has a unique job ID. This can make it difficult to group and analyze cluster metrics for jobs that use ephemeral clusters. To aggregate cluster utilization from the same job and assess performance across multiple runs, you must set the `DD_JOB_NAME` variable inside the `spark_env_vars` of every `new_cluster` to the same value as your request payload's `run_name`. - - Here's an example of a one-time job run request body: - - {{< highlight json "hl_lines=2 18" >}} - { - "run_name": "Example Job", - "idempotency_token": "8f018174-4792-40d5-bcbc-3e6a527352c8", - "tasks": [ - { - "task_key": "Example Task", - "description": "Description of task", - "depends_on": [], - "notebook_task": { - "notebook_path": "/Path/to/example/task/notebook", - "source": "WORKSPACE" - }, - "new_cluster": { - "num_workers": 1, - "spark_version": "13.3.x-scala2.12", - "node_type_id": "i3.xlarge", - "spark_env_vars": { - "DD_JOB_NAME": "Example Job" - } - } - } - ] - } - {{< /highlight >}} - -### Set up Data Observability: Jobs Monitoring with Databricks Networking Restrictions -With [Databricks Networking Restrictions][12], Datadog may not have access to your Databricks APIs, which is required to collect traces for Databricks job executions along with tags and other metadata. - -If you are controlling Databricks API access with [IP access lists][13], allow-listing Datadog's specific {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP addresses" >}} allows Datadog to connect to the Databricks APIs in your workspace. See Databricks's documentation for configuring IP access lists for [individual workspaces][16] to give Datadog API access. - -To monitor workspaces that use [Databricks Private Link][14] connectivity, see [Private Link Connectivity (Preview)][15]. - -[15]: /data_observability/jobs_monitoring/databricks/private_link - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/integrations/databricks?search=databricks -[4]: https://docs.databricks.com/en/security/secrets/index.html -[6]: https://app.datadoghq.com/data-jobs/ -[7]: /data_jobs -[8]: https://docs.databricks.com/api/workspace/jobs/submit -[9]: https://app.datadoghq.com/data-jobs/configuration -[12]: https://docs.databricks.com/en/security/network/front-end/index.html -[13]: https://docs.databricks.com/en/security/network/front-end/ip-access-list.html -[14]: https://www.databricks.com/trust/security-features/secure-your-data-with-private-networking -[16]: https://docs.databricks.com/en/security/network/front-end/ip-access-list-workspace -[18]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars -[19]: https://docs.databricks.com/aws/en/security/auth/access-control#access-control-lists-overview -[20]: https://docs.databricks.com/aws/en/security/auth/access-control#job-acls -[21]: https://docs.databricks.com/aws/en/security/auth/access-control#compute-acls -[22]: https://docs.databricks.com/aws/en/security/auth/access-control#lakeflow-declarative-pipelines-acls -[23]: https://docs.databricks.com/aws/en/security/auth/access-control#query-acls -[24]: https://docs.databricks.com/aws/en/security/auth/access-control#sql-warehouse-acls -[25]: https://docs.datadoghq.com/api/latest/authentication/?code-lang=curl#validate-api-key -[26]: https://docs.datadoghq.com/cloud_cost_management -[27]: https://docs.databricks.com/aws/en/admin/system-tables/ -[28]: /getting_started/tagging/ -[29]: https://docs.databricks.com/aws/en/compute/configure#compute-log-delivery + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. + 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
+1. In the **Select products to set up integration** section, ensure that Data Observability: Jobs Monitoring is {{< ui >}}Enabled{{< /ui >}}. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either + - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. + - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. + +[18]: https://docs.datadoghq.com/cloud_cost_management/ +[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ +[20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ + +{{% /tab %}} + +{{% tab "Private Link Connectivity" %}} + +If your Databricks workspace is deployed using [Private Link Connectivity][25], Datadog cannot access the Databricks APIs directly. This requires using a [Private Action Runner][26] deployed in your environment. + +See [Private Link Connectivity (Preview)][15] for full setup instructions. + +[15]: /data_observability/jobs_monitoring/databricks/private_link +[25]: https://docs.databricks.com/aws/en/security/network/front-end/front-end-private-connect +[26]: https://docs.datadoghq.com/actions/private_actions/ + +{{% /tab %}} + +{{% tab "Use a Personal Access Token (Legacy)" %}} + +
This option is only available for workspace integrations created before July 7, 2025. New workspace integrations must authenticate using OAuth.
+ +1. In your Databricks workspace, click on your profile in the top right corner and go to {{< ui >}}Settings{{< /ui >}}. Select {{< ui >}}Developer{{< /ui >}} in the left side bar. Next to {{< ui >}}Access tokens{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. +1. Click {{< ui >}}Generate new token{{< /ui >}}, enter "Datadog Integration" in the {{< ui >}}Comment{{< /ui >}} field, set the {{< ui >}}Lifetime (days){{< /ui >}} value to the maximum allowed (730 days), and create a reminder to update the token before it expires. Then click {{< ui >}}Generate{{< /ui >}}. Take note of your token. + + **Important:** + * For the [Datadog managed init script install (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent), ensure the token's Principal is a Workspace Admin. + * For manual init script installation, ensure the token's Principal has [CAN VIEW access][9] for the Databricks jobs and clusters you want to monitor. + + As an alternative, follow the [official Databricks documentation][10] to generate an access token for a [service principal][11]. The service principal must have the [Workspace access entitlement][17] enabled and the Workspace Admin or [CAN VIEW access][9] permissions as described above. +1. In Datadog, open the Databricks integration tile. +1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. +1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. + {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. + 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
+1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either + - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. + - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. + +[9]: https://docs.databricks.com/en/security/auth-authz/access-control/index.html#job-acls +[10]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#manage-personal-access-tokens-for-a-service-principal +[11]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#what-is-a-service-principal +[17]: https://docs.databricks.com/aws/en/security/auth/entitlements#entitlements-overview +[18]: https://docs.datadoghq.com/cloud_cost_management +[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ +[20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ + + +{{% /tab %}} + +{{< /tabs >}} + +### Install the Datadog Agent + +The Datadog Agent must be installed on Databricks clusters to monitor Databricks jobs that run on all-purpose or job clusters. This step is not required to monitor jobs on [serverless compute][4]. + +{{< tabs >}} +{{% tab "Datadog managed global init script (Recommended)" %}} + +Datadog can install and manage a global init script in the Databricks workspace. The Datadog Agent is installed on all clusters in the workspace, when they start. + +
+
    +
  • This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy across multiple clusters or Manually install on a specific cluster.
  • +
  • This install option, in which Datadog installs and manages your Datadog global init script, requires a Databricks Access Token with Workspace Admin permissions. A token with CAN VIEW access does not allow Datadog to manage the global init script of your Databricks account.
  • +
+
+ +#### When integrating a workspace with Datadog + +1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. +1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. +1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. +1. Click {{< ui >}}Save Databricks Workspace{{< /ui >}}. + {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-new-2.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup when adding a Databricks workspace. Datadog can install and manage a global init script." style="width:100%;" >}} + +#### When adding the init script to a Databricks workspace already integrated with Datadog + +1. On the **Configure** tab, click the workspace in the list of workspaces +1. Click the {{< ui >}}Configured Products{{< /ui >}} tab +1. Make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. +1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. +1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. +1. Click **Save Databricks Workspace** at the bottom of the browser window. + {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-existing.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup for a Databricks workspace already added to the integration. Datadog can install and manage a global init script." style="width:100%;" >}} + +Optionally, you can add tags to your Databricks cluster and Spark performance metrics by configuring the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as [Spark env vars][2] with the Databricks API: + +| Variable | Description | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][1]. For example: `env:staging,team:data_engineering` | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env.| +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][3] for more details. | + + +[1]: /getting_started/tagging/ +[2]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars +[3]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[4]: https://docs.databricks.com/aws/en/compute/serverless/ + +{{% /tab %}} + +{{% tab "Manually configure a cluster policy" %}} + +This approach is recommended for clusters in **Standard** access mode. + +**Create the init script** + +1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). + + ```shell + #!/bin/bash + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. + +1. Grant read-only permissions to the init script: + 1. At the volume level, grant the `READ VOLUME` permission to all account users. + 1. At the catalog level, grant the `USE CATALOG` permission to all account users. + +
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
+ +1. **Add the init script to the allowlist**: For clusters in **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. + +**Configure the compute policy** + +1. In {{< ui >}}Compute{{< /ui >}}, navigate to the {{< ui >}}Policies{{< /ui >}} tab. If you already have a cluster policy applied to your clusters, navigate to that existing policy to edit it. This is the simpler approach as the policy automatically applies to all clusters using it. Otherwise, click {{< ui >}}Create Policy{{< /ui >}} to create a new policy. +1. To add the init script to the cluster policy, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: + 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}init_scripts{{< /ui >}}. + 1. In the {{< ui >}}Source{{< /ui >}} dropdown, select {{< ui >}}Volume{{< /ui >}}. + 1. Under {{< ui >}}Destination{{< /ui >}}, enter the volume path to your init script. + 1. Click {{< ui >}}Add{{< /ui >}}. +1. Configure the environment variables. You must add each of the following environment variables to the cluster policy you created: + + | Key | Description | + |----------------------|------------------------------| + | DD_API_KEY | Your [Datadog API key][1]. | + | DD_SITE | Your [Datadog site][2]. | + | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | + + 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: + 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. + 1. In the {{< ui >}}Key{{< /ui >}} field, enter the environment variable key. + 1. In the {{< ui >}}Value{{< /ui >}} field, enter the environment variable value. + 1. Under the {{< ui >}}Type{{< /ui >}} drop-down, select {{< ui >}}Fixed{{< /ui >}}. + 1. Check the {{< ui >}}Hidden{{< /ui >}} checkbox to reduce exposure of sensitive values. + 1. Optionally, set other init script parameters and Datadog environment variables, such as `DD_ENV` and `DD_SERVICE`. You can configure the script using the following parameters: + + | Variable | Description | Default | + |--------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------| + | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | + | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | + | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | + | DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | + | DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + +1. Click {{< ui >}}Create{{< /ui >}} if creating a new policy or {{< ui >}}Save{{< /ui >}} if updating an existing policy. If you update an existing policy, all clusters using that policy automatically apply the changes on their next restart. If you create a new policy, follow the steps below to apply it to your clusters. + +**Apply the cluster policy to clusters** + +1. In {{< ui >}}Compute{{< /ui >}}, select the cluster you want to update or click {{< ui >}}Create Compute{{< /ui >}} for a new cluster. +1. In the {{< ui >}}Policy{{< /ui >}} dropdown at the top, select the policy you created. +1. Click {{< ui >}}Confirm{{< /ui >}} to save the changes. The cluster needs to be restarted for the policy to take effect. + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html +[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist + +{{% /tab %}} + +{{% tab "Manually install a global init script" %}} + +
+This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy or Manually install on a specific cluster. +
+ +1. In Databricks, click your display name (email address) in the upper right corner of the page. +1. Select {{< ui >}}Settings{{< /ui >}} and click the {{< ui >}}Compute{{< /ui >}} tab. +1. In the {{< ui >}}All purpose clusters{{< /ui >}} section, next to {{< ui >}}Global init scripts{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. +1. Click {{< ui >}}Add{{< /ui >}}. Name your script. Then, in the {{< ui >}}Script{{< /ui >}} field, copy and paste the following script, remembering to replace the placeholders with your parameter values. + + ```shell + #!/bin/bash + + # Required parameters + export DD_API_KEY= + export DD_SITE= + export DATABRICKS_WORKSPACE="" + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above sets the required parameters, and downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. + +1. To enable the script for all new and restarted clusters, toggle {{< ui >}}Enabled{{< /ui >}}. + {{< img src="data_jobs/databricks/toggle.png" alt="Databricks UI, admin settings, global init scripts. A script called 'install-datadog-agent' is in a list with an enabled toggle." style="width:100%;" >}} +1. Click {{< ui >}}Add{{< /ui >}}. + +#### Set the required init script parameters + +Provide the values for the init script parameters at the beginning of the global init script. + +```bash +export DD_API_KEY= +export DD_SITE= +export DATABRICKS_WORKSPACE="" +``` + +Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: + +| Variable | Description | Default | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| +| DD_API_KEY | Your [Datadog API key][1]. | | +| DD_SITE | Your [Datadog site][2]. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespace. | | +| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | +| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules + +{{% /tab %}} + +{{% tab "Manually install on a specific cluster" %}} + +1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). + + ```shell + #!/bin/bash + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL (for example, `install-databricks-0.14.0.sh` to use version `0.14.0`). You can find the source code used to generate this script, and the changes between script versions, on the [Datadog Agent repository][3]. + +1. Grant read-only permissions to the init script: + 1. At the volume level, grant the `READ VOLUME` permission to all account users. + 1. At the catalog level, grant the `USE CATALOG` permission to all account users. + +
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
+ +1. **Add the init script to the allowlist** (required for **Standard** access mode clusters): If your cluster uses **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. + +1. On the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. +1. At the bottom of the page, go to the {{< ui >}}Init Scripts{{< /ui >}} tab. + + {{< img src="data_jobs/databricks/init_scripts.png" alt="Databricks UI, cluster configuration advanced options, Init Scripts tab. A 'Destination' drop-down and an 'Init script path' file selector." style="width:80%;" >}} + + - Under the {{< ui >}}Destination{{< /ui >}} drop-down, select {{< ui >}}Volume{{< /ui >}}. + - Under {{< ui >}}Init script path{{< /ui >}}, enter the volume path to your init script. + - Click {{< ui >}}Add{{< /ui >}}. + +#### Set the required init script parameters + +1. In Databricks, on the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. +2. At the bottom of the page, go to the {{< ui >}}Spark{{< /ui >}} tab. + {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} + + In the {{< ui >}}Environment variables{{< /ui >}} textbox, provide the values for the init script parameters. + + ```text + DD_API_KEY= + DD_SITE= + DATABRICKS_WORKSPACE= + ``` + + Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: + +| Variable | Description | Default | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| +| DD_API_KEY | Your [Datadog API key][1]. | | +| DD_SITE | Your [Datadog site][2]. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | | +| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | +| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html +[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist + +3. Click {{< ui >}}Confirm{{< /ui >}}. + +{{% /tab %}} + +{{< /tabs >}} + +### Restart already-running clusters + +The init script installs the Agent when clusters start. + +Already-running all-purpose clusters or long-lived job clusters must be manually restarted for the init script to install the Datadog Agent. + +For scheduled jobs that run on job clusters, the init script installs the Datadog Agent automatically on the next run. + +## Validation + +In Datadog, view the [Data Observability: Jobs Monitoring][6] page to see a list of all your Databricks jobs. + +If some jobs are not visible, navigate to the [Configuration][9] page to understand why. This page lists all your Databricks jobs not yet configured with the Agent on their clusters, along with guidance for completing setup. + +## Troubleshooting + +If you don't see any data in Jobs Monitoring after installing the product, follow these steps. + +### Init script not running or failing + +1. **Restart the cluster**: The init script is only run on cluster startup. Ensure the cluster has been restarted since the init script was added. +1. **Confirm the init script ran**: In Databricks, click into the cluster and navigate to the {{< ui >}}Event log{{< /ui >}} tab. If `INIT_SCRIPTS_STARTED` is not present, the init script was not picked up by this cluster. Return to the [installation steps](#install-the-datadog-agent) to ensure the init script has been added to the cluster. +1. **Confirm the init script succeeded**: Find the `INIT_SCRIPTS_FINISHED` action in the event log and click into it to inspect the JSON, which indicates whether the init script exited with a failure. +1. **Investigate init script failures**: If `INIT_SCRIPTS_FINISHED` shows a failure, enable [cluster log delivery][29] to send init script logs to your preferred destination. Sending logs to a Unity Catalog volume is recommended. + {{< img src="data_jobs/databricks/compute_logging_config.png" alt="The Databricks cluster configuration page showing the Logging tab with options to configure a log delivery destination." style="width:100%;" >}} + After restarting the cluster with log delivery enabled, navigate to the log destination. The stdout and stderr logs can be found under the following path: + ``` + //init_scripts/_/ + ``` + +### Data not appearing after a successful init script run + +1. **API Key Validation:** If the init script was manually installed, use the [Validate API key endpoint][25] to ensure that the Datadog API key specified in the script is valid. +1. **Agent Validation:** The init script installs the Datadog Agent. To make sure it is properly installed, connect to the cluster with SSH and run the Agent status command: + ```shell + sudo datadog-agent status + ``` + +## Advanced Configuration + +### Filter log collection on clusters + +#### Exclude all log collection from an individual cluster +Configure the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as a [Spark environment variable][18] in the Databricks API. +```bash +DD_LOGS_CONFIG_PROCESSING_RULES=[{\"type\": \"exclude_at_match\",\"name\": \"drop_all_logs\",\"pattern\": \".*\"}] +``` + +### Permissions +Grant {{< ui >}}Workspace Admin{{< /ui >}} privileges to the user or service principal that connects to your Databricks workspace. This allows Datadog to manage init script installations and updates automatically, reducing the risk of misconfiguration. + +If you need more granular control, grant these minimal permissions to the following [workspace level objects][19] to still be able to monitor all jobs, clusters, and queries within a workspace: + +| Object | Permission | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Job | [CAN VIEW][20] +| Compute | [CAN ATTACH TO][21] +| Lakeflow Declarative Pipelines | [CAN VIEW][22] +| Query | [CAN VIEW][23] +| SQL warehouse | [CAN MONITOR][24] + +Additionally, for Datadog to access your Databricks cost data in Data Observability: Jobs Monitoring or [Cloud Cost Management][26], the user or service principal used to query [system tables][27] must have the following permissions: + - `CAN USE` permission on the SQL Warehouse. + - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + The user granting these must have `MANAGE` privilege on `CATALOG system`. + + +### Tag spans at runtime + +{{% djm-runtime-tagging %}} + +### Configure cluster tags + +Databricks custom cluster tags are automatically captured and available across Data Observability: Jobs Monitoring and the Datadog platform. The only exception is tags from Azure resource groups, which are not auto-captured. + +To add tags manually, set the `DD_TAGS` environment variable in the Spark environment variables of your cluster. This has the same effect as Databricks custom cluster tags but requires manual configuration. Use comma or space separated key:value pairs following [Datadog tag conventions][28]: + +```text +DD_TAGS=env:staging,team:data_engineering +``` + +### Aggregate cluster metrics from one-time job runs + This configuration is applicable if you want cluster resource utilization data about your jobs and create a new job and cluster for each run via the [one-time run API endpoint][8] (common when using orchestration tools outside of Databricks such as Airflow or Azure Data Factory). + + If you are submitting Databricks Jobs through the [one-time run API endpoint][8], each job run has a unique job ID. This can make it difficult to group and analyze cluster metrics for jobs that use ephemeral clusters. To aggregate cluster utilization from the same job and assess performance across multiple runs, you must set the `DD_JOB_NAME` variable inside the `spark_env_vars` of every `new_cluster` to the same value as your request payload's `run_name`. + + Here's an example of a one-time job run request body: + + {{< highlight json "hl_lines=2 18" >}} + { + "run_name": "Example Job", + "idempotency_token": "8f018174-4792-40d5-bcbc-3e6a527352c8", + "tasks": [ + { + "task_key": "Example Task", + "description": "Description of task", + "depends_on": [], + "notebook_task": { + "notebook_path": "/Path/to/example/task/notebook", + "source": "WORKSPACE" + }, + "new_cluster": { + "num_workers": 1, + "spark_version": "13.3.x-scala2.12", + "node_type_id": "i3.xlarge", + "spark_env_vars": { + "DD_JOB_NAME": "Example Job" + } + } + } + ] + } + {{< /highlight >}} + +### Set up Data Observability: Jobs Monitoring with Databricks Networking Restrictions +With [Databricks Networking Restrictions][12], Datadog may not have access to your Databricks APIs, which is required to collect traces for Databricks job executions along with tags and other metadata. + +If you are controlling Databricks API access with [IP access lists][13], allow-listing Datadog's specific {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP addresses" >}} allows Datadog to connect to the Databricks APIs in your workspace. See Databricks's documentation for configuring IP access lists for [individual workspaces][16] to give Datadog API access. + +To monitor workspaces that use [Databricks Private Link][14] connectivity, see [Private Link Connectivity (Preview)][15]. + +[15]: /data_observability/jobs_monitoring/databricks/private_link + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: https://app.datadoghq.com/integrations/databricks?search=databricks +[4]: https://docs.databricks.com/en/security/secrets/index.html +[6]: https://app.datadoghq.com/data-jobs/ +[7]: /data_jobs +[8]: https://docs.databricks.com/api/workspace/jobs/submit +[9]: https://app.datadoghq.com/data-jobs/configuration +[12]: https://docs.databricks.com/en/security/network/front-end/index.html +[13]: https://docs.databricks.com/en/security/network/front-end/ip-access-list.html +[14]: https://www.databricks.com/trust/security-features/secure-your-data-with-private-networking +[16]: https://docs.databricks.com/en/security/network/front-end/ip-access-list-workspace +[18]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars +[19]: https://docs.databricks.com/aws/en/security/auth/access-control#access-control-lists-overview +[20]: https://docs.databricks.com/aws/en/security/auth/access-control#job-acls +[21]: https://docs.databricks.com/aws/en/security/auth/access-control#compute-acls +[22]: https://docs.databricks.com/aws/en/security/auth/access-control#lakeflow-declarative-pipelines-acls +[23]: https://docs.databricks.com/aws/en/security/auth/access-control#query-acls +[24]: https://docs.databricks.com/aws/en/security/auth/access-control#sql-warehouse-acls +[25]: https://docs.datadoghq.com/api/latest/authentication/?code-lang=curl#validate-api-key +[26]: https://docs.datadoghq.com/cloud_cost_management +[27]: https://docs.databricks.com/aws/en/admin/system-tables/ +[28]: /getting_started/tagging/ +[29]: https://docs.databricks.com/aws/en/compute/configure#compute-log-delivery From 176a1b5b2f969bc00e765a4870ff11cfa6338bef Mon Sep 17 00:00:00 2001 From: Bryce Eadie Date: Tue, 14 Jul 2026 16:35:26 -0700 Subject: [PATCH 9/9] Normalize line endings to LF --- .../jobs_monitoring/databricks/_index.md | 1134 ++++++++--------- 1 file changed, 567 insertions(+), 567 deletions(-) diff --git a/content/en/data_observability/jobs_monitoring/databricks/_index.md b/content/en/data_observability/jobs_monitoring/databricks/_index.md index 41ac60e40e9..d17fcd9aa4b 100644 --- a/content/en/data_observability/jobs_monitoring/databricks/_index.md +++ b/content/en/data_observability/jobs_monitoring/databricks/_index.md @@ -1,567 +1,567 @@ ---- -title: "Enable Data Observability: Jobs Monitoring for Databricks" -description: "Enable Data Observability: Jobs Monitoring for Databricks workspaces with OAuth or Personal Access Token authentication and Datadog Agent installation." -aliases: - - /data_jobs/databricks -further_reading: - - link: '/data_jobs' - tag: 'Documentation' - text: 'Data Observability: Jobs Monitoring' - - link: "https://www.datadoghq.com/blog/databricks-serverless-jobs-datadog/" - tag: "Blog" - text: "Detect issues and optimize spend with Databricks serverless job monitoring" ---- - -[Data Observability: Jobs Monitoring][7] gives visibility into the performance and reliability of your Databricks jobs and workflows running on clusters or serverless compute. - -## Setup - -
If your Databricks workspace has Networking Restrictions enabled, add Datadog's {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP ranges" >}} to your allow-list. If your workspace uses Private Link, see the Private Link Connectivity tab below.
- -Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. - -1. [Configure the Datadog-Databricks integration](#configure-the-datadog-databricks-integration) for a Databricks workspace. -1. [Install the Datadog Agent](#install-the-datadog-agent) on your Databricks cluster(s) in the workspace. - - -### Configure the Datadog-Databricks integration - -{{< tabs >}} - -{{% tab "Use a Service Principal for OAuth" %}} - -
New workspace integrations must authenticate using OAuth. Workspaces already integrated with a Personal Access Token continue to function and can switch to OAuth at any time. After a workspace starts using OAuth, it cannot revert to a Personal Access Token.
- -#### Create and configure the service principal in Databricks - -1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. -1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. -1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. - -
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
-1. Enter a name and enable the following workspace entitlements for the service principal: - - {{< ui >}}Workspace access{{< /ui >}} - - {{< ui >}}Databricks SQL access{{< /ui >}} - - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. - -
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
-1. Click **Add**. - -1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. - 1. Set {{< ui >}}Lifetime (days){{< /ui >}} to the maximum value allowed (730). - - 1. Click {{< ui >}}Generate{{< /ui >}}. - - 1. Take note of your client ID and client secret. - - {{< img src="data_jobs/databricks/client-id-secret.png" alt="In Databricks, a modal showing the client ID and secret associated with a new OAuth secret is displayed." style="width:70%;" >}} - -1. On the {{< ui >}}Permissions{{< /ui >}} tab, click {{< ui >}}Grant access{{< /ui >}}. Search for the new service principal, grant it the {{< ui >}}Manage{{< /ui >}} permission, and click {{< ui >}}Save{{< /ui >}}. - -#### Add the Databricks workspace to Datadog - -1. In Datadog, open the Databricks integration tile. -1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. -1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. - {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. - 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. - 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. - 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. - 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): - - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - -
The user running these commands must have the MANAGE privilege on CATALOG system.
-1. In the **Select products to set up integration** section, ensure that Data Observability: Jobs Monitoring is {{< ui >}}Enabled{{< /ui >}}. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. - - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. - -[18]: https://docs.datadoghq.com/cloud_cost_management/ -[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ -[20]: https://docs.databricks.com/aws/en/admin/system-tables/ -[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ - -{{% /tab %}} - -{{% tab "Private Link Connectivity" %}} - -If your Databricks workspace is deployed using [Private Link Connectivity][25], Datadog cannot access the Databricks APIs directly. This requires using a [Private Action Runner][26] deployed in your environment. - -See [Private Link Connectivity (Preview)][15] for full setup instructions. - -[15]: /data_observability/jobs_monitoring/databricks/private_link -[25]: https://docs.databricks.com/aws/en/security/network/front-end/front-end-private-connect -[26]: https://docs.datadoghq.com/actions/private_actions/ - -{{% /tab %}} - -{{% tab "Use a Personal Access Token (Legacy)" %}} - -
This option is only available for workspace integrations created before July 7, 2025. New workspace integrations must authenticate using OAuth.
- -1. In your Databricks workspace, click on your profile in the top right corner and go to {{< ui >}}Settings{{< /ui >}}. Select {{< ui >}}Developer{{< /ui >}} in the left side bar. Next to {{< ui >}}Access tokens{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. -1. Click {{< ui >}}Generate new token{{< /ui >}}, enter "Datadog Integration" in the {{< ui >}}Comment{{< /ui >}} field, set the {{< ui >}}Lifetime (days){{< /ui >}} value to the maximum allowed (730 days), and create a reminder to update the token before it expires. Then click {{< ui >}}Generate{{< /ui >}}. Take note of your token. - - **Important:** - * For the [Datadog managed init script install (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent), ensure the token's Principal is a Workspace Admin. - * For manual init script installation, ensure the token's Principal has [CAN VIEW access][9] for the Databricks jobs and clusters you want to monitor. - - As an alternative, follow the [official Databricks documentation][10] to generate an access token for a [service principal][11]. The service principal must have the [Workspace access entitlement][17] enabled and the Workspace Admin or [CAN VIEW access][9] permissions as described above. -1. In Datadog, open the Databricks integration tile. -1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. -1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. - {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} -1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. - 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. - 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. - 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. - 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): - - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - -
The user running these commands must have the MANAGE privilege on CATALOG system.
-1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either - - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. - - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. - -[9]: https://docs.databricks.com/en/security/auth-authz/access-control/index.html#job-acls -[10]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#manage-personal-access-tokens-for-a-service-principal -[11]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#what-is-a-service-principal -[17]: https://docs.databricks.com/aws/en/security/auth/entitlements#entitlements-overview -[18]: https://docs.datadoghq.com/cloud_cost_management -[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ -[20]: https://docs.databricks.com/aws/en/admin/system-tables/ -[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ - - -{{% /tab %}} - -{{< /tabs >}} - -### Install the Datadog Agent - -The Datadog Agent must be installed on Databricks clusters to monitor Databricks jobs that run on all-purpose or job clusters. This step is not required to monitor jobs on [serverless compute][4]. - -{{< tabs >}} -{{% tab "Datadog managed global init script (Recommended)" %}} - -Datadog can install and manage a global init script in the Databricks workspace. The Datadog Agent is installed on all clusters in the workspace, when they start. - -
-
    -
  • This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy across multiple clusters or Manually install on a specific cluster.
  • -
  • This install option, in which Datadog installs and manages your Datadog global init script, requires a Databricks Access Token with Workspace Admin permissions. A token with CAN VIEW access does not allow Datadog to manage the global init script of your Databricks account.
  • -
-
- -#### When integrating a workspace with Datadog - -1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. -1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. -1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. -1. Click {{< ui >}}Save Databricks Workspace{{< /ui >}}. - {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-new-2.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup when adding a Databricks workspace. Datadog can install and manage a global init script." style="width:100%;" >}} - -#### When adding the init script to a Databricks workspace already integrated with Datadog - -1. On the **Configure** tab, click the workspace in the list of workspaces -1. Click the {{< ui >}}Configured Products{{< /ui >}} tab -1. Make sure the Data Observability: Jobs Monitoring product is **Enabled**. -1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. -1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. -1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. -1. Click **Save Databricks Workspace** at the bottom of the browser window. - {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-existing.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup for a Databricks workspace already added to the integration. Datadog can install and manage a global init script." style="width:100%;" >}} - -Optionally, you can add tags to your Databricks cluster and Spark performance metrics by configuring the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as [Spark env vars][2] with the Databricks API: - -| Variable | Description | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][1]. For example: `env:staging,team:data_engineering` | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env.| -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][3] for more details. | - - -[1]: /getting_started/tagging/ -[2]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars -[3]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[4]: https://docs.databricks.com/aws/en/compute/serverless/ - -{{% /tab %}} - -{{% tab "Manually configure a cluster policy" %}} - -This approach is recommended for clusters in **Standard** access mode. - -**Create the init script** - -1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). - - ```shell - #!/bin/bash - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. - -1. Grant read-only permissions to the init script: - 1. At the volume level, grant the `READ VOLUME` permission to all account users. - 1. At the catalog level, grant the `USE CATALOG` permission to all account users. - -
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
- -1. **Add the init script to the allowlist**: For clusters in **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. - -**Configure the compute policy** - -1. In {{< ui >}}Compute{{< /ui >}}, navigate to the {{< ui >}}Policies{{< /ui >}} tab. If you already have a cluster policy applied to your clusters, navigate to that existing policy to edit it. This is the simpler approach as the policy automatically applies to all clusters using it. Otherwise, click {{< ui >}}Create Policy{{< /ui >}} to create a new policy. -1. To add the init script to the cluster policy, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: - 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}init_scripts{{< /ui >}}. - 1. In the {{< ui >}}Source{{< /ui >}} dropdown, select {{< ui >}}Volume{{< /ui >}}. - 1. Under {{< ui >}}Destination{{< /ui >}}, enter the volume path to your init script. - 1. Click {{< ui >}}Add{{< /ui >}}. -1. Configure the environment variables. You must add each of the following environment variables to the cluster policy you created: - - | Key | Description | - |----------------------|------------------------------| - | DD_API_KEY | Your [Datadog API key][1]. | - | DD_SITE | Your [Datadog site][2]. | - | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | - - 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: - 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. - 1. In the {{< ui >}}Key{{< /ui >}} field, enter the environment variable key. - 1. In the {{< ui >}}Value{{< /ui >}} field, enter the environment variable value. - 1. Under the {{< ui >}}Type{{< /ui >}} drop-down, select {{< ui >}}Fixed{{< /ui >}}. - 1. Check the {{< ui >}}Hidden{{< /ui >}} checkbox to reduce exposure of sensitive values. - 1. Optionally, set other init script parameters and Datadog environment variables, such as `DD_ENV` and `DD_SERVICE`. You can configure the script using the following parameters: - - | Variable | Description | Default | - |--------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------| - | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | - | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | - | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | - | DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | - | DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - -1. Click {{< ui >}}Create{{< /ui >}} if creating a new policy or {{< ui >}}Save{{< /ui >}} if updating an existing policy. If you update an existing policy, all clusters using that policy automatically apply the changes on their next restart. If you create a new policy, follow the steps below to apply it to your clusters. - -**Apply the cluster policy to clusters** - -1. In {{< ui >}}Compute{{< /ui >}}, select the cluster you want to update or click {{< ui >}}Create Compute{{< /ui >}} for a new cluster. -1. In the {{< ui >}}Policy{{< /ui >}} dropdown at the top, select the policy you created. -1. Click {{< ui >}}Confirm{{< /ui >}} to save the changes. The cluster needs to be restarted for the policy to take effect. - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html -[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist - -{{% /tab %}} - -{{% tab "Manually install a global init script" %}} - -
-This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy or Manually install on a specific cluster. -
- -1. In Databricks, click your display name (email address) in the upper right corner of the page. -1. Select {{< ui >}}Settings{{< /ui >}} and click the {{< ui >}}Compute{{< /ui >}} tab. -1. In the {{< ui >}}All purpose clusters{{< /ui >}} section, next to {{< ui >}}Global init scripts{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. -1. Click {{< ui >}}Add{{< /ui >}}. Name your script. Then, in the {{< ui >}}Script{{< /ui >}} field, copy and paste the following script, remembering to replace the placeholders with your parameter values. - - ```shell - #!/bin/bash - - # Required parameters - export DD_API_KEY= - export DD_SITE= - export DATABRICKS_WORKSPACE="" - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above sets the required parameters, and downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. - -1. To enable the script for all new and restarted clusters, toggle {{< ui >}}Enabled{{< /ui >}}. - {{< img src="data_jobs/databricks/toggle.png" alt="Databricks UI, admin settings, global init scripts. A script called 'install-datadog-agent' is in a list with an enabled toggle." style="width:100%;" >}} -1. Click {{< ui >}}Add{{< /ui >}}. - -#### Set the required init script parameters - -Provide the values for the init script parameters at the beginning of the global init script. - -```bash -export DD_API_KEY= -export DD_SITE= -export DATABRICKS_WORKSPACE="" -``` - -Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: - -| Variable | Description | Default | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| -| DD_API_KEY | Your [Datadog API key][1]. | | -| DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespace. | | -| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | -| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules - -{{% /tab %}} - -{{% tab "Manually install on a specific cluster" %}} - -1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). - - ```shell - #!/bin/bash - - # Download and run the latest init script - curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script - bash djm-install-script || true - ``` - - The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL (for example, `install-databricks-0.14.0.sh` to use version `0.14.0`). You can find the source code used to generate this script, and the changes between script versions, on the [Datadog Agent repository][3]. - -1. Grant read-only permissions to the init script: - 1. At the volume level, grant the `READ VOLUME` permission to all account users. - 1. At the catalog level, grant the `USE CATALOG` permission to all account users. - -
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
- -1. **Add the init script to the allowlist** (required for **Standard** access mode clusters): If your cluster uses **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. - -1. On the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. -1. At the bottom of the page, go to the {{< ui >}}Init Scripts{{< /ui >}} tab. - - {{< img src="data_jobs/databricks/init_scripts.png" alt="Databricks UI, cluster configuration advanced options, Init Scripts tab. A 'Destination' drop-down and an 'Init script path' file selector." style="width:80%;" >}} - - - Under the {{< ui >}}Destination{{< /ui >}} drop-down, select {{< ui >}}Volume{{< /ui >}}. - - Under {{< ui >}}Init script path{{< /ui >}}, enter the volume path to your init script. - - Click {{< ui >}}Add{{< /ui >}}. - -#### Set the required init script parameters - -1. In Databricks, on the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. -2. At the bottom of the page, go to the {{< ui >}}Spark{{< /ui >}} tab. - {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} - - In the {{< ui >}}Environment variables{{< /ui >}} textbox, provide the values for the init script parameters. - - ```text - DD_API_KEY= - DD_SITE= - DATABRICKS_WORKSPACE= - ``` - - Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: - -| Variable | Description | Default | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| -| DD_API_KEY | Your [Datadog API key][1]. | | -| DD_SITE | Your [Datadog site][2]. | | -| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | | -| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | -| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | -| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | -| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | -| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | - - -[1]: https://app.datadoghq.com/organization-settings/api-keys -[2]: /getting_started/site/ -[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go -[4]: /getting_started/tagging/ -[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules -[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html -[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist - -3. Click {{< ui >}}Confirm{{< /ui >}}. - -{{% /tab %}} - -{{< /tabs >}} - -### Restart already-running clusters - -The init script installs the Agent when clusters start. - -Already-running all-purpose clusters or long-lived job clusters must be manually restarted for the init script to install the Datadog Agent. - -For scheduled jobs that run on job clusters, the init script installs the Datadog Agent automatically on the next run. - -## Validation - -In Datadog, view the [Data Observability: Jobs Monitoring][6] page to see a list of all your Databricks jobs. - -If some jobs are not visible, navigate to the [Configuration][9] page to understand why. This page lists all your Databricks jobs not yet configured with the Agent on their clusters, along with guidance for completing setup. - -## Troubleshooting - -If you don't see any data in Jobs Monitoring after installing the product, follow these steps. - -### Init script not running or failing - -1. **Restart the cluster**: The init script is only run on cluster startup. Ensure the cluster has been restarted since the init script was added. -1. **Confirm the init script ran**: In Databricks, click into the cluster and navigate to the {{< ui >}}Event log{{< /ui >}} tab. If `INIT_SCRIPTS_STARTED` is not present, the init script was not picked up by this cluster. Return to the [installation steps](#install-the-datadog-agent) to ensure the init script has been added to the cluster. -1. **Confirm the init script succeeded**: Find the `INIT_SCRIPTS_FINISHED` action in the event log and click into it to inspect the JSON, which indicates whether the init script exited with a failure. -1. **Investigate init script failures**: If `INIT_SCRIPTS_FINISHED` shows a failure, enable [cluster log delivery][29] to send init script logs to your preferred destination. Sending logs to a Unity Catalog volume is recommended. - {{< img src="data_jobs/databricks/compute_logging_config.png" alt="The Databricks cluster configuration page showing the Logging tab with options to configure a log delivery destination." style="width:100%;" >}} - After restarting the cluster with log delivery enabled, navigate to the log destination. The stdout and stderr logs can be found under the following path: - ``` - //init_scripts/_/ - ``` - -### Data not appearing after a successful init script run - -1. **API Key Validation:** If the init script was manually installed, use the [Validate API key endpoint][25] to ensure that the Datadog API key specified in the script is valid. -1. **Agent Validation:** The init script installs the Datadog Agent. To make sure it is properly installed, connect to the cluster with SSH and run the Agent status command: - ```shell - sudo datadog-agent status - ``` - -## Advanced Configuration - -### Filter log collection on clusters - -#### Exclude all log collection from an individual cluster -Configure the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as a [Spark environment variable][18] in the Databricks API. -```bash -DD_LOGS_CONFIG_PROCESSING_RULES=[{\"type\": \"exclude_at_match\",\"name\": \"drop_all_logs\",\"pattern\": \".*\"}] -``` - -### Permissions -Grant {{< ui >}}Workspace Admin{{< /ui >}} privileges to the user or service principal that connects to your Databricks workspace. This allows Datadog to manage init script installations and updates automatically, reducing the risk of misconfiguration. - -If you need more granular control, grant these minimal permissions to the following [workspace level objects][19] to still be able to monitor all jobs, clusters, and queries within a workspace: - -| Object | Permission | -|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Job | [CAN VIEW][20] -| Compute | [CAN ATTACH TO][21] -| Lakeflow Declarative Pipelines | [CAN VIEW][22] -| Query | [CAN VIEW][23] -| SQL warehouse | [CAN MONITOR][24] - -Additionally, for Datadog to access your Databricks cost data in Data Observability: Jobs Monitoring or [Cloud Cost Management][26], the user or service principal used to query [system tables][27] must have the following permissions: - - `CAN USE` permission on the SQL Warehouse. - - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): - ```sql - GRANT USE CATALOG ON CATALOG system TO ``; - GRANT USE SCHEMA ON CATALOG system TO ``; - GRANT SELECT ON CATALOG system TO ``; - ``` - The user granting these must have `MANAGE` privilege on `CATALOG system`. - - -### Tag spans at runtime - -{{% djm-runtime-tagging %}} - -### Configure cluster tags - -Databricks custom cluster tags are automatically captured and available across Data Observability: Jobs Monitoring and the Datadog platform. The only exception is tags from Azure resource groups, which are not auto-captured. - -To add tags manually, set the `DD_TAGS` environment variable in the Spark environment variables of your cluster. This has the same effect as Databricks custom cluster tags but requires manual configuration. Use comma or space separated key:value pairs following [Datadog tag conventions][28]: - -```text -DD_TAGS=env:staging,team:data_engineering -``` - -### Aggregate cluster metrics from one-time job runs - This configuration is applicable if you want cluster resource utilization data about your jobs and create a new job and cluster for each run via the [one-time run API endpoint][8] (common when using orchestration tools outside of Databricks such as Airflow or Azure Data Factory). - - If you are submitting Databricks Jobs through the [one-time run API endpoint][8], each job run has a unique job ID. This can make it difficult to group and analyze cluster metrics for jobs that use ephemeral clusters. To aggregate cluster utilization from the same job and assess performance across multiple runs, you must set the `DD_JOB_NAME` variable inside the `spark_env_vars` of every `new_cluster` to the same value as your request payload's `run_name`. - - Here's an example of a one-time job run request body: - - {{< highlight json "hl_lines=2 18" >}} - { - "run_name": "Example Job", - "idempotency_token": "8f018174-4792-40d5-bcbc-3e6a527352c8", - "tasks": [ - { - "task_key": "Example Task", - "description": "Description of task", - "depends_on": [], - "notebook_task": { - "notebook_path": "/Path/to/example/task/notebook", - "source": "WORKSPACE" - }, - "new_cluster": { - "num_workers": 1, - "spark_version": "13.3.x-scala2.12", - "node_type_id": "i3.xlarge", - "spark_env_vars": { - "DD_JOB_NAME": "Example Job" - } - } - } - ] - } - {{< /highlight >}} - -### Set up Data Observability: Jobs Monitoring with Databricks Networking Restrictions -With [Databricks Networking Restrictions][12], Datadog may not have access to your Databricks APIs, which is required to collect traces for Databricks job executions along with tags and other metadata. - -If you are controlling Databricks API access with [IP access lists][13], allow-listing Datadog's specific {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP addresses" >}} allows Datadog to connect to the Databricks APIs in your workspace. See Databricks's documentation for configuring IP access lists for [individual workspaces][16] to give Datadog API access. - -To monitor workspaces that use [Databricks Private Link][14] connectivity, see [Private Link Connectivity (Preview)][15]. - -[15]: /data_observability/jobs_monitoring/databricks/private_link - -## Further Reading - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/integrations/databricks?search=databricks -[4]: https://docs.databricks.com/en/security/secrets/index.html -[6]: https://app.datadoghq.com/data-jobs/ -[7]: /data_jobs -[8]: https://docs.databricks.com/api/workspace/jobs/submit -[9]: https://app.datadoghq.com/data-jobs/configuration -[12]: https://docs.databricks.com/en/security/network/front-end/index.html -[13]: https://docs.databricks.com/en/security/network/front-end/ip-access-list.html -[14]: https://www.databricks.com/trust/security-features/secure-your-data-with-private-networking -[16]: https://docs.databricks.com/en/security/network/front-end/ip-access-list-workspace -[18]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars -[19]: https://docs.databricks.com/aws/en/security/auth/access-control#access-control-lists-overview -[20]: https://docs.databricks.com/aws/en/security/auth/access-control#job-acls -[21]: https://docs.databricks.com/aws/en/security/auth/access-control#compute-acls -[22]: https://docs.databricks.com/aws/en/security/auth/access-control#lakeflow-declarative-pipelines-acls -[23]: https://docs.databricks.com/aws/en/security/auth/access-control#query-acls -[24]: https://docs.databricks.com/aws/en/security/auth/access-control#sql-warehouse-acls -[25]: https://docs.datadoghq.com/api/latest/authentication/?code-lang=curl#validate-api-key -[26]: https://docs.datadoghq.com/cloud_cost_management -[27]: https://docs.databricks.com/aws/en/admin/system-tables/ -[28]: /getting_started/tagging/ -[29]: https://docs.databricks.com/aws/en/compute/configure#compute-log-delivery +--- +title: "Enable Data Observability: Jobs Monitoring for Databricks" +description: "Enable Data Observability: Jobs Monitoring for Databricks workspaces with OAuth or Personal Access Token authentication and Datadog Agent installation." +aliases: + - /data_jobs/databricks +further_reading: + - link: '/data_jobs' + tag: 'Documentation' + text: 'Data Observability: Jobs Monitoring' + - link: "https://www.datadoghq.com/blog/databricks-serverless-jobs-datadog/" + tag: "Blog" + text: "Detect issues and optimize spend with Databricks serverless job monitoring" +--- + +[Data Observability: Jobs Monitoring][7] gives visibility into the performance and reliability of your Databricks jobs and workflows running on clusters or serverless compute. + +## Setup + +
If your Databricks workspace has Networking Restrictions enabled, add Datadog's {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP ranges" >}} to your allow-list. If your workspace uses Private Link, see the Private Link Connectivity tab below.
+ +Follow these steps to enable Data Observability: Jobs Monitoring for Databricks. + +1. [Configure the Datadog-Databricks integration](#configure-the-datadog-databricks-integration) for a Databricks workspace. +1. [Install the Datadog Agent](#install-the-datadog-agent) on your Databricks cluster(s) in the workspace. + + +### Configure the Datadog-Databricks integration + +{{< tabs >}} + +{{% tab "Use a Service Principal for OAuth" %}} + +
New workspace integrations must authenticate using OAuth. Workspaces already integrated with a Personal Access Token continue to function and can switch to OAuth at any time. After a workspace starts using OAuth, it cannot revert to a Personal Access Token.
+ +#### Create and configure the service principal in Databricks + +1. As a **Databricks workspace admin**, go to {{< ui >}}Settings{{< /ui >}} by clicking your profile in the upper-right corner of the workspace. +1. On the {{< ui >}}Identity and access{{< /ui >}} tab, click {{< ui >}}Manage{{< /ui >}} next to {{< ui >}}Service principals{{< /ui >}}. +1. Click {{< ui >}}Add service principal{{< /ui >}}, then click {{< ui >}}Add new{{< /ui >}}. + +
For Azure Databricks, select the "Databricks managed" management type. Datadog does NOT support "Microsoft Entra ID managed" service principals.
+1. Enter a name and enable the following workspace entitlements for the service principal: + - {{< ui >}}Workspace access{{< /ui >}} + - {{< ui >}}Databricks SQL access{{< /ui >}} + - {{< ui >}}Admin access{{< /ui >}}: Grants the workspace administrator access that Datadog requires. This is equivalent to adding the service principal to the `admins` group. + +
If you cannot grant the Admin access entitlement, provision granular access instead, as described in the Permissions section under Advanced Configuration.
+1. Click **Add**. + +1. Click on the name of your new service principal. Under the {{< ui >}}Secrets{{< /ui >}} tab, click {{< ui >}}Generate secret{{< /ui >}}. + 1. Set {{< ui >}}Lifetime (days){{< /ui >}} to the maximum value allowed (730). + + 1. Click {{< ui >}}Generate{{< /ui >}}. + + 1. Take note of your client ID and client secret. + + {{< img src="data_jobs/databricks/client-id-secret.png" alt="In Databricks, a modal showing the client ID and secret associated with a new OAuth secret is displayed." style="width:70%;" >}} + +1. On the {{< ui >}}Permissions{{< /ui >}} tab, click {{< ui >}}Grant access{{< /ui >}}. Search for the new service principal, grant it the {{< ui >}}Manage{{< /ui >}} permission, and click {{< ui >}}Save{{< /ui >}}. + +#### Add the Databricks workspace to Datadog + +1. In Datadog, open the Databricks integration tile. +1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. +1. Enter a workspace name, your Databricks workspace URL, and the client ID and secret you generated. + {{< img src="data_jobs/databricks/connect-workspace-form-m2m.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, client ID, and client secret." style="width:100%;" >}} +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the service principal `CAN USE`. + 1. Grant the service principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the service principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
+1. In the **Select products to set up integration** section, ensure that Data Observability: Jobs Monitoring is {{< ui >}}Enabled{{< /ui >}}. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either + - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. + - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. + +[18]: https://docs.datadoghq.com/cloud_cost_management/ +[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ +[20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ + +{{% /tab %}} + +{{% tab "Private Link Connectivity" %}} + +If your Databricks workspace is deployed using [Private Link Connectivity][25], Datadog cannot access the Databricks APIs directly. This requires using a [Private Action Runner][26] deployed in your environment. + +See [Private Link Connectivity (Preview)][15] for full setup instructions. + +[15]: /data_observability/jobs_monitoring/databricks/private_link +[25]: https://docs.databricks.com/aws/en/security/network/front-end/front-end-private-connect +[26]: https://docs.datadoghq.com/actions/private_actions/ + +{{% /tab %}} + +{{% tab "Use a Personal Access Token (Legacy)" %}} + +
This option is only available for workspace integrations created before July 7, 2025. New workspace integrations must authenticate using OAuth.
+ +1. In your Databricks workspace, click on your profile in the top right corner and go to {{< ui >}}Settings{{< /ui >}}. Select {{< ui >}}Developer{{< /ui >}} in the left side bar. Next to {{< ui >}}Access tokens{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. +1. Click {{< ui >}}Generate new token{{< /ui >}}, enter "Datadog Integration" in the {{< ui >}}Comment{{< /ui >}} field, set the {{< ui >}}Lifetime (days){{< /ui >}} value to the maximum allowed (730 days), and create a reminder to update the token before it expires. Then click {{< ui >}}Generate{{< /ui >}}. Take note of your token. + + **Important:** + * For the [Datadog managed init script install (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent), ensure the token's Principal is a Workspace Admin. + * For manual init script installation, ensure the token's Principal has [CAN VIEW access][9] for the Databricks jobs and clusters you want to monitor. + + As an alternative, follow the [official Databricks documentation][10] to generate an access token for a [service principal][11]. The service principal must have the [Workspace access entitlement][17] enabled and the Workspace Admin or [CAN VIEW access][9] permissions as described above. +1. In Datadog, open the Databricks integration tile. +1. On the {{< ui >}}Configure{{< /ui >}} tab, click {{< ui >}}Add Databricks Workspace{{< /ui >}}. +1. Enter a workspace name, your Databricks workspace URL, and the Databricks token you generated. + {{< img src="data_jobs/databricks/configure-workspace-form.png" alt="In the Datadog-Databricks integration tile, a Databricks workspace is displayed. This workspace has a name, URL, and API token." style="width:100%;" >}} +1. Provide the ID of a [Databricks SQL Warehouse][19] for Datadog to query. This gives you visibility into your Databricks costs in Jobs Monitoring or [Cloud Cost Management][18] and powers [Quality Monitoring][21]. + 1. In Databricks, go to {{< ui >}}SQL Warehouses{{< /ui >}} and select the warehouse for Datadog to use. It must be Pro or Serverless. Classic Warehouses are not supported. To reduce costs, use a dedicated 2XS warehouse, with Auto Stop configured for 5-10 minutes. + 1. Copy the ID from the warehouse's overview page (it is also the last segment of the warehouse's URL) and enter it in the integration tile. + 1. On the warehouse's {{< ui >}}Permissions{{< /ui >}} tab (top right), grant the token's principal `CAN USE`. + 1. Grant the token's principal read access to the Unity Catalog [system tables][20]. In the {{< ui >}}SQL Editor{{< /ui >}}, run the following commands using the principal's client ID (not its display name): + + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + +
The user running these commands must have the MANAGE privilege on CATALOG system.
+1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, choose either + - [Managed by Datadog (recommended)](?tab=datadogmanagedglobalinitscriptrecommended#install-the-datadog-agent): Datadog installs and manages the Agent with a global init script in the workspace. + - [Manually](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent): Follow the [instructions below](?tab=manuallyinstallaglobalinitscript#install-the-datadog-agent) to install and manage the init script for installing the Agent globally or on specific Databricks clusters. + +[9]: https://docs.databricks.com/en/security/auth-authz/access-control/index.html#job-acls +[10]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#manage-personal-access-tokens-for-a-service-principal +[11]: https://docs.databricks.com/en/admin/users-groups/service-principals.html#what-is-a-service-principal +[17]: https://docs.databricks.com/aws/en/security/auth/entitlements#entitlements-overview +[18]: https://docs.datadoghq.com/cloud_cost_management +[19]: https://docs.databricks.com/aws/en/compute/sql-warehouse/ +[20]: https://docs.databricks.com/aws/en/admin/system-tables/ +[21]: /data_observability/quality_monitoring/data_warehouses/databricks/ + + +{{% /tab %}} + +{{< /tabs >}} + +### Install the Datadog Agent + +The Datadog Agent must be installed on Databricks clusters to monitor Databricks jobs that run on all-purpose or job clusters. This step is not required to monitor jobs on [serverless compute][4]. + +{{< tabs >}} +{{% tab "Datadog managed global init script (Recommended)" %}} + +Datadog can install and manage a global init script in the Databricks workspace. The Datadog Agent is installed on all clusters in the workspace, when they start. + +
+
    +
  • This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy across multiple clusters or Manually install on a specific cluster.
  • +
  • This install option, in which Datadog installs and manages your Datadog global init script, requires a Databricks Access Token with Workspace Admin permissions. A token with CAN VIEW access does not allow Datadog to manage the global init script of your Databricks account.
  • +
+
+ +#### When integrating a workspace with Datadog + +1. In the **Select products to set up integration** section, make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. +1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. +1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. +1. Click {{< ui >}}Save Databricks Workspace{{< /ui >}}. + {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-new-2.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup when adding a Databricks workspace. Datadog can install and manage a global init script." style="width:100%;" >}} + +#### When adding the init script to a Databricks workspace already integrated with Datadog + +1. On the **Configure** tab, click the workspace in the list of workspaces +1. Click the {{< ui >}}Configured Products{{< /ui >}} tab +1. Make sure the Data Observability: Jobs Monitoring product is **Enabled**. +1. In the {{< ui >}}Datadog Agent Setup{{< /ui >}} section, select the {{< ui >}}Managed by Datadog{{< /ui >}} toggle button. +1. Click {{< ui >}}Select API Key{{< /ui >}} to either select an existing Datadog API key or create a new Datadog API key. +1. (Optional) Disable {{< ui >}}Enable Log Collection{{< /ui >}} if you do not want to collect driver and worker logs for correlating with jobs. +1. Click **Save Databricks Workspace** at the bottom of the browser window. + {{< img src="data_jobs/databricks/configure-data-jobs-monitoring-existing.png" alt="In the Datadog-Databricks integration tile, Datadog Agent Setup for a Databricks workspace already added to the integration. Datadog can install and manage a global init script." style="width:100%;" >}} + +Optionally, you can add tags to your Databricks cluster and Spark performance metrics by configuring the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as [Spark env vars][2] with the Databricks API: + +| Variable | Description | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][1]. For example: `env:staging,team:data_engineering` | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env.| +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][3] for more details. | + + +[1]: /getting_started/tagging/ +[2]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars +[3]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[4]: https://docs.databricks.com/aws/en/compute/serverless/ + +{{% /tab %}} + +{{% tab "Manually configure a cluster policy" %}} + +This approach is recommended for clusters in **Standard** access mode. + +**Create the init script** + +1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). + + ```shell + #!/bin/bash + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. + +1. Grant read-only permissions to the init script: + 1. At the volume level, grant the `READ VOLUME` permission to all account users. + 1. At the catalog level, grant the `USE CATALOG` permission to all account users. + +
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
+ +1. **Add the init script to the allowlist**: For clusters in **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. + +**Configure the compute policy** + +1. In {{< ui >}}Compute{{< /ui >}}, navigate to the {{< ui >}}Policies{{< /ui >}} tab. If you already have a cluster policy applied to your clusters, navigate to that existing policy to edit it. This is the simpler approach as the policy automatically applies to all clusters using it. Otherwise, click {{< ui >}}Create Policy{{< /ui >}} to create a new policy. +1. To add the init script to the cluster policy, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: + 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}init_scripts{{< /ui >}}. + 1. In the {{< ui >}}Source{{< /ui >}} dropdown, select {{< ui >}}Volume{{< /ui >}}. + 1. Under {{< ui >}}Destination{{< /ui >}}, enter the volume path to your init script. + 1. Click {{< ui >}}Add{{< /ui >}}. +1. Configure the environment variables. You must add each of the following environment variables to the cluster policy you created: + + | Key | Description | + |----------------------|------------------------------| + | DD_API_KEY | Your [Datadog API key][1]. | + | DD_SITE | Your [Datadog site][2]. | + | DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | + + 1. For each of the above variables, in the {{< ui >}}Definition{{< /ui >}} section, click {{< ui >}}Add Definition{{< /ui >}}. In the modal that opens, fill in the fields: + 1. In the {{< ui >}}Field{{< /ui >}} dropdown, select {{< ui >}}spark_env_vars{{< /ui >}}. + 1. In the {{< ui >}}Key{{< /ui >}} field, enter the environment variable key. + 1. In the {{< ui >}}Value{{< /ui >}} field, enter the environment variable value. + 1. Under the {{< ui >}}Type{{< /ui >}} drop-down, select {{< ui >}}Fixed{{< /ui >}}. + 1. Check the {{< ui >}}Hidden{{< /ui >}} checkbox to reduce exposure of sensitive values. + 1. Optionally, set other init script parameters and Datadog environment variables, such as `DD_ENV` and `DD_SERVICE`. You can configure the script using the following parameters: + + | Variable | Description | Default | + |--------------------------| ------------------------------------------------------------------------------------------------------------------------------------------------------------------| ---------| + | DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | + | WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | + | DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | + | DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | + | DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + +1. Click {{< ui >}}Create{{< /ui >}} if creating a new policy or {{< ui >}}Save{{< /ui >}} if updating an existing policy. If you update an existing policy, all clusters using that policy automatically apply the changes on their next restart. If you create a new policy, follow the steps below to apply it to your clusters. + +**Apply the cluster policy to clusters** + +1. In {{< ui >}}Compute{{< /ui >}}, select the cluster you want to update or click {{< ui >}}Create Compute{{< /ui >}} for a new cluster. +1. In the {{< ui >}}Policy{{< /ui >}} dropdown at the top, select the policy you created. +1. Click {{< ui >}}Confirm{{< /ui >}} to save the changes. The cluster needs to be restarted for the policy to take effect. + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html +[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist + +{{% /tab %}} + +{{% tab "Manually install a global init script" %}} + +
+This setup does not work on Databricks clusters in Standard access mode, because global init scripts cannot be installed on those clusters. If you are using clusters with the Standard access mode, Datadog recommends to Manually configure a cluster policy or Manually install on a specific cluster. +
+ +1. In Databricks, click your display name (email address) in the upper right corner of the page. +1. Select {{< ui >}}Settings{{< /ui >}} and click the {{< ui >}}Compute{{< /ui >}} tab. +1. In the {{< ui >}}All purpose clusters{{< /ui >}} section, next to {{< ui >}}Global init scripts{{< /ui >}}, click {{< ui >}}Manage{{< /ui >}}. +1. Click {{< ui >}}Add{{< /ui >}}. Name your script. Then, in the {{< ui >}}Script{{< /ui >}} field, copy and paste the following script, remembering to replace the placeholders with your parameter values. + + ```shell + #!/bin/bash + + # Required parameters + export DD_API_KEY= + export DD_SITE= + export DATABRICKS_WORKSPACE="" + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above sets the required parameters, and downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL with `install-databricks-0.14.0.sh` to use version `0.14.0`, for example. The source code used to generate this script, and the changes between script versions, can be found on the [Datadog Agent repository][3]. + +1. To enable the script for all new and restarted clusters, toggle {{< ui >}}Enabled{{< /ui >}}. + {{< img src="data_jobs/databricks/toggle.png" alt="Databricks UI, admin settings, global init scripts. A script called 'install-datadog-agent' is in a list with an enabled toggle." style="width:100%;" >}} +1. Click {{< ui >}}Add{{< /ui >}}. + +#### Set the required init script parameters + +Provide the values for the init script parameters at the beginning of the global init script. + +```bash +export DD_API_KEY= +export DD_SITE= +export DATABRICKS_WORKSPACE="" +``` + +Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: + +| Variable | Description | Default | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| +| DD_API_KEY | Your [Datadog API key][1]. | | +| DD_SITE | Your [Datadog site][2]. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). Enclose the name in double quotes if it contains whitespace. | | +| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | +| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules + +{{% /tab %}} + +{{% tab "Manually install on a specific cluster" %}} + +1. In Databricks, create an init script file in a [Unity Catalog volume][26] with the following content. Be sure to make note of the volume path (for example, `/Volumes/catalog_name/schema_name/volume_name/datadog-init-script.sh`). + + ```shell + #!/bin/bash + + # Download and run the latest init script + curl -L https://install.datadoghq.com/scripts/install-databricks.sh > djm-install-script + bash djm-install-script || true + ``` + + The script above downloads and runs the latest init script for Data Observability: Jobs Monitoring in Databricks. If you want to pin your script to a specific version, you can replace the filename in the URL (for example, `install-databricks-0.14.0.sh` to use version `0.14.0`). You can find the source code used to generate this script, and the changes between script versions, on the [Datadog Agent repository][3]. + +1. Grant read-only permissions to the init script: + 1. At the volume level, grant the `READ VOLUME` permission to all account users. + 1. At the catalog level, grant the `USE CATALOG` permission to all account users. + +
Databricks evaluates Unity Catalog Volume permissions against the cluster owner, not the principal running the cluster.
+ +1. **Add the init script to the allowlist** (required for **Standard** access mode clusters): If your cluster uses **Standard** access mode, you must add the init script path to the Unity Catalog allowlist. Follow the instructions in the [Databricks documentation][27] to add your init script path to the allowlist. + +1. On the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. +1. At the bottom of the page, go to the {{< ui >}}Init Scripts{{< /ui >}} tab. + + {{< img src="data_jobs/databricks/init_scripts.png" alt="Databricks UI, cluster configuration advanced options, Init Scripts tab. A 'Destination' drop-down and an 'Init script path' file selector." style="width:80%;" >}} + + - Under the {{< ui >}}Destination{{< /ui >}} drop-down, select {{< ui >}}Volume{{< /ui >}}. + - Under {{< ui >}}Init script path{{< /ui >}}, enter the volume path to your init script. + - Click {{< ui >}}Add{{< /ui >}}. + +#### Set the required init script parameters + +1. In Databricks, on the cluster configuration page, click the {{< ui >}}Advanced options{{< /ui >}} toggle. +2. At the bottom of the page, go to the {{< ui >}}Spark{{< /ui >}} tab. + {{< img src="data_jobs/databricks/configure-databricks-cluster-init-script.png" alt="Databricks UI, cluster configuration advanced options, Spark tab. A textbox titled 'Environment variables' contains values for DD_API_KEY and DD_SITE." style="width:100%;" >}} + + In the {{< ui >}}Environment variables{{< /ui >}} textbox, provide the values for the init script parameters. + + ```text + DD_API_KEY= + DD_SITE= + DATABRICKS_WORKSPACE= + ``` + + Optionally, you can also set other init script parameters and Datadog environment variables here, such as `DD_ENV` and `DD_SERVICE`. The script can be configured using the following parameters: + +| Variable | Description | Default | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| +| DD_API_KEY | Your [Datadog API key][1]. | | +| DD_SITE | Your [Datadog site][2]. | | +| DATABRICKS_WORKSPACE | Name of your Databricks Workspace. It should match the name provided in the [Datadog-Databricks integration step](#configure-the-datadog-databricks-integration). | | +| DRIVER_LOGS_ENABLED | Collect spark driver logs in Datadog. | false | +| WORKER_LOGS_ENABLED | Collect spark workers logs in Datadog. | false | +| DD_TAGS | Add tags to Databricks cluster and Spark performance metrics. Comma or space separated key:value pairs. Follow [Datadog tag conventions][4]. For example: `env:staging,team:data_engineering` | | +| DD_ENV | Override the `env` environment tag on metrics, traces, and logs from this cluster. By default, the Databricks workspace name is used as env. | | +| DD_LOGS_CONFIG_PROCESSING_RULES | Filter the logs collected with processing rules. See [Advanced Log Collection][5] for more details. | | + + +[1]: https://app.datadoghq.com/organization-settings/api-keys +[2]: /getting_started/site/ +[3]: https://github.com/DataDog/datadog-agent/blob/main/pkg/fleet/installer/setup/djm/databricks.go +[4]: /getting_started/tagging/ +[5]: /agent/logs/advanced_log_collection/?tab=environmentvariable#global-processing-rules +[26]: https://docs.databricks.com/en/connect/unity-catalog/volumes.html +[27]: https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/allowlist#how-to-add-items-to-the-allowlist + +3. Click {{< ui >}}Confirm{{< /ui >}}. + +{{% /tab %}} + +{{< /tabs >}} + +### Restart already-running clusters + +The init script installs the Agent when clusters start. + +Already-running all-purpose clusters or long-lived job clusters must be manually restarted for the init script to install the Datadog Agent. + +For scheduled jobs that run on job clusters, the init script installs the Datadog Agent automatically on the next run. + +## Validation + +In Datadog, view the [Data Observability: Jobs Monitoring][6] page to see a list of all your Databricks jobs. + +If some jobs are not visible, navigate to the [Configuration][9] page to understand why. This page lists all your Databricks jobs not yet configured with the Agent on their clusters, along with guidance for completing setup. + +## Troubleshooting + +If you don't see any data in Jobs Monitoring after installing the product, follow these steps. + +### Init script not running or failing + +1. **Restart the cluster**: The init script is only run on cluster startup. Ensure the cluster has been restarted since the init script was added. +1. **Confirm the init script ran**: In Databricks, click into the cluster and navigate to the {{< ui >}}Event log{{< /ui >}} tab. If `INIT_SCRIPTS_STARTED` is not present, the init script was not picked up by this cluster. Return to the [installation steps](#install-the-datadog-agent) to ensure the init script has been added to the cluster. +1. **Confirm the init script succeeded**: Find the `INIT_SCRIPTS_FINISHED` action in the event log and click into it to inspect the JSON, which indicates whether the init script exited with a failure. +1. **Investigate init script failures**: If `INIT_SCRIPTS_FINISHED` shows a failure, enable [cluster log delivery][29] to send init script logs to your preferred destination. Sending logs to a Unity Catalog volume is recommended. + {{< img src="data_jobs/databricks/compute_logging_config.png" alt="The Databricks cluster configuration page showing the Logging tab with options to configure a log delivery destination." style="width:100%;" >}} + After restarting the cluster with log delivery enabled, navigate to the log destination. The stdout and stderr logs can be found under the following path: + ``` + //init_scripts/_/ + ``` + +### Data not appearing after a successful init script run + +1. **API Key Validation:** If the init script was manually installed, use the [Validate API key endpoint][25] to ensure that the Datadog API key specified in the script is valid. +1. **Agent Validation:** The init script installs the Datadog Agent. To make sure it is properly installed, connect to the cluster with SSH and run the Agent status command: + ```shell + sudo datadog-agent status + ``` + +## Advanced Configuration + +### Filter log collection on clusters + +#### Exclude all log collection from an individual cluster +Configure the following environment variable in the {{< ui >}}Advanced Configuration{{< /ui >}} section of your cluster in the Databricks UI or as a [Spark environment variable][18] in the Databricks API. +```bash +DD_LOGS_CONFIG_PROCESSING_RULES=[{\"type\": \"exclude_at_match\",\"name\": \"drop_all_logs\",\"pattern\": \".*\"}] +``` + +### Permissions +Grant {{< ui >}}Workspace Admin{{< /ui >}} privileges to the user or service principal that connects to your Databricks workspace. This allows Datadog to manage init script installations and updates automatically, reducing the risk of misconfiguration. + +If you need more granular control, grant these minimal permissions to the following [workspace level objects][19] to still be able to monitor all jobs, clusters, and queries within a workspace: + +| Object | Permission | +|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Job | [CAN VIEW][20] +| Compute | [CAN ATTACH TO][21] +| Lakeflow Declarative Pipelines | [CAN VIEW][22] +| Query | [CAN VIEW][23] +| SQL warehouse | [CAN MONITOR][24] + +Additionally, for Datadog to access your Databricks cost data in Data Observability: Jobs Monitoring or [Cloud Cost Management][26], the user or service principal used to query [system tables][27] must have the following permissions: + - `CAN USE` permission on the SQL Warehouse. + - Read access to the [system tables][27] within Unity Catalog. In Databricks, open the {{< ui >}}SQL Editor{{< /ui >}} and run the following commands, using the service principal's client ID (not its display name): + ```sql + GRANT USE CATALOG ON CATALOG system TO ``; + GRANT USE SCHEMA ON CATALOG system TO ``; + GRANT SELECT ON CATALOG system TO ``; + ``` + The user granting these must have `MANAGE` privilege on `CATALOG system`. + + +### Tag spans at runtime + +{{% djm-runtime-tagging %}} + +### Configure cluster tags + +Databricks custom cluster tags are automatically captured and available across Data Observability: Jobs Monitoring and the Datadog platform. The only exception is tags from Azure resource groups, which are not auto-captured. + +To add tags manually, set the `DD_TAGS` environment variable in the Spark environment variables of your cluster. This has the same effect as Databricks custom cluster tags but requires manual configuration. Use comma or space separated key:value pairs following [Datadog tag conventions][28]: + +```text +DD_TAGS=env:staging,team:data_engineering +``` + +### Aggregate cluster metrics from one-time job runs + This configuration is applicable if you want cluster resource utilization data about your jobs and create a new job and cluster for each run via the [one-time run API endpoint][8] (common when using orchestration tools outside of Databricks such as Airflow or Azure Data Factory). + + If you are submitting Databricks Jobs through the [one-time run API endpoint][8], each job run has a unique job ID. This can make it difficult to group and analyze cluster metrics for jobs that use ephemeral clusters. To aggregate cluster utilization from the same job and assess performance across multiple runs, you must set the `DD_JOB_NAME` variable inside the `spark_env_vars` of every `new_cluster` to the same value as your request payload's `run_name`. + + Here's an example of a one-time job run request body: + + {{< highlight json "hl_lines=2 18" >}} + { + "run_name": "Example Job", + "idempotency_token": "8f018174-4792-40d5-bcbc-3e6a527352c8", + "tasks": [ + { + "task_key": "Example Task", + "description": "Description of task", + "depends_on": [], + "notebook_task": { + "notebook_path": "/Path/to/example/task/notebook", + "source": "WORKSPACE" + }, + "new_cluster": { + "num_workers": 1, + "spark_version": "13.3.x-scala2.12", + "node_type_id": "i3.xlarge", + "spark_env_vars": { + "DD_JOB_NAME": "Example Job" + } + } + } + ] + } + {{< /highlight >}} + +### Set up Data Observability: Jobs Monitoring with Databricks Networking Restrictions +With [Databricks Networking Restrictions][12], Datadog may not have access to your Databricks APIs, which is required to collect traces for Databricks job executions along with tags and other metadata. + +If you are controlling Databricks API access with [IP access lists][13], allow-listing Datadog's specific {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP addresses" >}} allows Datadog to connect to the Databricks APIs in your workspace. See Databricks's documentation for configuring IP access lists for [individual workspaces][16] to give Datadog API access. + +To monitor workspaces that use [Databricks Private Link][14] connectivity, see [Private Link Connectivity (Preview)][15]. + +[15]: /data_observability/jobs_monitoring/databricks/private_link + +## Further Reading + +{{< partial name="whats-next/whats-next.html" >}} + +[1]: https://app.datadoghq.com/integrations/databricks?search=databricks +[4]: https://docs.databricks.com/en/security/secrets/index.html +[6]: https://app.datadoghq.com/data-jobs/ +[7]: /data_jobs +[8]: https://docs.databricks.com/api/workspace/jobs/submit +[9]: https://app.datadoghq.com/data-jobs/configuration +[12]: https://docs.databricks.com/en/security/network/front-end/index.html +[13]: https://docs.databricks.com/en/security/network/front-end/ip-access-list.html +[14]: https://www.databricks.com/trust/security-features/secure-your-data-with-private-networking +[16]: https://docs.databricks.com/en/security/network/front-end/ip-access-list-workspace +[18]: https://docs.databricks.com/api/workspace/clusters/edit#spark_env_vars +[19]: https://docs.databricks.com/aws/en/security/auth/access-control#access-control-lists-overview +[20]: https://docs.databricks.com/aws/en/security/auth/access-control#job-acls +[21]: https://docs.databricks.com/aws/en/security/auth/access-control#compute-acls +[22]: https://docs.databricks.com/aws/en/security/auth/access-control#lakeflow-declarative-pipelines-acls +[23]: https://docs.databricks.com/aws/en/security/auth/access-control#query-acls +[24]: https://docs.databricks.com/aws/en/security/auth/access-control#sql-warehouse-acls +[25]: https://docs.datadoghq.com/api/latest/authentication/?code-lang=curl#validate-api-key +[26]: https://docs.datadoghq.com/cloud_cost_management +[27]: https://docs.databricks.com/aws/en/admin/system-tables/ +[28]: /getting_started/tagging/ +[29]: https://docs.databricks.com/aws/en/compute/configure#compute-log-delivery
If your Databricks workspace has Networking Restrictions enabled, add Datadog's {{< region-param key="ip_ranges_url_webhooks" link="true" text="webhook IP ranges" >}} to your allow-list. If your workspace uses Private Link, see the Private Link Connectivity tab below.