如何为DBT Elementary异常检测测试配置自定义警告/错误阈值?
问题
Elementary是一款聚焦DBT模型数据质量的工具,内置异常检测类数据质量测试。我在为模型实现freshness_anomalies(新鲜度异常)测试时,希望通过自定义阈值区分测试结果的警告与错误(默认所有结果均为警告)。
我的操作步骤:
- 从DBT测试生成的
metrics_anomaly_score表中提取该表的历史异常分数 - 取历史异常分数的85百分位数(1.1)作为警告阈值,98百分位数(2.8)作为错误阈值
配置代码如下:
tests: - elementary.freshness_anomalies: timestamp_column: "CAST(xxxx AS TIMESTAMP)" time_bucket: period: day count: 1 tags: ["elementary", "anomaly"] config: severity: "error" warn_if: ">1.1" error_if: ">2.8"
但在Databricks上运行DBT任务后,日志显示:
14:40:16 Failure in test elementary_source_freshness_anomalies_xxxx_CAST_xxxx_at_AS_TIMESTAMP_ (models/sources/XXX/XXX.yml) 14:40:16 Got 3 results, configured to fail if >2.8
分析后发现,系统并未将2.8识别为异常分数阈值,而是当作异常时间桶的数量阈值(即异常桶数量超过2.8时测试失败),这与预期不符。想咨询:针对Elementary异常测试定义警告/错误阈值的场景,有哪些最佳实践与技巧?
解决方案
Elementary的freshness_anomalies这类异常测试默认基于异常桶数量判断结果,无法直接通过warn_if/error_if设置异常分数阈值,可通过以下方式实现需求:
1. 自定义SQL测试,基于异常分数判断
复用Elementary底层的metrics_anomaly_score表,编写自定义测试逻辑直接针对异常分数设置阈值:
-- 自定义freshness异常分数阈值测试 SELECT anomaly_score, bucket_start, full_table_name FROM {{ ref('metrics_anomaly_score') }} WHERE metric_name = 'freshness' AND full_table_name = '{{ this.schema }}.{{ this.name }}' AND anomaly_score > 2.8 -- 错误阈值 UNION ALL SELECT anomaly_score, bucket_start, full_table_name FROM {{ ref('metrics_anomaly_score') }} WHERE metric_name = 'freshness' AND full_table_name = '{{ this.schema }}.{{ this.name }}' AND anomaly_score > 1.1 AND anomaly_score <= 2.8 -- 警告阈值
再在测试配置中通过severity_by字段区分警告和错误级别:
tests: - custom_freshness_anomaly_score_threshold: config: severity_by: column: anomaly_score mappings: - value: ">2.8" severity: error - value: ">1.1" severity: warn
2. 配置全局异常敏感度(批量生效)
在dbt_project.yml中设置全局的异常检测阈值,可针对新鲜度指标单独配置:
vars: elementary: anomaly_sensitivity: freshness: warn_threshold: 1.1 error_threshold: 2.8
注意:此配置会作用于所有使用freshness_anomalies的测试,若需单表单独配置,优先选择自定义测试方案。
3. 用Elementary告警功能替代测试阈值
通过Elementary的告警配置(如Slack、邮件),针对不同异常分数设置分级告警,不依赖DBT测试的warn_if/error_if:
- 在
elementary/config.yml中定义告警规则,异常分数>2.8触发错误级告警,>1.1触发警告级告警 - 这种方式不会影响DBT流水线的执行结果,适合需要监控但无需阻断流程的场景
内容的提问来源于stack exchange,提问作者Lan
相关产品推荐
相关产品推荐

