You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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不会保留已终止进程的指标,需要通过记录规则捕获进程的启停事件:

  1. 在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])
  1. 之后可以通过关联这两个指标,计算每个进程实例的运行时长:
process:end_time - process:start_time

注意:这个方法依赖Prometheus的记录规则配置,且需要确保exporter的采样间隔与规则中的[1m]匹配,避免误判启停事件。

内容的提问来源于stack exchange,提问作者oaaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:47:16