Prometheus 基于 bosun 框架进行告警

阅读数:193 2019 年 11 月 15 日 14:28

Prometheus基于bosun框架进行告警

我们使用 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 的目的。

Prometheus基于bosun框架进行告警

整体告警结构如下图所示:

Prometheus基于bosun框架进行告警

Bosun 对接 Prometheus 进行告警

关于 Boson 的安装及使用,请查看官方文档: https://bosun.org/quickstart。

Bosun 安装完成之后,需要配置 Bosun 的配置文件 (bosun.toml) 来从 Prometheus 数据源去查询数据,并将告警的 metadata 数据保存到 Redis 中 (如果没有设置 redis 则会默认将 medadata 数据保存到 Ledis)。

bosun.toml 文件内存如下:

复制代码
RuleFilePath = "/data/bosun-rule/share/rule/rule.conf"
EnableSave = true
HTTPListen = ":8080"
CheckFrequency = "2m"
TimeAndDate = [ 202, 75, 179, 136 ]
ShortURLKey = "aKey"
[DBConf]
RedisHost = "xx.xx.xx.xx:6379"
LedisDir = "ledis_data"
LedisBindAddr = "127.0.0.1:9565"
[PromConf]
[PromConf.default]
URL = "http://xx.xx.xx.xx:9090"
[AuthConf]
CookieSecret = "xxxxxx+A=="
TokenSecret = "xxxxxx="
AuthDisabled=true

更多关于 Bosun 配置文件的设置,请查看 https://bosun.org/system_configuration

配置完成之后,启动 bosun 即可。现在 Bosun 已经可以从 Prometheus 去的查询数据了。Bosun 有了数据之后, 接下来就是进行告警。Bosun 和其它的告警框架机制一样,基于相应的表达式去查询相关的数据进行表达式计算,如果符合最终的期望值,就触发告警。

Bosun 主要包含: 表达式 (expression),模板 (template), 规则 (rule),通知 (notification), 静默 (silence) 这几部分组成。

各部分的详细介绍,可以查阅官方文档。

Bosun 是如何进行表达式计算的?

Bosun 会以相应的 PromeQL 表达式去调用 Promtheus 对外暴露的 HTTP API 接口,并将返回的数据进行在处理,已达到告警的目的。

比如,想查一个服务实例是否存活, 如下图所示:

Prometheus基于bosun框架进行告警

Bosun 基于表达式就可以设置告警规则:

复制代码
alert container_mem_usage_high {
$metrics = "container_memory_usage_bytes"
$groupByTags = "region,pod_name,contianer_name"
$agg = "sum"
$step = "15s"
$filter = ''' namespace="default", ,pod_name="nginx-deployment-test-6c54bd5869-p7s85",container_name!="POD", container_name=~"nginx" '''
$result1 = prom($metrics, $groupByTags, $filter, $agg, $step, "5m", "")
$critTriggerThreshold = 900000000
crit = $result > $critTriggerThreshold
}

每一个告警规则会以 alert 关键字开始,后面是告警规则的名称 (该例子告警规则名称是:container_mem_usage_high)。作用域里面是告警的表达式,当 result>critTriggerThreshold 就会触发告警。

告警规则现在已经设置好了,但是告警内容最终是要通知用户的,那怎么通知用户?

result>critTriggerThreshold 计算表达式为 True 时,Bosun 会有多种方式给用户发送消息,如 Email, Slack, 自定义服务等。自定义模式更灵活,并且通常对接公司自己的消息推送服务, 基本都使用这种方式,我们配置下并将告警消息发送给我们的自定义服务。下面定义一个名字为 post 的 notification:

复制代码
notification post{
post = http://127.0.0.1:9999
bodyTemplate = sendChannelBody
contentType = application/json
}

然后在刚刚的告警规则中,引入 post notification, 这样当触发告警是就会 post Bosun 默认的消息给自自定义的服务。

复制代码
alert container_mem_usage_high {
$metrics = "container_memory_usage_bytes"
$groupByTags = "region,pod_name,contianer_name"
$agg = "sum"
$step = "15s"
$filter = ''' namespace="default", ,pod_name="nginx-deployment-test-6c54bd5869-p7s85",container_name!="POD", container_name=~"nginx" '''
$result1 = prom($metrics, $groupByTags, $filter, $agg, $step, "5m", "")
$critTriggerThreshold = 900000000
crit = $result > $critTriggerThreshold
critNotification = post
}

Bosun 基于告警规则触发告警并发送消息了,但是为了更优雅可以设置发送给 postnotification 的消息内容,这就需要设置告警模板:

复制代码
template inherit_template {
subSubject = {}
sendChannelBody = {
"alert_name":"{{.Alert.Name}}",
"start_time":"{{ .Start }}",
"last_abnormal_time":"{{.LastAbnormalTime}}",
"last_abnormal_status":"{{.LastAbnormalStatus}}",
"warn_threshold": "{{.Alert.Vars.warnTriggerThreshold}}",
"crit_threshold":"{{.Eval .Alert.Vars.critTriggerThreshold}}",
"trigger_value":"{{.Eval .Alert.Vars.result}}",
"warn_expression_result":"{{.Eval .Alert.Warn}}","
"crit_expression_result":"{{.Eval .Alert.Crit}}",
"current_status":"{{.CurrentStatus}}",
"alert_metrics":"{{.Alert.Vars.alertMetrics}}"
}
}

告警模板的定义是以 template 关键字开始,后面是定义模板的名称 (如:inherit_template)。这样将定义的告警模板引入到告警规则里面,就可以当触发告警时,基于该模板进行渲染并发送给自定义的服务。告警规则变成如下形式:

复制代码
alert container_mem_usage_high {
template = inherit_template
$metrics = "container_memory_usage_bytes"
$groupByTags = "region,pod_name,contianer_name"
$agg = "sum"
$step = "15s"
$filter = ''' namespace="default", ,pod_name="nginx-deployment-test-6c54bd5869-p7s85",container_name!="POD", container_name=~"nginx" '''
$result1 = prom($metrics, $groupByTags, $filter, $agg, $step, "5m", "")
$critTriggerThreshold = 900000000
crit = $result > $critTriggerThreshold
critNotification = post
}

这样就基本满足了告警的需求,并且 Bosun 还提供了告警静默 (silence) 的功能,给对不想接收的告警进行静默设置。这样基于 Bosun 进行告警基本就满足了当前的告警需求~

本文转载自公众号 360 云计算(ID:hulktalk)。

原文链接:

https://mp.weixin.qq.com/s/_9zqyQEuVdgmLYm0p5VMsw

评论

发布