Lazy loaded image
Prometheus 性能调优:高基数问题
Words 1119Read Time 3 min
2026-2-2
2026-2-3
date
related_level
slug
prometheus_cardinality
type
Post
relate_date
summary
高基数定义,通过价值评估和PromQL 监测精准治理监控基数“爆炸”问题
status
Published
tags
可观测性
调试
效率
category
运维管理
last_updated
Feb 3, 2026 09:05 AM
是否已更新
orginal_page
是否推荐
参考资料
  • 基数指的是一个指标(metric)所产生的时间序列(time series)的总数
高基数(high cardinality)是指因为标签组合爆炸式增长,导致时间序列数量急剧增长的情况
  • 常见高基数如 ID,UID,email 等包含唯一值的标签
  • 如何控制指标增长,即避免高基数
    • 评估高基数指标的价值
      • 分为两个维度:指标价值和指标基数增长
        • 对于高价值高成本的指标
          • 指标是否过于细粒度
          • 能否重构标签策略
          • 能否进行数据聚合
        • 对于低价值低成本的指标
          • 修改带来的影响不大,但可优先安排优化
      notion image
      识别高基数指标的来源
      • 通过 jobinstance 标签判断
        • job 标签:标识抓取任务名称(如 nodemysql
        • instance 标签:标识目标地址
      • 通过指标前缀来判断
        • node_* → Node Exporter
        • kube_* → Kube-State-Metrics
        • cadvisor_* → cAdvisor
        • probe_* → Blackbox Exporter
    • 发现高基数指标和标签并执行对应措施(重构?聚合?弃用?)
  • PromQL 查询高基数指标
    • 查询时间序列数量最多的前 10 个指标
      • topk(10, count by (__name__) ({__name__=~".+"}))
      前十个指标分别抽检 100 条查看标签的大致模式
      • topk(100, (<metric_name>))
      • topk(100, (apiserver_request_duration_seconds_bucket))
        • 以指标 apiserver_request_duration_seconds_bucket 为例
      查询指标名称对应标签的数量
      • count(count by (<label_name>) (<metric_name>))
      • count by (<label_name>) (<metric_name>) 返回各个标签的数量,查询容易超时
        • 严重可能 OOM
      查询存在指定标签的所有相关指标
      • limitk(1000, ({url=~".+"}))
        • 随机抽样 1000 条含 url 的时间序列
        • limitk 需要启用 --enable-feature=promql-experimental-functions
通过 promtool 命令行工具查询指标
  • 均可以用 -o json 更改输出格式,默认为 -o promql
promtool query labels 查询所有指标名称
  • 可用选项
    • --start, --end:查询时间范围(RFC3339 或 UNIX 时间戳)
  • promtool query labels http://localhost:9090 \ --start `date -d 'now - 3 minutes' +%s` --end `date +%s` \ __name__
    • 通过 wc -l 可以计算行数
promtool query labels 查询标签唯一值及其数量
  • 可用选项
    • --match 一个或多个时间序列选择器
    • --start, --end:查询时间范围(RFC3339 或 UNIX 时间戳)
  • promtool query labels http://localhost:9090 \ --start `date -d 'now - 10 minutes' +%s` --end `date +%s` \ --match 'longhorn_rest_client_rate_limiter_latency_seconds_bucket{verb="GET"}' \ url
    • 通过 wc -l 可以计算行数
promtool query instant 查询 job 抓取情况
  • 可用选项
    • --time 查询的执行时间(RFC3339 或 UNIX 时间戳)
  • promtool query instant http://localhost:9090 \ --time `date -d 'now - 3 minutes' +%s` \ topk(100, count by (job) (up))
    • 查看前 100 个 job 抓取的 target 数量
  • promtool query instant http://localhost:9090 \ topk(100, sum by (job) (scrape_samples_scraped))
    • 查询 job 抓取的样本数量总量前 100
  • promtool query instant http://localhost:9090 \ topk(100, sum by (job) (scrape_samples_post_metric_relabeling))
    • 重标签后的样本数量总量前 100
  • promtool query instant http://localhost:9090 \ topk(100, sum by (job) (scrape_series_added)) | grep -v "=> 0"
    • 查询 job 抓取的样本数量增长前 100
    • 排除增长量为 0
go 使用官方 client_golang 库查询指标
  • go get github.com/prometheus/client_golang
  • 以简单查询 topk(100, count by (job) (up)) 为例
    • main.go
      promapi.go
      resultparse.go
  • go run .
 
上一篇
kustomize 配合 helmCharts 直接生成 charts 资源纳入版本管理
下一篇
WSL 安装和配置

Comments
Loading...