Prometheus:根据另一个指标过滤查询

Prometheus: filter query based on another metric

假设我在 prometheus 中有两个指标,两个计数器:

它们都有匹配的 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