From ec7ef1ba5364c6e2a8b55b4bec32a521f8af9bfe Mon Sep 17 00:00:00 2001 From: Albert Lie Date: Thu, 17 Oct 2024 10:00:51 -0400 Subject: [PATCH 01/21] add an example of separating semantic model (pure yaml) from dbt model (yaml, sql, python) --- .../semantic-layer-3-build-semantic-models.md | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md index 7990cf6752f..8b90bcef97a 100644 --- a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md +++ b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md @@ -241,7 +241,9 @@ measures: ## Reviewing our work -Our completed code will look like this, our first semantic model! +Our completed code will look like this, our first semantic model! Here are two examples showing different organizational approaches: + +### Co-located approach @@ -289,6 +291,66 @@ semantic_models: agg: sum ``` +### Parallel subfoldering approach + + + +```yml +semantic_models: + - name: orders + defaults: + agg_time_dimension: ordered_at + description: | + Order fact table. This table is at the order grain with one row per order. + + model: ref('stg_orders') + + entities: + - name: order_id + type: primary + - name: location + type: foreign + expr: location_id + - name: customer + type: foreign + expr: customer_id + + dimensions: + - name: ordered_at + expr: date_trunc('day', ordered_at) + # use date_trunc(ordered_at, DAY) if using BigQuery + type: time + type_params: + time_granularity: day + - name: is_large_order + type: categorical + expr: case when order_total > 50 then true else false end + + measures: + - name: order_total + description: The total revenue for each order. + agg: sum + - name: order_count + description: The count of individual orders. + expr: 1 + agg: sum + - name: tax_paid + description: The total tax paid on each order. + agg: sum +``` + +As you can see, the content of the semantic model is identical in both approaches. The key differences are: + +1. **File location**: + - Co-located approach: `models/marts/orders.yml` + - Parallel subfoldering approach: `models/semantic_models/sem_orders.yml` + +2. **File naming**: + - Co-located approach: Uses the same name as the corresponding mart (`orders.yml`) + - Parallel subfoldering approach: Prefixes the file with `sem_` (`sem_orders.yml`) + +Choose the approach that best fits your project structure and team preferences. The co-located approach is often simpler for new projects, while the parallel subfoldering approach can be clearer for large existing projects being migrated to use the Semantic Layer. + ## Next steps Let's review the basics of semantic models: From 332db08b2a07f8eabb32cbdc6db2ff18a91bc365 Mon Sep 17 00:00:00 2001 From: Marcelo <34426867+marcelo-franceschini@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:26:25 -0300 Subject: [PATCH 02/21] Update databricks-configs.md with compression algorithm --- website/docs/reference/resource-configs/databricks-configs.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/website/docs/reference/resource-configs/databricks-configs.md b/website/docs/reference/resource-configs/databricks-configs.md index eea03f2b196..9e1b3282801 100644 --- a/website/docs/reference/resource-configs/databricks-configs.md +++ b/website/docs/reference/resource-configs/databricks-configs.md @@ -35,6 +35,7 @@ When materializing a model as `table`, you may include several optional configs | clustered_by | Each partition in the created table will be split into a fixed number of buckets by the specified columns. | Optional | SQL, Python | `country_code` | | buckets | The number of buckets to create while clustering | Required if `clustered_by` is specified | SQL, Python | `8` | | tblproperties | [Tblproperties](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-tblproperties.html) to be set on the created table | Optional | SQL, Python* | `{'this.is.my.key': 12}` | +| compression | Set the compression algorithm. | Optional | SQL, Python | `zstd` | \* Beginning in 1.7.12, we have added tblproperties to Python models via an alter statement that runs after table creation. We do not yet have a PySpark API to set tblproperties at table creation, so this feature is primarily to allow users to anotate their python-derived tables with tblproperties. @@ -54,7 +55,8 @@ We do not yet have a PySpark API to set tblproperties at table creation, so this | clustered_by | Each partition in the created table will be split into a fixed number of buckets by the specified columns. | Optional | SQL, Python | `country_code` | | buckets | The number of buckets to create while clustering | Required if `clustered_by` is specified | SQL, Python | `8` | | tblproperties | [Tblproperties](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-tblproperties.html) to be set on the created table | Optional | SQL, Python* | `{'this.is.my.key': 12}` | -| databricks_tags | [Tags](https://docs.databricks.com/en/data-governance/unity-catalog/tags.html) to be set on the created table | Optional | SQL+, Python+ | `{'my_tag': 'my_value'}` | +| databricks_tags | [Tags](https://docs.databricks.com/en/data-governance/unity-catalog/tags.html) to be set on the created table | Optional | SQL+, Python+ | `{'my_tag': 'my_value'}` | +| compression | Set the compression algorithm. | Optional | SQL, Python | `zstd` | \* Beginning in 1.7.12, we have added tblproperties to Python models via an alter statement that runs after table creation. We do not yet have a PySpark API to set tblproperties at table creation, so this feature is primarily to allow users to anotate their python-derived tables with tblproperties. 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 03/21] 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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�(Tuu#QM?G=Y;LfIb9dvar`zW^Ipa1;t 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 literal 0 HcmV?d00001 From 7c6b211f2caff80298bd2f262150ad18a940b7f1 Mon Sep 17 00:00:00 2001 From: mirnawong1 Date: Fri, 18 Oct 2024 09:32:20 +0100 Subject: [PATCH 04/21] remove defer --- website/docs/docs/build/metricflow-commands.md | 2 -- website/docs/docs/cloud/about-cloud-develop-defer.md | 3 --- 2 files changed, 5 deletions(-) diff --git a/website/docs/docs/build/metricflow-commands.md b/website/docs/docs/build/metricflow-commands.md index 29a9e70acd4..d010cd8bb17 100644 --- a/website/docs/docs/build/metricflow-commands.md +++ b/website/docs/docs/build/metricflow-commands.md @@ -28,8 +28,6 @@ In dbt Cloud, run MetricFlow commands directly in the [dbt Cloud IDE](/docs/clou For dbt Cloud CLI users, MetricFlow commands are embedded in the dbt Cloud CLI, which means you can immediately run them once you install the dbt Cloud CLI and don't need to install MetricFlow separately. You don't need to manage versioning because your dbt Cloud account will automatically manage the versioning for you. - -Note: The **Defer to staging/production** [toggle](/docs/cloud/about-cloud-develop-defer#defer-in-the-dbt-cloud-ide) button doesn't apply when running Semantic Layer commands in the dbt Cloud IDE. To use defer for Semantic layer commands in the IDE, toggle the button on and manually add the `--defer` flag to the command. This is a temporary workaround and will be available soon. diff --git a/website/docs/docs/cloud/about-cloud-develop-defer.md b/website/docs/docs/cloud/about-cloud-develop-defer.md index 3ee5ac71666..fc55edf8a38 100644 --- a/website/docs/docs/cloud/about-cloud-develop-defer.md +++ b/website/docs/docs/cloud/about-cloud-develop-defer.md @@ -40,9 +40,6 @@ To enable defer in the dbt Cloud IDE, toggle the **Defer to production** button For example, if you were to start developing on a new branch with [nothing in your development schema](/reference/node-selection/defer#usage), edit a single model, and run `dbt build -s state:modified` — only the edited model would run. Any `{{ ref() }}` functions will point to the production location of the referenced models. - -Note: The **Defer to staging/production** toggle button doesn't apply when running [dbt Semantic Layer commands](/docs/build/metricflow-commands) in the dbt Cloud IDE. To use defer for Semantic layer commands in the IDE, toggle the button on and manually add the `--defer` flag to the command. This is a temporary workaround and will be available soon. - ### Defer in dbt Cloud CLI From a3ab24571e8a9c73c15c6d13cc9f102a02c5c55c Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 09:40:26 +0100 Subject: [PATCH 05/21] Update model-query-history.md clarify option for ST for model query history --- website/docs/docs/collaborate/model-query-history.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/collaborate/model-query-history.md b/website/docs/docs/collaborate/model-query-history.md index 0f43c9b163f..0180757f980 100644 --- a/website/docs/docs/collaborate/model-query-history.md +++ b/website/docs/docs/collaborate/model-query-history.md @@ -25,7 +25,7 @@ So for example, if `model_super_santi` was queried 10 times in the past week, it To access the features, you should meet the following: -1. You have a dbt Cloud account on the [Enterprise plan](https://www.getdbt.com/pricing/). +1. You have a dbt Cloud account on the [Enterprise plan](https://www.getdbt.com/pricing/). Single-tenant accounts should contact their account representative for setup. 2. You have set up a [production](https://docs.getdbt.com/docs/deploy/deploy-environments#set-as-production-environment) deployment environment for each project you want to explore, with at least one successful job run. 3. You have [admin permissions](/docs/cloud/manage-access/enterprise-permissions) in dbt Cloud to edit project settings or production environment settings. 4. Use Snowflake or BigQuery as your data warehouse and can enable query history permissions or work with an admin to do so. Support for additional data platforms coming soon. From 189724053b70c5d2f030996088a4e4a942fd39d1 Mon Sep 17 00:00:00 2001 From: mirnawong1 Date: Fri, 18 Oct 2024 09:40:51 +0100 Subject: [PATCH 06/21] fix --- website/snippets/_v2-sl-prerequisites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/snippets/_v2-sl-prerequisites.md b/website/snippets/_v2-sl-prerequisites.md index f8108849f4f..68f6e7d10b7 100644 --- a/website/snippets/_v2-sl-prerequisites.md +++ b/website/snippets/_v2-sl-prerequisites.md @@ -1,4 +1,4 @@ -- Have a dbt Cloud Team or Enterprise account. Single-tenant accounts should contact their account representative setup. +- Have a dbt Cloud Team or Enterprise account. Single-tenant accounts should contact their account representative for setup. - Ensure your production and development environments use [dbt version 1.6 or higher](/docs/dbt-versions/upgrade-dbt-version-in-cloud). - Use Snowflake, BigQuery, Databricks, or Redshift. - Create a successful run in the environment where you configure the Semantic Layer. From 843cfd6363a991d27cc4f32ea89bdc7bde5e87b5 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:15:06 +0100 Subject: [PATCH 07/21] Update cumulative-metrics.md clarify different syntaxes for type_params::measure (shorthand and object syntax) raised in [internal slack thread](https://dbt-labs.slack.com/archives/C03KHQRQUBX/p1729214331646699) --- website/docs/docs/build/cumulative-metrics.md | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 056ff79c6eb..e893eaf81b1 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -18,21 +18,21 @@ Note that we use the double colon (::) to indicate whether a parameter is nested -| Parameter |
Description
| Type | -| --------- | ----------- | ---- | -| `name` | The name of the metric. | Required | -| `description` | The description of the metric. | Optional | -| `type` | The type of the metric (cumulative, derived, ratio, or simple). | Required | -| `label` | Required string that defines the display value in downstream tools. Accepts plain text, spaces, and quotes (such as `orders_total` or `"orders_total"`). | Required | -| `type_params` | The type parameters of the metric. Supports nested parameters indicated by the double colon, such as `type_params::measure`. | Required | -| `type_params::cumulative_type_params` | Allows you to add a `window`, `period_agg`, and `grain_to_date` configuration. Nested under `type_params`. | Optional | -| `cumulative_type_params::window` | The accumulation window, such as 1 month, 7 days, 1 year. This can't be used with `grain_to_date`. | Optional | -| `cumulative_type_params::grain_to_date` | Sets the accumulation grain, such as `month`, which will accumulate data for one month and then restart at the beginning of the next. This can't be used with `window`. | Optional | -| `cumulative_type_params::period_agg` | Specifies how to aggregate the cumulative metric when summarizing data to a different granularity. Can be used with grain_to_date. Options are
- `first` (Takes the first value within the period)
- `last` (Takes the last value within the period
- `average` (Calculates the average value within the period).

Defaults to `first` if no `window` is specified. | Optional | -| `type_params::measure` | A dictionary describing the measure you will use. | Required | -| `measure::name` | The measure you are referencing. | Optional | -| `measure::fill_nulls_with` | Set the value in your metric definition instead of null (such as zero). | Optional | -| `measure::join_to_timespine` | Boolean that indicates if the aggregated measure should be joined to the time spine table to fill in missing dates. Default `false`. | Optional | +| Parameter |
Description
| Type | +|-------------|---------------------------------------------------|-----------| +| `name` | The name of the metric. | Required | +| `description` | The description of the metric. | Optional | +| `type` | The type of the metric (cumulative, derived, ratio, or simple). | Required | +| `label` | Required string that defines the display value in downstream tools. Accepts plain text, spaces, and quotes (such as `orders_total` or `"orders_total"`). | Required | +| `type_params` | The type parameters of the metric. Supports nested parameters indicated by the double colon, such as `type_params::measure`. | Required | +| `type_params::measure` | The measure associated with the metric. Supports both shorthand (string) and object syntax. The shorthand is used if only the name is needed, while the object syntax allows specifying additional attributes. | Required | +| `measure::name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional | +| `measure::fill_nulls_with` | Sets a value (e.g., zero) to replace nulls in the metric definition. | Optional | +| `measure::join_to_timespine` | Boolean indicating if the aggregated measure should be joined to the time spine table to fill in missing dates. Default is `false`. | Optional | +| `type_params::cumulative_type_params` | Allows configuration of attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | +| `cumulative_type_params::window` | Specifies the accumulation window, such as 1 month, 7 days, or 1 year. Cannot be used with `grain_to_date`. | Optional | +| `cumulative_type_params::grain_to_date` | Sets the accumulation grain, such as `month`, restarting accumulation at the beginning of each specified grain period. Cannot be used with `window`. | Optional | +| `cumulative_type_params::period_agg` | Defines how to aggregate the cumulative metric when summarizing data to a different granularity: `first`, `last`, or `average`. Defaults to `first` if `window` is not specified. | Optional |
@@ -48,12 +48,32 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `window` | The accumulation window, such as 1 month, 7 days, 1 year. This can't be used with `grain_to_date`. | Optional | | `grain_to_date` | Sets the accumulation grain, such as `month`, which will accumulate data for one month and then restart at the beginning of the next. This can't be used with `window`. | Optional | | `type_params::measure` | A list of measure inputs | Required | -| `measure:name` | The measure you are referencing. | Optional | +| `measure:name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional | | `measure:fill_nulls_with` | Set the value in your metric definition instead of null (such as zero).| Optional | | `measure:join_to_timespine` | Boolean that indicates if the aggregated measure should be joined to the time spine table to fill in missing dates. Default `false`. | Optional | + + +When reading about `type_params::measure`, you may notice there are different ways of writing it: +- Shorthand syntax — To only specify the name of the measure, use a simple string value. This is a shorthand approach when no other attributes are required. +``` +yaml +type_params: + measure: revenue +``` +- Object syntax — To add more details or attributes to the measure (such as adding a filter, handling `null` values, or specifying whether to join to a time spine), you must use the object syntax. This allows for additional configuration beyond just the measure's name. +``` +yaml +type_params: + measure: + name: order_total + fill_nulls_with: 0 + join_to_timespine: true +``` + + ### Complete specification The following displays the complete specification for cumulative metrics, along with an example: From 4ceb73ac0527d363dd5cf75cb02dd31a8911d1c2 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:20:58 +0100 Subject: [PATCH 08/21] Update website/docs/docs/build/cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index e893eaf81b1..32f598d364a 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -18,7 +18,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested -| Parameter |
Description
| Type | +| Parameter |
Description
| Type | |-------------|---------------------------------------------------|-----------| | `name` | The name of the metric. | Required | | `description` | The description of the metric. | Optional | From 30933651d62c635a6d55b24b38f84cb0da72aa57 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:32:43 +0100 Subject: [PATCH 09/21] Update cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 32f598d364a..299de4cae53 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -1,6 +1,5 @@ --- title: "Cumulative metrics" -id: cumulative description: "Use Cumulative metrics to aggregate a measure over a given window." sidebar_label: Cumulative tags: [Metrics, Semantic Layer] @@ -58,20 +57,19 @@ Note that we use the double colon (::) to indicate whether a parameter is nested When reading about `type_params::measure`, you may notice there are different ways of writing it: - Shorthand syntax — To only specify the name of the measure, use a simple string value. This is a shorthand approach when no other attributes are required. -``` -yaml -type_params: - measure: revenue -``` + ```yaml + type_params: + measure: revenue + ``` - Object syntax — To add more details or attributes to the measure (such as adding a filter, handling `null` values, or specifying whether to join to a time spine), you must use the object syntax. This allows for additional configuration beyond just the measure's name. -``` -yaml -type_params: - measure: - name: order_total - fill_nulls_with: 0 - join_to_timespine: true -``` + + ```yaml + type_params: + measure: + name: order_total + fill_nulls_with: 0 + join_to_timespine: true + ``` ### Complete specification From 935150ac364f39fd5e0c004d57c92d5bce210aeb Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:41:45 +0100 Subject: [PATCH 10/21] Update cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 299de4cae53..66018461704 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -1,5 +1,6 @@ --- title: "Cumulative metrics" +id: cumulative description: "Use Cumulative metrics to aggregate a measure over a given window." sidebar_label: Cumulative tags: [Metrics, Semantic Layer] From cde56a9256da9ae1ba3c7858b475382c6f6877df Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:10:47 +0100 Subject: [PATCH 11/21] Update semantic-layer-3-build-semantic-models.md --- .../semantic-layer-3-build-semantic-models.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md index 8b90bcef97a..efb3c64ac62 100644 --- a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md +++ b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md @@ -291,7 +291,7 @@ semantic_models: agg: sum ``` -### Parallel subfoldering approach +### Parallel sub-folder approach @@ -341,15 +341,15 @@ semantic_models: As you can see, the content of the semantic model is identical in both approaches. The key differences are: -1. **File location**: +1. **File location** - Co-located approach: `models/marts/orders.yml` - - Parallel subfoldering approach: `models/semantic_models/sem_orders.yml` + - Parallel sub-folder approach: `models/semantic_models/sem_orders.yml` -2. **File naming**: +2. **File naming** - Co-located approach: Uses the same name as the corresponding mart (`orders.yml`) - - Parallel subfoldering approach: Prefixes the file with `sem_` (`sem_orders.yml`) + - Parallel sub-folder approach: Prefixes the file with `sem_` (`sem_orders.yml`) -Choose the approach that best fits your project structure and team preferences. The co-located approach is often simpler for new projects, while the parallel subfoldering approach can be clearer for large existing projects being migrated to use the Semantic Layer. +Choose the approach that best fits your project structure and team preferences. The co-located approach is often simpler for new projects, while the parallel sub-folder approach can be clearer for migrating large existing projects to the Semantic Layer. ## Next steps From eed19df7eb7a8f8c3f389457dbc6df4da35faa16 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:15:24 +0100 Subject: [PATCH 12/21] Update semantic-layer-3-build-semantic-models.md --- .../semantic-layer-3-build-semantic-models.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md index efb3c64ac62..da882dba6c5 100644 --- a/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md +++ b/website/docs/best-practices/how-we-build-our-metrics/semantic-layer-3-build-semantic-models.md @@ -243,7 +243,7 @@ measures: Our completed code will look like this, our first semantic model! Here are two examples showing different organizational approaches: -### Co-located approach + @@ -290,8 +290,9 @@ semantic_models: description: The total tax paid on each order. agg: sum ``` + -### Parallel sub-folder approach + @@ -338,6 +339,7 @@ semantic_models: description: The total tax paid on each order. agg: sum ``` + As you can see, the content of the semantic model is identical in both approaches. The key differences are: From 61529628cb65b43ea5bba9a5c566e4ff386ef667 Mon Sep 17 00:00:00 2001 From: Natalie Fiann Date: Fri, 18 Oct 2024 11:20:20 +0100 Subject: [PATCH 13/21] Updated docs to add section on fail-over to production and staging ennvironment / resolve refs in dowstream projects --- .../docs/docs/collaborate/govern/project-dependencies.md | 6 +++++- website/docs/guides/mesh-qs.md | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/website/docs/docs/collaborate/govern/project-dependencies.md b/website/docs/docs/collaborate/govern/project-dependencies.md index 2e73eee028b..55a50627610 100644 --- a/website/docs/docs/collaborate/govern/project-dependencies.md +++ b/website/docs/docs/collaborate/govern/project-dependencies.md @@ -21,6 +21,7 @@ This year, dbt Labs is introducing an expanded notion of `dependencies` across m - Use a supported version of dbt (v1.6, v1.7, or go versionless with "[Versionless](/docs/dbt-versions/upgrade-dbt-version-in-cloud#versionless)") for both the upstream ("producer") project and the downstream ("consumer") project. - Define models in an upstream ("producer") project that are configured with [`access: public`](/reference/resource-configs/access). You need at least one successful job run after defining their `access`. - Define a deployment environment in the upstream ("producer") project [that is set to be your Production environment](/docs/deploy/deploy-environments#set-as-production-environment), and ensure it has at least one successful job run in that environment. +- Execute a job in the staging environment of the upstream project in order for the downstream cross-project ref to resolve. - Each project `name` must be unique in your dbt Cloud account. For example, if you have a dbt project (codebase) for the `jaffle_marketing` team, you should not create separate projects for `Jaffle Marketing - Dev` and `Jaffle Marketing - Prod`. That isolation should instead be handled at the environment level. - We are adding support for environment-level permissions and data warehouse connections; please contact your dbt Labs account team for beta access. - The `dbt_project.yml` file is case-sensitive, which means the project name must exactly match the name in your `dependencies.yml`. For example, if your project name is `jaffle_marketing`, you should use `jaffle_marketing` (not `JAFFLE_MARKETING`) in all related files. @@ -110,7 +111,10 @@ Read [Why use a staging environment](/docs/deploy/deploy-environments#why-use-a- #### Staging with downstream dependencies -dbt Cloud begins using the Staging environment to resolve cross-project references from downstream projects as soon as it exists in a project without "fail-over" to Production. To avoid causing downtime for downstream developers, you should define and trigger a job before marking the environment as Staging: +dbt Cloud begins using the Staging environment to resolve cross-project references from downstream projects as soon as it exists in a project without "fail-over" to Production. This means that dbt Cloud will consistently use metadata from the Staging environment to resolve references in downstream projects, even if there haven't been any successful runs in the configured Staging environment. + +To avoid causing downtime for downstream developers, you should define and trigger a job before marking the environment as Staging: + 1. Create a new environment, but do NOT mark it as **Staging**. 2. Define a job in that environment. 3. Trigger the job to run, and ensure it completes successfully. diff --git a/website/docs/guides/mesh-qs.md b/website/docs/guides/mesh-qs.md index 0d13d043059..47ece7b29ec 100644 --- a/website/docs/guides/mesh-qs.md +++ b/website/docs/guides/mesh-qs.md @@ -300,6 +300,8 @@ To run your first deployment dbt Cloud job, you will need to create a new dbt Cl 5. After the run is complete, click **Explore** from the upper menu bar. You should now see your lineage, tests, and documentation coming through successfully. +For details on how dbt Cloud uses metadata from the Staging environment to resolve references in downstream projects, check out the section on [Staging with downstream dependencies](/docs/collaborate/govern/project-dependencies#staging-with-downstream-dependencies). + ## Reference a public model in your downstream project In this section, you will set up the downstream project, "Jaffle | Finance", and [cross-project reference](/docs/collaborate/govern/project-dependencies) the `fct_orders` model from the foundational project. Navigate to the **Develop** page to set up our project: From 73a926ad264dc98414ef646a721bf9ead9c5115d Mon Sep 17 00:00:00 2001 From: nataliefiann <120089939+nataliefiann@users.noreply.github.com> Date: Fri, 18 Oct 2024 11:34:52 +0100 Subject: [PATCH 14/21] Update website/docs/docs/collaborate/govern/project-dependencies.md Co-authored-by: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> --- website/docs/docs/collaborate/govern/project-dependencies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/collaborate/govern/project-dependencies.md b/website/docs/docs/collaborate/govern/project-dependencies.md index 55a50627610..c054d1b27b7 100644 --- a/website/docs/docs/collaborate/govern/project-dependencies.md +++ b/website/docs/docs/collaborate/govern/project-dependencies.md @@ -21,7 +21,7 @@ This year, dbt Labs is introducing an expanded notion of `dependencies` across m - Use a supported version of dbt (v1.6, v1.7, or go versionless with "[Versionless](/docs/dbt-versions/upgrade-dbt-version-in-cloud#versionless)") for both the upstream ("producer") project and the downstream ("consumer") project. - Define models in an upstream ("producer") project that are configured with [`access: public`](/reference/resource-configs/access). You need at least one successful job run after defining their `access`. - Define a deployment environment in the upstream ("producer") project [that is set to be your Production environment](/docs/deploy/deploy-environments#set-as-production-environment), and ensure it has at least one successful job run in that environment. -- Execute a job in the staging environment of the upstream project in order for the downstream cross-project ref to resolve. +- If the upstream project has a Staging environment, run a job in that Staging environment to ensure the downstream cross-project ref resolves. - Each project `name` must be unique in your dbt Cloud account. For example, if you have a dbt project (codebase) for the `jaffle_marketing` team, you should not create separate projects for `Jaffle Marketing - Dev` and `Jaffle Marketing - Prod`. That isolation should instead be handled at the environment level. - We are adding support for environment-level permissions and data warehouse connections; please contact your dbt Labs account team for beta access. - The `dbt_project.yml` file is case-sensitive, which means the project name must exactly match the name in your `dependencies.yml`. For example, if your project name is `jaffle_marketing`, you should use `jaffle_marketing` (not `JAFFLE_MARKETING`) in all related files. From cdf3afa6c844093e93d481885afab2b6562f4ba3 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:04:56 +0100 Subject: [PATCH 15/21] Update website/docs/docs/build/cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 66018461704..1e17bc17a1e 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -62,7 +62,7 @@ When reading about `type_params::measure`, you may notice there are different wa type_params: measure: revenue ``` -- Object syntax — To add more details or attributes to the measure (such as adding a filter, handling `null` values, or specifying whether to join to a time spine), you must use the object syntax. This allows for additional configuration beyond just the measure's name. +- Object syntax — To add more details or attributes to the measure (such as adding a filter, handling `null` values, or specifying whether to join to a time spine), you need to use the object syntax. This allows for additional configuration beyond just the measure's name. ```yaml type_params: From 09297654f056194871a554ebf127abe6d7bc104c Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:19:35 +0100 Subject: [PATCH 16/21] Update website/docs/docs/build/cumulative-metrics.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 1e17bc17a1e..42f1e66fd22 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -29,7 +29,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `measure::name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional | | `measure::fill_nulls_with` | Sets a value (e.g., zero) to replace nulls in the metric definition. | Optional | | `measure::join_to_timespine` | Boolean indicating if the aggregated measure should be joined to the time spine table to fill in missing dates. Default is `false`. | Optional | -| `type_params::cumulative_type_params` | Allows configuration of attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | +| `type_params::cumulative_type_params` | Configures the attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | | `cumulative_type_params::window` | Specifies the accumulation window, such as 1 month, 7 days, or 1 year. Cannot be used with `grain_to_date`. | Optional | | `cumulative_type_params::grain_to_date` | Sets the accumulation grain, such as `month`, restarting accumulation at the beginning of each specified grain period. Cannot be used with `window`. | Optional | | `cumulative_type_params::period_agg` | Defines how to aggregate the cumulative metric when summarizing data to a different granularity: `first`, `last`, or `average`. Defaults to `first` if `window` is not specified. | Optional | From 2e95ae76896b46ddefbf37d728de50d21d586089 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:19:45 +0100 Subject: [PATCH 17/21] Update website/docs/docs/build/cumulative-metrics.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 42f1e66fd22..9b1b95e7eba 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -56,7 +56,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested -When reading about `type_params::measure`, you may notice there are different ways of writing it: +The`type_params::measure` configuration can be written in different ways: - Shorthand syntax — To only specify the name of the measure, use a simple string value. This is a shorthand approach when no other attributes are required. ```yaml type_params: From f8514b4033a1ab69ca9007b6aa17fbdc269d390f Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:20:19 +0100 Subject: [PATCH 18/21] Update website/docs/docs/build/cumulative-metrics.md Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 9b1b95e7eba..acdf4fb380c 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -27,7 +27,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `type_params` | The type parameters of the metric. Supports nested parameters indicated by the double colon, such as `type_params::measure`. | Required | | `type_params::measure` | The measure associated with the metric. Supports both shorthand (string) and object syntax. The shorthand is used if only the name is needed, while the object syntax allows specifying additional attributes. | Required | | `measure::name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional | -| `measure::fill_nulls_with` | Sets a value (e.g., zero) to replace nulls in the metric definition. | Optional | +| `measure::fill_nulls_with` | Sets a value (for example, zero) to replace nulls in the metric definition. | Optional | | `measure::join_to_timespine` | Boolean indicating if the aggregated measure should be joined to the time spine table to fill in missing dates. Default is `false`. | Optional | | `type_params::cumulative_type_params` | Configures the attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | | `cumulative_type_params::window` | Specifies the accumulation window, such as 1 month, 7 days, or 1 year. Cannot be used with `grain_to_date`. | Optional | From 56d7c1b4ac4ad832e50e2af3c94fc0c174c57420 Mon Sep 17 00:00:00 2001 From: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:36:12 -0400 Subject: [PATCH 19/21] Updating licenses, access, and RBAC (#6310) 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? - Updates RBAC links - Removes stale page - Updates permissions specific links (they just go to the main page anyway) - Cut back on the service tokens permissions list as it was inconsistent and linking to areas that don't exist. Updated to link to the permissions page at the top ## Checklist - [ ] 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. - [ ] 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. - [ ] I have added checklist item(s) to this list for anything anything that needs to happen before this PR is merged, such as "needs technical review" or "change base branch." --- 🚀 Deployment available! Here are the direct links to the updated files: - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/best-practices/how-we-mesh/mesh-5-faqs - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/about-cloud/architecture - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/about-access - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/cloud-seats-and-users - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/enterprise-permissions - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/environment-permissions - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/licenses-and-groups - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/set-up-sso-google-workspace - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/cloud/manage-access/set-up-sso-okta - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/dbt-cloud-apis/service-tokens - https://docs-getdbt-com-git-cleanup-access-dbt-labs.vercel.app/docs/deploy/webhooks --------- Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- .../best-practices/how-we-mesh/mesh-5-faqs.md | 2 +- .../docs/cloud/about-cloud/architecture.md | 2 +- .../docs/cloud/manage-access/about-access.md | 2 +- .../manage-access/cloud-seats-and-users.md | 2 +- .../manage-access/enterprise-permissions.md | 18 +-- .../manage-access/environment-permissions.md | 2 +- .../manage-access/licenses-and-groups.md | 145 ------------------ .../set-up-sso-google-workspace.md | 2 +- .../cloud/manage-access/set-up-sso-okta.md | 2 +- .../docs/dbt-cloud-apis/service-tokens.md | 96 ++++-------- website/docs/docs/deploy/webhooks.md | 2 +- 11 files changed, 39 insertions(+), 236 deletions(-) delete mode 100644 website/docs/docs/cloud/manage-access/licenses-and-groups.md diff --git a/website/docs/best-practices/how-we-mesh/mesh-5-faqs.md b/website/docs/best-practices/how-we-mesh/mesh-5-faqs.md index 1ae49928ae5..9f12f7d2c20 100644 --- a/website/docs/best-practices/how-we-mesh/mesh-5-faqs.md +++ b/website/docs/best-practices/how-we-mesh/mesh-5-faqs.md @@ -215,7 +215,7 @@ There’s model-level access within dbt, role-based access for users and groups First things first: access to underlying data is always defined and enforced by the underlying data platform (for example, BigQuery, Databricks, Redshift, Snowflake, Starburst, etc.) This access is managed by executing “DCL statements” (namely `grant`). dbt makes it easy to [configure `grants` on models](/reference/resource-configs/grants), which provision data access for other roles/users/groups in the data warehouse. However, dbt does _not_ automatically define or coordinate those grants unless they are configured explicitly. Refer to your organization's system for managing data warehouse permissions. -[dbt Cloud Enterprise plans](https://www.getdbt.com/pricing) support [role-based access control (RBAC)](/docs/cloud/manage-access/enterprise-permissions#how-to-set-up-rbac-groups-in-dbt-cloud) that manages granular permissions for users and user groups. You can control which users can see or edit all aspects of a dbt Cloud project. A user’s access to dbt Cloud projects also determines whether they can “explore” that project in detail. Roles, users, and groups are defined within the dbt Cloud application via the UI or by integrating with an identity provider. +[dbt Cloud Enterprise plans](https://www.getdbt.com/pricing) support [role-based access control (RBAC)](/docs/cloud/manage-access/about-user-access#role-based-access-control-) that manages granular permissions for users and user groups. You can control which users can see or edit all aspects of a dbt Cloud project. A user’s access to dbt Cloud projects also determines whether they can “explore” that project in detail. Roles, users, and groups are defined within the dbt Cloud application via the UI or by integrating with an identity provider. [Model access](/docs/collaborate/govern/model-access) defines where models can be referenced. It also informs the discoverability of those projects within dbt Explorer. Model `access` is defined in code, just like any other model configuration (`materialized`, `tags`, etc). diff --git a/website/docs/docs/cloud/about-cloud/architecture.md b/website/docs/docs/cloud/about-cloud/architecture.md index 52614f0cbcd..ecf67b83a96 100644 --- a/website/docs/docs/cloud/about-cloud/architecture.md +++ b/website/docs/docs/cloud/about-cloud/architecture.md @@ -48,7 +48,7 @@ The git repo information is stored on dbt Cloud servers to make it accessible du ### Authentication services -The default settings of dbt Cloud enable local users with credentials stored in dbt Cloud. Still, integrations with various authentication services are offered as an alternative, including [single sign-on services](/docs/cloud/manage-access/sso-overview). Access to features can be granted/restricted by role using [RBAC](/docs/cloud/manage-access/enterprise-permissions). +The default settings of dbt Cloud enable local users with credentials stored in dbt Cloud. Still, integrations with various authentication services are offered as an alternative, including [single sign-on services](/docs/cloud/manage-access/sso-overview). Access to features can be granted/restricted by role using [RBAC](/docs/cloud/manage-access/about-user-access#role-based-access-control-). SSO features are essential because they reduce the number of credentials a user must maintain. Users sign in once and the authentication token is shared among integrated services (such as dbt Cloud). The token expires and must be refreshed at predetermined intervals, requiring the user to go through the authentication process again. If the user is disabled in the SSO provider service, their access to dbt Cloud is disabled, and they cannot override this with local auth credentials. diff --git a/website/docs/docs/cloud/manage-access/about-access.md b/website/docs/docs/cloud/manage-access/about-access.md index 6b02d9eb17b..b970b0d5763 100644 --- a/website/docs/docs/cloud/manage-access/about-access.md +++ b/website/docs/docs/cloud/manage-access/about-access.md @@ -89,7 +89,7 @@ There are three license types in dbt Cloud: - **Developer** — User can be granted _any_ permissions. - **Read-Only** — User has read-only permissions applied to all dbt Cloud resources regardless of the role-based permissions that the user is assigned. -- **IT** — User has [Security Admin](/docs/cloud/manage-access/enterprise-permissions#security-admin) and [Billing Admin](/docs/cloud/manage-access/enterprise-permissions#billing-admin) permissions applied, regardless of the group permissions assigned. +- **IT** — User has Security Admin and Billing Admin [permissions](/docs/cloud/manage-access/enterprise-permissions) applied, regardless of the group permissions assigned. Developer licenses will make up a majority of the users in your environment and have the highest impact on billing, so it's important to monitor how many you have at any given time. diff --git a/website/docs/docs/cloud/manage-access/cloud-seats-and-users.md b/website/docs/docs/cloud/manage-access/cloud-seats-and-users.md index da19f30ab4c..66d821b90d0 100644 --- a/website/docs/docs/cloud/manage-access/cloud-seats-and-users.md +++ b/website/docs/docs/cloud/manage-access/cloud-seats-and-users.md @@ -55,7 +55,7 @@ If you're on an Enterprise plan and have the correct [permissions](/docs/cloud/m - To add a user, go to **Account Settings** and select **Users**. - Click the [**Invite Users**](/docs/cloud/manage-access/invite-users) button. - - For fine-grained permission configuration, refer to [Role based access control](/docs/cloud/manage-access/enterprise-permissions). + - For fine-grained permission configuration, refer to [Role based access control](/docs/cloud/manage-access/about-user-access#role-based-access-control-).
diff --git a/website/docs/docs/cloud/manage-access/enterprise-permissions.md b/website/docs/docs/cloud/manage-access/enterprise-permissions.md index a1f6d795c23..5a56900d529 100644 --- a/website/docs/docs/cloud/manage-access/enterprise-permissions.md +++ b/website/docs/docs/cloud/manage-access/enterprise-permissions.md @@ -22,22 +22,14 @@ The following roles and permission sets are available for assignment in dbt Clou :::tip Licenses or Permission sets -The user's [license](/docs/cloud/manage-access/seats-and-users) type always overrides their assigned permission set. This means that even if a user belongs to a dbt Cloud group with 'Account Admin' permissions, having a 'Read-Only' license would still prevent them from performing administrative actions on the account. +The user's [license](/docs/cloud/manage-access/about-user-access) type always overrides their assigned permission set. This means that even if a user belongs to a dbt Cloud group with 'Account Admin' permissions, having a 'Read-Only' license would still prevent them from performing administrative actions on the account. ::: -## How to set up RBAC Groups in dbt Cloud +## Additional resources -Role-Based Access Control (RBAC) is helpful for automatically assigning permissions to dbt admins based on their SSO provider group associations. RBAC does not apply to [model groups](/docs/collaborate/govern/model-access#groups). +- [Grant users access](/docs/cloud/manage-access/about-user-access#grant-access) +- [Role-based access control](/docs/cloud/manage-access/about-user-access#role-based-access-control-) +- [Environment-level permissions](/docs/cloud/manage-access/environment-permissions) -1. Click the gear icon to the top right and select **Account Settings**. Click **Groups & Licenses** - - - -2. Select an existing group or create a new group to add RBAC. Name the group (this can be any name you like, but it's recommended to keep it consistent with the SSO groups). If you have configured SSO with SAML 2.0, you may have to use the GroupID instead of the name of the group. -3. Configure the SSO provider groups you want to add RBAC by clicking **Add** in the **SSO** section. These fields are case-sensitive and must match the source group formatting. -4. Configure the permissions for users within those groups by clicking **Add** in the **Access** section of the window. - - -5. When you've completed your configurations, click **Save**. Users will begin to populate the group automatically once they have signed in to dbt Cloud with their SSO credentials. diff --git a/website/docs/docs/cloud/manage-access/environment-permissions.md b/website/docs/docs/cloud/manage-access/environment-permissions.md index 44cf2dc9a64..b99da64609c 100644 --- a/website/docs/docs/cloud/manage-access/environment-permissions.md +++ b/website/docs/docs/cloud/manage-access/environment-permissions.md @@ -77,4 +77,4 @@ If the user has the same roles across projects, you can apply environment access ## Related docs --[Environment-level permissions setup](/docs/cloud/manage-access/environment-permissions-setup) +- [Environment-level permissions setup](/docs/cloud/manage-access/environment-permissions-setup) diff --git a/website/docs/docs/cloud/manage-access/licenses-and-groups.md b/website/docs/docs/cloud/manage-access/licenses-and-groups.md deleted file mode 100644 index b91af80f9b3..00000000000 --- a/website/docs/docs/cloud/manage-access/licenses-and-groups.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "Licenses and groups" -id: "licenses-and-groups" ---- - -## Overview - -dbt Cloud administrators can use dbt Cloud's permissioning model to control -user-level access in a dbt Cloud account. This access control comes in two flavors: -License-based and Role-based. - -- **License-based Access Controls:** User are configured with account-wide - license types. These licenses control the specific parts of the dbt Cloud application - that a given user can access. -- **Role-based Access Control (RBAC):** Users are assigned to _groups_ that have - specific permissions on specific projects or the entire account. A user may be - a member of multiple groups, and those groups may have permissions on multiple - projects. - -## License-based access control - -Each user on an account is assigned a license type when the user is first -invited to a given account. This license type may change over time, but a -user can only have one type of license at any given time. - -A user's license type controls the features in dbt Cloud that the user is able -to access. dbt Cloud's three license types are: - - **Read-Only** - - **Developer** - - **IT** - -For more information on these license types, see [Seats & Users](/docs/cloud/manage-access/seats-and-users). -At a high-level, Developers may be granted _any_ permissions, whereas Read-Only -users will have read-only permissions applied to all dbt Cloud resources -regardless of the role-based permissions that the user is assigned. IT users will have Security Admin and Billing Admin permissions applied regardless of the role-based permissions that the user is assigned. - -## Role-based access control - -:::info dbt Cloud Enterprise - -Role-based access control is a feature of the dbt Cloud Enterprise plan - -::: - -Role-based access control allows for fine-grained permissioning in the dbt Cloud -application. With role-based access control, users can be assigned varying -permissions to different projects within a dbt Cloud account. For teams on the -Enterprise tier, role-based permissions can be generated dynamically from -configurations in an [Identity Provider](sso-overview). - -Role-based permissions are applied to _groups_ and pertain to _projects_. The -assignable permissions themselves are granted via _permission sets_. - - -### Groups - -A group is a collection of users. Users may belong to multiple groups. Members -of a group inherit any permissions applied to the group itself. - -Users can be added to a dbt Cloud group based on their group memberships in the -configured [Identity Provider](sso-overview) for the account. In this way, dbt -Cloud administrators can manage access to dbt Cloud resources via identity -management software like Microsoft Entra ID (formerly Azure AD), Okta, or GSuite. See _SSO Mappings_ below for -more information. - -You can view the groups in your account or create new groups from the **Team > Groups** -page in your Account Settings. - - - - -### SSO Mappings - -SSO Mappings connect Identity Provider (IdP) group membership to dbt Cloud group -membership. When a user logs into dbt Cloud via a supported identity provider, -their IdP group memberships are synced with dbt Cloud. Upon logging in -successfully, the user's group memberships (and therefore, permissions) are -adjusted accordingly within dbt Cloud automatically. - -:::tip Creating SSO Mappings - -While dbt Cloud supports mapping multiple IdP groups to a single dbt Cloud -group, we recommend using a 1:1 mapping to make administration as simple as -possible. Consider using the same name for your dbt Cloud groups and your IdP -groups. - -::: - - -### Permission Sets - -Permission sets are predefined collections of granular permissions. Permission -sets combine low-level permission grants into high-level roles that can be -assigned to groups. Some examples of existing permission sets are: - - Account Admin - - Git Admin - - Job Admin - - Job Viewer - - ...and more - -For a full list of enterprise permission sets, see [Enterprise Permissions](/docs/cloud/manage-access/enterprise-permissions). -These permission sets are available for assignment to groups and control the ability -for users in these groups to take specific actions in the dbt Cloud application. - -In the following example, the _dbt Cloud Owners_ group is configured with the -**Account Admin** permission set on _All Projects_ and the **Job Admin** permission -set on the _Internal Analytics_ project. - - - - -### Manual assignment - -dbt Cloud administrators can manually assign users to groups independently of -IdP attributes. If a dbt Cloud group is configured _without_ any -SSO Mappings, then the group will be _unmanaged_ and dbt Cloud will not adjust -group membership automatically when users log into dbt Cloud via an identity -provider. This behavior may be desirable for teams that have connected an identity -provider, but have not yet configured SSO Mappings between dbt Cloud and the -IdP. - -If an SSO Mapping is added to an _unmanaged_ group, then it will become -_managed_, and dbt Cloud may add or remove users to the group automatically at -sign-in time based on the user's IdP-provided group membership information. - - -## FAQs -- **When are IdP group memberships updated for SSO Mapped groups?** Group memberships - are updated every time a user logs into dbt Cloud via a supported SSO provider. If - you've changed group memberships in your identity provider or dbt Cloud, ask your - users to log back into dbt Cloud for these group memberships to be synchronized. - -- **Can I set up SSO without RBAC?** Yes, see the documentation on - [Manual Assignment](#manual-assignment) above for more information on using - SSO without RBAC. - -- **Can I configure a user's License Type based on IdP Attributes?** Yes, see - the docs on [managing license types](/docs/cloud/manage-access/seats-and-users#managing-license-types) - for more information. diff --git a/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md b/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md index e4ff998015c..2b2575efc57 100644 --- a/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md +++ b/website/docs/docs/cloud/manage-access/set-up-sso-google-workspace.md @@ -117,7 +117,7 @@ If the verification information looks appropriate, then you have completed the c ## Setting up RBAC Now you have completed setting up SSO with GSuite, the next steps will be to set up -[RBAC groups](/docs/cloud/manage-access/enterprise-permissions) to complete your access control configuration. +[RBAC groups](/docs/cloud/manage-access/about-user-access#role-based-access-control-) to complete your access control configuration. ## Troubleshooting diff --git a/website/docs/docs/cloud/manage-access/set-up-sso-okta.md b/website/docs/docs/cloud/manage-access/set-up-sso-okta.md index 53986513ce2..fda32f118ef 100644 --- a/website/docs/docs/cloud/manage-access/set-up-sso-okta.md +++ b/website/docs/docs/cloud/manage-access/set-up-sso-okta.md @@ -190,4 +190,4 @@ configured in the steps above. ## Setting up RBAC Now you have completed setting up SSO with Okta, the next steps will be to set up -[RBAC groups](/docs/cloud/manage-access/enterprise-permissions) to complete your access control configuration. +[RBAC groups](/docs/cloud/manage-access/about-user-access#role-based-access-control-) to complete your access control configuration. diff --git a/website/docs/docs/dbt-cloud-apis/service-tokens.md b/website/docs/docs/dbt-cloud-apis/service-tokens.md index fe8ace5fa34..93a89922456 100644 --- a/website/docs/docs/dbt-cloud-apis/service-tokens.md +++ b/website/docs/docs/dbt-cloud-apis/service-tokens.md @@ -36,80 +36,36 @@ You can assign service account tokens to any permission set available in dbt Clo ### Team plans using service account tokens -The following permissions can be assigned to a service account token on a Team plan. +The following permissions can be assigned to a service account token on a Team plan. Refer to [Enterprise permissions](/docs/cloud/manage-access/enterprise-permissions) for more information about these roles. -**Account Admin**
-Account Admin service tokens have full `read + write` access to an account, so please use them with caution. A Team plan refers to this permission set as an "Owner role." For more on these permissions, see [Account Admin](/docs/cloud/manage-access/enterprise-permissions#account-admin). - -**Metadata Only**
-Metadata-only service tokens authorize requests to the Discovery API. - -**Semantic Layer Only**
-Semantic Layer-only service tokens authorize requests to the Semantic Layer APIs. - -**Job Admin**
-Job admin service tokens can authorize requests for viewing, editing, and creating environments, triggering runs, and viewing historical runs. - -**Job Runner**
-Job runner service tokens can authorize requests for triggering runs and viewing historical runs. - -**Member**
-Member service tokens can authorize requests for viewing and editing resources, triggering runs, and inviting members to the account. Tokens assigned the Member permission set will have the same permissions as a Member user. For more information about Member users, see "[Self-service Team plan permissions](/docs/cloud/manage-access/self-service-permissions)". - -**Read-only**
-Read-only service tokens can authorize requests for viewing a read-only dashboard, viewing generated documentation, and viewing source freshness reports. This token can access and retrieve account-level information endpoints on the [Admin API](/docs/dbt-cloud-apis/admin-cloud-api) and authorize requests to the [Discovery API](/docs/dbt-cloud-apis/discovery-api). +- Account Admin — Account Admin service tokens have full `read + write` access to an account, so please use them with caution. A Team plan refers to this permission set as an "Owner role." +- Job Admin +- Job Runner +- Metadata Only +- Member +- Read-only +- Semantic Layer Only ### Enterprise plans using service account tokens -The following permissions can be assigned to a service account token on an Enterprise plan. For more details about these permissions, see "[Enterprise permissions](/docs/cloud/manage-access/enterprise-permissions)." - -**Account Admin**
-Account Admin service tokens have full `read + write` access to an account, so please use them with caution. For more on these permissions, see [Account Admin](/docs/cloud/manage-access/enterprise-permissions#account-admin). - -**Security Admin**
-Security Admin service tokens have certain account-level permissions. For more on these permissions, see [Security Admin](/docs/cloud/manage-access/enterprise-permissions#security-admin). - -**Billing Admin**
-Billing Admin service tokens have certain account-level permissions. For more on these permissions, see [Billing Admin](/docs/cloud/manage-access/enterprise-permissions#billing-admin). - -**Manage marketplace apps**
-Used only for service tokens assigned to marketplace apps (for example, the [Snowflake Native app](/docs/cloud-integrations/snowflake-native-app)). - -**Metadata Only**
-Metadata-only service tokens authorize requests to the Discovery API. - -**Semantic Layer Only**
-Semantic Layer-only service tokens authorize requests to the Semantic Layer APIs. - -**Job Admin**
-Job Admin service tokens can authorize requests for viewing, editing, and creating environments, triggering runs, and viewing historical runs. For more on these permissions, see [Job Admin](/docs/cloud/manage-access/enterprise-permissions#job-admin). - -**Account Viewer**
-Account Viewer service tokens have read-only access to dbt Cloud accounts. For more on these permissions, see [Account Viewer](/docs/cloud/manage-access/enterprise-permissions#account-viewer) on the Enterprise Permissions page. - -**Admin**
-Admin service tokens have unrestricted access to projects in dbt Cloud accounts. You have the option to grant that permission all projects in the account or grant the permission only on specific projects. For more on these permissions, see [Admin Service](/docs/cloud/manage-access/enterprise-permissions#admin-service) on the Enterprise Permissions page. - -**Git Admin**
-Git admin service tokens have all the permissions listed in [Git admin](/docs/cloud/manage-access/enterprise-permissions#git-admin) on the Enterprise Permissions page. - -**Database Admin**
-Database admin service tokens have all the permissions listed in [Database admin](/docs/cloud/manage-access/enterprise-permissions#database-admin) on the Enterprise Permissions page. - -**Team Admin**
-Team admin service tokens have all the permissions listed in [Team admin](/docs/cloud/manage-access/enterprise-permissions#team-admin) on the Enterprise Permissions page. - -**Job Viewer**
-Job viewer admin service tokens have all the permissions listed in [Job viewer](/docs/cloud/manage-access/enterprise-permissions#job-viewer) on the Enterprise Permissions page. - -**Developer**
-Developer service tokens have all the permissions listed in [Developer](/docs/cloud/manage-access/enterprise-permissions#developer) on the Enterprise Permissions page. - -**Analyst**
-Analyst admin service tokens have all the permissions listed in [Analyst](/docs/cloud/manage-access/enterprise-permissions#analyst) on the Enterprise Permissions page. - -**Stakeholder**
-Stakeholder service tokens have all the permissions listed in [Stakeholder](/docs/cloud/manage-access/enterprise-permissions#stakeholder) on the Enterprise Permissions page. +Refer to [Enterprise permissions](/docs/cloud/manage-access/enterprise-permissions) for more information about these roles. + +- Account Admin — Account Admin service tokens have full `read + write` access to an account, so please use them with caution. +- Account Viewer +- Admin +- Analyst +- Billing Admin +- Database Admin +- Developer +- Git Admin +- Job Admin +- Job Viewer +- Manage marketplace apps +- Metadata Only +- Semantic Layer Only +- Security Admin +- Stakeholder +- Team Admin ## Service token update diff --git a/website/docs/docs/deploy/webhooks.md b/website/docs/docs/deploy/webhooks.md index dfb8b7c7406..ffea38b5b84 100644 --- a/website/docs/docs/deploy/webhooks.md +++ b/website/docs/docs/deploy/webhooks.md @@ -29,7 +29,7 @@ You can also check out the free [dbt Fundamentals course](https://learn.getdbt.c ## Prerequisites - You have a dbt Cloud account that is on the [Team or Enterprise plan](https://www.getdbt.com/pricing/). - For `write` access to webhooks: - - **Enterprise plan accounts** — Permission sets are the same for both API service tokens and the dbt Cloud UI. You, or the API service token, must have the [Account Admin](/docs/cloud/manage-access/enterprise-permissions#account-admin), [Admin](/docs/cloud/manage-access/enterprise-permissions#admin), or [Developer](/docs/cloud/manage-access/enterprise-permissions#developer) permission set. + - **Enterprise plan accounts** — Permission sets are the same for both API service tokens and the dbt Cloud UI. You, or the API service token, must have the Account Admin, Admin, or Developer [permission set](/docs/cloud/manage-access/enterprise-permissions). - **Team plan accounts** — For the dbt Cloud UI, you need to have a [Developer license](/docs/cloud/manage-access/self-service-permissions). For API service tokens, you must assign the service token to have the [Account Admin or Member](/docs/dbt-cloud-apis/service-tokens#team-plans-using-service-account-tokens) permission set. - You have a multi-tenant or an AWS single-tenant deployment model in dbt Cloud. For more information, refer to [Tenancy](/docs/cloud/about-cloud/tenancy). - Your destination system supports [Authorization headers](#troubleshooting). From 606f242ab899eb1e70aaf75ac21f4619f1fb43b2 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:42:24 +0100 Subject: [PATCH 20/21] Update cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index acdf4fb380c..888da54a70f 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -27,7 +27,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `type_params` | The type parameters of the metric. Supports nested parameters indicated by the double colon, such as `type_params::measure`. | Required | | `type_params::measure` | The measure associated with the metric. Supports both shorthand (string) and object syntax. The shorthand is used if only the name is needed, while the object syntax allows specifying additional attributes. | Required | | `measure::name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional | -| `measure::fill_nulls_with` | Sets a value (for example, zero) to replace nulls in the metric definition. | Optional | +| `measure::fill_nulls_with` | Sets a value (for example, 0) to replace nulls in the metric definition. | Optional | | `measure::join_to_timespine` | Boolean indicating if the aggregated measure should be joined to the time spine table to fill in missing dates. Default is `false`. | Optional | | `type_params::cumulative_type_params` | Configures the attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | | `cumulative_type_params::window` | Specifies the accumulation window, such as 1 month, 7 days, or 1 year. Cannot be used with `grain_to_date`. | Optional | From 11cbe211098175cdd7fe661490dfd66ec448e62a Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:51:09 +0100 Subject: [PATCH 21/21] Update cumulative-metrics.md --- website/docs/docs/build/cumulative-metrics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/docs/build/cumulative-metrics.md b/website/docs/docs/build/cumulative-metrics.md index 888da54a70f..b44918d2fbd 100644 --- a/website/docs/docs/build/cumulative-metrics.md +++ b/website/docs/docs/build/cumulative-metrics.md @@ -30,7 +30,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `measure::fill_nulls_with` | Sets a value (for example, 0) to replace nulls in the metric definition. | Optional | | `measure::join_to_timespine` | Boolean indicating if the aggregated measure should be joined to the time spine table to fill in missing dates. Default is `false`. | Optional | | `type_params::cumulative_type_params` | Configures the attributes like `window`, `period_agg`, and `grain_to_date` for cumulative metrics. | Optional | -| `cumulative_type_params::window` | Specifies the accumulation window, such as 1 month, 7 days, or 1 year. Cannot be used with `grain_to_date`. | Optional | +| `cumulative_type_params::window` | Specifies the accumulation window, such as `1 month`, `7 days`, or `1 year`. Cannot be used with `grain_to_date`. | Optional | | `cumulative_type_params::grain_to_date` | Sets the accumulation grain, such as `month`, restarting accumulation at the beginning of each specified grain period. Cannot be used with `window`. | Optional | | `cumulative_type_params::period_agg` | Defines how to aggregate the cumulative metric when summarizing data to a different granularity: `first`, `last`, or `average`. Defaults to `first` if `window` is not specified. | Optional | @@ -45,7 +45,7 @@ Note that we use the double colon (::) to indicate whether a parameter is nested | `type` | The type of the metric (cumulative, derived, ratio, or simple). | Required | | `label` | Required string that defines the display value in downstream tools. Accepts plain text, spaces, and quotes (such as `orders_total` or `"orders_total"`). | Required | | `type_params` | The type parameters of the metric. Supports nested parameters indicated by the double colon, such as `type_params::measure`. | Required | -| `window` | The accumulation window, such as 1 month, 7 days, 1 year. This can't be used with `grain_to_date`. | Optional | +| `window` | The accumulation window, such as `1 month`, `7 days`, or `1 year`. This can't be used with `grain_to_date`. | Optional | | `grain_to_date` | Sets the accumulation grain, such as `month`, which will accumulate data for one month and then restart at the beginning of the next. This can't be used with `window`. | Optional | | `type_params::measure` | A list of measure inputs | Required | | `measure:name` | The name of the measure being referenced. Required if using object syntax for `type_params::measure`. | Optional |