Dbt 模型审计员
v1.0.0审计 dbt(数据构建工具)项目的模型质量、测试覆盖率、文档完整性、性能和对最佳实践的遵守情况。检查命名...
运行时依赖
安装命令
点击复制技能文档
dbt 模型审计员
审计 dbt 项目的模型质量、测试覆盖率、文档完整性、性能优化和遵循社区最佳实践。它扮演着经验丰富的分析工程师的角色,审查您的 dbt 项目结构、模型设计和配置。
使用
当您需要评估 dbt 项目的健康状况或审查特定模型时调用此技能。
基本调用:
审计 /path/to/dbt/project 目录下的 dbt 项目
审查此项目的 dbt 模型质量
审查我们的模型的 dbt 测试覆盖率
专注审计:
仅审计分阶段模型
审查 marts 层的物化策略
审查面向客户的模型的文档完整性
查找违反命名约定的模型
代理读取 dbt 项目文件(模型、模式、配置)并生成综合审计报告。
工作原理
步骤 1:发现 dbt 项目结构
代理映射项目布局:
# 确定 dbt 项目
cat dbt_project.yml
# 映射所有模型文件
find models/ -name ".sql" | head -50
# 映射所有 schema/YAML 文件
find models/ -name ".yml" -o -name ".yaml" | head -50
# 检查包
cat packages.yml 2>/dev/null || cat dependencies.yml 2>/dev/null
# 检查配置文件(用于目标配置)
cat profiles.yml 2>/dev/null
代理识别:
项目名称和版本来自 dbt_project.yml
模型层:分阶段、中间、marts(或自定义层名称)
源:定义的源表
种子和快照:静态数据和 SCD 配置
宏:自定义 Jinja 宏
包:安装的 dbt 包(dbt_utils、codegen 等)
步骤 2:审计命名约定
代理检查模型文件名是否符合社区最佳实践:
预期的命名模式:
层 约定 示例
分阶段 stg_<源>__<实体> stg_stripe__payments.sql
中间 int_<实体>_<动词> int_payments_pivoted.sql
marts <实体> 或 fct_/dim_ fct_orders.sql、dim_customers.sql
源 在 YAML 中定义,而不是 SQL src_stripe.yml
执行的检查:
PASS:models/staging/stripe/stg_stripe__payments.sql 遵循 stg_<源>__<实体> 约定
FAIL:models/staging/payments.sql 缺少源前缀。应该是:stg_<源>__payments.sql
FAIL:models/marts/core/customer_orders_joined_final_v2.sql 命名不清晰。建议:fct_customer_orders.sql
问题:
“joined” 描述了实现,“final” 和 “v2” 是反模式
WARN:models/staging/stripe/stripe_charges.sql 源名称重复,没有 stg_ 前缀
其他命名检查:
文件名中没有空格或特殊字符
一致的大小写(下划线命名法要求)
没有 _final、_v2、_backup、_old 后缀
源名称在 YAML 定义和文件路径之间匹配
Schema YAML 文件名与其目录匹配 (_stripe__models.yml 在 stripe/ 中)
步骤 3:验证 ref() 和 source() 的使用
代理确保适当的依赖管理:
# 找到使用硬编码表引用而不是 ref() 的模型
grep -rn "FROM\s\+\\?[a-z_]\+\.\|JOIN\s\+\\?[a-z_]\+" models/ \ --include=".sql" | grep -v "ref\|source\|this"
执行的检查:
FAIL:models/marts/core/fct_orders.sql:12 硬编码引用:FROM raw.stripe.payments 应该是:FROM {{ source('stripe', 'payments') }} 或:FROM {{ ref('stg_stripe__payments') }}
FAIL:models/marts/core/fct_orders.sql:18 跨层跳过:marts 模型直接引用源 fct_orders -> source('stripe', 'payments') 应该通过分阶段:fct_orders -> ref('stg_stripe__payments')
PASS:models/staging/stripe/stg_stripe__payments.sql 正确使用 {{ source('stripe', 'payments') }}
DAG 结构验证:
分阶段模型应该只引用 source()
中间模型应该引用 ref() 到分阶段或其他中间模型
marts 模型应该引用 ref() 到中间或分阶段模型
没有循环依赖
没有过度深的链(> 8 个级别表明过度工程)
没有“孤立”模型(没有被其他模型或暴露引用的模型)
步骤 4:评估测试覆盖率
代理评估测试的完整性:
# 解析 schema YAML 文件以获取测试定义
cat models/staging/stripe/_stripe__models.yml
测试覆盖率分析:
模型:stg_stripe__payments
YAML 中定义的列:8
带有测试的列:3(37.5%)
测试:
- payment_id:unique、not_null [GOOD:主键测试]
- status:accepted_values [GOOD:枚举验证]
- amount:not_null [GOOD]
- payment_id:没有关系测试到 orders [WARN]
- created_at:没有 not_null、没有新鲜度测试 [WARN]
- customer_id:没有关系测试 [FAIL —— FK 应该测试]
- currency:没有 accepted_values 测试 [WARN]
- payment_method:没有 accepted_values 测试 [WARN]