我们使用 Prometheus 对容器服务监控数据采集及存储,并采用 alertmanager 进行告警通知,但是随着业务的不断增长,业务对告警的需求十分强烈,基于 Prometheus 已规则文件的方式下发告警规则,并基于 Alertmanager 实现告警通知的方式,不是特别灵活。所以我们想通过其它的告警框架来实现对容器的告警,本文介绍了基于 bosun 框架进行告警的方法。
告警框架介绍
Alertmanager
Alertmanager 与 Prometheus 是相互分离的两个组件。Prometheus 根据下发的报警规则将警报发送给 Alertmanager,然后 Alertmanager 将 silencing、inhibition、aggregation 等消息通过 email、PaperDuty 和 HipChat 发送通知给用户。
主要功能:
删除重复的告警数据
分组并将告警通过路由发送到正确的接收器(如 email、PaperDuty 和 HipChat)
静默(silence)和告警抑制(inhibition)
支持高可用(HA)
Kapacitor
kapacitor 是一个开源的数据处理框架,主要用于创建告警,运行 ETL 任务.
主要功能:
处理 streaming 和 batch 两种类型的数据
实时的从 influxDB 查询数据,并支持 influxdbDB 的所有方法
存储 kapacitor 处理之后的数据到 InfluxDB
用户自定义函数
整合了多种 channel,如: HipChat, OpsGenie, Alerta, Sensu, PagerDuty, Slack 等
Bosun
bosun 是一个新型的监控和告警系统,由 Stack Exchange 团队打造,使用 golang 编写,支持定义复杂的告警规则,支持 OpenTSDB, Graphite, InfluxDB, Prometheus,ES 等数据源。
主要功能:
使用 Bosun 灵活的表达式语言对实时数据进行准确的计算
Bosun 能够运行在任何支持 Golang 的平台(如: Windows, Mac, Linux 等)
支持多维度的数据聚合,并且可以加入新的标签
使用 Bosun 模板语言来创建告警通知(如:graphs, tables, and contextual information)
支持查询 OpenTSDB, Graphite, Logstash-Elasticsearch,InfluxDB, Prometheus.
使用 scollector 收集 Windows, Linux 和一些应用的监控数据
告警框架对比
分别对这三种不同类型的告警框架进行了对比,我们的需求是想要一个可以通过 HTTP API 的方式进行业务告警规则的下发,并且针对于业务自定义的告警,表达式的学习成本比较低的场景,最终选择了 Bosun 作为容器监控服务的告警框架。虽然 Bosun 当前不支持高可用(HA),可以通过双活的方式达到 HA 的目的。
整体告警结构如下图所示:
Bosun 对接 Prometheus 进行告警
关于 Boson 的安装及使用,请查看官方文档:https://bosun.org/quickstart。
Bosun 安装完成之后,需要配置 Bosun 的配置文件(bosun.toml)来从 Prometheus 数据源去查询数据,并将告警的 metadata 数据保存到 Redis 中(如果没有设置 redis 则会默认将 medadata 数据保存到 Ledis)。
bosun.toml 文件内存如下:
更多关于 Bosun 配置文件的设置,请查看https://bosun.org/system_configuration
配置完成之后,启动 bosun 即可。现在 Bosun 已经可以从 Prometheus 去的查询数据了。Bosun 有了数据之后,接下来就是进行告警。Bosun 和其它的告警框架机制一样,基于相应的表达式去查询相关的数据进行表达式计算,如果符合最终的期望值,就触发告警。
Bosun 主要包含: 表达式(expression),模板(template), 规则(rule),通知(notification), 静默(silence)这几部分组成。
各部分的详细介绍,可以查阅官方文档。
Bosun 是如何进行表达式计算的?
Bosun 会以相应的 PromeQL 表达式去调用 Promtheus 对外暴露的 HTTP API 接口,并将返回的数据进行在处理,已达到告警的目的。
比如,想查一个服务实例是否存活,如下图所示:
Bosun 基于表达式就可以设置告警规则:
每一个告警规则会以 alert 关键字开始,后面是告警规则的名称(该例子告警规则名称是:container_mem_usage_high)。作用域里面是告警的表达式,当critTriggerThreshold 就会触发告警。
告警规则现在已经设置好了,但是告警内容最终是要通知用户的,那怎么通知用户?
当critTriggerThreshold 计算表达式为 True 时,Bosun 会有多种方式给用户发送消息,如 Email, Slack, 自定义服务等。自定义模式更灵活,并且通常对接公司自己的消息推送服务,基本都使用这种方式,我们配置下并将告警消息发送给我们的自定义服务。下面定义一个名字为 post 的 notification:
然后在刚刚的告警规则中,引入 post notification,这样当触发告警是就会 post Bosun 默认的消息给自自定义的服务。
Bosun 基于告警规则触发告警并发送消息了,但是为了更优雅可以设置发送给 postnotification 的消息内容,这就需要设置告警模板:
告警模板的定义是以 template 关键字开始,后面是定义模板的名称(如:inherit_template)。这样将定义的告警模板引入到告警规则里面,就可以当触发告警时,基于该模板进行渲染并发送给自定义的服务。告警规则变成如下形式:
这样就基本满足了告警的需求,并且 Bosun 还提供了告警静默(silence)的功能,给对不想接收的告警进行静默设置。这样基于 Bosun 进行告警基本就满足了当前的告警需求~
本文转载自公众号 360 云计算(ID:hulktalk)。
原文链接:
https://mp.weixin.qq.com/s/_9zqyQEuVdgmLYm0p5VMsw
评论