Prometheus 3.0 迁移指南
根据我们的 稳定性承诺,Prometheus 3.0 版本包含一些向后不兼容的更改。本文档提供了从 Prometheus 2.x 迁移到 Prometheus 3.0 及更高版本的指南。
标志
-
以下功能标志已被移除,并已加入 Prometheus v3 的默认行为中
promql-at-modifierpromql-negative-offsetnew-service-discovery-managerexpand-external-labels- 外部标签值中的环境变量引用
${var}或$var会根据当前环境变量的值进行替换。 - 对未定义变量的引用将被替换为空字符串。可以使用
$$转义$字符。
- 外部标签值中的环境变量引用
no-default-scrape-port- Prometheus v3 将不再根据指定的方案 (scheme) 为抓取目标添加端口。目标现在将按配置显示在标签中。
- 如果您依赖将
https://example.com/metrics或http://example.com/metrics形式的抓取目标分别表示为https://example.com/metrics:443和http://example.com/metrics:80,请将它们添加到您的目标 URL 中。
agent- 请改用专门的
--agent命令行标志。
- 请改用专门的
remote-write-receiver- 请改用专门的
--web.enable-remote-write-receiver命令行标志来启用远程写入接收器。
- 请改用专门的
auto-gomemlimit- Prometheus v3 会自动设置
GOMEMLIMIT以匹配 Linux 容器的内存限制。如果没有容器限制,或者进程在容器外运行,则使用系统内存总量。可以使用--no-auto-gomemlimit禁用此功能。
- Prometheus v3 会自动设置
auto-gomaxprocs- Prometheus v3 会自动设置
GOMAXPROCS以匹配 Linux 容器的 CPU 配额。可以使用--no-auto-gomaxprocs禁用此功能。
- Prometheus v3 会自动设置
如果您继续将这些参数传递给
--enable-feature,Prometheus v3 将记录一条警告。 -
从 v3.9 开始,功能标志
native-histograms不再起作用。原生直方图现在是一个稳定功能,但抓取它们必须通过全局或单次抓取配置选项scrape_native_histograms(在 v3.8 中添加)来启用。
配置
- 抓取作业级别的配置选项
scrape_classic_histograms已重命名为always_scrape_classic_histograms。如果您使用scrape_native_histograms抓取配置选项来摄取原生直方图,并且还想摄取端点可能随原生直方图一起暴露的经典直方图,请确保添加此配置或更改为新名称。 remote_write项中http_config.enable_http2的默认值已更改为false。在 Prometheus v2 中,远程写入 HTTP 客户端默认使用 HTTP/2。为了跨多个套接字并行处理多个远程写入队列,最好不要默认使用 HTTP/2。如果您更喜欢在远程写入中使用 HTTP/2,现在必须在remote_write配置部分中设置http_config.enable_http2: true。
PromQL
正则表达式匹配换行符
PromQL 中正则表达式的 . 模式现在匹配换行符。此更改后,像 .* 这样的正则表达式会匹配包含 \n 的字符串。这适用于查询中的匹配器和重贴标签 (relabel) 配置。
例如,以下正则表达式现在匹配相应的字符串,而在 Prometheus v2 中,这些组合是不匹配的: - .* 额外匹配 foo\n 和 Foo\nBar - foo.?bar 额外匹配 foo\nbar - foo.+bar 额外匹配 foo\nbar
如果您希望 Prometheus v3 的行为与 v2 一致,则必须通过将所有 . 模式替换为 [^\n] 来更改正则表达式,例如 foo[^\n]*。
范围选择器和回溯排除了与左边界重合的样本
回溯和范围选择器现在是左开右闭(之前是左闭右闭),这使得它们的行为更加一致。此更改会影响范围的左边界或回溯增量与一个或多个样本的时间戳重合的查询。
例如,假设我们正在查询一个样本间隔正好为 1 分钟的时间序列。在 Prometheus v3 之前,5m 的范围查询通常会返回 5 个样本。但是,如果查询评估与抓取完全对齐,它会返回 6 个样本。在 Prometheus v3 中,在均匀间隔的情况下,此类查询将始终返回 5 个样本。
此更改通常会影响子查询,因为它们的评估时机自然是完美均匀分布的,并与子查询分辨率的倍数时间戳对齐。此外,查询前端通常将子查询与步长大小的倍数对齐。结合起来,这很容易造成完美的相互对齐,这通常是用户未预料到且不知道的,因此新的行为可能会令人惊讶。在 Prometheus v3 之前,此类系统上的 foo[1m:1m] 子查询可能总是返回两个点,从而允许进行速率计算。然而,在 Prometheus v3 中,这样的子查询只会返回一个点,这对于速率或增量计算是不够的,从而导致返回“无数据”。
此类查询需要重写以扩展窗口,以正确覆盖超过一个点。在这个例子中,foo[2m:1m] 无论查询如何对齐,都将始终返回两个点。重写查询的确切形式可能取决于预期的结果,对于行为已更改的查询,没有通用的直接替换方案。
测试也更容易受到影响。要修复这些问题,要么调整预期的样本数量,要么扩展范围。
holt_winters 函数已重命名
holt_winters 函数已重命名为 double_exponential_smoothing,现在受 promql-experimental-functions 功能标志的保护。如果您想继续使用 holt_winters,则必须执行以下两项操作:
- 在您的查询中将
holt_winters重命名为double_exponential_smoothing。 - 在您的 Prometheus CLI 调用中传递
--enable-feature=promql-experimental-functions。
抓取协议
Prometheus v3 对抓取时接收到的 Content-Type 标头更为严格。如果被抓取的目标没有指定 Content-Type 标头,或者如果该标头不可解析或无法识别,Prometheus v2 将默认使用标准的 Prometheus 文本协议。这可能导致抓取时解析到不正确的数据。在这些情况下,Prometheus v3 现在将导致抓取失败。
如果抓取目标未提供正确的 Content-Type 标头,可以使用 fallback_scrape_protocol 参数指定回退协议。请参阅 Prometheus scrape_config 文档。
这是一个重大变更,因为如果未指定此回退协议,在 Prometheus v2 中可能成功的抓取现在可能会失败。
杂项
TSDB 格式与降级
为了准备索引格式的更改,TSDB 格式在 Prometheus v2.55 中已略有更改。因此,Prometheus v3 的 TSDB 只能由 Prometheus v2.55 或更高版本读取。在升级到 v3 时请记住这一点 —— 您将只能降级到 v2.55,不能更低,否则会丢失您的 TSDB 持久数据。
作为额外的安全措施,您可以选择先考虑升级到 v2.55 并确认 Prometheus 工作正常,然后再升级到 v3。
TSDB 存储契约
现在要求 TSDB 兼容的存储返回匹配指定选择器的结果。这可能会影响某些第三方实现,最可能是实现 remote_read 的那些。
此契约并未被强制执行,但可能会导致未定义的行为。
UTF-8 名称
Prometheus v3 支持指标和标签名称中的 UTF-8。这意味着指标和标签名称在升级后可能会根据端点暴露的内容而发生变化。此外,以前会被标记为无效的指标和标签名称现在将不再被标记。
希望保留原始验证行为的用户可以更新其 Prometheus yaml 配置以指定旧版验证方案:
global:
metric_name_validation_scheme: legacy
或者基于每个抓取单独配置:
scrape_configs:
- job_name: job1
metric_name_validation_scheme: utf8
- job_name: job2
metric_name_validation_scheme: legacy
日志消息格式
Prometheus v3 已从之前的 go-kit/log 改用 log/slog。这导致了日志消息格式的变化。旧日志格式的一个示例如下:
ts=2024-10-23T22:01:06.074Z caller=main.go:627 level=info msg="No time or size retention was set so using the default time retention" duration=15d
ts=2024-10-23T22:01:06.074Z caller=main.go:671 level=info msg="Starting Prometheus Server" mode=server version="(version=, branch=, revision=91d80252c3e528728b0f88d254dd720f6be07cb8-modified)"
ts=2024-10-23T22:01:06.074Z caller=main.go:676 level=info build_context="(go=go1.23.0, platform=linux/amd64, user=, date=, tags=unknown)"
ts=2024-10-23T22:01:06.074Z caller=main.go:677 level=info host_details="(Linux 5.15.0-124-generic #134-Ubuntu SMP Fri Sep 27 20:20:17 UTC 2024 x86_64 gigafips (none))"
新日志格式中的类似序列如下所示:
time=2024-10-24T00:03:07.542+02:00 level=INFO source=/home/user/go/src/github.com/prometheus/prometheus/cmd/prometheus/main.go:640 msg="No time or size retention was set so using the default time retention" duration=15d
time=2024-10-24T00:03:07.542+02:00 level=INFO source=/home/user/go/src/github.com/prometheus/prometheus/cmd/prometheus/main.go:681 msg="Starting Prometheus Server" mode=server version="(version=, branch=, revision=7c7116fea8343795cae6da42960cacd0207a2af8)"
time=2024-10-24T00:03:07.542+02:00 level=INFO source=/home/user/go/src/github.com/prometheus/prometheus/cmd/prometheus/main.go:686 msg="operational information" build_context="(go=go1.23.0, platform=linux/amd64, user=, date=, tags=unknown)" host_details="(Linux 5.15.0-124-generic #134-Ubuntu SMP Fri Sep 27 20:20:17 UTC 2024 x86_64 gigafips (none))" fd_limits="(soft=1048576, hard=1048576)" vm_limits="(soft=unlimited, hard=unlimited)"
le 和 quantile 标签值
在 Prometheus v3 中,经典直方图的 le 标签值和摘要的 quantile 标签值在摄取时会被归一化。在 Prometheus v2 中,这些标签的值在某些情况下取决于抓取协议(protobuf 与文本格式)。这导致标签值根据抓取协议发生变化。例如,暴露为 my_classic_hist{le="1"} 的指标在通过文本格式摄取时会变成 my_classic_hist{le="1"},但通过 protobuf 摄取时会变成 my_classic_hist{le="1.0"}。这改变了指标的标识,并导致在查询指标时出现问题。在 Prometheus v3 中,这些标签值将始终被归一化为浮点数表示。即,上面的示例无论通过哪种协议,最终都将始终导致 my_classic_hist{le="1.0"} 被摄取到 Prometheus 中。此更改的影响是,直接引用标签值作为整数(例如 le="1")的告警、记录规则和仪表盘将停止工作。
处理此更改的方式(全局或基于每个指标):
- 修复对整数
le、quantile标签值的引用,但除此之外不做任何处理,并接受跨越转换时间的某些查询将产生不准确或意外结果的事实。这是推荐的解决方案。 - 使用
metric_relabel_config在抓取目标时保留旧标签。这应该仅应用于当前产生此类标签的指标。
metric_relabel_configs:
- source_labels:
- quantile
target_label: quantile
regex: (\d+)\.0+
- source_labels:
- le
- __name__
target_label: le
regex: (\d+)\.0+;.*_bucket
禁止使用 v1 API 配置 Alertmanager
Prometheus 3 不再支持 Alertmanager 的 v1 API。实际上,Prometheus 3 需要 Alertmanager 0.16.0 或更高版本。使用旧版本 Alertmanager 或使用 alerting: alertmanagers: [api_version: v1] 配置的用户需要升级 Alertmanager 并更改其配置以使用 api_version: v2。
Prometheus 2.0 迁移指南
有关从 Prometheus 1.8 到 2.0 的迁移指南,请参阅 Prometheus v2.55 文档。