编程 Alertmanager 升到 v0.35.0:--enable-feature=auto-gomemlimit 会直接报未知参数,另有 3 处配置加载失败

2026-11-16 00:04:26

Alertmanager 升到 v0.35.0:--enable-feature=auto-gomemlimit 会直接报未知参数,另有 3 处配置加载失败

仓库:
Release:

结论先行

v0.35.0 里有 4 条 [CHANGE],都属于破坏性变更,升级前必须逐条对照处理,不存在“先升上去再说”的空间:

  1. auto-gomemlimit 特性开关被提升为独立命令行参数 --auto-gomemlimit,--enable-feature=auto-gomemlimit 已被移除。#5464
  2. eventrecorder 的每个 output 必须带 name,未命名的配置会直接加载失败。#5393
  3. eventrecorder 的输出格式换成 events/v2:alert labels、alert annotations、group labels、silence annotations、muted-alert labels 全部变成 JSON map,protobuf 消费者必须换新 schema。#5409、#5500
  4. 已废弃的 types 包被移除,统一用 alert 包。#5585

另有 3 条行为修正,不报错但会改变线上表现:silence 在恰好等于结束时间时即视为过期、timeinterval 支持跨周区间、discord/slack/webex 遇到 HTTP 429 改为按 Retry-After 重试。

判据与改法

1. 启动参数:旧 flag 不认,会直接起不来

auto-gomemlimit 原先挂在 --enable-feature 下面,现在被提升为顶层 flag,旧的写法已从参数表里删掉:

# v0.35.0 之前的写法,升级后直接报未知参数
alertmanager --enable-feature=auto-gomemlimit

# v0.35.0 的写法
alertmanager --auto-gomemlimit

判断依据很直接:如果启动命令里还有 --enable-feature=auto-gomemlimit,进程会在解析参数阶段失败,不会进到配置加载。要改的地方不只是手敲的命令行,还包括 systemd unit 的 ExecStart、容器 args、Helm values 里的 extraArgs、以及各种启动脚本。用 alertmanager --help 可以看到新的 flag 列表。

注意这跟“新增一个 flag”不是一回事:--enable-feature 本身还在(其它特性开关仍走它),只是 auto-gomemlimit 这个值被摘了出去。

2. eventrecorder:output 缺 name 会导致配置加载失败

新版本要求每个 output 显式命名,name 会成为该 output 在 metrics 和日志里的标识,取代原来的 URL、broker 或 topic:

eventrecorder:
outputs:
- name: kafka-primary   # 必填,缺失则配置加载失败
type: kafka
# ...

判断依据:升级后如果 alertmanager --config.file=... 在启动时直接报 eventrecorder 相关配置错误,先检查每个 output 有没有写 name。这一条影响的是配置文件本身,跟运行时状态无关,所以用 amtool check-config 之类的校验就能提前暴露。

3. events/v2:结构变了,消费端要先跟上

输出数据结构整体换成 events/v2。以下几点从标量/列表变成了 JSON map:

  • alert labels
  • alert annotations
  • group labels
  • silence annotations
  • muted-alert labels

如果下游只是把 event 当 JSON 存起来,影响相对小;如果有代码按固定字段路径取值,或者用 protobuf 反序列化,就必须换用新 schema,否则轻则字段解析为空,重则反序列化失败。升级顺序上,先让消费端兼容 v2,再升 Alertmanager,避免事件流断在半路。

4. types 包移除:改 alert 包

自己写集成、引用了 Alertmanager 库的项目需要改 import:把已废弃的 types 包替换成 alert 包。这一步在编译期就会报错,不会拖到运行期,属于四件事里最容易发现的一个。

容易被忽略的行为修正

silence 在恰好等于结束时间时即过期

#5665 把 silence 的过期判定改成“到达结束时间即过期”,与 API 的语义对齐。之前依赖“结束时间那一秒仍然生效”的告警窗口,边界上会少一点点覆盖。同批还有 #5666,每次读写 silence 使用单一求值时间,避免同一次判断里出现两个时间基准。

timeinterval 支持跨周区间

#5579 允许 weekday 区间绕到周末,例如:

time_intervals:
- name: weekend
time_intervals:
- weekdays: ['friday:monday']

之前的 weekday 区间不能跨越周末边界,想表达“周五到周一”只能拆成多段。

discord / slack / webex:429 不再丢通知

三者都改成遇到 HTTP 429 时按 Retry-After 重试,而不是把这条通知丢掉:

对限流敏感的部署来说这是行为变化:alertmanager_notifications_failed_total 上的失败计数会下降,取而代之的是通知延迟上升,重试期间队列占用也会变高。监控面板如果只看失败率,需要同时看发送延迟。

升级顺序建议

按“编译期 → 配置期 → 运行期”的顺序处理最省事:先改代码里的 types → alert import 并重新编译;再改启动参数 --enable-feature=auto-gomemlimit → --auto-gomemlimit、给 eventrecorder 每个 output 补 name,用配置校验确认能加载;接着让 events/v2 的消费端上线;最后再切 Alertmanager 实例,观察通知延迟和 429 相关指标。

推荐文章

程序员茄子在线接单