「译文」通过 Relabel 减少 Prometheus 指标的使用量

本文最后更新于:2023年5月6日 上午

👉️URL: https://grafana.com/docs/grafana-cloud/data-configuration/metrics/metrics-control-usage/control-prometheus-metrics-usage/usage-reduction/?pg=blog&plcmt=body-txt

📝Description:

通过重新标记减少 Prometheus 指标的使用量 本指南描述了几种技术,你可以用来减少 Grafana Cloud 上的 Prometheus 指标使用量。
在应用这些技术之前,确保你正在重复利用从高可用性 Prometheus 集群发送的任何样本 (samples)。这将使你的活动系列 (active series) 计数减少一半。要了解如何做到这一点,请参阅从多个高可用性 Prometheus 实例发送数据。
你可以通过两种方式减少发送到 Grafana Cloud 的活动系列的数量。

通过重新标记减少普罗米修斯的指标使用量

本指南描述了几种技术,你可以用来减少 Grafana Cloud 上的 Prometheus 指标使用量。

在应用这些技术之前,请确保你对从高可用性的 Prometheus 集群发送的任何样本进行重复数据处理。这将使你的活动系列计数减少一半。要了解如何做到这一点,请参见 从多个高可用性的 Prometheus 实例发送数据

你可以通过两种方式减少发送到 Grafana Cloud 的活动系列的数量。

  • Allowlisting(允许清单): 这涉及到保留一套你明确定义的 " 重要 " 度量和标签,并放弃其他一切。为了允许列出度量和标签,你应该确定一组你想保留的核心重要度量和标签。要在 Prometheus 中启用允许列表,请使用 keeplabelkeep动作与任意重新标记的配置。

  • Denylisting(拒绝清单): 这涉及到放弃一组你明确定义的 " 不重要 " 指标,而保留其他的一切。一旦你确定了一个你想放弃的指标和标签的列表,拒绝清单就成为可能。要了解如何发现高重要性指标,请看 分析普罗米修斯指标使用情况。要在 Prometheus 中启用拒绝清单,请使用 droplabeldrop 动作与任意的重新标记配置。

这两种方法都是通过 Prometheus 的度量过滤和重新标记功能 relabel_config 实现的。这个功能允许你使用正则表达式来过滤系列标签,并保留或删除那些匹配的标签。你还可以使用 relabel_config 操作、转换和重命名系列标签。

Prom Labs 的 Relabeler 工具在调试 relabel 配置时可能会有所帮助。Relabeler 允许你直观地确认 relabel 配置所实施的规则。

本指南希望大家对正则表达式有所了解。要了解更多,请参见维基百科上的 正则表达式。要玩转和分析任何正则表达式,你可以使用 RegExr

Relabel_config 语法

你可以使用 Prometheus 的 relabel_config 配置对象过滤系列。在高层次上,relabel_config允许你选择一个或多个源标签值,可以使用 separator 参数将其连接起来。然后可以使用 regex 对结果进行匹配,如果出现匹配,可以执行 action 操作。

你可以执行以下常见的 " 行动 " 操作。

  • keep: 保留一个匹配的目标或系列,放弃所有其他的目标 (targets) 或系列 (series)
  • drop: 丢弃一个匹配的目标或系列,保留所有其他的
  • replace: 用target_label' 和replacement` 参数定义的新标签替换或重命名一个匹配的标签
  • labelkeep': 将regex’与所有标签名称匹配,删除所有不匹配的标签(忽略source_labels,适用于所有标签名称)
  • labeldrop: 将 regex 与所有标签名称匹配,删除所有匹配的标签(忽略source_labels,适用于所有标签名称)

关于可用动作的完整列表,请参见 Prometheus 文档中的 relabel_config

任何 relabel_config 都必须有相同的一般结构。

1
2
3
4
5
- source_labels = [source_label_1, source_label_2, ...]
separator: ;
action: replace
regex: (.*)
replacement: $1

这些默认值应该被修改,以适应你的重新标记的使用情况。

  • source_labels: 从可用的集合中选择一个或多个标签
  • separator: 使用这个字符连接选择的标签
  • regex: 在连接的数据上匹配这个正则表达式
  • action: 执行指定的 relabel 动作
  • replace: 如果使用 replacelabelmap中的一个,定义替换值。你可以使用 regex 匹配组来访问由 regex 捕获的数据。要了解更多关于 regex 匹配组的信息,请看 这个 StackOverflow 答案
  • target_label: 将由 replacement 定义的提取和修改的标签值分配给这个标签名。

没有明确设置的参数将使用默认值来填写。为了提高可读性,通常最好明确定义一个 relabel_config。要了解更多关于relabel_config 块的一般格式,请看 Prometheus 文档中的 relabel_config

下面是一个例子。

1
2
3
4
5
6
- source_labels: [instance_ip ]
separator: ;
action: replace
regex: (.*)
replacement: $1
target_label: host_ip

这个最小的重标片段在刮削到的标签集合中搜索 instance_ip 标签。如果它找到了 instance_ip 标签,它就把这个标签重命名为 host_ip。由于(.*) 重词捕获了整个标签值,在设置新的 target_label 时,替换引用这个捕获组,$1。由于我们在这里使用了默认的 regexreplacementactionseparator值,为了简洁起见,它们可以省略。然而,为了可读性,通常最好明确定义这些。

要删除一个特定的标签,使用 source_labels 选择它,并使用 "" 的替换值。要批量删除或保留标签,使用 labelkeeplabeldrop动作。

你可以使用 relabel_config 来过滤和重新标注:

  • 刮削的目标
  • 摄入普罗米修斯存储中的样品和标签
  • 将样品和标签发送到远程仓库

你将在下一节中学习如何做到这一点。

普罗米修斯配置文件中的 Relabel_config

你可以应用 relabel_config 来过滤和处理 metric 收集的以下阶段的标签:

  • 目标选择 scrape_configs 工作的 relabel_configs 部分。这允许你使用relabel_config 对象来选择目标,以刮取和重新标注由任何服务发现机制创建的元数据。
  • 指标选择scrape_configs 工作的 metric_relabel_configs 部分。这允许你使用 relabel_config 对象来选择应该被摄入 Prometheus 存储的标签和系列。
  • Remote Write(远程写入)remote_write 配置的 write_relabel_configs 部分。这允许你使用 relabel_config 来控制 Prometheus 运送到远程存储的标签和系列。

这个配置文件的骨架样本展示了这些部分在 Prometheus 配置中的位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
global:
. . .
rule_files:
. . .
scrape_configs:

- job_name: sample_job_1
kubernetes_sd_configs:
- . . .
relabel_configs:
- source_labels: [. . .]
. . .
- source_labels: [. . .]
. . .
metric_relabel_configs:
- source_labels: [. . .]
. . .
- source_labels: [. . .]
. . .

- job_name: sample_job_2
static_configs:
- targets: [. . .]
metric_relabel_configs:
- source_labels: [. . .]
. . .

. . .

remote_write:
- url: . . .
write_relabel_configs:
- source_labels: [. . .]
. . .
- source_labels: [. . .]
. . .

在一个给定的刮削任务中使用 relabel_configs 来选择要搜刮的目标。这在使用服务发现机制(如kubernetes_sd_configs)或 Kubernetes 服务发现获取目标集时通常很有用。要了解更多关于 Prometheus 服务发现的功能,请参见 Prometheus 文档中的 配置

在给定的刮削任务中使用 metric_relabel_configs 来选择要保留的系列和标签,并执行任何标签替换操作。这发生在使用 relabel_configs 选择目标之后。

最后,在 remote_write 配置中使用 write_relabel_configs 来选择哪些系列和标签要运送到远程存储。这个配置不会影响在 metric_relabel_configsrelabel_configs中设置的任何配置。如果你在 metric_relabel_configs 部分丢弃一个标签,它将不会被 Prometheus 摄取,因此也不会被运送到远程存储。

使用 relabel_configs 选择刮削目标

relabel_configs配置允许你 keepdrop 由服务发现机制返回的目标,如 Kubernetes 服务发现或 AWS EC2 实例服务发现。例如,你可能有一个 scrape 工作,使用 kubernetes_sd_configs 参数获取所有 Kubernetes 端点。通过使用下面的 relabel_configs 片段,你可以将这个作业的搜刮目标限制在那些服务标签对应于 app=nginx 和端口名对应于 web 的目标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
scrape_configs:
- job_name: kubernetes_nginx
honor_timestamps: true
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- default
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_app]
regex: nginx
action: keep
- source_labels: [__meta_kubernetes_endpoint_port_name]
regex: web
action: keep

kuberentes_sd_configsdefault 命名空间获取的初始端点集可能非常大,这取决于你在集群中运行的应用程序。使用 __meta_kubernetes_service_label_app 标签过滤器,其对应的服务没有 app=nginx 标签的端点将被该刮削作业放弃。

由于 kubernetes_sd_configs 也将添加任何其他 Pod 端口作为搜刮目标(带有 role: endpoints),我们需要使用__meta_kubernetes_endpoint_port_name 重新标签配置来过滤这些端口。例如,如果一个支持 Nginx 服务的 Pod 有两个端口,我们只刮削名为 web 的端口,而放弃另一个。

简而言之,上面的代码段在 default 命名空间中获取所有端点,并将那些其对应的服务具有 app=nginx 标签集的端点作为刮削目标。这组目标由一个或多个拥有一个或多个定义端口的 Pod 组成。我们放弃所有不叫 web 的端口。

在目标选择阶段使用重新标记,你可以有选择地选择你想搜刮(或放弃)的目标和端点来调整你的指标使用。

使用metric_relabel_configs 选择度量和标签

在这个阶段的重新标记和过滤,在 Prometheus 将样本摄入本地并运送到远程存储之前,会修改或丢弃样本。这种重新标记发生在目标选择之后。一旦 Prometheus 刮取了一个目标,metric_relabel_configs允许你定义 keepdropreplace 动作,以对刮取的样本进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- job_name: monitoring/kubelet/1
honor_labels: true
honor_timestamps: false
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: /metrics/cadvisor
scheme: https
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- kube-system
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_k8s_app]
regex: kubelet
action: keep
- source_labels: [__meta_kubernetes_endpoint_port_name]
regex: https-metrics
action: keep
. . .
metric_relabel_configs:
- source_labels: [__name__]
regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s)
action: drop

这个配置样本指示 Prometheus 首先使用 Kubernetes 服务发现 (kubernetes_sd_configs) 获取一个要刮削的端点列表。端点被限制在 kube-system 命名空间内。接下来,使用 relabel_configs,只保留具有服务标签k8s_app=kubelet 的 Endpoints。此外,只有那些将 https-metrics 作为定义的端口名称的 Endpoints 被保留。这个减少的目标集对应于 Kubelet https-metrics 刮削端点。

在刮削这些端点后,Prometheus 应用了 metric_relabel_configs 部分,它 drop 所有度量名称与指定 regex 相匹配的度量。你可以使用 __name__ 元标签提取一个样本的度量名称。在这种情况下,Prometheus 会放弃一个像 container_network_tcp_usage_total(. . .) 的指标。普罗米修斯会保留所有其他的度量。你可以在这里添加额外的 metric_relabel_configs 部分来 replace 和修改标签。

metric_relabel_configs通常用于在采集前重新标记和过滤样本,并限制被持久化到存储的数据量。使用metric_relabel_configs,你可以通过扔掉不需要的样本来大幅减少 Prometheus 指标的使用。

如果运送样本到 Grafana Cloud,你也可以选择在本地持久化样本,但防止运送到远程存储。要做到这一点,在你的 Prometheus 配置的 remote_write 部分的 write_relabel_configs 小节中使用 relabel_config 对象。当本地的 Prometheus 存储很便宜,也很充足,但运到远程存储的指标集需要明智的策划,以避免多余的成本,这可能很有用。

使用write_relabel_configs 控制远程写行为

在这个阶段的重新标记和过滤会在 Prometheus 将样本运送到远程存储之前修改或丢弃。使用这个功能,你可以在本地存储指标,但防止它们运送到 Grafana Cloud。要了解更多关于 remote_write 的信息,请参见 Prometheus 官方文档的 remote_write

Prometheus 在使用 relabel_configs 进行目标选择和使用 metric_relabel_configs 进行度量选择和重新标注后,应用这个重新标注和删除步骤。

下面的配置片段展示了一个 " 允许列表 " 的方法,其中指定的指标被运送到远程存储,而所有其他指标被丢弃。请注意,这些指标仍然会被持久化到本地存储,除非这个重新标记的配置发生在 scrape job 的 metric_relabel_configs 部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
remote_write:
- url: <Your Metrics instance remote_write endpoint>
remote_timeout: 30s
write_relabel_configs:
- source_labels: [__name__]
regex: "apiserver_request_total|kubelet_node_config_error|kubelet_runtime_operations_errors_total"
action: keep
basic_auth:
username: <your_remote_endpoint_username_here>
password: <your_remote_endpoint_password_here>
queue_config:
capacity: 500
max_shards: 1000
min_shards: 1
max_samples_per_send: 100
batch_send_deadline: 5s
min_backoff: 30ms
max_backoff: 100ms

这块 remote_write 配置设置了 Prometheus 将推送样本的远程端点。write_relabel_configs 部分为所有与 apiserver_request_total|kubelet_node_config_error|kubelet_runtime_operations_errors_total 匹配的指标定义了一个 keep 动作,放弃其他所有指标。你可以在这里额外定义 remote_write 特定的重标规则。

最后,这配置了认证证书和 remote_write 队列。要了解更多关于 remote_write 的配置参数,请参见 Prometheus 文档中的 remote_write

总结

在本指南中,我们概述了 Prometheus 强大而灵活的 relabel_config 功能,以及如何利用它来控制和减少本地和 Grafana 云端 Prometheus 的使用。

选择哪些指标和样本来刮取、存储和运送到 Grafana Cloud,起初看起来是相当令人生畏的。在 Mixins 中可以找到精心策划的重要指标集。Mixins 是一组预配置的仪表盘和警报。为这些仪表盘和警报提供支持的 PromQL 查询参考了一组核心的 “重要” 可观察指标。有用于 Kubernetes、Consul、Jaeger 等的混合插件。要了解更多关于它们的信息,请参见 Prometheus Monitoring Mixins。允许列出或保留在 Mixin 的警报规则和仪表盘中引用的指标集,可以形成一个坚实的基础,在此基础上建立一个完整的可观察性指标集来进行刮取和存储。

References


「译文」通过 Relabel 减少 Prometheus 指标的使用量
https://ewhisper.cn/posts/2679/
作者
东风微鸣
发布于
2022年7月27日
许可协议