如何用通配符编写Prometheus查询以在Grafana展示多响应码指标
问题:如何用单一查询聚合多响应码的Counter指标到Grafana面板
我的应用输出以下Counter类型指标:
app_counters_some_client_response_code_201_count_value{} app_counters_some_client_response_code_400_count_value{} app_counters_some_client_response_code_404_count_value{}
我想在Grafana仪表盘的同一个面板中展示这些不同指标的值,以响应码作为图例。但因为响应码种类未知且无法获取完整列表,没法逐个编写查询,请问如何用通配符写一个单一查询?
解决方案
1. 编写带通配符的基础查询
用*通配符匹配所有包含响应码的指标,结合rate函数(Counter类型指标必须用增长率展示才具备监控意义)和聚合函数筛选目标数据:
sum(rate(app_counters_some_client_response_code_*_count_value[5m])) by (__name__)
*:匹配任意响应码数字rate(...):计算5分钟内的指标增长率,避免Counter累计值持续上涨导致图表失去可读性sum(...) by (__name__):按指标名聚合数据,确保每个响应码对应一条独立的数据系列
2. 用label_replace提取响应码作为图例
通过正则表达式从指标名中提取响应码,生成专门用于图例展示的新标签:
label_replace(sum(rate(app_counters_some_client_response_code_*_count_value[5m])) by (__name__), "response_code", "$1", "__name__", "app_counters_some_client_response_code_(.*)_count_value")
label_replace函数参数说明:- 第一个参数:基础查询的结果集
- 第二个参数:新生成的标签名称(这里命名为
response_code) - 第三个参数:标签的取值(
$1对应正则匹配到的第一个分组,也就是响应码数字) - 第四个参数:要匹配的原标签(这里是指标名字段
__name__) - 第五个参数:正则表达式,精准匹配指标名的结构,捕获其中的响应码部分
3. 配置Grafana图例
进入面板的「图例」设置界面,选择response_code作为图例字段,这样每个数据系列就会以对应的响应码(如201、400)作为标识展示。
可选:展示累计值而非增长率
如果不需要监控变化趋势,只想查看当前的累计计数,可直接去掉rate函数:
label_replace(sum(app_counters_some_client_response_code_*_count_value) by (__name__), "response_code", "$1", "__name__", "app_counters_some_client_response_code_(.*)_count_value")
内容的提问来源于stack exchange,提问作者Shahbaz Khan
相关产品推荐
相关产品推荐

