【问题标题】:How to get all metric names from Prometheus server filtered by a particular label如何从按特定标签过滤的 Prometheus 服务器获取所有指标名称
【发布时间】:2022-01-14 22:42:56
【问题描述】:

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

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

curl -g 'http://localhost:9090/api/v1/label/__name__/values

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

curl -g 'http://localhost:9090/api/v1/label/__name__/values?match[]={job!="prometheus"}'

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

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

@anemyte,仍然返回所有结果。你能检查一下查询吗

【问题讨论】:

  • 最后一个肯定对我有用:pastebin.com/izvkhJpP
  • @anemyte,即使我指定了不同的标签,仍然可以获得所有指标。我还通过github.com/prometheus/client_golang api 获得了相同数量的指标。 // LabelValues 对给定标签、时间范围和匹配器的值进行查询。 LabelValues(ctx context.Context, label string, matches []string, startTime time.Time, endTime time.Time) (model.LabelValues, Warnings, error)
  • 您尝试过哪些其他标签选择器?它是否适用于一些简单的愚蠢的东西,比如match[]=my_metric_foo
  • @anemyte,它总是返回所有指标名称,而不管来自普罗米修斯服务器的任何 match[]。
  • 好吧,在这一点上我只能说它要么是一个错误,要么你的 match[] 参数根本无法识别。检查日志,尝试在浏览器中请求标签(消除 curl 的问题)在图形面板中组成选择器。

标签: rest curl prometheus prometheus-alertmanager prometheus-java


【解决方案1】:

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

  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"}' 

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

【讨论】:

  • 这将为所有指标及其值提供附加标签。我们的程序在内存受限的环境中运行,所以想了解我发布的查询有什么问题。 Prometheus端的查询或任何错误是否有任何问题?
  • @user3082802 哦,对不起,不知道我怎么写的。请参阅上面我发布的查询,它对我有用。
  • 我使用了您在上面发布的确切查询,但出现以下错误。 “方法不允许”
  • @user3082802 将-g 替换为-XGET
  • curl -X GET localhost:9090/api/v1/label/__name__/values --data-urlencode 'match[]={job!="prometheus"}' 它返回了所有指标,所以 {job="prometheus"} 和{job!="prometheus"} 返回完全相同的结果
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2021-09-06
  • 2012-12-04
  • 2018-08-14
  • 2021-10-12
相关资源
最近更新 更多