基于release_date标签过滤最近一天PromQL指标的问题求助
解决Prometheus基于自定义时间标签筛选的问题
问题本质
Prometheus的标签均为字符串类型,不支持直接对自定义时间格式的标签执行时间算术运算——你之前使用的timestamp()函数仅能处理样本的采集时间戳,无法解析release_date标签中的字符串时间,因此那条查询语句完全无效。
可行解决办法
办法1:构造正则匹配时间范围
由于YYYY.MM.DD HH:MM:SS格式的字符串,字典排序与时间顺序完全一致,可通过正则表达式直接匹配所有时间晚于2024.04.03 12:27:35减1天(即2024.04.02 12:27:35)的release_date值。
对应的PromQL查询语句:
app_common_opts{ release_date=~"202[5-9].*|20[3-9][0-9].*|2[1-9][0-9]{2}.*|[3-9][0-9]{3}.*|2024\\.(0[5-9]|1[0-2])\\..*|2024\\.04\\.(0[3-9]|1[0-9]|2[0-9]|3[0-1]) .*|2024\\.04\\.02 (1[3-9]|2[0-3]):.*|2024\\.04\\.02 12:([3-5][0-9]|2[8-9]):.*|2024\\.04\\.02 12:27:([36-59])" }
该正则覆盖了所有符合要求的场景:年份更大、月份更大、日期更大,或同日期下小时/分钟/秒晚于目标时间的情况。
办法2:修改指标暴露格式(长期最优)
调整应用的指标暴露逻辑,额外添加一个release_date_unix标签,将发布时间以**Unix时间戳(字符串格式)**的形式暴露,例如:
{__name__="app_common_opts", instance="my-servise", release_date="2024.04.03 12:27:35", release_date_unix="1712176055"} 1
后续筛选时,只需将目标时间转换为Unix时间戳(2024.04.02 12:27:35对应1712089655),再使用更简洁的正则匹配:
app_common_opts{ release_date_unix=~"17120896[5-9][0-9]|1712089[7-9][0-9]{2}|171209[0-9]{4}|1712[1-9][0-9]{5}|171[3-9][0-9]{6}|17[2-9][0-9]{7}|1[8-9][0-9]{8}|[2-9][0-9]{9}" }
这种方式后续调整时间范围时,仅需换算Unix时间戳即可,正则构造也更简单。
关键提醒
Prometheus无法直接对标签字符串执行数值或时间运算,所有基于标签的时间筛选都必须通过正则匹配实现。另外编写正则时,.这类特殊字符需要用\\转义,避免被当作通配符处理。
内容的提问来源于stack exchange,提问作者Total Pusher
相关产品推荐
相关产品推荐

