如何用代码定义数据仪表盘?DAC 实战:让 AI Agent 自动化构建标准看板
痛点:传统仪表盘的时代局限
每个开发团队迟早都要面对一个问题:老板要看销售数据、产品要看用户留存、运维要看系统监控……于是大家打开 Grafana、Metabase、Tableau,在 GUI 里一顿拖拽配置,生成一堆”只可意会不可言传”的看板。
问题是,这些配置不可版本控制、不可代码审查、不可自动化。换个人维护,谁也不知道当初为什么选这个时间窗口、为什么用这个聚合逻辑。更糟糕的是,AI Agent 完全无法参与——它看不到你的拖拽步骤。
DAC(Dashboard as Code)就是来终结这个尴尬局面的。
DAC 是什么?
DAC(github.com/bruin-data/dac)是一个开源仪表盘即代码工具,允许你用 YAML 或 TSX(JSX 变体) 来定义交互式数据仪表盘。它由 Bruin 团队开发,使用 Go 编写,目前 686+ stars,AGPL-3.0 协议。
核心特性:
- Dashboard as Code:用 YAML 或 TSX 声明式定义仪表盘的布局、查询、过滤器
- 内置语义层:在
semantic/目录下定义一次指标和维度,DAC 自动生成 SQL - AI Agent 原生集成:通过 Codex 内置技能,AI 可以直接与看板对话并实时修改内容
- 多数据库支持:Postgres、MySQL、Snowflake、BigQuery、Redshift、Databricks 等
- 可版本化:所有配置都在文本文件中,天然适配 Git 工作流
5 分钟快速上手
安装
curl -LsSf https://getbruin.com/install/dac | sh
安装脚本会自动检测系统环境,下载对应二进制文件。
初始化项目
dac init my-dashboards cd my-dashboards
这个命令会创建一个标准项目结构,包含基础配置文件和一个示例仪表盘。还会自动安装 DAC 的 Claude 和 Codex 技能文件:
ls .claude/skills/create-dashboard/SKILL.md ls .codex/skills/create-dashboard
这意味着你的 AI 编码 Agent 开箱即用,可以直接帮你写仪表盘代码。
验证和启动
dac validate --dir . dac serve --dir . --open
浏览器会自动打开 http://localhost:3000,你会看到一个包含 SQL 查询和可视化组件的完整仪表盘。
实战:用 YAML 定义销售看板
来看一个具体的 YAML 示例,展示 DAC 的核心表达能力:
name: Sales Overview
connection: warehouse
rows:
- widgets:
- name: Revenue
type: metric
sql: SELECT SUM(amount) AS value FROM sales
column: value
prefix: "$"
col: 4
- name: Orders
type: metric
sql: SELECT COUNT(*) AS value FROM orders
column: value
col: 4
- widgets:
- name: Daily Revenue Trend
type: line-chart
sql: |
SELECT
DATE(created_at) AS day,
SUM(amount) AS revenue
FROM sales
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1
x: day
y: revenue
col: 12
这个配置定义了 2 行布局:第一行显示总收入($4 col)和订单数(4 col),第二行是全宽的 30 天收入趋势折线图。每个 widget 的 SQL 查询一目了然,可以放进 Git 审查。
TSX 版本更灵活
如果你需要动态计算布局、根据数据库内容生成组件,可以用 TSX 模式:
export default () |
TSX 的好处是可以用 JavaScript 逻辑控制渲染,比如依据数据库返回的行数决定是否显示某个图表。
语义层:定义一次,处处引用
DAC 最有特色的功能之一是其内置语义层。在 semantic/ 目录下定义一次:
metrics:
- name: total_revenue
label: Total Revenue
description: Sum of all transaction amounts
sql: SUM(amount)
format: currency
dimensions:
- name: transaction_date
label: Date
sql: DATE(created_at)
然后在任何 widget 中引用:
widgets:
- name: Revenue by Day
type: line-chart
metrics: [total_revenue]
dimensions: [transaction_date]
col: 12
优势:业务指标的定义集中管理,不会出现”同一个收入指标在不同看板中用不同 SQL 实现”的混乱。修改语义层定义,所有引用它的看板自动更新。
与 AI Agent 配合
DAC 的设计初衷就是让 AI Agent 也能构建仪表盘。安装时自动绑定的 Codex 技能文件,意味着你可以在终端中对 AI 说:
“帮我创建一个销售仪表盘,显示上月各地区的收入排名”
Codex 会自动调用 DAC 的命令行,生成对应的 YAML 文件,执行 dac validate 并启动服务。整个过程不需要你手写任何代码,但生成的 YAML 仍在你的版本控制之下,可以随时修改和审查。
对于自动化流水线,还可以在 CI 中加入:
dac validate --dir . --with-database
确保每次 PR 修改仪表盘后,查询语法和数据库连接都正确无误。
适用场景
| 场景 | 推荐度 |
|---|---|
| 团队需要多个标准化看板 | ⭐⭐⭐⭐⭐ |
| 需要版本控制和代码审查 | ⭐⭐⭐⭐⭐ |
| AI Agent 自动化生成报表 | ⭐⭐⭐⭐⭐ |
| 临时分析 + 快速可视化 | ⭐⭐⭐ |
| 复杂交互式仪表盘 | ⭐⭐⭐ |
DAC 特别适合那些需要将 Dashboard 纳入 DevOps 流水线的团队。每一次看板变更都有迹可循、可回滚、可审查——这在传统 GUI 工具中几乎不可能实现。
总结
DAC 不是要取代 Grafana 或 Metabase,而是提供一种全新的”代码优先”的仪表盘范式。当你的团队开始用 AI Agent 辅助编码时,一个 AI 能读写、能版本控制、能 CI 验证的仪表盘方案,价值远超想象。
值得一试的场景:如果团队正在用 Codex 或 Claude Code 辅助开发,加上 DAC 等于让 AI 的能力从”写代码”延伸到”建看板”——一条命令,一个 PR,一个标准化的仪表盘就完成了。
项目地址:github.com/bruin-data/dac 安装命令:
curl -LsSf https://getbruin.com/install/dac | sh