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

如何用PromQL在动态时间区间获取CLI工具执行的最大指标值

解决CLI工具单次执行周期的PromQL统计方案

核心思路

给CLI的每一次执行分配唯一标识标签(比如run_id),让同一次执行产生的所有指标都携带这个标签。之后通过按run_id分组聚合,就能精准统计单次执行的处理时长、对象数量,完全避开固定时间间隔聚合的问题。

第一步:修改指标定义,添加唯一执行标识

每次CLI启动时,生成一个全局唯一的ID(比如UUID、时间戳+随机串),并将这个ID作为标签附加到所有自定义指标上:

  • 处理对象数指标示例:process_objects_total{run_id="a1b2c3d4", job="daily-cli"}
  • 处理时长指标示例:process_duration_seconds{run_id="a1b2c3d4", job="daily-cli"}

如果使用Prometheus客户端库(比如Python的prometheus-client、Go的prometheus包),只需在CLI启动时初始化指标时带上run_id标签,整个执行周期内的指标都会自动继承这个标签。

第二步:编写精准的PromQL查询

1. 统计单次执行的处理对象总数

取同一run_id下process_objects_total的最大值(因为执行过程中该指标是累计递增的,最大值即为本次处理的总对象数):

max by (run_id) (process_objects_total)

2. 统计单次执行的总处理时长

同理,取同一run_id下process_duration_seconds的最大值(时长从0累计到执行结束,最大值就是总耗时):

max by (run_id) (process_duration_seconds)

3. 关联执行结束时间(适配Grafana时间轴)

如果需要在Grafana的时间轴上准确定位每次执行的时间,可以结合time()函数,拿到每次执行的结束时间:

# 处理时长关联结束时间
max by (run_id) (process_duration_seconds) * on(run_id) group_left() time()

# 处理对象数关联结束时间
max by (run_id) (process_objects_total) * on(run_id) group_left() time()

第三步:Grafana面板配置

  • 选择柱状图面板,将上述PromQL作为查询语句
  • 图例设置为{{run_id}}(或结合job等其他标签,比如{{job}} - {{run_id}})
  • 若要同时展示处理时长和对象数,启用双Y轴,分别配置两个查询,对应不同的Y轴刻度

替代方案(不修改指标标签的妥协方案)

如果暂时无法修改指标,可尝试利用执行时间区间的差异,但可靠性较低:

# 统计每个周期内的对象数,仅适用于执行间隔远大于聚合区间的场景
max_over_time(process_objects_total[$__interval]) unless max_over_time(process_objects_total[$__interval] offset $__interval)

但此方案无法处理同区间多次执行、跨区间执行的情况,仅作为临时过渡使用,优先推荐添加run_id标签的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:25:19