Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
252 changes: 252 additions & 0 deletions docs/cloud/integrations/alerts/rootly.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
---
title: "Rootly"
---

Elementary's Rootly integration enables sending alerts to [Rootly](https://rootly.com) when data issues are detected.

Alerts are sent to a Rootly [Generic Webhook Alert Source](https://docs.rootly.com/integrations/generic-webhook-alert-source/generic-webhook-alert-source). Rootly then creates or updates alerts, and can trigger incidents, paging, and other alert workflows based on your configuration.

To send alerts to Rootly, you need to create [alert rules](/cloud/features/alerts-and-incidents/alert-rules) and select Rootly as the destination.

## Prerequisites

You need a Rootly account with access to create Alert Sources.

## Create a Generic Webhook Alert Source in Rootly

Before connecting Elementary, you need to create a Generic Webhook Alert Source in Rootly:

1. In Rootly, go to **Alert Sources** and click **New alert source**. Search for **Generic Webhook** and select it.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — locating Generic Webhook Alert Source in Rootly */}
<img
src="/pics/cloud/rootly_new_alert_source.png"
alt="Locate Generic Webhook Alert Source in Rootly"
/>
</div>
</Frame>

2. Give the alert source a name (e.g. "Elementary Cloud").

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — naming the alert source */}
<img
src="/pics/cloud/rootly_name_source.png"
alt="Name the Rootly generic webhook alert source"
/>
</div>
</Frame>

3. On the source setup page, you will see the **webhook URL** and a **Bearer Token**. You will need both when connecting in Elementary. Keep this page open — you will come back to it after sending a test alert.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — webhook URL and Bearer Token on the source setup page */}
<img
src="/pics/cloud/rootly_webhook_details.png"
alt="Rootly generic webhook alert source connection details"
/>
</div>
</Frame>

<Info>
The Bearer Token is a secret. Keep it secure and do not share it publicly.
</Info>

<Tip>
If you want every alert from this source to always route to the same service, team, or escalation policy, use the fixed-target webhook URL variant Rootly offers (`.../notify/<type>/<id>`) instead of the base URL. See [Routing alerts to a target](#routing-alerts-to-a-target) below.
</Tip>

## Connect Rootly in Elementary

1. Go to the **Environments** page on the sidebar.

2. Select an environment and click connect on the **Connect incident management tool** card, and select **Rootly**.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — selecting Rootly as incident management tool */}
<img
src="/pics/cloud/rootly_select_provider.png"
alt="Select Rootly as incident management tool"
/>
</div>
</Frame>

3. Fill in the connection details from your Rootly alert source:
- **Source name** — a display name for this alert source (e.g. "Elementary Cloud")
- **Webhook endpoint URL** — the webhook URL from the Rootly alert source
- **Webhook secret** — the Bearer Token from the Rootly alert source

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — Connect Rootly form with source name/webhook endpoint/secret */}
<img
src="/pics/cloud/rootly_connect_form.png"
alt="Enter Rootly connection details"
/>
</div>
</Frame>

4. Expand **Test connection** to send a test incident and verify the integration is working.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — Test incident section */}
<img
src="/pics/cloud/rootly_test_connection.png"
alt="Test the Rootly connection"
/>
</div>
</Frame>

<Warning>
The test connection sends a real alert event to Rootly. You may need to manually resolve or close it after testing.
</Warning>

5. Click **Save**. **Rootly** will now be available as a destination on the [alert rules](/cloud/features/alerts-and-incidents/alert-rules) page.

<Tip>
You can add multiple alert sources by clicking **+ Add source** — for example, to route different alert rules to different Rootly alert sources.
</Tip>

## Configure Alert Fields in Rootly

After sending a test alert from Elementary, go back to the Rootly alert source setup page. You should see the test alert appear in the recent activity / payload preview. Use it as a reference while mapping fields.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — alert source showing received test alert payload */}
<img
src="/pics/cloud/rootly_source_test_alert.png"
alt="Rootly alert source showing received test alert"
/>
</div>
</Frame>

Rootly doesn't require a specific payload shape — you map the JSON fields Elementary sends to Rootly's alert fields yourself, using Liquid expressions (or by clicking the field directly in the payload preview).

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — Alert Fields mapping UI */}
<img
src="/pics/cloud/rootly_field_mapping.png"
alt="Map alert fields in Rootly"
/>
</div>
</Frame>

At minimum, map these fields:

| Rootly field | Map to | Purpose |
|---|---|---|
| **Title** | `title` | Headline shown on the alert |
| **External Identifier** | `external_id` | Stable key Rootly uses to match follow-up events to the same alert |
| **State** | `state` | Lifecycle state (`triggered` / `resolved`) — drives auto-resolution |
| **External URL** | `external_url` | Link back to the relevant page in Elementary Cloud |
| **Description** | `description` | Present only on grouped-alert notifications |

### Configure auto-resolution

Elementary sends a `resolved` state event with the same `external_id` when a previously failing test or model passes again. To have Rootly automatically resolve the alert:

1. In the alert source settings, open **Auto-Resolution**.
2. Map the **external identifier** field to `external_id`.
3. Map the **state** field to `state`.
4. Set the resolved-state value to `resolved`.
5. Turn on auto-resolution for the source.

<Frame>
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — Auto-Resolution configuration */}
<img
src="/pics/cloud/rootly_auto_resolution.png"
alt="Configure auto-resolution in Rootly"
/>
</div>
</Frame>

### Available fields

Elementary sends the following fields depending on the alert type. All fields are optional — they are included only when the data is available.

| Field | Type | Description |
|-------|------|-------------|
| `severity` | String | Alert severity (e.g. `warn`, `fail`, `error`) |
| `owners` | Array of strings | Asset and test owners (email addresses) |
| `tags` | Array of strings | Asset and test tags |
| `environment` | String | Elementary environment name |
| `test_description` | String | Test description (test alerts only) |
| `source` | String | Pipeline tool name (pipeline alerts only) |
| `connector` | String | Connector name (pipeline alerts only) |
| `failure_reason` | String | Failure reason (pipeline alerts only) |

Pipeline alerts also include additional fields such as `connector_type`, `connector_id`, `sync_id`, `destination`, `task_type`, and `rescheduled_at`.

<Tip>
When configuring fields, use the test alert payload as a reference — it includes sample values for the common fields, making it easy to set up mappings.
</Tip>

### Recommended field mappings

We recommend mapping these fields in Rootly, in addition to the required ones above:

- **`severity`** — enables routing alerts by severity
- **`owners`** — enables filtering and routing by data owner
- **`tags`** — enables filtering by tag

<Note>
For array fields like `owners` and `tags`, map them to a field type in Rootly that supports multiple values.
</Note>

If you need additional fields for your routing that are not currently included, [reach out to us](https://www.elementary-data.com/contact-us) and we'll work with you to add them.

## Routing alerts to a target

Rootly supports two ways to route an alert to a service, team, or escalation policy:

- **URL-based** — use the fixed-target webhook URL variant (`.../notify/<type>/<id>`) as the webhook endpoint URL when connecting in Elementary. Every alert from that source routes to the same target. This is the simplest option and works well since Elementary alerts don't include a routing target in the payload.
- **Payload-based** — map a routing target from the payload itself. Since Elementary doesn't send a routing target field, this option isn't applicable for this integration — use the URL-based approach instead, or add multiple Rootly sources (one per target) in Elementary and route different [alert rules](/cloud/features/alerts-and-incidents/alert-rules) to each.

## How alerts work

### Alert creation and deduplication

Each Elementary alert includes a stable **external identifier** based on the alert's identity (test, model, or pipeline). Rootly uses this identifier to:

- **Create** a new alert when a new issue is detected
- **Deduplicate** — avoid creating duplicate alerts for the same ongoing issue
- **Auto-resolve** — when a test passes again, Elementary sends a resolved event with the same external identifier, which resolves the alert in Rootly (once auto-resolution is configured, see above)

### Alert types

Elementary sends the following alert types to Rootly:

- **Test alerts** — dbt and Elementary test failures
- **Model alerts** — dbt model and snapshot failures
- **Source freshness alerts** — source freshness check failures
- **Pipeline alerts** — pipeline connector failures (Fivetran, etc.)
- **Resolved alerts** — automatically sent when a previously failing test/model passes

### Link to Elementary

Each alert includes an **external URL** linking back to the relevant page in Elementary Cloud, so you can quickly investigate the issue.

### Alerts in Rootly

Each alert sent by Elementary appears in Rootly with its mapped fields and a link back to Elementary Cloud.

<Frame caption="Alert detail in Rootly">
<div className="dark:bg-white rounded-md p-1">
{/* TODO: screenshot — alert detail view in Rootly */}
<img
src="/pics/cloud/rootly_alert_detail.png"
alt="Elementary alert detail in Rootly"
/>
</div>
</Frame>

When an alert matches your Rootly [alert workflows](https://docs.rootly.com/workflows/alert-workflows), it can automatically create an incident, page an on-call responder, or post to Slack or Microsoft Teams with full context.
1 change: 1 addition & 0 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@
"cloud/integrations/alerts/pagerduty",
"cloud/integrations/alerts/opsgenie",
"cloud/integrations/alerts/incident-io",
"cloud/integrations/alerts/rootly",
"cloud/integrations/alerts/jira",
"cloud/integrations/alerts/linear",
"cloud/integrations/alerts/servicenow",
Expand Down
Binary file added docs/pics/cloud/rootly_alert_detail.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_auto_resolution.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_connect_form.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_field_mapping.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_name_source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_new_alert_source.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_select_provider.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_source_test_alert.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_test_connection.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/pics/cloud/rootly_webhook_details.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,27 @@
}
>
</Card>
<Card
title="Rootly"
href="/cloud/integrations/alerts/rootly"
icon={
<svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" rx="6" fill="#8B72D9"/>
<g fill="#FFFFFF">
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(-78 12 14)"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(-52 12 14)"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(-26 12 14)"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(26 12 14)"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(52 12 14)"/>
<path d="M12 6C12.8 8.2 13 10.8 12 13.7C11 10.8 11.2 8.2 12 6Z" transform="rotate(78 12 14)"/>
<path d="M12 14.2C9.5 13.2 6.7 13.4 5 14.6L5 17.2C6.7 16.1 9.5 15.9 12 16.9Z"/>
<path d="M12 14.2C14.5 13.2 17.3 13.4 19 14.6L19 17.2C17.3 16.1 14.5 15.9 12 16.9Z"/>
</g>
</svg>
}
>
</Card>
<Card
title="Webhooks"
href="/cloud/integrations/alerts/webhooks"
Expand Down
Loading