prometheus relabel_config 删除操作不起作用

dan*_*sim 3 prometheus

我一直在尝试通过以下方式删除未使用的指标(在抓取之前)以减轻 Prometheus 集群上的负载relabel_configs

- job_name: nginx-ingress-controller-metrics
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - <some-namespace>
  relabel_configs:
  # single
  - source_labels: [__name__]
    regex: nginx_ingress_controller_response_size_bucket
    action: drop
  # multiple
  - source_labels: [__name__]
    regex: nginx_ingress_controller_(request_size_bucket|response_duration_seconds_bucket|bytes_sent_bucket|bytes_sent_sum)
    action: drop
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到任何这些指标被删除(在抓取之前),并且它们被抓取和摄取,因为我可以通过PromQL.

我尝试了同一配置的许多变体(即引号、括号等)。知道为什么这些目标仍然被刮擦/摄取吗?

ane*_*yte 9

您声明的内容relabel_configs发生在 Prometheus 与导出器建立连接之前。没有连接意味着还没有指标和标签,因此此时您无法删除指标__name__

您实际需要使用的是metric_relabel_configs. 此重新标记步骤发生在 Prometheus 从导出器检索数据之后、数据实际保存到数据库之前。这是一个例子:

metric_relabel_configs:
  - source_labels: [__name__]
    regex: my_useless_metric.*
    action: drop
Run Code Online (Sandbox Code Playgroud)

如果您好奇“那么 relabel_configs 有什么意义?”,relabel_configs请在主机规模上操作指标。使用服务发现信息(此时可用),您可以使用重新标记来更改地址、端口或决定是否应该删除该实例。

  • @danksim 就是这样:“对于 `relabel_configs` 这将导致 __* 目标 *__ 不被抓取,对于 `metric_relabel_configs` 这将导致 __* 时间序列 *__ 不被摄取”。正如你所说,你想避免某些 __*metrics*__ (=时间序列),而 `relabel_configs` 只能帮助你避免抓取一些 __*hosts*__ (=目标)。再次强调,在“relabel_configs”期间,尚未建立与目标的连接,因此除了 SD 数据之外,您一无所知。此时您无法选择某些指标,因为还没有。 (3认同)
  • 有趣的。这就说得通了。谢谢。那么如何在抓取之前删除指标呢?我什至不想删除未使用的指标来减轻负载。我知道“metric_relabel_configs”,但我相信这是在抓取之后、摄取之前。 (2认同)
  • @danksim 没有办法做到这一点。在知道指标名称之前,您必须检索(=抓取)指标。在这种情况下,抓取意味着 Prometheus 执行 HTTP GET 请求并将所有存在的标签提取到内存中。您可以在它们进入数据库之前(=在摄取之前)删除一些。这是不可能用“__address__”来实现的,因为它只是目标实例的“host:port”。您只能通过扰乱实例来删除实例中的所有指标。 (2认同)