如何从 Prometheus 服务器获取按特定标签过滤的所有指标名称

use*_*802 8 rest curl prometheus prometheus-alertmanager prometheus-java

我们希望从 Prometheus 服务器获取按特定标签过滤的所有指标名称。

第 1 步:使用以下查询获取所有指标名称,查询成功并获得所有指标名称。

curl -g 'http://localhost:9090/api/v1/label/__name__/values
Run Code Online (Sandbox Code Playgroud)

步骤 2 :使用以下查询获取按标签过滤的所有指标名称,但查询仍然返回所有指标名称。

curl -g 'http://localhost:9090/api/v1/label/__name__/values?match[]={job!="prometheus"}'
Run Code Online (Sandbox Code Playgroud)

有人可以帮我通过 http 按标签过滤所有指标名称吗?谢谢

curl -G -XGET http://localhost:9090/api/v1/label/__name__/values --data-urlencode 'match[]={__name__=~".+", job!="prometheus"}'
Run Code Online (Sandbox Code Playgroud)

@anemyte,仍然返回所有结果。您可以检查一下查询吗

ane*_*yte 9

虽然乍一看似乎很简单,但事实证明这是一件非常棘手的事情。

  1. 必须对参数match[]及其值进行编码。curl可以通过--data-urlencode论证做到这一点。

  2. 编码match[]参数必须出现在 URL 中,而不是出现在application/x-www-form-urlencoded标头中(curl默认情况下,标头中放置的是编码值)。因此,-G(大写的!)键也是必需的。

  3. {job!="prometheus"}不是有效的查询。它给出以下错误:

    解析错误:向量选择器必须至少包含一个非空匹配器

    可以使用这个低效的正则表达式选择器来克服:{__name__=~".+", job!="prometheus"}。如果可能的话,最好将其替换为另一个选择器(例如{job="foo"})。

将所有内容放在一起:

curl -XGET -G 'http://localhost:9090/api/v1/label/__name__/values' \
  --data-urlencode 'match[]={__name__=~".+", job!="prometheus"}' 
Run Code Online (Sandbox Code Playgroud)

自 Prometheus 发布以来,使用上面示例中的选择器成为可能v2.24.0