简介
Alertmanager 处理由客户端运用程序(如 Prometheus server)发送的警报。它负责去重(deduplicating),分组(grouping),并将它们路由(routing)到正确的接纳器(receiver)集成,如电子邮件,微信,或钉钉。它还负责处理警报的静默/屏蔽(silencing)、守时发送/不发送(Mute)和按捺(inhibition)问题。
AlertManager 作为 开源的为 Prometheus 而规划的告警运用, 现已具有了告警运用各类丰富、灵活、可定制的功用:
- 去重(deduplicating):比如高可用 AlertManager 部署下,同一个告警一起发到一切的高可用节点,会依据 hash 进行去重
-
分组(grouping):比如能够依据
AlertName
,Instance
,Job
等任意 label 对海量告警进行分组. 典型状况便是, 忽然很多 Pod 都发出了AlertName: InstanceDown
的 Alerts, 那么能够直接依据AlertName
进行分组后发送, 这样用户只会收到一封xxx 个 Pods InstanceDown
的告警邮件. 大大减少告警接纳人员的收件量. -
路由(routing): 将告警跟进一定的过滤条件发送到指定的 receiver. 如: 满意
job=db
的告警路由给 DBA; 满意team=team-A
的告警路由给 team-A 的邮件组… - 接纳器(receiver): 详细的告诉途径 + 收件人. 如: 邮件告诉途径+DBA邮箱; 钉钉告诉途径+SRE联系人;
- 静默/屏蔽(silencing): 如运用发布的时刻段, 屏蔽相关的告警.
- 守时发送/不发送(Mute): 如工作时刻(965, 每周 5天)经过邮件途径发送; 非工作时刻(下班、周末、节假日)正常途径 mute, 仅经过 on-call 途径发送给 on-call 人员
-
按捺(inhibition):常用场景,高等级的告警触发(firing)后,低等级的告警就不必发了。比如:磁盘空间的
critical
等级告警现已触发(空间运用超越 90%), 这时候warning
等级的告警(空间运用超越 80%)就被按捺.
除了没有多租户功用、没有很好的 UI 界面、没有告警前史计算展现之外,作为告警运用, AlertManager 现已是非常强壮了。️️️
AlertManager 生产装备趟过的坑
接下来就不东拉西扯了, 直接进入正题:AlertManager 生产装备趟过的坑
Notes:
以下一切内容根据 20220723 时 AlertManager 的最新版: v0.24
URL 相关装备
需求
- 对外展现的 URL 是相似这样的:
https://ewhisper.cn/alertmanager/#/alerts
- 是个域名
- 有个
/alertmanager/
前缀
- 恳求转到 AlertManager 组件时, 仍是保持默许的状况不变, 如
https://10.0.0.1:9093/#/alerts
即: 反向代理发送的途径与用户运用的不同.
完成
Ingress 层面的完成
这儿直接运用 Traefik 来完成的, 之前现已写过文章了, 详细拜见这儿:
- 根据 Traefik 如何完成向后转发主动去掉前缀? – 春风微鸣技能博客 (ewhisper.cn)
AlertManager 装备
AlertManager 这儿需求装备 2 个静态参数, 是经过在 AlertManager 的 StatefulSets 中增加 alertmanager --<flags>
来完成的.
默许状况下,Prometheus(和 Alertmanager)假定外部URL(-web.external-url
)中的任何途径都是一个前缀途径,将在一切发送到它的恳求中呈现。然而这并不总是如此,--web.route-prefix
标志允许你更细化地操控这一点。
经过如下装备, 这将在向 AlertManager 传递恳求之前剥离掉/alertmanager/
。在这种状况下,你需求指定用户在其浏览器中运用的URL是 https://ewhisper.cn/alertmanager/
,而Prometheus在其HTTP恳求中看到的前缀不是/alertmanager/
,而仅仅空的/
。
alertmanager \
--web.external-url https://ewhisper.cn/alertmanager/ \
--web.route-prefix=/
一个小坑
经过上面的装备, 都很完美, 可是检查邮件内容的时候发现一个小坑:
- 默许邮件模板最下方的
Sent by Alertmanager
url 没有/
, 导致点击该url后无法正常跳转.
这儿是经过 Ingress – Traefik 完成了主动加 /
的功用, 能够拜见另一篇文章:
- 根据 Traefik 如何完成 path 末尾主动加斜杠? – 春风微鸣技能博客 (ewhisper.cn)
默许主动 Resolved 告警的坑
假如你没有详细看过文档, 直接采用的默许装备, 并且 AlertManager 的告警源除了 Prometheus 也有其他监控软件. 你会发现一个状况: 每过 5min, 某些还在触发中的告警被主动 Resolved(已康复) 了!
这是由于默许的 AlertManager 的装备中, 有个 resolve_timeout
的参数, 且其默许装备为: resolve_timeout: 5m
.
️Reference:
ResolveTimeout是alertmanager运用的默许值,假如 alerts 不包含EndsAt,在这个时刻往后,假如 alerts 没有被更新,AlertManager 会将其声明为已处理(Resolved)。 这个参数对来自Prometheus的 alerts 没有影响,由于它们总是包含EndsAt。
这便是 主动 Resolved 的原因, 当初碰到的时候, 我一看, 这好办啊, 我想要禁用这个功用, 尽管这个参数无法禁用, 假如非要在这份爱上加上一个期限,我期望是一万年, 直接设置个 10000y
得了.
成果报错了…
这个 duration
在文档上, 明明说是:
️Reference:
<duration>
: 正则表达式匹配的持续时刻((([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?|0)
, 如.1d
,1h30m
,5m
,10s
可是设置 10000y
满意 ([0-9]+)y)
却报错了.
后面又翻各种源码, 总算发现这个 <duration>
是无法设置为 三位数的 y 的: 设置 100y
报错, 设置 99y
正常运转.
所以, 想要禁用 AlertManager 主动 Resolved 的功用, 就这么设置: resolve_timeout: 99y
默许 4H 还未处理的告警主动重发告警告诉的坑
不管是谁, 我觉得都是期望自己每天收到的告警邮件越少越好的, 便利一项项跟进处理. 成果 AlertManager 倒好, “交心”地供给了4H 未处理告警主动重发 的功用.
这是由于默许的 AlertManager 的装备中, 有个 repeat_interval
的参数, 且其默许装备为: repeat_interval: 4h
…
仍是像上回相同, 我想要禁用这个功用, 尽管这个参数无法禁用(假如设置为0, 不会禁用, 反而会报错: repeat_interval cannot be zero
), 假如非要在这份爱上加上一个期限,我期望是一万年, 直接设置个 10000y
得了.
成果又报错了(严格说是warning)…
repeat_interval is greater than the data retention period.
It can lead to notifications being repeated more often than expected.
️Reference:
repeat_interval大于数据保存期。这或许导致告诉的重复频率超越预期。
也便是说, repeat_interval
设置太大反而或许会导致告诉的重复频率更高, 假如想把它设置的尽或许大, 也不要大于数据的保存时刻.
所以, 想要尽或许降低 AlertManager 未处理告警主动重发 的频率, 就这么设置: repeat_interval: <尽或许大, 但不要大于数据的保存(data retention)时刻
设置 AlertManager 的数据保存(data retention)时长
接着上文来说, 默许的 AlertManager 的数据保存(data retention)时长是多久呢? 假如想要调大该如何调呢?
查找文档, 又没找到
为啥没找到, 原因如下:
️Reference:
Alertmanager经过指令行标志(command-line flags)和一个装备文件进行装备。 指令行标志装备了不可改变的系统参数,而装备文件定义了按捺规则、告诉路由和告诉接纳者。
文档是没有关于 指令行标志装备 的内容的. 在哪儿能找到呢? 运转 alertmanager -h
指令, 成果如下:
Notes:
仅显现部分, cluster 相关的 flags 很多, 就不展现了.
$ alertmanager -h
usage: alertmanager [<flags>]
Flags:
...
--config.file="alertmanager.yml"
Alertmanager configuration file name.
--storage.path="data/" Base path for data storage.
--data.retention=120h How long to keep data for.
--alerts.gc-interval=30m Interval between alert GC.
--web.config.file="" [EXPERIMENTAL] Path to configuration file that can enable TLS or authentication.
--web.external-url=WEB.EXTERNAL-URL
The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself.
If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. If omitted, relevant URL components will be derived automatically.
--web.route-prefix=WEB.ROUTE-PREFIX
Prefix for the internal routes of web endpoints. Defaults to path of --web.external-url.
--web.listen-address=":9093"
Address to listen on for the web interface and API.
--web.get-concurrency=0 Maximum number of GET requests processed concurrently. If negative or zero, the limit is GOMAXPROC or 8, whichever is larger.
--web.timeout=0 Timeout for HTTP requests. If negative or zero, no timeout is set.
...
--log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]
--log.format=logfmt Output format of log messages. One of: [logfmt, json]
能够看到: --data.retention=120h
默许是 120h, 5天.
太少了, 改为 --data.retention=90d
, 成果又错了, 这次是格式, 应该写为: --data.retention=--data.retention=2160h
那么相应的, 上面的参数就能够设置为: repeat_interval: 90d
(是的, 你没看错, 这儿能够写为 90d …)
完好的生产实践 AlertManager 装备
最终, 给到大家一份完好的生产实践 AlertManager 装备, 供参考:
不可变参数(及指令行 flags)
-
'--storage.path=/alertmanager'
(存储位置, 生产上这个目录需求装备持久化存储) -
'--config.file=/etc/alertmanager/alertmanager.yml'
(装备文件位置, 生产上能够经过 ConfigMap 保存并运用) -
'--cluster.advertise-address=[$(POD_IP)]:9094'
(高可用集群端口 9094) -
'--cluster.listen-address=0.0.0.0:9094'
(高可用集群端口 9094) -
--cluster.peer=alertmanager-0.alertmanager-headless:9094
(高可用集群的一个 peer; 需求创建 headless service) -
--cluster.peer=alertmanager-1.alertmanager-headless:9094
(高可用集群的另一个 peer) -
--cluster.peer=alertmanager-2.alertmanager-headless:9094
(高可用集群的第三个 peer) '--data.retention=2160h'
-
'--log.level=info'
(日志等级, 开发测试环境能够设置为debug
) '--web.external-url=https://ewhisper.cn/alertmanager/'
'--web.route-prefix=/'
可变参数(装备文件中的参数)
global:
resolve_timeout: 99y
receivers:
# jiralert 插件, 能够将告警发送到 jira
- name: jiralert
webhook_configs:
- send_resolved: true
url: http://jiralert:9097/alert
route:
group_by:
- alertname
group_interval: 5m
group_wait: 1m
receiver: dev-receiver
repeat_interval: 90d
templates:
- /etc/alertmanager/*.tmpl
详细的 route, receiver, inhibit 等装备就不表现了.
以上.
三人行, 必有我师; 常识同享, 天下为公. 本文由春风微鸣技能博客 EWhisper.cn 编写.