Prometheus:根据另一个指标过滤查询
Prometheus: filter query based on another metric
假设我在 prometheus 中有两个指标,两个计数器:
requests_processed_total
requests_failed_total
它们都有匹配的 service
标签。示例:
requests_processed_total{service="news"} 1097
requests_processed_total{service="store"} 487
requests_failed_total{service="news"} 23
requests_failed_total{service="store"} 89
如何查询 requests_failed_total
,但仅限于 request_processed_total > 1000
.
的服务
我期待以下回复:
requests_failed_total{service="news"} 23
# Note that the "store" service is excluded
您可以使用 HTTP API 来执行此操作。
以下命令将查找 request_processed_total>1000 的服务:
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_processed_total>1000" | jq --raw-output '.data.result[].metric.service'
并且以下命令将显示给定服务的 requests_failed_total:
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_failed_total{service=\"SERVICE\"}" | jq --raw-output '.data.result[].value[1]'
所以,如果你两者都拿走,你会得到你想要的:
for s in $(curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_processed_total>1000" | jq --raw-output '.data.result[].metric.service')
do
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_failed_total{service=\"$s\"}" | jq --raw-output '.data.result[] | .metric.service + " " + .value[1]'
done
如果您使用的是 Grafana,您可以执行以下操作:
(1) 创建仪表板
(2) 单击仪表板设置 > 变量 > 新建
(3) 使用以下内容创建一个变量:
Name = service
Type = Query
Data source = Prometheus
Query = query_result(request_processed_total>5)
Regex = /service="(.*)"/
(4) 使用“service”变量在任何面板中显示“requests_failed_total”指标(您也可以使用“repeat for”Grafana 功能。
requests_failed_total and on(service) requests_processed_total > 1000
https://prometheus.io/docs/prometheus/latest/querying/operators/#logical-set-binary-operators
https://prometheus.io/docs/prometheus/latest/querying/operators/#one-to-one-vector-matches
假设我在 prometheus 中有两个指标,两个计数器:
requests_processed_total
requests_failed_total
它们都有匹配的 service
标签。示例:
requests_processed_total{service="news"} 1097
requests_processed_total{service="store"} 487
requests_failed_total{service="news"} 23
requests_failed_total{service="store"} 89
如何查询 requests_failed_total
,但仅限于 request_processed_total > 1000
.
我期待以下回复:
requests_failed_total{service="news"} 23
# Note that the "store" service is excluded
您可以使用 HTTP API 来执行此操作。
以下命令将查找 request_processed_total>1000 的服务:
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_processed_total>1000" | jq --raw-output '.data.result[].metric.service'
并且以下命令将显示给定服务的 requests_failed_total:
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_failed_total{service=\"SERVICE\"}" | jq --raw-output '.data.result[].value[1]'
所以,如果你两者都拿走,你会得到你想要的:
for s in $(curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_processed_total>1000" | jq --raw-output '.data.result[].metric.service')
do
curl --silent --user USER:PASS --globoff --request GET "https://PROMETHEUS-SERVER/query?query=request_failed_total{service=\"$s\"}" | jq --raw-output '.data.result[] | .metric.service + " " + .value[1]'
done
如果您使用的是 Grafana,您可以执行以下操作:
(1) 创建仪表板
(2) 单击仪表板设置 > 变量 > 新建
(3) 使用以下内容创建一个变量:
Name = service
Type = Query
Data source = Prometheus
Query = query_result(request_processed_total>5)
Regex = /service="(.*)"/
(4) 使用“service”变量在任何面板中显示“requests_failed_total”指标(您也可以使用“repeat for”Grafana 功能。
requests_failed_total and on(service) requests_processed_total > 1000
https://prometheus.io/docs/prometheus/latest/querying/operators/#logical-set-binary-operators https://prometheus.io/docs/prometheus/latest/querying/operators/#one-to-one-vector-matches