如何用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
相关产品推荐
相关产品推荐

