Kibana自定义时间范围下用@timestamp计算文档等待时长问题求助
Kibana 队列等待时长区间统计解决方案
错误原因
@timestamp是文档入库的具体时间点,无法直接和时长单位做数值比较,你写的@timestamp <=2(hours)属于非法KQL语法,必须先计算统计基准时间和@timestamp的差值得到等待时长,再做区间筛选。
实现步骤
1. 生成等待时长计算字段
无需修改索引原有映射,直接用Kibana运行时字段临时生成即可:
- 进入Discover页,点击左侧数据视图旁的编辑按钮,选择「Add runtime field」
- 字段名填
wait_hours,类型选「Number」,脚本框输入以下Painless代码:
// 若等待时长计算基准为当前查询时间,用此脚本 long timeDiffMs = new Date().getTime() - doc['@timestamp'].value.toInstant().toEpochMilli(); return timeDiffMs / 3600000; // 换算为小时单位
- 如果你的统计基准是文档入库当日的上午9点,替换为以下脚本:
ZonedDateTime entryTime = doc['@timestamp'].value; ZonedDateTime baseTime = entryTime.withHour(9).withMinute(0).withSecond(0).withNano(0); long timeDiffMs = new Date().getTime() - baseTime.toInstant().toEpochMilli(); return timeDiffMs / 3600000;
- 点击保存即可完成字段添加
2. KQL查询对应区间文档
- 统计等待时长小于2小时的文档:
FieldName:somevalue and wait_hours < 2 - 统计等待时长大于等于2小时且小于12小时的文档:
FieldName:somevalue and wait_hours >= 2 and wait_hours < 12
3. 分区间批量统计数量
如果需要同时展示两个区间的文档数,直接用可视化分桶即可:
- 新建柱状图/表格可视化,选择对应数据视图
- 指标聚合选「Count」,统计文档总数
- 桶聚合选「Range」,字段选
wait_hours,添加两个区间:- 0~2
- 2~12
- 执行查询即可得到两个区间的文档数量
内容的提问来源于stack exchange,提问作者Irfan
相关产品推荐
相关产品推荐

