我在Prometheus监控中高基数问题中的优化之路
背景 对于整个 Kubernetes 集群来说,随着业务不断地打磨,新增指标,那么对于 Prometheus 特性来说,那么内存 与 存储的使用势必是增加。这是对于存储压力是很重的,通常情况下,使用 Prometheus,都会是用于 Kubernetes 集群中,而 应用于 Kubernetes 集中的存储势必是 PVC 之类的网络存储。 这种场景中,我将尝试拆解如何分析和配置 Prometheus 以显著的减少其资源使用并解决高基数问题 高基数 基数 (cardinality) 通俗来说是一个集合中的元素数量 [1] 基数的来源通常为: label 的数量 series(指标) 的数量 时间:label 或者 series 随时间而流失或增加,通常是增加 那么这么看来高基数就是,label, series, 时间这三个集合的笛卡尔积,那么高基数的情况就很正常了。 而高基数带来的则是 Prometheus 资源使用,以及监控的性能。下图是 Grafana Lab 提到的一张图,很好的阐述了高基数这个问题 图:Prometheus中的基数 Source:https://grafana.com/blog/2022/02/15/what-are-cardinality-spikes-and-why-do-they-matter 如图所示:一个指标 server_responses 他的 label 存在两个 status_code 与 environment ,这代表了一个集合,那他的 label value 是 1~5xx,这个指标的笛卡尔积就是10。 那么此时存在一个问题,如何能定位 基数高不高,Grafana Lab 给出了下面的数据 [1],但是我不清楚具体的来源或者如何得到的这些值。也就是 label:value 低基数:1: 5 标准基数:1: 80 高基数:1: 10000 为什么指标会指数级增长 在以 Kubernetes 为基础的架构中,随着抽象级别的提高(通常为Pod, Label, 以及更多抽象的拓扑),指标的时间序列也越来越多。因为在这种基础架构中,在传统架构中运行的一个应用的单个裸机,被许多运行分散在许多不同节点上的许多不同微服务的 Pod 所取代。在这些抽象层中的每一个都需要一个标签,以便可以唯一地标识它们,并且这些组件中的每一个都会生成自己的指标,从而创建其独特的时间序列集。...