You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:12:19