一、介绍
本文主要记录下prometheus的匹配模式。
在写PromQL时候,经常会需要根据tag匹配,比如我们常用的tagkey=tagval。
其实PromQL的匹配有多种,本文总结下。
二、完全匹配
目前主要支持两种匹配模式:完全匹配和正则匹配。
完全匹配
PromQL 支持使用 = 和!= 两种完全匹配模式:
- 查询状态码为200的:http_server_requests_seconds_count{application="hubble-biz-aiops", uri="/actuator/metrics",status="200"}
- 查询状态码为非200的:http_server_requests_seconds_count{application="hubble-biz-aiops", uri="/actuator/metrics",status!="200"}
三、正则匹配
1、介绍
PromQL 还可以使用正则表达式作为匹配条件,并且可以使用多个匹配条件。
什么时候会用到正则呢?
一般我们匹配多种条件时候会使用正则,比如一个实际场景:http请求状态码中,匹配2xx,3xx,4xx认为成功,或者是匹配5xx是失败。
这里的xx就会有多种数据,不好一一例举,因此用正则是比较合适的。
正则匹配分为正向匹配和反向匹配:
- 正向匹配:使用 label=~regx 表示选择那些标签符合正则表达式定义的时间序列。
- 反向匹配:使用 label!~regx 进行排除。
2、案例
案例一
我想查询指标http_server_requests_seconds_count中,状态码status为非2xx的:
http_server_requests_seconds_count{application="hubble-biz-bq-alarm-query",status!~"2.."}
注意:
- 2..:表示2xx,其中.代表任意字符,也可以用2.*或者2.+
- .表示一个字符,这个字符可以是任意字符,*表示0~n个,+表示1~n个
- 所以.*表示.后面可以跟0~n个.,如满足2.*的:2x,2xx,2xxx,2xxxxx,……
- .+表示.后面可以跟1~n个.,如满足2.+的:2xx,2xxx,2xxxxx,……
案例二
我想查询指标 prometheus_http_requests_total 中,所有 handler 标签以 /api/v1 开头的记录,那么我的表达式为:prometheus_http_requests_total{handler=~"/api/v1/.*"}。