简介

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

在某些情况下,用户可能希望强制使用旧版字符集,这可能是为了与较旧的系统或尚不支持 UTF-8 的系统兼容。

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

Go 插装

目前,官方 Prometheus client_golang 库创建的指标默认会拒绝 UTF-8 名称。需要更改默认验证方案以允许 UTF-8。在未来版本的通用库中,设置此值的要求将被移除。

import "github.com/prometheus/common/model"

func init() {
    model.NameValidationScheme = model.UTF8Validation
}

如果用户希望强制使用旧版字符集,可以将验证方案设置为 LegacyValidation

必须在实例化指标之前设置验证方案,并且如果需要,可以在运行时设置。

其他语言的插装

其他客户端库可能也有类似的要求来设置验证方案。请查阅您正在使用的库的文档。

配置抓取期间的名称验证

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

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

global:
  metric_name_validation_scheme: legacy

或按抓取配置设置

scrape_configs:
  - job_name: prometheus
    metric_name_validation_scheme: legacy

抓取配置设置会覆盖全局设置。

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

在抓取时,抓取系统**必须**在 Accept 头中传递 escaping=allow-utf-8 以便提供 UTF-8 名称。如果被抓取的系统没有看到此头部,它将自动使用下划线替换将 UTF-8 名称转换为旧版兼容格式。

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

  • underscores:默认设置:将旧版无效字符转换为下划线。
  • dots:类似于下划线转义,但点号会被转换为 _dot_,并且已存在的下划线会被转换为 __。这允许包含点号的简单指标名称进行往返转换。
  • values:此模式在名称前加上 U__,并用 unicode 值(用下划线包围)替换所有无效字符。单个下划线会被双下划线替换。此模式允许 UTF-8 名称与旧版系统进行完全往返转换。

远程写入 2.0

Remote Write 2.0 在 Prometheus 3.0 中自动接受所有 UTF-8 名称。Remote Write 2.0 无法强制执行旧版字符集验证。

OTLP 指标

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

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

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

查询

查询包含 UTF-8 名称的指标需要在 PromQL 中使用略微不同的语法。

经典查询语法仍适用于旧版兼容名称

my_metric{}

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

{"my.metric"}

如果标签名称包含旧版不兼容字符,也必须用引号括起来

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

指标名称可以出现在大括号内的任何位置,但通常习惯将其放在首位。

本文档是开源的。请通过提交 issues 或 pull requests 来帮助改进它。