QCon北京|3天沉浸式学习,跳出信息茧房。 了解详情
写点什么

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:282058

评论

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

明确生态边界的钉钉,让ToB从业者们松了口气

ToB行业头条

3步排查,3步优化,探针性能损耗直降44%

TakinTalks稳定性社区

Java 性能分析 探针 性能提升 性能损耗

华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本

华为云数据库小助手

GaussDB GaussDB ( for Redis )

创业圈的哈利波特们注意了!霍格沃兹即将开学,谁是你的魔法导师?

创业邦

不仅仅是一把瑞士军刀 —— Apifox的野望和不足

Liam

Java 程序员 Jmeter Postman swagger

阿里本地生活端智能架构设计与技术探索

阿里巴巴终端技术

端智能

直播预告 | PolarDB-X 动手实践系列——用 PolarDB-X + Flink 搭建实时数据大屏

阿里云数据库开源

数据库 阿里云 开源 分布式 polarDB

Go性能优化小技巧

jinjin

Go 性能优化

实现简易的 Vue 响应式

CRMEB

【性能测试工具lmbench】快来测测你的系统可以打几分

优麒麟

Linux 开源 系统管理 优麒麟

新思科技加速安全软件开发,推出Code Sight插件标准版

InfoQ_434670063458

软件开发 新思科技 可信软件 IDE环境 Code Sight

【Zeekr_Tech】TARA攻击树分析方法论

Zeekr_Tech

信息安全 极氪

2022年作为一个中年程序员写给35岁的自己

Linux服务器开发

c++ 程序员 架构师 Linux服务器开发 Linux后台开发

XSS跨站脚本攻击漏洞修复技巧

喀拉峻

网络安全

Go Data Structures: Interfaces [中译]

hyx

源码 Go 语言

关于黑帕云用户迁移明道云的详细说明

明道云

OpenMLDB 在线模块架构解析

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征平台

英特尔X钉钉:以智能协作驱动数字办公发展

科技新消息

配置Mountebank环境-mountebank系列(2)

Bruce Talk

技术 敏捷 Agile

谷歌云对象存储攻防

火线安全

安全攻防 对象存储 云安全

模块一作业

HZ

架构实战营

网络安全 Kali web安全 基于SMB协议收集信息

学神来啦

Linux 运维 网络安全 WEB安全 kali Linux

Tapdata加入PolarDB开源数据库社区

阿里云数据库开源

数据库 阿里云 开源 开源数据库 polarDB

Apache Flink 在国有大型银行智能运营场景下的应用

Apache Flink

大数据 flink 编程 流计算 实时计算

KubeVela: 如何用 100 行代码快速引入 AWS 最受欢迎的 50 种云资源

阿里巴巴云原生

巧用对象存储回源绕过SSRF限制

火线安全

Web 云安全 web漏洞

19 条有效的跨端 cpp 开发经验

阿里巴巴终端技术

cpp 跨端开发

架构实战营 第6期 模块一课后作业

火钳刘明

#架构实战营 「架构实战营」

校招项目应该如何准备才能高大上一点

宇宙之一粟

项目 3月月更

大数据,不只“懂数”,更要“懂行”

鼎道智联

大数据

3大能力升级,云效+钉钉,让研发协作更「敏捷」

阿里云云效

云计算 阿里云 云原生 钉钉 敏捷研发

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