From 26b663ac788756ceb7f8d314f900b07a411e964e Mon Sep 17 00:00:00 2001
From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com>
Date: Thu, 17 Oct 2024 12:52:32 -0700
Subject: [PATCH] Model-level notifications (#6218)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## What are you changing in this pull request and why?
Beta docs for model-level notifications
- [x] New page
- [x] Update sidebar so new page is below Job notifications page
- [x] Add feature card to two landing pages
## Checklist
- [x] I have reviewed the [Content style
guide](https://github.com/dbt-labs/docs.getdbt.com/blob/current/contributing/content-style-guide.md)
so my content adheres to these guidelines.
- [x] The topic I'm writing about is for specific dbt version(s) and I
have versioned it according to the [version a whole
page](https://github.com/dbt-labs/docs.getdbt.com/blob/current/contributing/single-sourcing-content.md#adding-a-new-version)
and/or [version a block of
content](https://github.com/dbt-labs/docs.getdbt.com/blob/current/contributing/single-sourcing-content.md#versioning-blocks-of-content)
guidelines.
- [x] Needs PM review
ADDING PAGE (if so, uncomment):
- [x] Add/remove page in `website/sidebars.js`
- [x] Provide a unique filename for new pages
---
🚀 Deployment available! Here are the direct links to the updated files:
-
https://docs-getdbt-com-git-ly-docs-beta-model-notifications-dbt-labs.vercel.app/docs/deploy/deployment-overview
-
https://docs-getdbt-com-git-ly-docs-beta-model-notifications-dbt-labs.vercel.app/docs/deploy/model-notifications
-
https://docs-getdbt-com-git-ly-docs-beta-model-notifications-dbt-labs.vercel.app/docs/deploy/monitor-jobs
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com>
---
.../docs/docs/deploy/deployment-overview.md | 6 ++
.../docs/docs/deploy/model-notifications.md | 87 ++++++++++++++++++
website/docs/docs/deploy/monitor-jobs.md | 1 +
website/sidebars.js | 1 +
.../example-enable-model-notifications.png | Bin 0 -> 41733 bytes
5 files changed, 95 insertions(+)
create mode 100644 website/docs/docs/deploy/model-notifications.md
create mode 100644 website/static/img/docs/dbt-cloud/example-enable-model-notifications.png
diff --git a/website/docs/docs/deploy/deployment-overview.md b/website/docs/docs/deploy/deployment-overview.md
index 11575e6b0b7..9382634812f 100644
--- a/website/docs/docs/deploy/deployment-overview.md
+++ b/website/docs/docs/deploy/deployment-overview.md
@@ -79,6 +79,12 @@ Learn how to use dbt Cloud's features to help your team ship timely and quality
link="/docs/deploy/job-notifications"
icon="dbt-bit"/>
+
+
+
+Set up dbt to notify the appropriate model owners through email about issues as soon as they occur, while the job is still running. Model owners can specify which statuses to receive notifications about:
+
+- `Success` and `Fails` for models
+- `Warning`, `Success`, and `Fails` for tests
+
+With model-level notifications, model owners can be the first ones to know about issues before anyone else (like the stakeholders).
+
+:::info Beta feature
+
+This feature is currently available in [beta](/docs/dbt-versions/product-lifecycles#dbt-cloud) to a limited group of users and is gradually being rolled out. If you're in the beta, please contact the Support team at support@getdbt.com for assistance or questions.
+
+:::
+
+To be timely and keep the number of notifications to a reasonable amount when multiple models or tests trigger them, dbt observes the following guidelines when notifying the owners:
+
+- Send a notification to each unique owner/email during a job run about any models (with status of failure/success) or tests (with status of warning/failure/success). Each owner receives only one notification, the initial one.
+- Don't send any notifications about subsequent models or tests while a dbt job is still running.
+- At the end of a job run, each owner receives a notification, for each of the statuses they specified to be notified about, with a list of models and tests that have that status.
+
+Create configuration YAML files in your project for dbt to send notifications about the status of your models and tests.
+
+## Prerequisites
+- Your dbt Cloud administrator has [enabled the appropriate account setting](#enable-access-to-model-notifications) for you.
+- Your environment(s) must be on ["Versionless"](/docs/dbt-versions/versionless-cloud).
+
+
+## Configure groups
+
+Add your group configuration in either the `dbt_project.yml` or `groups.yml` file. For example:
+
+```yml
+version: 2
+
+groups:
+ - name: finance
+ description: "Models related to the finance department"
+ owner:
+ # 'name' or 'email' is required
+ name: "Finance Team"
+ email: finance@dbtlabs.com
+ slack: finance-data
+
+ - name: marketing
+ description: "Models related to the marketing department"
+ owner:
+ name: "Marketing Team"
+ email: marketing@dbtlabs.com
+ slack: marketing-data
+```
+
+## Set up models
+
+Set up your model configuration in either the `dbt_project.yml` or `groups.yml` file; doing this automatically sets up notifications for tests, too. For example:
+
+```yml
+version: 2
+
+models:
+ - name: sales
+ description: "Sales data model"
+ config:
+ group: finance
+
+ - name: campaigns
+ description: "Campaigns data model"
+ config:
+ group: marketing
+
+```
+
+## Enable access to model notifications
+
+Provide dbt Cloud account members the ability to configure and receive alerts about issues with models or tests that are encountered during job runs.
+
+To use model-level notifications, your dbt Cloud account must have access to the feature. Ask your dbt Cloud administrator to enable this feature for account members by following these steps:
+
+1. Navigate to **Notification settings** from your profile name in the sidebar (lower left-hand side).
+1. From **Email notications**, enable the setting **Enable group/owner notifications on models** under the **Model notifications** section. Then, specify which statuses to receive notifications about (Success, Warning, and/or Fails).
+
+
diff --git a/website/docs/docs/deploy/monitor-jobs.md b/website/docs/docs/deploy/monitor-jobs.md
index 8382743dd03..1cbba23161e 100644
--- a/website/docs/docs/deploy/monitor-jobs.md
+++ b/website/docs/docs/deploy/monitor-jobs.md
@@ -13,6 +13,7 @@ This portion of our documentation will go over dbt Cloud's various capabilities
- [Run visibility](/docs/deploy/run-visibility) — View your run history to help identify where improvements can be made to scheduled jobs.
- [Retry jobs](/docs/deploy/retry-jobs) — Rerun your errored jobs from start or the failure point.
- [Job notifications](/docs/deploy/job-notifications) — Receive email or Slack notifications when a job run succeeds, encounters warnings, fails, or is canceled.
+- [Model notifications](/docs/deploy/model-notifications) — Receive email notifications about any issues encountered by your models and tests as soon as they occur while running a job.
- [Webhooks](/docs/deploy/webhooks) — Use webhooks to send events about your dbt jobs' statuses to other systems.
- [Leverage artifacts](/docs/deploy/artifacts) — dbt Cloud generates and saves artifacts for your project, which it uses to power features like creating docs for your project and reporting freshness of your sources.
- [Source freshness](/docs/deploy/source-freshness) — Monitor data governance by enabling snapshots to capture the freshness of your data sources.
diff --git a/website/sidebars.js b/website/sidebars.js
index d31f6d03f57..2178e4cd35a 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -499,6 +499,7 @@ const sidebarSettings = {
"docs/deploy/run-visibility",
"docs/deploy/retry-jobs",
"docs/deploy/job-notifications",
+ "docs/deploy/model-notifications",
"docs/deploy/webhooks",
"docs/deploy/artifacts",
"docs/deploy/source-freshness",
diff --git a/website/static/img/docs/dbt-cloud/example-enable-model-notifications.png b/website/static/img/docs/dbt-cloud/example-enable-model-notifications.png
new file mode 100644
index 0000000000000000000000000000000000000000..16cf5457db5523a3cdd505accc59ee1f1666f45b
GIT binary patch
literal 41733
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