我们的engine从不接触您的数据仓库密码
datahashi

01产品

定义一次,随处可查。

每个Metric只有一个YAML定义。无论从哪里查询,得到的都是同一条正确的SQL:联接自动找到,合计保持正确。

model.yaml
entities:
  - name: Order
    table: public.orders
    primary_key: id
    dimensions:
      - name: region
        type: string
    measures:
      - name: revenue
        expr: amount
        agg: sum
      - name: order_count
        expr: id
        agg: count

metrics:
  - name: avg_order_value
    expr: revenue / order_count
    format: currency
一次请求
{ "metrics": ["avg_order_value"],
  "dimensions": ["region"] }
datahashi编写的SQL
SELECT o.region,
       SUM(o.amount) / COUNT(o.id)
         AS avg_order_value
FROM public.orders o
GROUP BY o.region;
结果 · 示例值
regionavg_order_value
EMEA118.40
NA131.52
APAC104.77

工作方式

从数据仓库到答案,只需四步

无论自托管还是托管,都是同样的四步。

  1. 01

    运行Query Runner

    以只读角色安装在数据仓库旁边。密码与审计日志都由它保管。

    $ query-runner -config runner.yaml
    ✓ listening :8787
    ✓ warehouse reachable (read-only role)
  2. 02

    定义Metric

    用YAML编写。在任何人查询之前,控制台会校验每一个定义。

    metrics:
      - name: avg_order_value
        expr: revenue / order_count
    ✓ 3 metrics valid
    # example
  3. 03

    发布版本

    发布会把模型与访问规则一起冻结。每次变更都作为下一个版本发布。

    ✓ published v7
      model + access rules, frozen together
    # example
  4. 04

    分发访问权限

    应用获得密钥,智能体通过OAuth登录。每个调用方只能看到您授权的Metric。

    app-finance  key    governed  4 metrics
    agent-sales  OAuth  governed  2 metrics

编译器

联接(JOIN)不必自己写

只需描述一次表之间的关系。datahashi选择联接路径,并在联接前先求和,因此一对多联接不会让合计虚高。

Order.order_totalmeasure
声明一次
Order → Refund一对多联接
扇出安全
Refund.reasondimension
按退款原因汇总的order_total,全部原因 · 示例数据1,284,930✓ 无重复计算

联接路径由模型解析。在联接可能重复行之前,总计已先汇总。

规模扩大之后

到一百个Metric时依然成立的事

访问模式

对智能体收窄,对分析师放宽

governed密钥只能看到命名的Metric。explore密钥额外开放原始字段,便于动手分析。模式按密钥固定。

命名Metric · 精选View · 智能体默认模式

  • 请求Metric · avg_order_value, revenue
  • 查询精选view · finance_summary
  • 请求原始measure · 403 forbidden
  • 读取原始字段 · 此密钥不可见

可移植性

沿用现有的数据仓库

请求从不指明数据仓库,因此日后迁移时,调用方无需任何改动。

  • Snowflake
  • BigQuery
  • Postgres
  • MySQL

Rollup会预先计算最常见的问题,让它们无需访问数据仓库。

归属

每个Metric都有负责人

定义中可以写明负责的团队。变更以新版本发布,调用方可以固定在自己信任的版本上。

# model.yaml
- name: Order
  owner: "Finance Analytics"

# a caller pins the version it trusts
{ "metrics": ["avg_order_value"],
  "version": "7" }

下一步:智能体如何提问

智能体发送的请求与仪表盘完全相同。