在Grafana中使用正则表达式进行数据过滤
一、Prometheus数据源(PromQL)
(一)基于标签的正则表达式过滤
- 基本语法
- 在Prometheus中,指标带有标签(Labels),可以使用
=~
操作符结合正则表达式对标签值进行过滤。例如,如果有一个指标http_requests_total
带有path
标签,表示HTTP请求的路径,要过滤出以/api
开头的请求路径对应的指标,可以使用如下查询语句: http_requests_total{path =~ "/api.*"}
。这里/api.*
是一个正则表达式,.*
表示匹配任意字符零次或多次,所以这个查询会匹配所有以/api
开头的路径对应的http_requests_total
指标。
- 在Prometheus中,指标带有标签(Labels),可以使用
- 否定匹配
- 如果要进行否定的正则表达式匹配,可以使用
!~
操作符。例如,要查询路径不是以/static
开头的http_requests_total
指标,可以使用http_requests_total{path!~ "/static.*"}
。
- 如果要进行否定的正则表达式匹配,可以使用
二、日志数据源(如Loki,与Grafana集成)
(一)查询日志中的文本内容
- Loki查询语法中的正则表达式
- 在Loki数据源中,可以使用正则表达式来查询日志中的特定内容。例如,如果要查询包含特定错误消息(假设错误消息包含
error: database connection
)的日志,可以在Loki的查询栏中使用如下查询: {job="my - application"} |= "error: database connection"
。这里|=
操作符表示日志行包含(使用了类似正则表达式的匹配)指定的字符串。如果要使用更严格的正则表达式匹配,可以使用|~
操作符。例如,要查询包含以error:
开头,后面跟着任意字符,再跟着database
的日志行,可以使用{job="my - application"} |~ "error:.*database"
。
- 在Loki数据源中,可以使用正则表达式来查询日志中的特定内容。例如,如果要查询包含特定错误消息(假设错误消息包含
- 过滤特定字段值(基于日志中的结构化数据)
- 如果日志是结构化的,并且有特定的字段(如
status
字段表示日志的状态),要使用正则表达式过滤该字段的值。假设日志是JSON格式,并且有一个status
字段,要查询状态为以4
开头的数字(表示4xx错误)的日志,可以使用: {job="my - application", status =~ "4.*"}
。
- 如果日志是结构化的,并且有特定的字段(如
三、在仪表板变量中使用正则表达式(通用情况)
(一)创建正则表达式类型的变量
- 变量配置
- 在仪表板(Dashboard)的设置(Settings)页面创建变量时,可以将变量类型设置为“Custom”(自定义),然后在变量的定义中使用正则表达式。例如,创建一个名为
server_names
的变量,它从Prometheus指标的server_name
标签获取值,但只获取符合特定正则表达式的值。 - 在变量的“Query”(查询)部分,可以使用类似
label_values(http_requests_total, server_name) =~ "server - [0 - 9]+"
的查询语句。这里server - [0 - 9]+
是一个正则表达式,它会匹配以server -
开头,后面跟着一个或多个数字的服务器名称。
- 在仪表板(Dashboard)的设置(Settings)页面创建变量时,可以将变量类型设置为“Custom”(自定义),然后在变量的定义中使用正则表达式。例如,创建一个名为
- 在面板查询中使用变量进行过滤
- 在面板的查询语句中使用这个变量进行过滤。例如,在查询
http_requests_total
指标时,可以使用http_requests_total{server_name = '$server_names'}
。这样,面板中的数据就会根据变量中通过正则表达式筛选出来的服务器名称进行过滤。
- 在面板的查询语句中使用这个变量进行过滤。例如,在查询