Prometheus 标签(Label)有哪些限制?
Prometheus 标签的限制包括:标签名需匹配 [a-zA-Z_][a-zA-Z0-9_]*、值可为任意 UTF-8、双下划线前缀保留、组合基数决定性能上限。本文列出全部硬性限制与避免高基数事故的实践。
硬性限制只有两条:标签名必须匹配 [a-zA-Z_][a-zA-Z0-9_]*,双下划线前缀(__)保留给内部使用;真正的"软限制"是基数——标签组合总数决定 Prometheus 的内存与查询性能。
硬性规则
- 标签名:字母/下划线开头,只含字母、数字、下划线;中文、点号、横线都不行(点号要写成下划线);
- 保留前缀:
__开头的标签(如__address__)是抓取期内部标签,最终会被丢弃; - 指标名规则同标签名;
- 标签值:任意 UTF-8 字符串,无长度硬限——但值越长存储越大。
真正的瓶颈:基数
每条"指标名 + 全部标签组合"是一个独立时序。标签取值越多,序列数爆炸式增长:
100 实例 × 50 接口 × 10 状态码 = 50 万条序列(一个指标!)
经验红线:单实例活跃序列(prometheus_tsdb_head_series)控制在数百万级以内;单指标的标签组合最好控制在千级。
实践建议
- 标签只放"会用来分组/过滤"的维度;
- 用户 ID、请求 ID、时间戳、完整 URL 路径——永远不做标签(放日志或链路里);
- 不确定时先上线观察序列增速,再放量。
观测云对照
观测云同样以标签组织指标数据,但底层存储对高基数的容忍度远高于 Prometheus 本地 TSDB;即便意外打爆了某个标签维度,也不会拖垮整个查询层。
常见问题(FAQ)
Q:标签名大小写敏感吗? 敏感。Method 和 method 是两个标签。
Q:标签数量有上限吗? 没有硬性上限,但每个标签都增加索引开销,实践上单序列 10 个以内。
Q:如何发现高基数指标? 查 count by (__name__)({__name__=~".+"}) | sort_desc 取前几名审查。