如何实现PromQL范围查询Windows进程指定时段的运行时长?
解决Prometheus+Grafana展示Windows进程选定时间范围运行时长的问题
问题根源
你原来的查询time() - min by(process) (windows_process_start_time{process="foo"})仅能通过instant查询生效,是因为它只取当前时间点的进程启动时间最小值,计算到当前的时长。切换到range查询时,time()会被解析为每个采样点的时间戳,再加上min by(process)的聚合逻辑破坏了时间序列的连续性,导致无法正确展示时间段内的时长变化。另外,这个查询仅对正在运行的进程有效,因为进程终止后windows_process_start_time指标会从Prometheus中消失。
解决方案
1. 展示当前运行进程在选定时间范围内的时长变化/最终时长
直接使用以下PromQL进行range查询:
time() - windows_process_start_time{process="foo"}
在Grafana中配置表格面板时:
- 选择
Range查询类型 - 在面板的
Transform选项中添加Reduce转换,选择Last(获取时间范围结束时的最终运行时长)或Max(获取时间段内进程达到的最长运行时长,适合进程未重启的情况) - 即可在表格中看到进程在选定时间段内的运行时长数据
2. 统计进程在选定时间范围内的总运行时长(含中途重启)
如果进程在时间段内有重启,需要累加每次运行的时长,可以用近似统计的方式:
count_over_time(windows_process_start_time{process="foo"}[$__range]) * $__interval
原理是:windows_process_start_time存在的每个采样点都代表进程在运行,统计采样点数量乘以采样间隔($__interval是Grafana内置变量,代表查询的采样间隔),就能近似得到总运行时长。采样间隔越小,结果越准确。
3. 展示已终止进程的运行时长
默认情况下,Prometheus不会保留已终止进程的指标,需要通过记录规则捕获进程的启停事件:
- 在Prometheus配置中添加以下记录规则:
groups: - name: process_tracking_rules rules: # 捕获进程启动事件(仅在进程首次出现或重启时记录) - record: process:start_time expr: windows_process_start_time{process="foo"} unless last_over_time(windows_process_start_time{process="foo"}[1m]) # 捕获进程终止事件(仅在进程消失时记录当前时间) - record: process:end_time expr: time() unless windows_process_start_time{process="foo"} and last_over_time(windows_process_start_time{process="foo"}[1m])
- 之后可以通过关联这两个指标,计算每个进程实例的运行时长:
process:end_time - process:start_time
注意:这个方法依赖Prometheus的记录规则配置,且需要确保exporter的采样间隔与规则中的[1m]匹配,避免误判启停事件。
内容的提问来源于stack exchange,提问作者oaaya
相关产品推荐
相关产品推荐

