Prometheus 中的 UTF-8

简介

Prometheus 3.0 之前的版本要求指标和标签名称遵守一套严格的字符要求。从 Prometheus 3.0 开始,所有 UTF-8 字符串都是有效的名称,但生态系统中的其他部分需要进行一些手动更改,才能引入包含任意 UTF-8 字符的名称。

也可能存在用户希望强制使用传统字符集的情况,例如为了与尚不支持 UTF-8 的旧版 Prometheus 或其他抓取器兼容。

本文档将指导您了解 UTF-8 过渡的详细信息。

Go 仪表化

目前,由 Prometheus 官方 client_golang 库  创建的指标默认接受 UTF-8 名称。

以前,文档建议用户覆盖 model.NameValidationScheme 的值来默认选择传统验证。这个布尔值现在已被弃用,并且应始终设置为 UTF8Validation。如果需要强制执行传统验证,应由各个实现调用相应的验证 API 来完成,这不再是一个库功能。

其他语言的仪表化

其他客户端库可能尚不支持 UTF-8,并且可能需要特殊处理或配置。请查阅您所使用的库的文档。

在抓取期间配置名称验证

默认情况下,Prometheus 3.0 接受所有 UTF-8 字符串作为有效的指标和标签名称。可以为抓取的目标覆盖此行为,并拒绝不符合传统字符集的名称。

此选项可以在 Prometheus YAML 文件中全局设置

global:
  metric_name_validation_scheme: legacy

或基于每个抓取配置进行设置

scrape_configs:
  - job_name: prometheus
    metric_name_validation_scheme: legacy

抓取配置设置会覆盖全局设置。如果设置了抓取配置的验证,但未设置转义方案,则转义方案将根据验证方案推断。这允许用户仅在抓取配置中设置 metric_name_validation_scheme,而无需同时指定 metric_name_escaping_scheme。

用于 UTF-8 转义的抓取内容协商

在抓取时,抓取系统**必须**在 Accept 标头中传递 `escaping=allow-utf-8`,才能获得 UTF-8 名称。如果抓取目标没有看到此标头,它将自动使用下划线替换将 UTF-8 名称转换为与传统格式兼容的名称。

如果需要,Prometheus 和兼容的抓取系统也可以通过将 `escaping` 标头设置为不同的值来请求特定的转义方法。

  • underscores:默认值:将不符合传统格式的字符转换成下划线。
  • dots:与 UnderscoreEscaping 类似,不同之处在于点被转换为 _dot_,而预先存在的下划线被转换为 __。这允许对包含点的简单指标名称进行往返转换。
  • values:此模式在名称前加上 U__,并将所有无效字符替换为其 Unicode 值,并用下划线包围。单个下划线被替换为双下划线。此模式允许在传统 Prometheus 中对 UTF-8 名称进行完整的往返转换。

在内容协商中声明支持 UTF-8 表示 Prometheus *能够*接收 UTF-8 字符,但并不要求指标名称包含以前不支持的字符。同样,声明支持 UTF-8 的 Accept 标头也不要求指标生产者禁用其端的名称转换。具体的名称转换策略由指标生产者决定。要求是当 Prometheus 请求除 allow-utf-8 之外的转义方案时,生产者必须按照请求的方式转换名称。

远程写入 2.0

在 Prometheus 3.0 中,远程写入 2.0 自动接受所有 UTF-8 名称。无法通过远程写入 2.0 强制执行传统字符集验证。

OTLP 指标

Prometheus 3.0 中的 OTLP 接收器默认仍将所有名称规范化为 Prometheus 格式。您可以在 Prometheus 配置的 `otlp` 部分中更改此设置,如下所示

otlp:
  # Ingest OTLP data keeping UTF-8 characters in metric/label names.
  translation_strategy: NoTranslation

请注意,当不附加类型和单位后缀时,如果存在两个名称相同但类型或单位不同的指标,这些指标将在 Prometheus 中发生冲突。一旦 Prometheus 原生支持类型和单位元数据,这个问题就会消失。

有关更多详细信息,请参阅 OpenTelemetry 指南

查询

查询带有 UTF-8 名称的指标在 PromQL 中将需要略有不同的语法。

经典的查询语法对于与传统格式兼容的名称仍然有效

my_metric{}

但是 UTF-8 名称必须用引号括起来**并且**移到大括号内

{"my.metric"}

如果标签名称包含与传统格式不兼容的字符,也必须用引号括起来

{"metric.name", "my.label.name"="bar"}

指标名称可以出现在大括号内的任何位置,但风格上建议将其作为第一项。

本页内容