如何在Grafana中统计含列表的列内各值的出现次数?
问题描述
我有一个以Elasticsearch为数据源的Grafana面板,已经通过Extract Fields转换解析JSON日志,得到如下表格:
| ID | Field1 | Field2 |
|---|---|---|
| A | [ "Value-1", "Value-2" ] | 示例1 |
| B | [ "Value-1" ] | 示例2 |
| C | [ "Value-2", "Value-3" ] | 示例3 |
我希望统计Field1列表中每个值的出现次数,期望得到如下结果:
| Field1 | 次数 |
|---|---|
| "Value-1" | 2 |
| "Value-2" | 2 |
| "Value-3" | 1 |
我的初步思路是先把列表值拆分为单独行(拆分后表格如下),再通过Group By转换统计次数,但没找到对应的拆分转换方法,请问有没有实现该转换的方法或更优方案?
拆分后期望的中间表格:
| ID | Field1 | Field2 |
|---|---|---|
| A | "Value-1" | 示例1 |
| A | "Value-2" | 示例1 |
| B | "Value-1" | 示例2 |
| C | "Value-2" | 示例3 |
| C | "Value-3" | 示例3 |
解决方案
方案1:Grafana内置转换实现拆分+统计
Grafana自带拆分数组字段的转换功能,步骤如下:
- 进入面板的
Transform标签页,点击Add transformation,选择**Expand multi-value fields**(部分新版本Grafana中名为Unnest)。 - 在转换配置里,指定要拆分的字段为
Field1,转换会自动将数组中的每个元素拆分为单独行,同时保留其他字段的对应值,生成你需要的中间表格。 - 继续添加
Group By转换:- 选择
Group by字段为Field1 - 在
Aggregations中选择Count,将结果列重命名为次数
- 选择
- 调整表格展示列,仅保留
Field1和次数即可得到目标结果。
方案2:Elasticsearch查询层面直接聚合(更高效)
如果数据量较大,在Elasticsearch层面做聚合比Grafana后处理更高效,直接修改查询语句:
- 打开面板的
Query标签页,切换到Code模式(可视化查询可切换至JSON编辑器)。 - 在查询的
aggregations部分添加terms聚合(注意如果Field1是数组类型,需用Field1.keyword确保聚合准确性):
{ "aggs": { "field1_values": { "terms": { "field": "Field1.keyword", "size": 100 // 根据实际数据量调整返回数量 } } }, "size": 0 // 仅返回聚合结果,不返回原始数据 }
- 执行查询后,Grafana会直接返回
Field1各值的计数,将表格展示的Key和Doc Count调整为Field1和次数即可。
内容的提问来源于stack exchange,提问作者Wesgur
相关产品推荐
相关产品推荐

