深入 Kibana 07 - Lens:拖拽背后的自动聚合推断
Visualize 要求使用者逐项选择 bucket 和 metric,Lens 则尝试从字段类型和当前画布状态推断合理方案。一次拖拽会触发 operation 匹配、维度约束和可视化建议排序。Lens 的价值不只在交互更轻,而在于它把聚合知识编码进了推断流程。
字段类型到聚合的映射
Lens 拿到一个字段后,它首先读取该字段在 Data View 里登记的类型。映射规则如下:
1 | |
这不是 UI 里写死的一张枚举表,而是 Lens datasource 和 operation 定义共同给出的兼容结果。当前 Lens 插件位于 x-pack/platform/plugins/shared/lens;这些内部模块会随重构移动,不应当当作稳定的插件 API。拖字段时,Lens 会按字段类型和当前维度筛选可用 operation,再选择默认建议。
这解释了一个常见现象:把同一个字段拖到 X 轴和 Y 轴,Lens 会选不同的聚合——X 轴(dimension)更倾向于 bucket 语义,Y 轴更倾向于 metric 语义,即使字段类型相同。
Suggestion 引擎
字段映射只解决了"聚合选什么",图表类型的推断由 suggestion 引擎负责。
1 | |
suggestion 逻辑分布在 x-pack/platform/plugins/shared/lens/public/visualizations/ 下的各图表实现中,例如 XY 图使用独立的 xy_suggestions.ts。不同图表类型根据字段维度和当前状态生成候选结果,Lens 再把候选项显示在 Suggestions 面板中。
当用户调整字段组合时,suggestion 列表实时刷新。这意味着 Lens 不是预先规定"两个字段只能画折线图",而是每次都重新评估所有图表类型对当前维度组合的兼容性。
Layer 模型
1 | |
一个 Lens 画布可以有多个 layer。常见用法是在 time series 上叠加一条阈值参考线(reference line layer),或者叠加事件注解(annotation layer)。不同 layer 可以共享同一个 data source,也可以各自绑定不同的 index pattern。每个 layer 的聚合结果独立计算,最终在渲染层合并到同一张图上。
Formula:computed metric
Lens 的 formula 功能允许在 Y 轴输入表达式而不是单选一个聚合函数:
1 | |
formula 表达式被 Lens 的表达式引擎解析成一个 pipeline,在 ES 的 aggregation 层(bucket_script、moving_fn 等)执行,不在 Kibana 侧做二次计算。这意味着 formula 的计算精度和性能取决于 ES 管道聚合的能力,而不是 JavaScript。
为什么 Lens 取代了 Visualize
Visualize(传统面板编辑器)与 Lens 的根本差异在于配置入口:
1 | |
Kibana 8.x 官方文档明确标注 Lens 为推荐的可视化编辑器。Visualize 仍然保留(主要是历史 Dashboard 的兼容),但新功能只在 Lens 里迭代。
Lens Saved Object 结构
1 | |
columns 里每一列就是一个 operation 配置,包含字段名、聚合类型、参数(如 terms 的 size)。Lens 的 “Inspect” 面板会展示最终发给 ES 的聚合 JSON,这是验证推断结果是否符合预期的直接手段。
实验:观察推断差异
在 Lens 编辑器里,依次拖以下三种字段到 X 轴维度,记录每次 Lens 自动选择的聚合类型,然后用 Inspect(图表右上角 → Inspect → Requests)查看实际发给 ES 的聚合 JSON:
1 | |
Inspect 面板里的 Request 标签页会展示完整的 ES 请求 body,其中 aggs 节点就是 Lens 推断并生成的聚合定义。这与 Visualize 需要手动配置后才能在 Inspect 里看到的 aggs 直接对应。
将实验结果映射到内部对象
1 | |
每种 Column 类型都在 Lens 的 operation 模块里有对应的 toEsAggsFn 方法,负责把 column 配置序列化成 ES aggregation 参数。
模式提炼
1 | |
工程迁移表
| Lens 概念 | Grafana 对应 | Tableau 对应 | Power BI 对应 |
|---|---|---|---|
| Operation catalog(字段 → 聚合) | Query 字段配置(手动) | "Show Me"自动推断聚合 | 自动汇总(SUM/COUNT 推断) |
| Suggestion 引擎 | 无内置(靠用户选面板类型) | Show Me(基于维度/度量组合) | Auto-visualization hint |
| Layer 模型 | 多 series + override | 多 mark layer | 叠加图层 |
| Formula(管道聚合表达式) | 计算字段(Transforms) | 计算字段(LOD 表达式) | DAX 计算列 / 度量 |
| Lens Saved Object | Panel JSON | 工作簿 XML | pbix 二进制 |
| Inline editing(Dashboard 内直接编辑) | Grafana 8+ 面板内编辑 | Dashboard 内编辑 | 报表内编辑 |
常见误解
误解一:“Lens 只能画简单图,复杂聚合还是要用 Visualize”。formula 功能已经覆盖了移动平均、差值、百分比等管道聚合场景。Visualize 的手动配置能表达的聚合,Lens 通过 operation catalog 和 formula 基本都能覆盖,差异主要在旧版本或特定图表类型。
误解二:“Lens 的图表类型比 Visualize 少”。Kibana 8.x 中 Lens 已经包含折线、柱状、面积、饼图、环形图、热力图、散点、Metric、Gauge、Waffle 等主流类型。Visualize 中部分类型(如 TSVB、Vega)是独立编辑器,不归属于 Lens,但这不代表 Lens 图表类型少。
误解三:“拖字段后 Lens 就直接发请求”。Lens 有一个 debounce 机制,配置变更会短暂等待后再触发查询,避免在拖拽过程中发出大量中间状态的请求。
误解四:“Lens 公式和 Elasticsearch Painless 脚本是一回事”。Lens formula 被编译成 ES 的标准聚合(bucket_script、moving_fn 等),不涉及 Painless 脚本。Painless 是 ES 侧的脚本执行能力,用在 runtime fields 和 script query 里。
练习
-
在 Lens 编辑器中,分别把 keyword、date、number 三种类型的字段拖到 Y 轴(metric 位置),观察每次自动选中的 operation 名称,然后在 Inspect → Requests 里找到对应的 ES aggregation JSON,确认推断的聚合类型与字段类型的对应关系。
-
用 formula 实现"每个 bucket 的值占所有 bucket 总和的百分比":在 Y 轴输入
count() / overall_sum(count()) * 100,用 Inspect 查看生成的 ES bucket_script 结构,理解overall_sum如何映射为 pipeline aggregation。 -
建一个双 layer 图表:Layer 0 是正常的时序折线,Layer 1 是一条固定值的 reference line。观察 Inspect 里 Layer 0 和 Layer 1 各自发出了什么 ES 请求(或 Layer 1 是否发请求)。
系列导航
参考资料
- Kibana Lens 官方文档:https://www.elastic.co/guide/en/kibana/current/lens.html(operation catalog、layer 模型、formula 支持范围)
- Kibana 源码 Lens 插件:https://github.com/elastic/kibana/tree/main/x-pack/platform/plugins/shared/lens(operation 模块、suggestion 引擎、getSuggestions 实现)
- Elasticsearch 聚合文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html(bucket_script、moving_fn 等管道聚合)
- Kibana 8.x 版本说明(Lens 成为默认编辑器):https://www.elastic.co/guide/en/kibana/current/whats-new.html
