Grafana结合Elasticsearch:正则提取名称后合并计数的方法求助
解决Grafana中Elasticsearch数据源按名称聚合计数的问题
问题场景
当前使用Elasticsearch作为Grafana数据源,查询得到原始结果如下:
| Message | Count |
|---|---|
| ResourceInvalidOperation-John | 5 |
| ResourceInvalidOperation-Mary | 10 |
| ResourceContent-George | 7 |
| BusinessInvalidContent-John | 6 |
| ResourceInvalidOperation-George | 9 |
| ResourceReference-John | 1 |
需求:提取Message字段中XXXXX-名称格式里的名称部分,将同名记录的Count值求和合并,得到目标结果:
| Name | Count |
|---|---|
| John | 12 |
| Mary | 10 |
| George | 16 |
解决方案
方法一:Elasticsearch原生聚合(高效推荐)
直接在数据源查询阶段完成提取与聚合,比Grafana Transform更高效:
- 打开Grafana的Elasticsearch查询编辑器
- 添加Bucket aggregation,类型选择
Terms - 在
Field选项中,选择Script,输入脚本:
(若Message字段为keyword类型,去掉doc['Message.keyword'].value.split('-')[1].keyword后缀即可) - 添加Metrics聚合,类型选择
Sum,目标字段选择你的Count字段(如Count或ES原生的_count) - 执行查询,直接得到按名称聚合后的求和结果
方法二:Grafana Transform处理
若需在Grafana端完成转换,按以下步骤操作:
- 确保原始查询能返回完整的Message和Count数据
- 切换到Transform标签页,点击
Add transformation - 选择Extract fields转换:
- 目标字段选
Message - 正则表达式填入
.*-(.*)$ - 提取后的字段名设置为
Name
- 目标字段选
- 继续添加Group by转换:
- 分组字段选择刚提取的
Name - 聚合函数选
Sum,目标字段选Count
- 分组字段选择刚提取的
- 可选:添加Organize fields转换,隐藏原始Message字段,只保留
Name和求和后的Count字段
内容的提问来源于stack exchange,提问作者Sekonder SS
相关产品推荐
相关产品推荐

