如何在Kibana中计算两个聚合指标间的比率?Scripted Fields不适用
如何在Kibana中计算聚合指标的比率
这确实是Scripted Fields的一个局限——它只能在单文档层面做计算,完全没法处理聚合后指标间的比率需求。不过Kibana有好几种实用的方案能解决这个问题,我给你梳理几个最常用的:
1. 使用Lens可视化(推荐,Kibana主流工具)
Lens是Kibana现在主推的可视化工具,原生支持基于聚合结果的计算,操作非常直观:
- 打开Lens,选择你的索引模式;
- 先添加第一个聚合指标(比如选择「总和」函数,关联字段
metric_a); - 再添加第二个聚合指标(同样选择「总和」函数,关联字段
metric_b); - 点击顶部的「添加计算」按钮,选择「比率」选项;
- 在弹出的设置里,指定分子为第一个指标、分母为第二个指标,确认后就能直接生成比率指标了;
- 还可以在指标设置里调整显示格式(比如改成百分比),让结果更直观。
2. 使用Timelion(适合时序数据场景)
如果你的数据是时序类的,Timelion会是个灵活的选择,它专门处理时序数据的计算:
- 打开Timelion,输入类似这样的表达式:
.es(index=your_index_name, metric=sum:metric_a) /.es(index=your_index_name, metric=sum:metric_b).label("A/B比率").format(percent) - 解释一下:
.es()函数分别获取两个指标的总和,用/做除法运算,.label()给结果加名称,.format(percent)把结果转成百分比显示; - 你还可以根据需要添加时间范围过滤、分组等参数,适配你的数据场景。
3. 使用Canvas(适合定制化仪表盘)
Canvas适合制作高度定制的仪表盘,能直接通过表达式计算聚合后的比率:
- 打开Canvas,先创建两个「数据元素」,分别查询两个指标的聚合值:
比如第一个元素的表达式:
第二个元素的表达式:filters | essql query="SELECT SUM(metric_a) FROM your_index_name" | getCell 0filters | essql query="SELECT SUM(metric_b) FROM your_index_name" | getCell 0 - 然后添加一个「文本元素」,用以下表达式计算并显示比率:
var sumA = elements.sum_a_element_id | getValue var sumB = elements.sum_b_element_id | getValue math "sumA / sumB" | formatNumber "0.00%" - 替换掉表达式里的元素ID和索引名称,就能得到你需要的比率了。
4. 使用Elasticsearch管道聚合(查询层面预计算)
如果希望在查询Elasticsearch时就直接算出比率,可以用bucket_script管道聚合,之后在Kibana可视化里直接调用这个聚合结果:
- 构造包含管道聚合的查询DSL,示例如下:
{ "size": 0, "aggs": { "sum_metric_a": { "sum": { "field": "metric_a" } }, "sum_metric_b": { "sum": { "field": "metric_b" } }, "a_b_ratio": { "bucket_script": { "buckets_path": { "a_value": "sum_metric_a", "b_value": "sum_metric_b" }, "script": "params.a_value / params.b_value" } } } } - 在Kibana的可视化(比如垂直条形图)中,选择「自定义聚合」,导入这个DSL,然后把
a_b_ratio作为指标显示即可。
内容的提问来源于stack exchange,提问作者André Silveira
相关产品推荐
相关产品推荐

