参考资料
- 基数指的是一个指标(metric)所产生的时间序列(time series)的总数
高基数(high cardinality)是指因为标签组合爆炸式增长,导致时间序列数量急剧增长的情况
- 常见高基数如 ID,UID,email 等包含唯一值的标签
- 如何控制指标增长,即避免高基数
- 分为两个维度:指标价值和指标基数增长
- 对于高价值高成本的指标
- 指标是否过于细粒度?
- 能否重构标签策略?
- 能否进行数据聚合?
- 对于低价值低成本的指标
- 修改带来的影响不大,但可优先安排优化。
- 通过
job和instance标签判断 job标签:标识抓取任务名称(如node、mysql)instance标签:标识目标地址- 通过指标前缀来判断
node_*→ Node Exporterkube_*→ Kube-State-Metricscadvisor_*→ cAdvisorprobe_*→ Blackbox Exporter- 发现高基数指标和标签并执行对应措施(重构?聚合?弃用?)
评估高基数指标的价值

识别高基数指标的来源
- PromQL 查询高基数指标
- 查询时间序列数量最多的前 10 个指标
topk(10, count by (__name__) ({__name__=~".+"}))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
前十个指标分别抽检 100 条查看标签的大致模式
查询指标名称对应标签的数量
查询存在指定标签的所有相关指标
通过 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 .
- Author:白鸟3
- URL:https://blog.kun2peng.top/operation/prometheus_cardinality
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
