核心是阻止高基数数据进入内存,通过采集、写入、查询三环节拦截:先定位爆炸源头(查序列数、指标分布、危险标签),再源头裁剪(labeldrop、路径归一化、禁用元标签),接着预聚合(recording rules),最后加限制兜底(max-series、admin API、exporter改造)。
核心是不让高基数数据进内存——在采集、写入、查询三个环节层层拦截,而不是等它进来再“救火”。
别猜,直接查指标和标签的实际分布:
让高基数标签根本不出现在时间序列里:
- action: labeldrop; source_labels: [url] 或 [user_id]
/api/v1/orders/789 → /api/v1/orders/:id,再用 labelmap 或 replacement 覆盖原标签不查爆炸性原始指标,只查聚合后结果:
http_requests_total{method, status, url} 拆成两层:一层按 job, method, status 聚合(低基数),另一层只保留关键白名单 URL(如 /health、/login)job:http_requests_total:rate5m = sum by (job, method, status) (rate(http_requests_total[5m]))
drop 或仅短期保留用于调试防漏网之鱼引发雪崩:
--web.enable-admin-api),配合脚本定期调用 /api/v1/admin/tsdb/delete_series 清理已确认废弃的系列(注意指定时间范围,慎用)