2.9. 控制用户定义的项目中未绑定指标属性的影响
开发人员可以使用键值对的形式为指标定义属性。潜在的键值对数量与属性的可能值数量对应。具有无限数量可能值的属性被称为未绑定属性。例如,customer_id
属性不绑定,因为它有无限多个可能的值。
每个分配的键值对都有唯一的时间序列。在标签中使用许多未绑定属性可导致所创建的时间序列数量出现指数增加。这可能会影响 Prometheus 性能,并消耗大量磁盘空间。
集群管理员可以使用以下方法控制用户定义的项目中未绑定指标属性的影响:
- 限制用户定义的项目中每个目标提取可接受的示例数量
- 创建在达到提取示例阈值或无法提取目标时触发的警报
限制提取示例可帮助防止在标签中添加多个未绑定属性导致的问题。开发人员还可以通过限制其为指标定义的未绑定属性数量来防止底层原因。使用绑定到一组有限可能值的属性可减少潜在的键-值对组合数量。
2.9.1. 为用户定义的项目设置提取示例限制
您可以限制用户定义的项目中每个目标提取可接受的示例数量。
如果您设置了示例限制,则在达到限制后,不会为该目标摄取更多样本数据。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群,也可以使用在openshift-user-workload-monitoring
项目中具有user-workload-monitoring-config-edit
角色的用户访问集群。 -
您已创建了
user-workload-monitoring-config
ConfigMap
对象。 -
已安装 OpenShift CLI(
oc
)。
流程
在
openshift-user-workload-monitoring
项目中编辑user-workload-monitoring-config
ConfigMap
对象:$ oc -n openshift-user-workload-monitoring edit configmap user-workload-monitoring-config
在
data/config.yaml
中添加enforcedSampleLimit
配置,以限制用户定义的项目中每个目标提取可接受的示例数量:apiVersion: v1 kind: ConfigMap metadata: name: user-workload-monitoring-config namespace: openshift-user-workload-monitoring data: config.yaml: | prometheus: enforcedSampleLimit: 50000 1
- 1
- 如果指定此参数,则需要一个值。这个
enforceSampleLimit
示例将用户定义的项目中每个目标提取的示例数量限制为 50,000。
保存文件以使改变生效。该限制会自动应用。
注意除非集群管理员为用户定义的项目启用了监控,否则应用到
user-workload-monitoring-config
ConfigMap
的配置不会被激活。警告将更改保存到
user-workload-monitoring-config
ConfigMap
对象时,可能会重新部署openshift-user-workload-monitoring
项目中的 Pod 和其他资源。该项目中正在运行的监控进程也可能被重启。
2.9.2. 创建提取示例警报
您可以创建在以下情况下通知您的警报:
-
在指定的
for
持续时间内无法提取对象或对象不可用 -
在指定的
for
持续时间内达到或超过提取示例阈值
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群,也可以使用在openshift-user-workload-monitoring
项目中具有user-workload-monitoring-config-edit
角色的用户访问集群。 - 您已为用户定义的项目启用了监控。
-
您已创建了
user-workload-monitoring-config
ConfigMap
对象。 -
您已经使用
enforcedSampleLimit
限制了用户定义的项目中每个目标提取可接受的示例数量。 -
已安装 OpenShift CLI(
oc
)。
流程
创建一个包含警报的 YAML 文件,用于在目标停机以及即将达到强制的示例限制时通知您。本例中的文件名为
monitoring-stack-alerts.yaml
:apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: prometheus: k8s role: alert-rules name: monitoring-stack-alerts 1 namespace: ns1 2 spec: groups: - name: general.rules rules: - alert: TargetDown 3 annotations: message: '{{ printf "%.4g" $value }}% of the {{ $labels.job }}/{{ $labels.service }} targets in {{ $labels.namespace }} namespace are down.' 4 expr: 100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job, namespace, service)) > 10 for: 10m 5 labels: severity: warning 6 - alert: ApproachingEnforcedSamplesLimit 7 annotations: message: '{{ $labels.container }} container of the {{ $labels.pod }} pod in the {{ $labels.namespace }} namespace consumes {{ $value | humanizePercentage }} of the samples limit budget.' 8 expr: scrape_samples_scraped/50000 > 0.8 9 for: 10m 10 labels: severity: warning 11
- 1
- 定义警报规则的名称。
- 2
- 指定要部署警报规则的用户定义的项目。
- 3
- 如果在
for
持续时间内无法提取目标或者目标不可用,则TargetDown
警报将触发。 - 4
TargetDown
警报触发时输出的消息。- 5
- 在这个持续时间内必须满足
TargetDown
警报的条件才会触发该警报。 - 6
- 定义
TargetDown
警报的严重性。 - 7
- 当在指定的
for
持续时间内达到或超过定义的提取示例阈值时,ApproachingEnforcedSamplesLimit
警报将触发。 - 8
- 当
ApproachingEnforcedSamplesLimit
警报触发时输出的消息。 - 9
ApproachingEnforcedSamplesLimit
警报的阈值。在本例中,当每个目标提取的示例数量超过强制示例限制50000
的 80% 时,警报将触发。在警报触发前,还必须已经过了for
持续时间。表达式scrape_samples_scraped/<number> > <threshold>
中的<number>
必须与user-workload-monitoring-config
ConfigMap
对象中定义的enforcedSampleLimit
值匹配。- 10
- 在这个持续时间内必须满足
ApproachingEnforcedSamplesLimit
警报的条件才会触发该警报。 - 11
- 定义
ApproachingEnforcedSamplesLimit
警报的严重性。
将配置应用到用户定义的项目中:
$ oc apply -f monitoring-stack-alerts.yaml
其他资源
- 创建用户定义的工作负载监控配置映射
- 为用户定义的项目启用监控
- 请参阅确定为什么 Prometheus 消耗大量磁盘空间以了解通过什么步骤来查询哪些指标的提取示例数最高