Skip to main content
Paradime integrates natively with Elementary CLI to enable you to generate report and/or send alerts using the Bolt scheduler out of the box. No additional installation required.
Elementary sends alerts to Datadog by creating incidents with detailed information about data quality issues, test failures, and model errors. Each alert becomes a structured incident in your Datadog dashboard with appropriate severity levels and metadata.

1. Get Datadog API Credentials

To send incidents to Datadog, you’ll need both an API key and an Application key. Get your API Key
  1. Log in to your Datadog account
  2. Navigate to Organization SettingsAPI Keys
  3. Click + New Key to create a new API key
  4. Give it a descriptive name like “Elementary Integration”
  5. Copy the API key (you’ll need this later)
Get your Application Key
  1. In Organization Settings, go to Application Keys
  2. Click + New Key to create a new application key
  3. Give it a descriptive name like “Elementary Integration”
  4. Copy the application key (you’ll need this later)
Ensure Application Key has the below permissions
  1. incident_notification_settings_read
  2. incident_read
  3. incident_write
  4. teams_read
  5. user_access_read
Identify your Datadog Site Your Datadog site depends on your region. You can check your site by looking at your Datadog URL when logged in.

2. Configure the Integration

Pass your credentials directly when running edr monitor. You should use environment variables in the Bolt command, as described here for secrets.
Available CLI options:
These four flags are the only Datadog settings available on the command line. Other global defaults, such as a default notification handle, commander, or a custom severity mapping, are set once in a config.yml file. See Set project-level defaults.

3. Test your Integration

Run the following command to create a test incident in your Datadog account and verify the integration is configured correctly:
If successful, you’ll see a test incident created in your Datadog dashboard under Incidents, including sample error details, metadata, and all configured notification settings.

4. Execute the CLI

Once configured, run the following command after your dbt™ runs and tests:

5. Set project-level defaults (avoid repeating alerts_config)

You do not need to repeat the alerts_config block in every model YAML. There are two ways to set defaults once and let them apply across your whole project, and you can combine both.
There are two independent mechanisms, and which one to use depends on the setting:
  1. A config.yml file sets true global defaults for the whole project (one value for every alert).
  2. dbt™ config inheritance (+meta in dbt_project.yml) sets defaults per folder or domain, using standard dbt™ merging.
This table shows which settings support a project-wide global, and how a per-alert value interacts with it:

Global defaults with a config.yml file

Elementary reads global settings from a config.yml file. Point edr at the directory containing it with the --config-dir (-c) flag. Because this file is committed to your dbt™ repository, it works in Bolt schedules without any extra setup.
Then reference the directory when you run edr:
The config.yml file is read as plain YAML. It does not render {{ env_var(...) }} or any Jinja, so every value is used literally. Keep secrets (--datadog-api-key and --datadog-application-key) as CLI flags backed by Bolt environment variables, and put only non-secret defaults (severity, handles, commander, site) in config.yml.
Supported datadog: keys in config.yml

Per-folder defaults with dbt™ +meta inheritance

Setting alerts_config through dbt™‘s standard config inheritance (+meta in dbt_project.yml, applied to a folder) is respected by Elementary exactly like model-level meta. This is the recommended way to handle datadog_incident_type_uuid, which has no config.yml global, and to vary handles per domain. You set it once per folder instead of once per model.
A more specific folder, or an individual model, can override a broader default using standard dbt™ config merging. The recognized keys inside alerts_config are datadog_severity, datadog_notification_handle, datadog_commander_uuid, and datadog_incident_type_uuid.
Models vs. tests precedence. Folder-level +meta applies to both. For models, a folder or config.meta value overrides the model’s top-level meta:. For tests, the reverse holds: a test’s own meta: takes precedence over folder-level +meta. So if a specific test already carries its own alerts_config in meta, set the override explicitly on that test.
Recommended setup for a large project (many domains, many models)
  1. Put organization-wide defaults (default_severity, severity_mapping, notification_handles, commander_user_id, site) in one config.yml.
  2. Put per-domain overrides, especially datadog_incident_type_uuid and each domain’s notification handle, as folder-level +meta.alerts_config in dbt_project.yml, one block per domain path.
  3. Only drop down to model-level or test-level meta for the rare exception that needs a special commander, incident type, or severity.
This removes the repeated alerts_config block from every model YAML: nothing needs to be per-model unless you want a deliberate exception.

6. Per-Alert Customization via dbt™ YAML

You can override Datadog incident settings on a per-model or per-test basis directly in your dbt™ project YAML files. These settings take precedence over the global CLI and config.yml defaults.
Where to add these settings Per-alert Datadog settings live inside the alerts_config block under config: meta: in your dbt™ YAML files. They can be applied at:
  • Model level: affects all alerts from that model’s tests
  • Test level: affects only that specific test (overrides model-level if both are set)
Available per-alert parameters
datadog_commander_uuid and datadog_incident_type_uuid require UUIDs, not handles or display names. Using the wrong format will cause the incident creation to fail.
How to find the required UUIDs User UUID (datadog_commander_uuid)
  1. In Datadog, navigate to Organization SettingsUsers
  2. Click on the user you want to assign as commander
  3. The UUID is visible in the URL: app.datadoghq.com/organization-settings/users/<uuid>
Incident Type UUID (datadog_incident_type_uuid)
  1. In Datadog, navigate to IncidentsSettingsIncident Types
  2. Click on the incident type you want to use
  3. The UUID is visible in the URL or in the incident type details panel
Full example
Severity precedence order When determining the severity of a Datadog incident, Elementary applies the following precedence (highest to lowest):
  1. Test-level datadog_severity in config.meta.alerts_config
  2. Model-level or folder-level datadog_severity in config.meta.alerts_config
  3. config.yml severity_mapping (status → severity). When set, this replaces the built-in status mapping below.
  4. Built-in status mapping (error → SEV-1, fail → SEV-2, warn → SEV-3), used only when no severity_mapping is configured.
  5. Default severity from --datadog-default-severity (which overrides config.yml default_severity); fallback SEV-3.

Alert on Source Freshness Failures

Not supported in dbt Cloud.
To alert on source freshness failures, run edr run-operation upload-source-freshness immediately after each execution of dbt source freshness. This operation uploads the results to a table, and the subsequent edr monitor execution will send the alert as a Datadog incident. Keep the following in mind:
  • dbt source freshness and upload-source-freshness must run from the same machine.
  • upload-source-freshness requires the --project-dir argument to be passed.

Continuous Alerting

To monitor continuously, use your orchestrator to run edr monitor on a regular schedule. We recommend running it right after your dbt™ job ends to catch the latest data updates as quickly as possible.

Deduplication

Elementary automatically deduplicates Datadog incidents. Before creating a new incident, it checks whether an active incident already exists for the same alert. If one is found, no duplicate is created. This means:
  • Re-running edr monitor without resolving the underlying issue will not create duplicate incidents.
  • Once an incident is resolved in Datadog, the next failing run will create a fresh incident.