如何在Grafana(Prometheus数据源)中动态筛选昨日日期标签数据
解决Grafana中Prometheus指标动态筛选昨日date标签的问题
你的核心问题是PromQL本身不支持直接在标签匹配中生成动态日期字符串,得结合Grafana的变量功能来实现,具体步骤如下:
方法一:使用Grafana动态变量(推荐)
创建日期变量
- 进入Grafana仪表盘的「设置」→「变量」,点击「添加变量」
- 变量类型选择「Date & time」,变量名设为
yesterday_date - 「Time range」选择「Custom」,设置:
- From:
now-1d/d(自动对齐到昨日的起始时间) - To:
now-1d/d
- From:
- 「Format」选择「YYYY-MM-DD」,点击保存
在查询中使用变量
直接在PromQL里用变量做精确匹配:metric_name{date="$yesterday_date"}
为什么你之前的尝试失败了
metric_name{date = today()}:PromQL没有today()函数,无法识别这种写法metric_name{date=~"^(.*)-2d$"}:正则逻辑错误,你的date标签是YYYY-MM-DD格式,这个正则匹配的是结尾为-2d的字符串,和日期无关metric_name{date=~"$(time()-2d:1d)"}:PromQL不支持这种语法插值,且time()返回的是Unix时间戳,不是YYYY-MM-DD格式的字符串,无法匹配date标签
方法二:纯PromQL实现(不推荐,性能较差)
如果不想依赖Grafana变量,可以通过标签转换和时间函数实现,但需要处理标签到时间格式的转换,示例如下:
metric_name # 将date标签转换为无分隔符的日期字符串 |> label_replace(__name__, "date_str", "$1$2$3", "date", "(\\d{4})-(\\d{2})-(\\d{2})") # 筛选昨日的日期字符串 |> where date_str == strftime("%Y%m%d", time() - 86400)
注:这种方法需要遍历所有指标标签做转换,数据量大时性能会受影响,优先推荐变量方案
内容的提问来源于stack exchange,提问作者Hili Pa
相关产品推荐
相关产品推荐

