Prometheus查询是否存在避免重复标签选择器的语法?
简化Prometheus查询中重复标签选择器的方法
PromQL本身并没有你期望的with式标签复用语法,但可以通过以下两种方式大幅简化你的查询:
方法1:利用Grafana模板变量复用公共标签
在Grafana中创建一个包含公共标签的模板变量,比如命名为common_labels,变量值设置为:
name="$avalon_apdex_service",kubernetes_namespace="$ns",uri!~"$uri"
(注意标签之间不要加空格,避免语法错误)
之后你的查询可以简化为:
( ( sum(rate(http_server_requests_seconds_bucket{{$common_labels}},status!~"5..",le="1.0"}[5m])) + sum(rate(http_server_requests_seconds_bucket{{$common_labels}},status!~"5..",le="4.0"}[5m])) ) / 2 ) / sum(rate(http_server_requests_seconds_count{{$common_labels}}}[5m]))
方法2:使用Prometheus记录规则预计算重复逻辑
通过Prometheus的记录规则,将重复的标签筛选和计算逻辑提前定义,避免在查询中重复编写。
在Prometheus配置中添加以下记录规则:
groups: - name: apdex_calculation_rules rules: # 预计算符合条件的bucket速率总和(按le标签分组) - record: apdex:http_server_requests_bucket:rate5m expr: sum(rate(http_server_requests_seconds_bucket{name="$avalon_apdex_service",kubernetes_namespace="$ns",uri!~"$uri",status!~"5.."}[5m])) by (le) # 预计算总请求数速率总和 - record: apdex:http_server_requests_count:rate5m expr: sum(rate(http_server_requests_seconds_count{name="$avalon_apdex_service",kubernetes_namespace="$ns",uri!~"$uri"}[5m]))
之后你的查询可以简化为非常简洁的形式:
( (apdex:http_server_requests_bucket:rate5m{le="1.0"} + apdex:http_server_requests_bucket:rate5m{le="4.0"}) / 2 ) / apdex:http_server_requests_count:rate5m
注意:你原始查询中存在一个笔误——第二个bucket选择器中的name="avaon_apdex_service"少了一个l,应该是avalon_apdex_service,使用记录规则或模板变量时记得修正这个错误。
内容的提问来源于stack exchange,提问作者vf58bwk4
相关产品推荐
相关产品推荐

