阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

Prometheus 基于 bosun 框架进行告警

  • 2019-11-15
  • 本文字数:3384 字

    阅读完需:约 11 分钟

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 的目的。



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


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  = trueHTTPListen = ":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 接口,并将返回的数据进行在处理,已达到告警的目的。


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



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)。作用域里面是告警的表达式,当critTriggerThreshold 就会触发告警。


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


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


2019-11-15 14:282161

评论

发布
暂无评论
发现更多内容

编程能力 —— 寻路问题

wendraw

Java 大前端 编程能力

5分钟上手部署!!!

清风

Java Spring Boot

区块链+高考,让世界再无冒名顶替

CECBC

创业使人成长系列 (2)- 散伙协议

石云升

创业 股权 合伙人 散伙协议

实验室里的AI激情:腾讯优图的升级修炼之路

脑极体

SpringBoot入门:01 - 配置数据源

封不羁

Java spring springboot

16种设计思想 - Design for failure

Man

Java 微服务 设计原则

Git 常用操作汇总-cheat sheet

多选参数

git GitHub gitlab gitee

数据结构与算法知识点总结

烟雨濛濛

最大的 String 字符长度是多少?

武培轩

Java 源码 后端 JVM

521我发誓读完本文,再也不会担心Spring配置类问题了

YourBatman

spring springboot @Configuration Spring配置类

啃碎并发(八):深入分析wait&notify原理 猿码架构

猿灯塔

编程能力 —— 异步编程

wendraw

Java 大前端 编程能力

一个爱不释手的Apifox,让我扔掉 Postman的想法

给你买橘子

Java 编程 程序员 开发 Postman

HTTP/2 总结

guoguo 👻

利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?

JackTian

Python Linux 运维 数据分析 招聘

Java 后端博客系统文章系统——No2

猿灯塔

【Java虚拟机】垃圾收集器与内存分配

烫烫烫个喵啊

Java Java虚拟机

亚马逊:让创新科技成为重启世界的新动能

爱极客侠

Docker基础修炼3--Docker容器及常用命令

黑马腾云

Docker Linux 容器 命令

微服务架构下分布式事务解决方案

Axe

终于有人把Elasticsearch架构原理讲明白了,感觉之前看的都是渣

爱嘤嘤嘤斯坦

Java elasticsearch 编程 架构

领域驱动设计(DDD)实践之路(一)

vivo互联网技术

架构 领域驱动设计 DDD

漫画通信:一图看懂通信发展史

阿里云Edge Plus

积极支持EdgeX发展,英特尔为2020 EdgeX中国挑战赛获奖队伍创造广阔合作空间

最新动态

编程能力 —— 解析表达式

wendraw

Java 大前端 编程能力

图解:深度优先搜索与广度优先搜索

淡蓝色

Java 数据结构 算法

流水账

zack

DDD实施过程中的点滴思考

冯文辉

领域驱动设计 DDD

【写作群星榜】6.27~7.10 写作平台优秀作者 & 文章排名

InfoQ写作社区官方

写作平台 排行榜 热门活动

肖风:数据要素市场与分布式AI平台

CECBC

Prometheus基于bosun框架进行告警_文化 & 方法_王希刚_InfoQ精选文章