
Elementary 调研:2,400 stars 的 dbt-native 数据可观测性,5 年老牌开源怎么把 anomaly detection 装进 dbt
Elementary 是 dbt 生态里最知名的开源数据可观测性(Data Observability)工具 —— 5 年老项目、Apache-2.0、dbt-native 架构、ML 异常检测开箱即用,本文把它讲透。
写在前面:数据可观测性为啥被 dbt 卡脖子
数据栈走到 2026 年,dbt 已经是仓内转换的事实标准。但 dbt 只管 ” 把脏数据变成干净表 ”,不管 ” 数据脏没脏 / 表更没更新 / schema 变了没 ”。
这就是数据可观测性(Data Observability)想解决的问题:
- freshness:订单表 4 小时没更新,是上游挂了还是 ETL 漏跑?
- volume:今日 DAU 突然从 100 万跌到 30 万,是业务崩了还是 ETL 漏了一部分?
- schema:上游把
user_id改成userId,我的下游模型是不是直接挂了? - anomaly:表里 null rate 突然飙到 20%,是上游 bug 还是合理业务变化?
商业方案(Monte Carlo / Bigeye)动辄百万刀年费,开源圈有 4 个玩家:Elementary / Soda Core / Great Expectations / re_data。本文主角是 Elementary —— dbt-native 范式里最强的开源选手。
一、它解决什么问题
Elementary 把自己定位为 dbt-native data observability,直接在 dbt 项目里跑 anomaly detection、schema monitor、lineage、alert,不需要额外的 pipeline / 额外的 ETL。
基本信息
| 项 | 数据 |
|---|---|
| 仓库 | elementary-data/elementary |
| Stars | 2,400 ⭐(GitHub API 实时,比 bi-research-pool 标的 1,864 高 28%) |
| Forks | 226 |
| License | Apache-2.0 ✅ |
| 创建 | 2021-08-30(5 年老项目) |
| 最新版 | v0.25.1(2026-07-08,约 1 个月 / 版) |
| 最后 push | 2026-08-27(昨天,活跃度极佳) |
| 体积 | 250 MB |
| Open issues | 24(极低,社区响应快) |
| 主语言 | HTML 81.5% + Python 18.5%(UI report 是核心) |
| OpenSSF Scorecard | 7.5/10(v0.23.4 时 7.1/10,逐月提升) |
| 官网 | elementary-data.com |
| 配套 dbt package | elementary-data/dbt-data-reliability(369 ⭐,Apache-2.0) |
核心架构 :Elementary = 两个仓库协作 。
dbt-data-reliability(dbt package,装进 dbt 项目里收集元数据到 warehouse)+elementary(CLI + UI report,读元数据生成可视化)。 没有 dbt package,CLI 就是空的;没有 CLI,dbt package 只是元数据表。
二、Elementary 的 8 大核心能力
README 里写得清楚,Elementary OSS 提供 8 大基础能力 + Cloud 付费版:
1️⃣ Anomaly Detection Tests(最值钱)
作为 dbt 原生 test 形式 —— 装上 Elementary dbt package 后,你可以写:
# models/schema.yml
columns:
- name: order_id
tests:
- elementary.column_anomalies:
column_anomalies:
- null_count
- null_percent
- min
- max
- average
- stddev
- name: revenue
tests:
- elementary.column_anomalies:
column_anomalies:
- sum
- average
跑 dbt test 时,Elementary 会:
- 收集这些列指标历史 7-30 天的数据
- 用 ML 算法(默认时序 + z-score)训练 baseline
- 跑当前 run,对比历史分布
- 偏离超过阈值就 fail test + 报警
覆盖指标:null_count / null_percent / min / max / average / stddev / sum / unique_percent / distinct_count(新版)
2️⃣ Automated Monitors(开箱即用)
不需要写一行 SQL,Elementary 在 dbt run 时 自动自动 给所有 model 加三层 monitor:
| Monitor | 检测什么 |
|---|---|
| Freshness | 表多久没更新(基于 dbt.source_freshness + warehouse query history) |
| Volume | 行数 / size 是不是剧烈变化(基于 information schema) |
| Schema | 字段类型 / 字段数变化(detect breaking changes) |
零配置成本 —— 跑 dbt run 之后立刻有这三个 monitor 覆盖所有 model。
3️⃣ End-to-End Data Lineage(深度)
Elementary 生成的 lineage 不是 dbt 默认那种简单 DAG,而是:
- ✅ enriched with test results(每个节点上挂 test 状态,红绿黄清楚)
- ✅ 支持跨 dbt run 历史(lineage evolution,能看 schema 怎么变)
- ✅ impact analysis(一个 model 挂了,影响下游哪些 model)
- ⚠️ Column-Level Lineage 只在 Cloud 版(OSS 没开源)
4️⃣ Data Quality Dashboard(单页面 UI)
跑 elementary report 之后,CLI 会生成一份 static HTML report(含丰富交互),覆盖:
- 所有 model 的 test 状态
- Freshness 矩阵(哪个表多久没更新)
- Volume 趋势
- Anomaly 历史曲线
- Lineage 图
- 失败 test 的详细 error
这是 dbt 自带 dbt docs 没有的能力 —— dbt docs 只显示你写的 schema/test 定义,看不到运行时数据。
5️⃣ Models Performance
监控每个 dbt model 的:
- 跑时多久(execution time 趋势)
- 资源消耗(query history)
- 跟历史平均比是不是变慢了
能让你提前发现:” 哎这个 incremental model 怎么今天突然跑 30 分钟,平时 5 分钟?” —— 是上游膨胀了还是 SQL 退化?
6️⃣ Configuration-as-Code
Elementary 的所有配置(alert 频道、owner、anomaly 阈值)都写在 dbt 项目的 yml 文件里,跟 dbt 代码一起版本化。
# models/elementary.yml
elementary:
alerts:
- name: slack_alert
type: slack
channel: data-alerts
owners: [@data-team]
7️⃣ Alerts(多渠道 + owner tag)
支持 4 类 alert 渠道:
- Slack(最常用)
- Microsoft Teams
- Webhook(自定义集成)
每条 alert 可以 tag owner(” 这条挂在 @张三 头上 ”),alert 内容包含test 失败原因 + lineage 上下文 + 影响范围。
8️⃣ Data Catalog(基础版)
Cloud 版完整 catalog,OSS 提供基础数据集浏览:
- 数据集 description
- 列 description
- 数据集 health 评分
- 上下游依赖
Cloud 版独有:Column-Level Lineage(端到端,含 BI 工具)、AI-Powered Data Tests(用 LLM 验证非结构化数据)、Full Data Catalog、内置 AI agents 帮你 scale reliability workflows。
三、双引擎架构深度(dbt package + CLI)
这是 Elementary 最值得讲的差异化设计 —— 两个仓库配合,而不是一个单体。
Part 1:elementary-data/dbt-data-reliability(dbt package,369 ⭐)
这是 装进 dbt 项目 的 dbt package(不是普通 Python 包)。作用:
- 在 dbt run / dbt test 时 自动收集:
- Model 元数据(schema、列、SQL)
- Run results(每个 model 跑了多久 / 状态)
- Test results(哪些 test pass / fail)
- Query history(freshness / volume 原始数据)
- 写入 元数据表 到 warehouse(
elementary.*schema) - 注册 dbt macros / tests 让用户用
elementary.column_anomalies这种 test
安装方式(在你的 dbt 项目的 packages.yml):
packages:
- package: elementary-data/dbt-data-reliability
version: [">=0.25.0", "<0.26.0"]
然后 dbt deps + dbt run 即可。
Part 2:elementary-data/elementary(CLI + UI,2,400 ⭐)
这是 独立的 Python CLI(pip install elementary-data),作用:
- 读 元数据表(同一个 warehouse)
- 生成 static HTML UI report(
elementary report命令) - 触发 alerts(
elementary monitor命令,可调度)
CLI 不依赖 dbt runtime,只依赖 warehouse 连接 —— 可以在任何有 credentials 的环境跑。
安装方式:
pip install elementary-data
配置 ~/.elementary/profiles.yml(结构跟 dbt 一样,因为读的是同一个 warehouse)。
Part 3:协作模式
dbt run / dbt test
↓ (dbt-data-reliability 收集元数据)
warehouse.elementary.* 表
↓ (elementary CLI 读)
HTML report + Slack/Teams alerts
核心优势 :所有数据 留在你自己的 warehouse,Elementary 不上传任何数据到外部。对数据合规严格的企业(金融 / 医疗 / 政府)特别友好。
四、Elementary vs 4 大对手
数据可观测性赛道里,Elementary 不是唯一的开源选择。看下 4 个核心对比:
4 大对比表
| 维度 | Elementary | dbt 内置 | Soda Core | Great Expectations | Monte Carlo |
|---|---|---|---|---|---|
| License | Apache-2.0 ✅ | Apache-2.0 ✅(dbt 自带) | Apache-2.0 ✅ | Apache-2.0(部分模块 AGPL) | 闭源商业 💰 |
| dbt-native | ✅ 深度集成 | ✅ 同源 | ⚠️ 独立,可集成 | ⚠️ 独立框架 | ⚠️ 独立 SaaS |
| Anomaly Detection | ✅ ML-based(时序 + z-score) | ❌ 无 | ⚠️ 基础阈值 | ⚠️ 基础阈值 | ✅ ML 高级 |
| Auto Freshness/Volume | ✅ 零配置 | ⚠️ 仅 source freshness | ✅ 自动 | ⚠️ 需配置 | ✅ 自动 |
| Lineage UI | ✅ enriched | ⚠️ dbt docs 基础版 | ⚠️ SodaCloud 才有 | ⚠️ 基础版 | ✅ 高级 |
| Column-Level Lineage | ⚠️ Cloud 付费 | ❌ 无 | ❌ 无 | ❌ 无 | ✅ 完整 |
| Alert 渠道 | Slack/Teams/Email/Webhook | ❌ 需自己实现 | Slack/Email | Slack/Email | 全套 |
| 学习曲线 | 低(写 dbt test 就完事) | 极低 | 中(YAML + SodaCL) | 高(Python expectation) | 低(SaaS) |
| 大客户 | 中(开源 + Cloud 双轨) | N/A | 中(SodaCloud 商业) | 高(GX Cloud 商业) | 高(百万刀年费) |
| GitHub stars | 2,400 ⭐ | dbt-core 13.7K ⭐ | ~1.5K ⭐ | ~10K ⭐ | N/A 闭源 |
核心差异
1️⃣ dbt-native vs 独立框架
Elementary 是唯一一个 dbt-native 的:
- 用 dbt test 形式写 anomaly detection(
elementary.column_anomalies) - 元数据走 dbt run pipeline(不需要额外 ETL)
- 配置写在 dbt 项目
yml里(跟代码一起版本化)
Soda Core / Great Expectations 都是独立框架:
- Soda Core 写 YAML checks + SodaCL(另一套 DSL)
- Great Expectations 写 Python expectation suite(另一套 API)
- 你需要单独部署、单独调度、单独 alert
结论:如果团队主栈是 dbt,Elementary 是最低摩擦的选择。
2️⃣ Anomaly Detection 智能度
Elementary 用 ML(时序 + z-score + 简单 baseline 学习),覆盖:
- 列级:null_count / null_percent / min / max / average / stddev / sum / unique_percent
- 表级:freshness / volume / schema
Monte Carlo 用更高级 ML(多维 anomaly detection + cross-table correlation),能发现 ” 订单表 DAU 跌 ” 是 ” 流量表跌 ” 导致的,Elementary 还做不到跨表关联。
结论:单表 / 单 column 的 anomaly Elementary 够用;跨表 correlation 要 Monte Carlo。
3️⃣ Alert 渠道丰富度
Elementary OSS 版:Slack + Teams + Email + Webhook。
Monte Carlo 商业版:Slack + Teams + Email + PagerDuty + Opsgenie + Jira + 自定义 webhook。
结论:开源版 Elementary 覆盖 90% 场景,企业级 PagerDuty 集成需要自己写 Webhook 包装。
4️⃣ 商业模式
| 项目 | 商业模式 |
|---|---|
| Elementary | OSS 全功能 + Cloud 付费(Column-Level Lineage / BI 集成 / AI agents / 高级 catalog) |
| Soda Core | SodaCore 开源 + SodaCloud 付费 |
| Great Expectations | GX OSS(部分模块 AGPL ⚠️)+ GX Cloud 付费 |
| Monte Carlo | 纯 SaaS 订阅(百万刀级) |
结论:Elementary 是 ” 开源最慷慨 ” 的 —— OSS 80% 能力够用,要 column-level lineage 才有付费动力。
五、35 分钟实战:装 Elementary 跑通 Slack 报警
前置准备(5 分钟)
- 已有的 dbt 项目(dbt-core ≥1.0.0)
- 能连的 warehouse(Snowflake / BigQuery / Redshift / Databricks SQL / Postgres 任一)
- Slack workspace(一个 channel + 一个 incoming webhook URL)
Step 1:在 dbt 项目里装 dbt package(3 分钟)
编辑 packages.yml:
packages:
- package: elementary-data/dbt-data-reliability
version: [">=0.25.0", "<0.26.0"]
跑:
dbt deps
dbt run # 会创建 elementary.* 元数据表
Step 2:装 CLI(2 分钟)
pip install elementary-data
Step 3:配置 CLI profiles(3 分钟)
创建 ~/.elementary/profiles.yml(结构跟 dbt 一模一样):
elementary:
target: prod
outputs:
prod:
type: snowflake # 或 bigquery / redshift / databricks / postgres
account: xxx
user: xxx
password: xxx
database: ANALYTICS
warehouse: COMPUTE_WH
schema: elementary
threads: 4
Step 4:加 anomaly detection test(5 分钟)
编辑 models/orders/schema.yml:
version: 2
models:
- name: orders
columns:
- name: order_id
tests:
- unique
- not_null
- elementary.column_anomalies:
column_anomalies:
- null_count
- null_percent
- unique_percent
- name: revenue
tests:
- elementary.column_anomalies:
column_anomalies:
- sum
- average
- max
跑:
dbt test
首次跑:Elementary 收集 baseline(无报警,纯粹收集数据)。
第二次跑 (等 24h 后):开始用 baseline 比对, 异常会触发 fail + Slack alert。
Step 5:配 Slack alert(3 分钟)
编辑 models/elementary.yml:
version: 2
elementary:
alerts:
- name: slack_data_alerts
type: slack
channel: "#data-alerts"
webhook: "https://hooks.slack.com/services/T000/B000/XXX"
owners: ["@data-eng"]
subscribers: ["@data-oncall"]
Step 6:生成 UI report(3 分钟)
elementary report
会生成一个 single-file HTML report(含 lineage + test 结果 + 异常曲线),可以放到内网静态服务器。
Step 7:调度 monitor(3 分钟)
elementary monitor
可以放在 Airflow / cron / GitHub Actions 里调度跑。
Step 8:完整链路
dbt run (CI/CD)
↓
dbt test → 触发 anomaly detection → fail → Slack alert
↓
elementary monitor (cron, 每天) → 跑 freshness/volume check → Slack alert
↓
elementary report (每周) → 生成 HTML report → 邮件分享给团队
总成本:装 dbt package + CLI 约 15 分钟,写 anomaly test 约 20 分钟。
六、7 条风险清单
⚠️ 风险 1:dbt-only 局限
Elementary 强绑定 dbt —— 如果你的 pipeline 里有非 dbt 的部分(Spark / Flink / 自研 ETL),Elementary 管不到。
缓解:把 Spark/Flink 的 metadata 用 dbt macros 包一层,或者额外用 Monte Carlo。
⚠️ 风险 2:OSS 版 UI report 是静态 HTML
elementary report 生成的是 single-file static HTML,不能实时刷新。要新数据得重新跑一次 CLI。
缓解:放在 cron 里每天 / 每周重新生成。
⚠️ 风险 3:AI-Powered Data Tests 还在新版
新版加的 AI-Powered Tests(用 LLM 验证非结构化数据,比如文本字段是否符合语义)文档薄,稳定性待观察。
缓解:核心业务指标用传统 anomaly detection,AI tests 做锦上添花。
⚠️ 风险 4:Column-Level Lineage 在 OSS 没有
如果你需要 “ 用户改了一列,下游哪些 BI 报表 / dashboard 受影响 ” 的端到端 lineage,要付费 Cloud。
缓解:短期用 dbt docs + 手工维护 column mapping;长期预算够买 Cloud。
⚠️ 风险 5:Open issues 24 不算少
24 个 open issues 不算多但也不极少 —— 社区响应速度要观察。OpenSSF 评分 7.5/10(Branch-Protection 5/10,CII-Best-Practices 0/10)是失分项。
缓解:关注 release notes,pin 版本(不要 always latest)。
⚠️ 风险 6:dbt 版本兼容性
Elementary 要求 dbt-core ≥1.0.0,部分功能需要 dbt 1.3+。如果团队还在用 dbt 0.x,需要先升级。
缓解:dbt 0.x 项目先升级到 1.x,再装 Elementary。
⚠️ 风险 7:Enterprise 功能付费
一些 企业级功能 只在 Cloud 版:
- Column-Level Lineage
- AI-Powered Tests 完整版
- BI 工具集成(Looker / Mode / Tableau 反向 lineage)
- AI agents(自动 root cause)
- SLA 监控 + 报告
缓解:OSS 版覆盖 80% 场景,剩下 20% 评估 Cloud 订阅 ROI。
七、总结
3 个最值得装 Elementary 的理由
1️⃣ dbt-native 是最低摩擦
如果你团队主栈是 dbt,Elementary 是
唯一深度集成 dbt 的数据可观测性开源工具 —— 直接用 elementary.column_anomalies 写 test,跟 dbt test 同套工作流。
2️⃣ Apache-2.0 + 5 年老牌
不是昙花一现的项目 —— 2021 年创建、5 年持续迭代、OpenSSF 7.5/10、1 个月 / 版节奏,企业用得放心。
3️⃣ ML 异常检测开箱即用
不需要写一行 ML 代码,
elementary.column_anomalies 加列名 —— 7 列 5 指标全覆盖,自动学习 baseline。
先试一周
Day 1:装 dbt-data-reliability + elementary-data CLI,跑 dbt deps + dbt run + dbt test(10 分钟)。
Day 2-3:给 3-5 个核心 model 加 column_anomalies test(30 分钟)。
Day 4-5:配 Slack alert,让团队收到第一条告警(10 分钟)。
Day 6-7:跑 elementary report 生成第一份 HTML report,给团队做周会分享。
如果团队用 dbt 而且数据质量痛点是核心,Elementary 是开源圈最值得装的工具。如果需要 column-level lineage 或者跨表 correlation anomaly detection,再评估 Soda Core / Monte Carlo。
参考
- Elementary GitHub 仓库 —— 主仓,2,400 ⭐
- Elementary dbt package 仓库 —— 配套 dbt package,369 ⭐
- Elementary 官网 —— 商业 Cloud 版
- Elementary 官方文档 —— Quickstart + Features
- Elementary OpenSSF Scorecard —— 7.1/10(v0.23.4)/ 7.5/10(最新版)
- dbt-core 13.7K ⭐ 调研 —— 上一篇文章,dbt 仓内转换
- Soda Core 调研 —— 跨数据栈 alternative(待调研)
- Great Expectations —— Python expectation suite(待调研)
- Monte Carlo Data —— 商业 SaaS 龙头
- dbt 官方 docs —— dbt-native 生态基础
- Slack Incoming Webhook 文档 —— alert 渠道
- Elementary Slack 社区 —— 官方支持频道
📎 WordPress 链接
- 官方链接:《Elementary 调研:2,400 stars 的 dbt-native 数据可观测性,5 年老牌开源怎么把 anomaly detection 装进 dbt》
- 短链:
https://east196.cn/?p=425 - WordPress API ID:425
- 状态:published · 2026-08-28