Prometheus Alertmanager 完整实战指南:安装部署、路由配置、amtool 运维与高可用集群
Prometheus Alertmanager 完整实战指南安装部署、路由配置、amtool 运维与高可用集群【免费下载链接】alertmanagerPrometheus Alertmanager项目地址: https://gitcode.com/GitHub_Trending/al/alertmanager本指南以 Alertmanager 官方仓库 README 为主线系统讲解 Prometheus Alertmanager 的核心职责去重、分组、路由、静默与抑制、四种安装方式、完整的 YAML 配置示例、v2 HTTP API、amtool 命令行工具的全部常用操作以及基于 gossip 协议的高可用集群搭建与调优。读完本文你将能够独立部署一个 Alertmanager 实例编写覆盖多团队、多级别告警的分级路由配置并用 amtool 完成告警查询、静默管理与路由验证最终搭建一套可投入生产的 HA 集群。1. Alertmanager 是什么Alertmanager 负责处理由 Prometheus Server 等客户端应用发送过来的告警。它的核心工作包括去重Deduplicating同一告警多次上报时只保留有效状态分组Grouping将相似告警合并为一条通知避免海量告警轰炸路由Routing按照路由树把告警分发到正确的接收器receiver静默Silencing在指定时间内按匹配规则静默特定告警抑制Inhibition当某类告警已经触发时抑制另一类相关告警的通知。告警最终通过接收器投递出去接收器可以是邮件email、PagerDuty、OpsGenie也可以借助 webhook 接收器接入任意自定义机制。仓库中 notify 目录下的email、pagerduty、opsgenie、slack、webhook、wechat等子包即为各个接收器的具体实现。2. 安装与启动Alertmanager 提供多种安装方式可根据部署环境选择。2.1 预编译二进制推荐从 Prometheus 官方下载页获取最新生产版本二进制这是官方推荐的安装方式。解压后直接运行./alertmanager --config.fileyour_file2.2 Docker 镜像镜像发布在 Quay.io 与 Docker Hub 上prom/alertmanager。快速体验一条命令即可docker run --name alertmanager -d -p 127.0.0.1:9093:9093 quay.io/prometheus/alertmanager启动后Alertmanager 的 Web UI 与 API 即可以通过http://localhost:9093/访问。2.3 从源码编译从源码构建需要先安装 Go 与 Node.js含 npm用于构建 Web UI。克隆仓库后执行git clone https://github.com/prometheus/alertmanager.git cd alertmanager make build ./alertmanager --config.fileyour_file也可以只构建仓库中的某一个二进制例如只构建amtoolmake build BINARIESamtool构建产物与启动入口分别在 cmd/alertmanager/main.go 与 cmd/amtool/main.go。此外Alertmanager 也支持作为库被嵌入使用app/options.go 中提供了DefaultOptions()与完整的配置校验逻辑validate方便以编程方式启动实例。3. 核心概念在动手写配置之前先理解 Alertmanager 的四大核心概念它们也是 docs/alertmanager.md 中重点阐述的内容。3.1 分组Grouping分组将“性质相似”的告警归类到同一条通知里。典型场景集群发生网络分区时数百个服务实例同时失联Prometheus 会为每个实例各产生一条告警。如果不分组接收方会瞬间收到数百条通知。分组可以配置为按cluster和alertname等标签聚合从而只发送一条紧凑的通知同时仍能在通知中看到具体受影响的实例。分组的粒度、通知时机与接收器均由配置中的路由树决定详见第 5 节。3.2 抑制Inhibition抑制是指“当某些告警已经在触发时抑制另一些告警的通知”。例如整个集群不可达的告警正在触发时可以配置 Alertmanager 静默掉该集群相关的所有其他告警避免成百上千条与实际问题无关的告警通知刷屏。抑制规则同样在配置文件中定义inhibit_rules。3.3 静默Silences静默是在指定时间段内简单地屏蔽告警通知。静默基于 matcher匹配器配置其语法与路由树相同新到的告警如果与某个生效中的静默的全部等值或正则 matcher 匹配则不会发出任何通知。静默通常在 Alertmanager 的 Web 界面中创建也可以使用 amtool 管理。3.4 客户端行为Client behaviorAlertmanager 对告警发送方有特殊要求详见 docs/alerts_api.md这部分只对不使用 Prometheus 发送告警的高级场景相关。3.5 告警数量限制Alert limits可选Alertmanager 支持通过--alerts.per-alertname-limit限制每个 alertname 的活跃告警数量。当达到上限时新告警会被丢弃但已知告警的心跳仍会被处理已有告警按指纹识别会自动过期为新的告警腾出空间。该特性在某个告警实例数量异常暴增时非常有用可以防止接收器被淹没并避免可靠性问题。被丢弃的告警总数记录在alertmanager_alerts_limited_total指标中启用alert-names-in-metrics特性开关后该指标还会带上alertname标签。4. 配置示例一份覆盖主要特性的完整配置以下是 README 中给出的示例配置覆盖了 YAML 配置格式的大多数关键方面完整配置文档见 docs/configuration.mdglobal: # The smarthost and SMTP sender used for mail notifications. smtp_smarthost: localhost:25 smtp_from: alertmanagerexample.org # The root route on which each incoming alert enters. route: # The root route must not have any matchers as it is the entry point for # all alerts. It needs to have a receiver configured so alerts that do not # match any of the sub-routes are sent to someone. receiver: team-X-mails # The labels by which incoming alerts are grouped together. For example, # multiple alerts coming in for clusterA and alertnameLatencyHigh would # be batched into a single group. # # To aggregate by all possible labels use ... as the sole label name. # This effectively disables aggregation entirely, passing through all # alerts as-is. This is unlikely to be what you want, unless you have # a very low alert volume or your upstream notification system performs # its own grouping. Example: group_by: [...] group_by: [alertname, cluster] # When a new group of alerts is created by an incoming alert, wait at # least group_wait to send the initial notification. # This way ensures that you get multiple alerts for the same group that start # firing shortly after another are batched together on the first # notification. group_wait: 30s # When the first notification was sent, wait group_interval to send a batch # of new alerts that started firing for that group. group_interval: 5m # If an alert has successfully been sent, wait repeat_interval to # resend them. repeat_interval: 3h # All the above attributes are inherited by all child routes and can # overwritten on each. # The child route trees. routes: # This route performs a regular expression match on alert labels to # catch alerts that are related to a list of services. - matchers: - service~^(foo1|foo2|baz)$ receiver: team-X-mails # The service has a sub-route for critical alerts, any alerts # that do not match, i.e. severity ! critical, fall-back to the # parent node and are sent to team-X-mails routes: - matchers: - severitycritical receiver: team-X-pager - matchers: - servicefiles receiver: team-Y-mails routes: - matchers: - severitycritical receiver: team-Y-pager # This route handles all alerts coming from a database service. If theres # no team to handle it, it defaults to the DB team. - matchers: - servicedatabase receiver: team-DB-pager # Also group alerts by affected database. group_by: [alertname, cluster, database] routes: - matchers: - ownerteam-X receiver: team-X-pager - matchers: - ownerteam-Y receiver: team-Y-pager # Inhibition rules allow to mute a set of alerts given that another alert is # firing. # We use this to mute any warning-level notifications if the same alert is # already critical. inhibit_rules: - source_matchers: - severitycritical target_matchers: - severitywarning # Apply inhibition if the alertname is the same. # CAUTION: # If all label names listed in equal are missing # from both the source and target alerts, # the inhibition rule will apply! equal: [alertname] receivers: - name: team-X-mails email_configs: - to: team-Xalertsexample.org, team-Yalertsexample.org - name: team-X-pager email_configs: - to: team-Xalerts-criticalexample.org pagerduty_configs: - routing_key: team-X-key - name: team-Y-mails email_configs: - to: team-Yalertsexample.org - name: team-Y-pager pagerduty_configs: - routing_key: team-Y-key - name: team-DB-pager pagerduty_configs: - routing_key: team-DB-key4.1 各段落的配置要点global全局默认项。示例中设置了 SMTP 投递主机smtp_smarthost与发件人地址smtp_from。SMTP 的认证用户名、密码以及所有接收器共享的 HTTP 配置等也都可以在此定义。route根路由是每条告警进入的入口。根路由不能设置任何 matcher并且必须配置一个 receiver以保证没有匹配到任何子路由的告警也有去处。group_by告警分组依据的标签列表。示例中按alertname与cluster分组即clusterA且alertnameLatencyHigh的多条告警会被合并为同一组。若希望按所有标签聚合可将group_by设为[...]group_by: [...]这会完全关闭聚合、逐条透传告警——除非告警量极低或上游通知系统自行做了分组否则一般不推荐。group_wait / group_interval / repeat_interval决定通知节奏的三个时间参数group_wait新告警组建立后等待至少该时长再发出首条通知以便把短时间内相继触发的同一组告警合并到首条通知中示例 30sgroup_interval首条通知发出后等待该时长再发送该组新触发的告警批次示例 5mrepeat_interval告警成功发送后等待该时长再重新发送示例 3h。routes子路由树。所有子路由都会继承父路由的上述属性也可以在子路由上单独覆盖例如数据库路由将group_by覆盖为[alertname, cluster, database]按受影响的数据库进一步细分分组。inhibit_rules抑制规则。示例实现“同一 alertname 下若severitycritical告警已触发则抑制severitywarning告警”。需要特别注意equal的警告语义如果equal中列出的标签名在源告警和目标告警上都缺失抑制规则同样会生效receivers接收器定义。每个接收器以name标识可同时配置多种类型如team-X-pager同时包含 email 与 PagerDuty。仓库中还有一份带templates、continue: true与tracing等扩展项的示例配置 doc/examples/simple.yml适合进一步对照学习。配置的加载、校验与热重载逻辑位于 config/config.go 与 config/coordinator.go。5. 路由树与匹配语义路由树是 Alertmanager 配置的核心。告警进入根路由后按顺序自上而下尝试匹配各子路由matcher 语法支持等值匹配severitycritical与正则匹配service~^(foo1|foo2|baz)$。在上一节示例中service属于foo1|foo2|baz的告警进入team-X-mails其中severitycritical的进一步进入子路由team-X-pager而severity ! critical的告警回退到父节点仍由team-X-mails接收。回退fall-back语义未匹配子路由条件的告警回退到父路由的接收器这正是“默认接收器”机制的来源。continue 字段默认情况下命中某个路由后即停止继续匹配设置continue: true可让告警在匹配当前路由后继续尝试后续兄弟路由doc/examples/simple.yml 中的team-X-pager子路由即演示了该用法。继承与覆盖group_wait、group_interval、repeat_interval、group_by等属性对所有子路由生效并允许在任意层级覆盖。路由树的构建、匹配与测试实现在 dispatch/route.go 与 dispatch/dispatch.go并配有 dispatch/route_test.go 等测试覆盖。6. HTTP API当前 Alertmanager API 为v2版本。除 HTTP 处理器本身外该 API 完全基于 OpenAPI。借助任何主流语言的 OpenAPI 生成器都可以快速生成 API 客户端。访问前缀APIv2 通过/api/v2前缀访问例如状态端点即/api/v2/status。版本演进APIv1 在0.16.0中标记弃用并从0.27.0版本起移除。路由前缀如果设置了--web.route-prefixAPI 路由也会带上此前缀。例如--web.route-prefix/alertmanager/时状态端点变为/alertmanager/api/v2/status。客户端代码仓库 api/v2/client 目录下即为自动生成的 Go 客户端覆盖 alert、alertgroup、general、receiver、silence 等全部资源对应的 REST API 处理逻辑在 api/v2/restapi 下。7. amtool命令行运维利器amtool是与 Alertmanager API 交互的命令行工具随 Alertmanager 的所有发行版捆绑发布也可以单独安装go install github.com/prometheus/alertmanager/cmd/amtoollatest从 cli/root.go 的源码可以看出amtool 支持alert、silence、check-config、cluster、config、template六组命令并提供了--alertmanager.url目标地址、-o/--output输出格式 simple/extended/json、--timeout默认 30s、--http.config.fileHTTP 客户端配置等全局参数。7.1 查询告警查看当前所有触发中的告警$ amtool alert Alertname Starts At Summary Test_Alert 2017-08-02 18:30:18 UTC This is a testing alert! Test_Alert 2017-08-02 18:30:18 UTC This is a testing alert! Check_Foo_Fails 2017-08-02 18:30:18 UTC This is a testing alert! Check_Foo_Fails 2017-08-02 18:30:18 UTC This is a testing alert!使用 extended 输出查看完整字段标签、注解、起止时间、生成器 URL$ amtool -o extended alert Labels Annotations Starts At Ends At Generator URL alertnameTest_Alert instancenode0 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local alertnameTest_Alert instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local alertnameCheck_Foo_Fails instancenode0 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local alertnameCheck_Foo_Fails instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.localamtool 支持 Alertmanager 提供的丰富查询语法等值与正则匹配$ amtool -o extended alert query alertnameTest_Alert Labels Annotations Starts At Ends At Generator URL alertnameTest_Alert instancenode0 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local alertnameTest_Alert instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local $ amtool -o extended alert query instance~.1 Labels Annotations Starts At Ends At Generator URL alertnameTest_Alert instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local alertnameCheck_Foo_Fails instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.local $ amtool -o extended alert query alertname~Test.* instance~.1 Labels Annotations Starts At Ends At Generator URL alertnameTest_Alert instancenode1 linkhttps://example.com summaryThis is a testing alert! 2017-08-02 18:31:24 UTC 0001-01-01 00:00:00 UTC http://my.testing.script.localalert命令组在 cli/alert.go 中注册包含 query 与 add 两个子命令。7.2 管理静默添加静默输出为静默 ID$ amtool silence add alertnameTest_Alert b3ede22e-ca14-4aa0-932c-ca2f3445f926 $ amtool silence add alertnameTest_Alert instance~.0 e48cb58a-0b17-49ba-b734-3585139b1d25查看静默$ amtool silence query ID Matchers Ends At Created By Comment b3ede22e-ca14-4aa0-932c-ca2f3445f926 alertnameTest_Alert 2017-08-02 19:54:50 UTC kellel $ amtool silence query instance~.0 ID Matchers Ends At Created By Comment e48cb58a-0b17-49ba-b734-3585139b1d25 alertnameTest_Alert instance~.0 2017-08-02 22:41:39 UTC kellel按 ID 过期静默$ amtool silence expire b3ede22e-ca14-4aa0-932c-ca2f3445f926批量过期所有匹配某个查询的静默先用-q只输出 ID再传入 expire$ amtool silence query instance~.0 ID Matchers Ends At Created By Comment e48cb58a-0b17-49ba-b734-3585139b1d25 alertnameTest_Alert instance~.0 2017-08-02 22:41:39 UTC kellel $ amtool silence expire $(amtool silence query -q instance~.0) $ amtool silence query instance~.0或者直接过期全部静默$ amtool silence expire $(amtool silence query -q)从 cli/silence.go 可以看到silence命令组包含 add、expire、import、query、update 五个子命令覆盖静默的完整生命周期。7.3 模板渲染测试假设配置文件中声明了模板目录templates: - /foo/bar/*.tmpl可以用template render直接验证模板渲染效果amtool template render --template.glob/foo/bar/*.tmpl --template.text{{ template slack.default.markdown.v1 . }}内置模板与自定义模板的机制见 template/default.tmpl 与 template/template.go。7.4 amtool 配置文件amtool 允许通过配置文件预设常用选项默认配置文件路径为$HOME/.config/amtool/config.yml或/etc/amtool/config.ymlWindows 系统下为%APPDATA%\amtool\config.yml或%ProgramData%\amtool\config.yml。示例# Define the path that amtool can find your alertmanager instance alertmanager.url: http://localhost:9093 # Override the default author. (unset defaults to your username) author: meexample.com # Force amtool to give you an error if you dont include a comment on a silence comment_required: true # Set a default output format. (unset defaults to simple) output: extended # Set a default receiver receiver: team-X-pager各字段说明与 cli/root.go 中帮助文本一致alertmanager.url为每条请求预设的 Alertmanager 地址author新建静默时使用的默认作者不设置则取当前系统用户名comment_required创建静默时是否强制要求填写注释默认为 true从源码看comment_required是require-comment的旧式别名见 cli/root.go 中的legacyFlags映射与 cli/config/config.go 的解析逻辑两者均可使用output默认输出类型可选 simple、extended、jsonreceiver默认接收器此外还支持date.format日期输出格式默认2006-01-02 15:04:05 MST与http.config.file连接 Alertmanager 的 HTTP 客户端配置文件等选项。7.5 路由可视化与验证amtool 可以文本树的形式可视化配置中的路由也可以传入一组告警标签来测试路由输出该告警会依次匹配到的所有接收器以逗号分隔# View routing tree of remote Alertmanager $ amtool config routes --alertmanager.urlhttp://localhost:9093 # Test if alert matches expected receiver $ amtool config routes test --config.filedoc/examples/simple.yml --tree --verify.receiversteam-X-pager servicedatabase ownerteam-X其中--verify.receivers用于指定期望的接收器如果实际匹配结果与期望不符amtool 会返回退出码 1。这在修改路由配置后做回归验证时非常有用。config命令组还提供config show用于查看当前运行配置simple/extended/json 三种输出详见 cli/config.go。8. 高可用集群Alertmanager 的高可用模式已在众多公司生产环境使用并且默认开启。重要从 Alertmanager 0.15 开始集群同时需要UDP 和 TCP两种协议才能工作。如果使用了防火墙请务必对集群端口同时放行这两种协议如果在容器中运行请务必同时暴露集群端口的两种协议。8.1 集群原理集群基于 gossip 协议底层使用 hashicorp/memberlist见 cluster/cluster.go实现节点发现与状态同步。每个 Alertmanager 实例独立接收全部告警而静默与通知状态在 peer 之间互相复制——这正是必须把 Prometheus 指向全部 Alertmanager、而不是做负载均衡的根本原因只有每个实例都收到全部告警才能保证任意实例故障时不丢失通知。从源码看cluster/cluster.go节点启动时会解析--cluster.peer指定的初始 peer、计算通告地址并将所有 peer 先标记为 failed、再通过Join与周期性的reconnect/refresh任务维持连接在开始评估通知之前还会执行Settle流程连续 3 轮观察 peer 数不变即认为 gossip 已收敛避免在集群尚未就绪时发送不完整状态的通知。8.2 集群参数速查创建 HA 集群时各实例通过--cluster.*参数互相通信完整参数如下参数说明默认值--cluster.listen-address集群监听地址设为空字符串可关闭 HA 模式0.0.0.0:9094--cluster.advertise-address集群通告地址对外宣告的地址自动推导--cluster.peer初始 peer每增加一个 peer 重复一次该 flag—--cluster.peer-timeoutpeer 超时时间15s--cluster.peers-resolve-timeoutpeer 解析超时时间15s--cluster.gossip-interval集群消息传播速度200ms--cluster.pushpull-interval值越小收敛越快、带宽开销越大1m0s--cluster.settle-timeout评估通知前等待集群连接收敛的最大时间—--cluster.tcp-timeoutTCP 连接、读写超时10s--cluster.probe-timeout标记节点不健康前等待 ack 的时间500ms--cluster.probe-interval随机探测节点的间隔1s--cluster.reconnect-interval重连丢失 peer 的间隔10s--cluster.reconnect-timeout持续尝试重连丢失 peer 的时长6h0m0s--cluster.label可选的集群标识字符串附加在每个数据包与流上用于唯一标识集群、防止跨集群 gossip 串扰以上默认值与 cluster/cluster.go 中定义的DefaultPushPullInterval、DefaultGossipInterval等常量一一对应并可在 app/options.go 的DefaultOptions()中确认。配置要点--cluster.listen-address中选定的端口就是其他 peer 在--cluster.peer中需要指定的端口如果实例的 IP 不属于 RFC 6890 定义且带有默认路由的地址则必须设置--cluster.advertise-address。8.3 快速启动三节点集群在本地启动三个 peer 组成的集群可以直接使用仓库自带的 Procfile 配合goremangoreman start8.4 对接 PrometheusPrometheus 1.4 及以后版本支持同时指向多个 Alertmanager在prometheus.yml中配置alerting: alertmanagers: - static_configs: - targets: - alertmanager1:9093 - alertmanager2:9093 - alertmanager3:9093重要不要在 Prometheus 与 Alertmanager 之间做负载均衡而应把 Prometheus 指向全部 Alertmanager 的列表。Alertmanager 的实现要求所有告警都发送到所有实例才能保证高可用。8.5 关闭高可用如果不需要 HA 模式将--cluster.listen-address设为空即可让 Alertmanager 不再监听 peer 请求--cluster.listen-address9. 整体架构上图展示了告警从进入到投递的完整链路告警生成方将告警发送到 Alertmanager 的 APIAlertmanager 存储活跃告警、按照配置对其分组与路由应用抑制与静默规则最后通过配置的接收器发出通知。在 HA 部署中每个实例独立接收告警静默与通知状态在 peer 间复制。关于架构的更多细节可参考 docs/alertmanager.md。10. 总结围绕 README 这条主线本文完整覆盖了 Alertmanager 的安装部署、核心概念、完整配置示例、路由树语义、v2 API、amtool 全套操作与 HA 集群搭建。日常使用中最值得记住的几条实践建议根路由不写 matcher、必须有默认 receiver其余子路由逐层细化并正确设置continue以控制匹配流程**三个时间参数group_wait / group_interval / repeat_interval**决定了通知的节奏与合并效果应按告警严重程度与团队响应时效合理取值抑制规则中的equal存在标签缺失即生效的坑配置时务必确认相关标签在所有告警上都存在HA 集群必须让每个实例收到全部告警防火墙与容器网络要同时放行集群端口的 UDP 与 TCP用amtool config routes test --verify.receivers在改动路由后做回归验证用amtool silence expire $(amtool silence query -q)批量清理过期静默可以显著降低运维事故率。若需要进一步深入可继续阅读仓库中的 docs/alertmanager.md、docs/configuration.md、docs/high_availability.md 与 docs/alerts_api.md并结合 dispatch/route.go、cluster/cluster.go、config/config.go 等源码理解底层实现。【免费下载链接】alertmanagerPrometheus Alertmanager项目地址: https://gitcode.com/GitHub_Trending/al/alertmanager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →