From f6a79de570d15e765ba29130a3579092428653aa Mon Sep 17 00:00:00 2001 From: Jordi van Dooren Date: Wed, 18 Sep 2024 12:15:05 +0200 Subject: [PATCH 01/10] Move misplaced space inside around an ` ENV_VAR` --- website/docs/reference/global-configs/usage-stats.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/global-configs/usage-stats.md b/website/docs/reference/global-configs/usage-stats.md index 62ead8834a6..73610c29586 100644 --- a/website/docs/reference/global-configs/usage-stats.md +++ b/website/docs/reference/global-configs/usage-stats.md @@ -25,6 +25,6 @@ For full transparency, you can see all the event definitions in [`tracking.py`]( send_anonymous_usage_stats: False ``` - dbt Core users can also use the` DO_NOT_TRACK` environment variable to enable or disable sending anonymous data. For more information, see [Environment variables](/docs/build/environment-variables). + dbt Core users can also use the `DO_NOT_TRACK` environment variable to enable or disable sending anonymous data. For more information, see [Environment variables](/docs/build/environment-variables). `DO_NOT_TRACK=1` is the same as `DBT_SEND_ANONYMOUS_USAGE_STATS=False` From e90d3ee68d7534673249c240ba0a2d7f190cae19 Mon Sep 17 00:00:00 2001 From: Ly Nguyen <107218380+nghi-ly@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:51:50 -0700 Subject: [PATCH 02/10] Account settings (#6077) ## What are you changing in this pull request and why? - Reorganizing "account settings" to be on its own page (vs environments page). - Add to sidebar underneath the heading **Set up dbt > dbt Cloud** . ## 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] Add page in `website/sidebars.js` - [x] Provide a unique filename for new pages - [x] Run link testing locally with `npm run build` to update the links that point to deleted pages - [x] Update anchor links --------- Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/docs/cloud/account-settings.md | 50 ++++++++++++++++++ .../docs/dbt-versions/2023-release-notes.md | 2 +- .../docs/docs/dbt-versions/release-notes.md | 4 +- website/docs/docs/deploy/about-ci.md | 2 +- website/docs/docs/deploy/ci-jobs.md | 2 +- website/docs/guides/core-to-cloud-1.md | 6 +-- website/docs/guides/core-to-cloud-3.md | 6 +-- website/sidebars.js | 1 + website/snippets/_cloud-environments-info.md | 39 -------------- .../example-sidebar-account-settings.png | Bin 0 -> 25522 bytes 10 files changed, 62 insertions(+), 50 deletions(-) create mode 100644 website/docs/docs/cloud/account-settings.md create mode 100644 website/static/img/docs/dbt-cloud/example-sidebar-account-settings.png diff --git a/website/docs/docs/cloud/account-settings.md b/website/docs/docs/cloud/account-settings.md new file mode 100644 index 00000000000..6d35da3b5f3 --- /dev/null +++ b/website/docs/docs/cloud/account-settings.md @@ -0,0 +1,50 @@ +--- +title: "Account settings in dbt Cloud" +sidebar_label: "Account settings" +description: "Learn how to enable account settings for your dbt Cloud users." +--- + +The following sections describe the different **Account settings** available from your dbt Cloud account in the sidebar (under your account name on the lower left-hand side). + + + +## Git repository caching + +At the start of every job run, dbt Cloud clones the project's Git repository so it has the latest versions of your project's code and runs `dbt deps` to install your dependencies. + +For improved reliability and performance on your job runs, you can enable dbt Cloud to keep a cache of the project's Git repository. So, if there's a third-party outage that causes the cloning operation to fail, dbt Cloud will instead use the cached copy of the repo so your jobs can continue running as scheduled. + +dbt Cloud caches your project's Git repo after each successful run and retains it for 8 days if there are no repo updates. It caches all packages regardless of installation method and does not fetch code outside of the job runs. + +dbt Cloud will use the cached copy of your project's Git repo under these circumstances: + +- Outages from third-party services (for example, the [dbt package hub](https://hub.getdbt.com/)). +- Git authentication fails. +- There are syntax errors in the `packages.yml` file. You can set up and use [continuous integration (CI)](/docs/deploy/continuous-integration) to find these errors sooner. +- If a package doesn't work with the current dbt version. You can set up and use [continuous integration (CI)](/docs/deploy/continuous-integration) to identify this issue sooner. + +To use, select the **Enable repository caching** option from your account settings. + + + +## Partial parsing + +At the start of every dbt invocation, dbt reads all the files in your project, extracts information, and constructs an internal manifest containing every object (model, source, macro, and so on). Among other things, it uses the `ref()`, `source()`, and `config()` macro calls within models to set properties, infer dependencies, and construct your project's DAG. When dbt finishes parsing your project, it stores the internal manifest in a file called `partial_parse.msgpack`. + +Parsing projects can be time-consuming, especially for large projects with hundreds of models and thousands of files. To reduce the time it takes dbt to parse your project, use the partial parsing feature in dbt Cloud for your environment. When enabled, dbt Cloud uses the `partial_parse.msgpack` file to determine which files have changed (if any) since the project was last parsed, and then it parses _only_ the changed files and the files related to those changes. + +Partial parsing in dbt Cloud requires dbt version 1.4 or newer. The feature does have some known limitations. Refer to [Known limitations](/reference/parsing#known-limitations) to learn more about them. + +To use, select the **Enable partial parsing between deployment runs** option from your account settings. + + + +## Account access to Advanced CI features + +[Advanced CI](/docs/deploy/advanced-ci) features, such as [compare changes](/docs/deploy/advanced-ci#compare-changes), allow dbt Cloud account members to view details about the changes between what's in the production environment and the pull request. + +To use Advanced CI features, your dbt Cloud account must have access to them. Ask your dbt Cloud administrator to enable Advanced CI features on your account, which they can do by choosing the **Enable account access to Advanced CI** option from the account settings. + +Once enabled, the **Run compare changes** option becomes available in the CI job settings for you to select. + + \ No newline at end of file diff --git a/website/docs/docs/dbt-versions/2023-release-notes.md b/website/docs/docs/dbt-versions/2023-release-notes.md index d0af7f70126..60f4fd42929 100644 --- a/website/docs/docs/dbt-versions/2023-release-notes.md +++ b/website/docs/docs/dbt-versions/2023-release-notes.md @@ -110,7 +110,7 @@ Archived release notes for dbt Cloud from 2023 Now available for dbt Cloud Enterprise plans is a new option to enable Git repository caching for your job runs. When enabled, dbt Cloud caches your dbt project's Git repository and uses the cached copy instead if there's an outage with the Git provider. This feature improves the reliability and stability of your job runs. - To learn more, refer to [Repo caching](/docs/deploy/deploy-environments#git-repository-caching). + To learn more, refer to [Repo caching](/docs/cloud/account-settings#git-repository-caching). diff --git a/website/docs/docs/dbt-versions/release-notes.md b/website/docs/docs/dbt-versions/release-notes.md index 79adea9bfbb..ca128402743 100644 --- a/website/docs/docs/dbt-versions/release-notes.md +++ b/website/docs/docs/dbt-versions/release-notes.md @@ -309,7 +309,7 @@ The following features are new or enhanced as part of our [dbt Cloud Launch Show January also saw some refreshed content, either aligning with new product features or requests from the community: - - Native support for [partial parsing in dbt Cloud](https://docs.getdbt.com/docs/dbt-cloud-environments#partial-parsing) + - Native support for [partial parsing in dbt Cloud](https://docs.getdbt.com/docs/cloud/account-settings#partial-parsing) - Updated guidance on using dots or underscores in the [Best practice guide for models](https://docs.getdbt.com/best-practices/how-we-style/1-how-we-style-our-dbt-models) - Updated [PrivateLink for VCS docs](https://docs.getdbt.com/docs/cloud/secure/vcs-privatelink) - Added a new `job_runner` role in our [Enterprise project role permissions docs](https://docs.getdbt.com/docs/cloud/manage-access/enterprise-permissions#project-role-permissions) @@ -326,7 +326,7 @@ The following features are new or enhanced as part of our [dbt Cloud Launch Show By default, dbt parses all the files in your project at the beginning of every dbt invocation. Depending on the size of your project, this operation can take a long time to complete. With the new partial parsing feature in dbt Cloud, you can reduce the time it takes for dbt to parse your project. When enabled, dbt Cloud parses only the changed files in your project instead of parsing all the project files. As a result, your dbt invocations will take less time to run. - To learn more, refer to [Partial parsing](/docs/dbt-cloud-environments#partial-parsing). + To learn more, refer to [Partial parsing](/docs/cloud/account-settings#partial-parsing). diff --git a/website/docs/docs/deploy/about-ci.md b/website/docs/docs/deploy/about-ci.md index 51b3b160fae..1de9365219c 100644 --- a/website/docs/docs/deploy/about-ci.md +++ b/website/docs/docs/deploy/about-ci.md @@ -6,7 +6,7 @@ pagination_next: "docs/deploy/continuous-integration" hide_table_of_contents: true --- -Use [CI jobs](/docs/deploy/ci-jobs) in dbt Cloud to set up automation for testing code changes before merging to production. Additionally, [enable Advanced CI features](/docs/dbt-cloud-environments#account-access-to-advanced-ci-features) for these jobs to evaluate whether the code changes are producing the appropriate data changes you want by reviewing the comparison differences dbt provides. +Use [CI jobs](/docs/deploy/ci-jobs) in dbt Cloud to set up automation for testing code changes before merging to production. Additionally, [enable Advanced CI features](/docs/cloud/account-settings#account-access-to-advanced-ci-features) for these jobs to evaluate whether the code changes are producing the appropriate data changes you want by reviewing the comparison differences dbt provides. Refer to the guide [Get started with continuous integration tests](/guides/set-up-ci?step=1) for more information. diff --git a/website/docs/docs/deploy/ci-jobs.md b/website/docs/docs/deploy/ci-jobs.md index 0c4cad9e674..649d64d30c7 100644 --- a/website/docs/docs/deploy/ci-jobs.md +++ b/website/docs/docs/deploy/ci-jobs.md @@ -15,7 +15,7 @@ dbt Labs recommends that you create your CI job in a dedicated dbt Cloud [deploy - CI features: - For both the [concurrent CI checks](/docs/deploy/continuous-integration#concurrent-ci-checks) and [smart cancellation of stale builds](/docs/deploy/continuous-integration#smart-cancellation) features, your dbt Cloud account must be on the [Team or Enterprise plan](https://www.getdbt.com/pricing/). - [Advanced CI](/docs/deploy/advanced-ci) features: - - For the [compare changes](/docs/deploy/advanced-ci#compare-changes) feature, your dbt Cloud account must have access to Advanced CI. Please ask your [dbt Cloud administrator to enable](/docs/dbt-cloud-environments#account-access-to-advanced-ci-features) this for you. + - For the [compare changes](/docs/deploy/advanced-ci#compare-changes) feature, your dbt Cloud account must have access to Advanced CI. Please ask your [dbt Cloud administrator to enable](/docs/cloud/account-settings#account-access-to-advanced-ci-features) this for you. - Set up a [connection with your Git provider](/docs/cloud/git/git-configuration-in-dbt-cloud). This integration lets dbt Cloud run jobs on your behalf for job triggering. - If you're using a native [GitLab](/docs/cloud/git/connect-gitlab) integration, you need a paid or self-hosted account that includes support for GitLab webhooks and [project access tokens](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html). If you're using GitLab Free, merge requests will trigger CI jobs but CI job status updates (success or failure of the job) will not be reported back to GitLab. diff --git a/website/docs/guides/core-to-cloud-1.md b/website/docs/guides/core-to-cloud-1.md index 99c6ed82bf1..efed66c862a 100644 --- a/website/docs/guides/core-to-cloud-1.md +++ b/website/docs/guides/core-to-cloud-1.md @@ -76,9 +76,9 @@ This section outlines the steps to set up your dbt Cloud account and configure i ### Additional configuration Explore these additional configurations for performance and reliability improvements: -1. In **Account settings**, enable [partial parsing](/docs/deploy/deploy-environments#partial-parsing) to only reparse changed files, saving time. +1. In **Account settings**, enable [partial parsing](/docs/cloud/account-settings#partial-parsing) to only reparse changed files, saving time. -2. In **Account settings**, enable [Git repo caching](/docs/deploy/deploy-environments#git-repository-caching) for job reliability & third-party outage protection. +2. In **Account settings**, enable [Git repo caching](/docs/cloud/account-settings#git-repository-caching) for job reliability & third-party outage protection. ## Data platform setup @@ -142,7 +142,7 @@ The most common data environments are production, staging, and development. The - Streamlining the process of switching between development, staging, and production contexts. - Making it easy to configure environments through the dbt Cloud UI instead of manually editing the `profiles.yml` file. You can also [set up](/reference/dbt-jinja-functions/target) or [customize](/docs/build/custom-target-names) target names in dbt Cloud. - Adding `profiles.yml` attributes to dbt Cloud environment settings with [Extended Attributes](/docs/dbt-cloud-environments#extended-attributes). -- Using [Git repo caching](/docs/dbt-cloud-environments#git-repository-caching) to protect you from third-party outages, Git auth failures, and more. +- Using [Git repo caching](/docs/cloud/account-settings#git-repository-caching) to protect you from third-party outages, Git auth failures, and more. ### Initial setup steps 1. **Set up development environment** — Set up your [development](/docs/dbt-cloud-environments#create-a-development-environment) environment and [development credentials](/docs/cloud/dbt-cloud-ide/develop-in-the-cloud#access-the-cloud-ide). You’ll need this to access your dbt project and start developing. diff --git a/website/docs/guides/core-to-cloud-3.md b/website/docs/guides/core-to-cloud-3.md index 0ea22de8478..7d482d54471 100644 --- a/website/docs/guides/core-to-cloud-3.md +++ b/website/docs/guides/core-to-cloud-3.md @@ -99,11 +99,11 @@ dbt Cloud provides robust orchestration that enables you to schedule, run, and m ### Tips -- Enable [partial parsing](/docs/deploy/deploy-environments#partial-parsing) between jobs in dbt Cloud to significantly speed up project parsing by only processing changed files, optimizing performance for large projects. +- Enable [partial parsing](/docs/cloud/account-settings#partial-parsing) between jobs in dbt Cloud to significantly speed up project parsing by only processing changed files, optimizing performance for large projects. - [Run multiple CI/CD](/docs/deploy/continuous-integration) jobs at the same time which will not block production runs. The Job scheduler automatically cancels stale runs when a newer commit is pushed. This is because each PR will run in its own schema. - dbt Cloud automatically [cancels](/docs/deploy/job-scheduler#run-cancellation-for-over-scheduled-jobs) a scheduled run if the existing run is still executing. This prevents unnecessary, duplicative executions. -- Protect you and your data freshness from third-party outages by enabling dbt Cloud’s [Git repository caching](/docs/deploy/deploy-environments#git-repository-caching), which keeps a cache of the project's Git repository. -- [Link deploy jobs](/docs/deploy/deploy-jobs#trigger-on-job-completion--) across dbt Cloud projects by configuring your job or using the [Create Job API](/dbt-cloud/api-v2#/operations/Create%20Job) to do this. +- Protect you and your data freshness from third-party outages by enabling dbt Cloud’s [Git repository caching](/docs/cloud/account-settings#git-repository-caching), which keeps a cache of the project's Git repository. +- [Link deploy jobs](/docs/deploy/deploy-jobs#trigger-on-job-completion) across dbt Cloud projects by configuring your job or using the [Create Job API](/dbt-cloud/api-v2#/operations/Create%20Job) to do this. - [Rerun your jobs](/docs/deploy/retry-jobs) from the start or the point of failure if your dbt job run completed with a status of **`Error.`** ### Caveats diff --git a/website/sidebars.js b/website/sidebars.js index fe1118b3be2..3ecff4567ce 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -48,6 +48,7 @@ const sidebarSettings = { link: { type: "doc", id: "docs/cloud/about-cloud-setup" }, items: [ "docs/cloud/about-cloud-setup", + "docs/cloud/account-settings", "docs/dbt-cloud-environments", "docs/cloud/migration", { diff --git a/website/snippets/_cloud-environments-info.md b/website/snippets/_cloud-environments-info.md index 7c6cf2f9431..6addd6a3a7a 100644 --- a/website/snippets/_cloud-environments-info.md +++ b/website/snippets/_cloud-environments-info.md @@ -82,44 +82,5 @@ If you're developing in the [dbt Cloud IDE](/docs/cloud/dbt-cloud-ide/develop-in #### Only the **top-level keys** are accepted in extended attributes This means that if you want to change a specific sub-key value, you must provide the entire top-level key as a JSON block in your resulting YAML. For example, if you want to customize a particular field within a [service account JSON](/docs/core/connect-data-platform/bigquery-setup#service-account-json) for your BigQuery connection (like 'project_id' or 'client_email'), you need to provide an override for the entire top-level `keyfile_json` main key/attribute using extended attributes. Include the sub-fields as a nested JSON block. -### Git repository caching -At the start of every job run, dbt Cloud clones the project's Git repository so it has the latest versions of your project's code and runs `dbt deps` to install your dependencies. - -For improved reliability and performance on your job runs, you can enable dbt Cloud to keep a cache of the project's Git repository. So, if there's a third-party outage that causes the cloning operation to fail, dbt Cloud will instead use the cached copy of the repo so your jobs can continue running as scheduled. - -dbt Cloud caches your project's Git repo after each successful run and retains it for 8 days if there are no repo updates. It caches all packages regardless of installation method and does not fetch code outside of the job runs. - -dbt Cloud will use the cached copy of your project's Git repo under these circumstances: - -- Outages from third-party services (for example, the [dbt package hub](https://hub.getdbt.com/)). -- Git authentication fails. -- There are syntax errors in the `packages.yml` file. You can set up and use [continuous integration (CI)](/docs/deploy/continuous-integration) to find these errors sooner. -- If a package doesn't work with the current dbt version. You can set up and use [continuous integration (CI)](/docs/deploy/continuous-integration) to identify this issue sooner. - -To enable Git repository caching, select **Account settings** from the gear menu and enable the **Repository caching** option. - - - -### Partial parsing - -At the start of every dbt invocation, dbt reads all the files in your project, extracts information, and constructs an internal manifest containing every object (model, source, macro, and so on). Among other things, it uses the `ref()`, `source()`, and `config()` macro calls within models to set properties, infer dependencies, and construct your project's DAG. When dbt finishes parsing your project, it stores the internal manifest in a file called `partial_parse.msgpack`. - -Parsing projects can be time-consuming, especially for large projects with hundreds of models and thousands of files. To reduce the time it takes dbt to parse your project, use the partial parsing feature in dbt Cloud for your environment. When enabled, dbt Cloud uses the `partial_parse.msgpack` file to determine which files have changed (if any) since the project was last parsed, and then it parses _only_ the changed files and the files related to those changes. - -Partial parsing in dbt Cloud requires dbt version 1.4 or newer. The feature does have some known limitations. Refer to [Known limitations](/reference/parsing#known-limitations) to learn more about them. - -To enable, select **Account settings** from the gear menu and enable the **Partial parsing** option. - - - -### Account access to Advanced CI features - -[Advanced CI](/docs/deploy/advanced-ci) features, such as [compare changes](/docs/deploy/advanced-ci#compare-changes), allow dbt Cloud account members to view details about the changes between what's in the production environment and the pull request. - -To use Advanced CI features, your dbt Cloud account must have access to them. Ask your dbt Cloud administrator to enable Advanced CI features on your account, which they can do by selecting **Account settings** from the gear menu and choosing the **Enable account access to Advanced CI** option. - -Once enabled, the **Run compare changes** option becomes available in the CI job settings for you to select. - - diff --git a/website/static/img/docs/dbt-cloud/example-sidebar-account-settings.png b/website/static/img/docs/dbt-cloud/example-sidebar-account-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2ba860145cf9f1c65324bff8c8a063996c66fb GIT binary patch literal 25522 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 Date: Thu, 19 Sep 2024 08:25:39 +1200 Subject: [PATCH 03/10] fix typo --- .../semantic-layer-3-build-semantic-models.md | 2 +- 1 file changed, 1 insertion(+), 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 98276776019..7990cf6752f 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 @@ -293,7 +293,7 @@ semantic_models: Let's review the basics of semantic models: -- 🧱 Consist off **entities, dimensions, and measures**. +- 🧱 Consist of **entities, dimensions, and measures**. - 🫂 Describe the **semantics and relationships of objects** in the warehouse. - 1️⃣ Correspond to a **single logical model** in your dbt project. From 361dea26bcf63b88e67675c3b7ea22d7944b1ee5 Mon Sep 17 00:00:00 2001 From: "Leona B. Campbell" <3880403+runleonarun@users.noreply.github.com> Date: Wed, 18 Sep 2024 16:52:04 -0700 Subject: [PATCH 04/10] Update metrics-overview.md (#6093) ## What are you changing in this pull request and why? Fix typo ## 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." --- website/docs/docs/build/metrics-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/metrics-overview.md b/website/docs/docs/build/metrics-overview.md index 586402b6847..38b9b22bdb2 100644 --- a/website/docs/docs/build/metrics-overview.md +++ b/website/docs/docs/build/metrics-overview.md @@ -90,7 +90,7 @@ import SLCourses from '/snippets/_sl-course.md'; -## Default granularity for metircs +## Default granularity for metrics It's possible to define a default time granularity for metrics if it's different from the granularity of the default aggregation time dimensions (`metric_time`). This is useful if your time dimension has a very fine grain, like second or hour, but you typically query metrics rolled up at a coarser grain. The granularity can be set using the `time_granularity` parameter on the metric, and defaults to `day`. If day is not available because the dimension is defined at a coarser granularity, it will default to the defined granularity for the dimension. From 658f5099cb026bd04686e3b8b6768267ecd4a469 Mon Sep 17 00:00:00 2001 From: Theo Kiehn <162969167+tkiehn@users.noreply.github.com> Date: Thu, 19 Sep 2024 02:04:32 +0200 Subject: [PATCH 05/10] Remove unnecessary bracket (#6089) ## What are you changing in this pull request and why? Remove unnecessary bracket in adapter.drop_schema documentation. There are 2 opening brackets but 3 closing brackets Co-authored-by: Leona B. Campbell <3880403+runleonarun@users.noreply.github.com> --- website/docs/reference/dbt-jinja-functions/adapter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/dbt-jinja-functions/adapter.md b/website/docs/reference/dbt-jinja-functions/adapter.md index 7d2ae696a78..54e1e31fd84 100644 --- a/website/docs/reference/dbt-jinja-functions/adapter.md +++ b/website/docs/reference/dbt-jinja-functions/adapter.md @@ -190,7 +190,7 @@ Drops a schema (or equivalent) in the target database. If the target schema does ```sql -{% do adapter.drop_schema(api.Relation.create(database=target.database, schema="my_schema"))) %} +{% do adapter.drop_schema(api.Relation.create(database=target.database, schema="my_schema")) %} ``` From 8efd193b0c1f3f3f240008fa7a6c80eacc57d3ea Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:13:36 +0100 Subject: [PATCH 06/10] Update behavior-changes.md adding redshift-restrict_direct_pg_catalog_access flag to yaml example per [slack thread](https://getdbt.slack.com/archives/C03SAHKKG2Z/p1726676174268999?thread_ts=1726623397.819369&cid=C03SAHKKG2Z) --- .../docs/reference/global-configs/behavior-changes.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/website/docs/reference/global-configs/behavior-changes.md b/website/docs/reference/global-configs/behavior-changes.md index 4abdd7d2104..45e5fb6e0c9 100644 --- a/website/docs/reference/global-configs/behavior-changes.md +++ b/website/docs/reference/global-configs/behavior-changes.md @@ -41,7 +41,12 @@ By contrast, behavior change migrations happen slowly, over the course of months These flags _must_ be set in the `flags` dictionary in `dbt_project.yml`. They configure behaviors closely tied to project code, which means they should be defined in version control and modified through pull or merge requests, with the same testing and peer review. -The following example displays the current flags and their current default values in the latest dbt Cloud and dbt Core versions. To opt out of a specific behavior change, set the values of the flag to `False` in `dbt_project.yml`. You'll continue to see warnings for legacy behaviors that you have opted out of explicitly until you either resolve them (switch the flag to `True`) or choose to silence the warnings using the `warn_error_options.silence` flag. +The following example displays the current flags and their current default values in the latest dbt Cloud and dbt Core versions. To opt out of a specific behavior change, set the values of the flag to `False` in `dbt_project.yml`. You will continue to see warnings for legacy behaviors you’ve opted out of, until you either: + +- Resolve the issue (by switching the flag to `True`) +- Silence the warnings using the `warn_error_options.silence` flag + +Here is an example of the available behavior change flags with their default values: @@ -50,6 +55,7 @@ flags: require_explicit_package_overrides_for_builtin_materializations: False require_model_names_without_spaces: False source_freshness_run_project_hooks: False + restrict_direct_pg_catalog_access: False ``` @@ -61,7 +67,7 @@ When we use dbt Cloud in the following table, we're referring to accounts that h | require_explicit_package_overrides_for_builtin_materializations | 2024.04.141 | 2024.06.192 | 1.6.14, 1.7.14 | 1.8.0 | | require_resource_names_without_spaces | 2024.05.146 | TBD* | 1.8.0 | 1.9.0 | | source_freshness_run_project_hooks | 2024.03.61 | TBD* | 1.8.0 | 1.9.0 | -| [Redshift] restrict_direct_pg_catalog_access | 2024.09.242 | TBD* | dbt-redshift v1.9.0 | 1.9.0 | +| [Redshift] [restrict_direct_pg_catalog_access](#redshift-restrict_direct_pg_catalog_access) | 2024.09.242 | TBD* | dbt-redshift v1.9.0 | 1.9.0 | When the dbt Cloud Maturity is "TBD," it means we have not yet determined the exact date when these flags' default values will change. Affected users will see deprecation warnings in the meantime, and they will receive emails providing advance warning ahead of the maturity date. In the meantime, if you are seeing a deprecation warning, you can either: - Migrate your project to support the new behavior, and then set the flag to `True` to stop seeing the warnings. From e5e754ff084a2a6a4d6c9a77f73e6a8d71fb461c Mon Sep 17 00:00:00 2001 From: Jordi van Dooren Date: Thu, 19 Sep 2024 12:10:44 +0200 Subject: [PATCH 07/10] Add `clone` and `docs generate` to list of commands `retry` supports. `clone` and `docs generate` were never included in the lists of commands that `retry` support, but it seems like both commands have been supported since the dbt 1.6 release that introduced `dbt retry`. See https://github.com/dbt-labs/dbt-core/blob/main/core/dbt/task/retry.py. --- website/docs/reference/commands/retry.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/website/docs/reference/commands/retry.md b/website/docs/reference/commands/retry.md index 8da5d5a77a6..68d18dfd77a 100644 --- a/website/docs/reference/commands/retry.md +++ b/website/docs/reference/commands/retry.md @@ -10,6 +10,8 @@ Retry works with the following commands: - [`build`](/reference/commands/build) - [`compile`](/reference/commands/compile) +- [`clone`](/reference/commands/clone) +- [`docs generate`](/reference/commands/cmd-docs#dbt-docs-generate) - [`seed`](/reference/commands/seed) - [`snapshot`](/reference/commands/build) - [`test`](/reference/commands/test) From d87233df39b45b4ae130d0ddbb82c6c276aa1e2a Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:47:21 +0100 Subject: [PATCH 08/10] Update dimensions.md add querystrig --- website/docs/docs/build/dimensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/docs/build/dimensions.md b/website/docs/docs/build/dimensions.md index 6b665f4251c..affd74f81aa 100644 --- a/website/docs/docs/build/dimensions.md +++ b/website/docs/docs/build/dimensions.md @@ -124,7 +124,7 @@ mf query --metrics users_created,users_deleted --group-by metric_time__year --or You can set `is_partition` for time to define specific time spans. Additionally, use the `type_params` section to set `time_granularity` to adjust aggregation details (hourly, daily, weekly, and so on). - + From 781d65623152879230c5aa3047ab6f1ba82b02e3 Mon Sep 17 00:00:00 2001 From: Mirna Wong <89008547+mirnawong1@users.noreply.github.com> Date: Thu, 19 Sep 2024 13:14:31 +0100 Subject: [PATCH 09/10] Update website/docs/reference/global-configs/behavior-changes.md --- website/docs/reference/global-configs/behavior-changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/reference/global-configs/behavior-changes.md b/website/docs/reference/global-configs/behavior-changes.md index 45e5fb6e0c9..8e9e93b8488 100644 --- a/website/docs/reference/global-configs/behavior-changes.md +++ b/website/docs/reference/global-configs/behavior-changes.md @@ -46,7 +46,7 @@ The following example displays the current flags and their current default value - Resolve the issue (by switching the flag to `True`) - Silence the warnings using the `warn_error_options.silence` flag -Here is an example of the available behavior change flags with their default values: +Here's an example of the available behavior change flags with their default values: From b6351b13c151f0d3d27d8513563c60f1fa81d34f Mon Sep 17 00:00:00 2001 From: Mike Alfare <13974384+mikealfare@users.noreply.github.com> Date: Thu, 19 Sep 2024 10:21:38 -0400 Subject: [PATCH 10/10] Add behavior change flag docs for adapter maintainers (#6092) ## What are you changing in this pull request and why? We added behavior flags for adapter maintainers to use on first- and third-party adapters. This PR adds documentation explaining how to configure and use behavior flags. ## 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] 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." - [x] Approval by Product (@amychen1776) --------- Co-authored-by: Amy Chen <46451573+amychen1776@users.noreply.github.com> Co-authored-by: Matt Shaver <60105315+matthewshaver@users.noreply.github.com> --- website/docs/guides/adapter-creation.md | 102 ++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/website/docs/guides/adapter-creation.md b/website/docs/guides/adapter-creation.md index f737afa0392..066d27a7aaa 100644 --- a/website/docs/guides/adapter-creation.md +++ b/website/docs/guides/adapter-creation.md @@ -556,6 +556,108 @@ While much of dbt's adapter-specific functionality can be modified in adapter ma See [this GitHub discussion](https://github.com/dbt-labs/dbt-core/discussions/5468) for information on the macros required for `GRANT` statements: +### Behavior change flags + +Starting in `dbt-adapters==1.5.0` and `dbt-core==1.8.7`, adapter maintainers can implement their own behavior change flags. Refer to [Behavior changes](https://docs.getdbt.com/reference/global-configs/behavior-changes)for more information. + +Behavior Flags are not intended to be long-living feature flags. They should be implemented with the expectation that the behavior will be the default within an expected period of time. To implement a behavior change flag, you must provide a name for the flag, a default setting (`True` / `False`), an optional source, and a description and/or a link to the flag's documentation on docs.getdbt.com. + +We recommend having a description and documentation link whenever possible. The description and/or docs should provide end users context for why the flag exists, why they may see a warning, and why they may want to utilize the behavior flag. Behavior change flags can be implemented by overwriting `_behavior_flags()` on the adapter in `impl.py`: + + + +```python +class ABCAdapter(BaseAdapter): + ... + @property + def _behavior_flags(self) -> List[BehaviorFlag]: + return [ + { + "name": "enable_new_functionality_requiring_higher_permissions", + "default": False, + "source": "dbt-abc", + "description": ( + "The dbt-abc adapter is implementing a new method for sourcing metadata. " + "This is a more performant way for dbt to source metadata but requires higher permissions on the platform. " + "Enabling this without granting the requisite permissions will result in an error. " + "This feature is expected to be required by Spring 2025." + ), + "docs_url": "https://docs.getdbt.com/reference/global-configs/behavior-changes#abc-enable_new_functionality_requiring_higher_permissions", + } + ] +``` + + + +Once a behavior change flag has been implemented, it can be referenced on the adapter both in `impl.py` and in Jinja macros: + + + +```python +class ABCAdapter(BaseAdapter): + ... + def some_method(self, *args, **kwargs): + if self.behavior.enable_new_functionality_requiring_higher_permissions: + # do the new thing + else: + # do the old thing +``` + + + + + +```sql +{% macro some_macro(**kwargs) %} + {% if adapter.behavior.enable_new_functionality_requiring_higher_permissions %} + {# do the new thing #} + {% else %} + {# do the old thing #} + {% endif %} +{% endmacro %} +``` + + + +Every time the behavior flag evaluates to `False,` it warns the user, informing them that a change will occur in the future. + +This warning doesn't display when the flag evaluates to `True` as the user is already in the new experience. + +Recognizing that the warnings can be disruptive and are not always necessary, you can evaluate the flag without triggering the warning. Simply append `.no_warn` to the end of the flag. + + + + +```python + class ABCAdapter(BaseAdapter): + ... + def some_method(self, *args, **kwargs): + if self.behavior.enable_new_functionality_requiring_higher_permissions.no_warn: + # do the new thing + else: + # do the old thing +``` + + + + + +```sql +{% macro some_macro(**kwargs) %} + {% if adapter.behavior.enable_new_functionality_requiring_higher_permissions.no_warn %} + {# do the new thing #} + {% else %} + {# do the old thing #} + {% endif %} +{% endmacro %} +``` + + + +It's best practice to evaluate a behavior flag as few times as possible. This will make it easier to remove once the behavior change has matured. + +As a result, evaluating the flag earlier in the logic flow is easier. Then, take either the old or the new path. While this may create some duplication in code, using behavior flags in this way provides a safer way to implement a change, which we are already admitting is risky or even breaking in nature. + ### Other files #### `profile_template.yml`