摘要
本文档规定了 Prometheus 在生成文本暴露时,对包含旧版字符集之外字符的指标和标签名称所使用的不同转义方案。这些方案在抓取过程中通过 Accept 和 Content-Type 头中的 escaping 参数进行协商。
简介
Prometheus 支持多种转义方案来处理文本暴露中包含旧版字符集(a-zA-Z0-9_:)之外字符的指标和标签名称。转义方案在抓取期间进行协商,并影响指标生产者应如何格式化其指标名称。
转义方案
无转义(allow-utf-8)
头部值:escaping=allow-utf-8
行为:
- 指标和标签名称 MUST 是有效的 UTF-8 字符串。
- 当名称在暴露格式中出现在双引号内时,
\、\n和"MUST 用反斜杠转义。 - 当名称在暴露格式中以非引号形式出现时,
\和\nMUST 用反斜杠转义。 - 此方案 MUST 仅在生产者和消费者都支持 UTF-8 名称时使用。
下划线转义(underscores)
头部值:escaping=underscores
行为:
- 不在旧版字符集(a-zA-Z0-9_:)中的任何字符 MUST 被替换为下划线。
- 第一个字符 MUST 是字母、下划线或冒号。
- 后续字符 MUST 是字母、数字、下划线或冒号。
- 示例:
metric.name/with/slashes变为metric_name_with_slashes。
点转义(dots)
头部值:escaping=dots
行为:
- 点(.)MUST 被替换为
_dot_。 - 现有的下划线 MUST 被替换为双下划线(
__)。 - 其他非旧版字符 MUST 被替换为单个下划线。
- 第一个字符 MUST 是字母、下划线或冒号。
- 后续字符 MUST 是字母、数字、下划线或冒号。
- 示例:
metric.name.with.dots变为metric_dot_name_dot_with_dot_dots。
值编码转义(values)
头部值:escaping=values
行为:
- 名称 MUST 以
U__为前缀。 - 不属于旧版字符集(a-zA-Z0-9_:)的每个字符 MUST 被替换为其十六进制的 Unicode 码点,用下划线包围。
- 单个下划线 MUST 被替换为双下划线。
- 示例:
metric.name变为U__metric_2E_name(其中 2E 是 '.' 的十六进制 Unicode 码点)。
默认行为
如果 Accept 头中未指定转义方案,SHOULD 使用 underscores 转义。
安全考虑
- 目标 MUST 在应用转义之前验证输入名称。
- 转义方案 MUST 经过验证以防止注入攻击。
allow-utf-8方案 MUST 仅在生产者和消费者都支持 UTF-8 名称时使用。