动态碎片化如何让 Logfire 查询快 1000 倍
来源:pydantic.dev — 2026-01-29
📋 概述
Pydantic 的 Logfire 把 OpenTelemetry 数据以 Parquet 存进对象存储,半结构化的 attributes 原本整列存成 JSON,而查询慢的真正原因是额外的 IO:下载大块 JSON 的数据量与启动延迟远超过 CPU 开销,单个多变属性还会让字典压缩与 zstd 失效。团队先做静态碎化,在写入时把手写的一小撮属性抽成强类型列,但覆盖范围有限、未碎化属性仍需整列扫描,内部列还会暴露给用户。动态碎化改为在写入与压缩时按实际数据自动把最常出现或最大的属性抽成强类型列,无需配置,也不再写出全 null 的列。
🔑 核心要点
- 慢的根源不是 CPU 而是额外 IO:下载大块 JSON 的数据量与延迟主导查询耗时
- 原方案把 attributes 整体存成一列 JSON,单个多变属性就让 dictionary 与 zstd 压缩失效
- 静态碎化只抽出手写的一小撮属性,未碎化属性依然要整列扫描
- 内部碎化列对用户可见,select * 会看到 _lf_attributes_* 这类实现细节
- 动态碎化在写入与压缩时自动按实际数据抽取属性为强类型列,无需配置
- 效果:查询快逾 1000 倍,此前 30 秒超时的查询可在 1 秒内返回
💡 金句
查询 Logfire 里的数据马上就要快得惊人了——在某些场景下是 1000 倍以上。
👍 0
👎 0
← 返回 Lobsters 首页