CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页/开源项目/Prometheus/Prometheus 中的 UTF-8
文档目录
Docker Swarm使用 Prometheus 查询日志使用 TLS 加密保护 Prometheus API 和 UI 端点使用基本认证保护 Prometheus API 和 UI 端点使用 cAdvisor 监控 Docker 容器指标为 Prometheus 对 Go 应用程序进行插桩理解和使用多目标 Exporter 模式将 Prometheus 用作 OpenTelemetry 后端Prometheus 中的 UTF-8

Prometheus

Prometheus 中的 UTF-8

Prometheus 3.0 之前的版本要求指标名称和标签名称遵守严格的字符要求。从 Prometheus 3.0 开始,所有 UTF-8 字符串都是有效的名称,但要在生态系统的其他部分引入包含任意 UTF-8 字符的名称,还需要一些手动更改。 在某些情况下,用户可能希望强制使用旧版字符集,例如为了与不支持 UTF-8 的旧版 Prometheus 或其他抓取器兼容。 本文档将指导你了解...

简介

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 配置中单独设置:

scrape_configs:
  - job_name: prometheus
    metric_name_validation_scheme: legacy

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

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

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

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

  • underscores:默认方式:将旧版不允许的字符转换为下划线。
  • dots:类似于下划线转义,但点会被转换为 _dot_,已有的下划线会被转换为 __。这允许同时包含点的简单指标名称进行往返转换。
  • values:此模式在名称前加上 U__,并将所有无效字符替换为 Unicode 值并用下划线包围。单个下划线替换为双下划线。此模式允许 UTF-8 名称与旧版 Prometheus 之间的完整往返转换。

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

Remote Write 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: NoTranslation

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

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

查询

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

经典的查询语法对于旧版兼容的名称仍然有效:

my_metric{}

但 UTF-8 名称必须用引号括起来并且放在花括号内:

{"my.metric"}

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

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

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

文章大纲