一 背景

基于ELK日志的报警时互联网公司标配,大一点公司都会自研组件,报警信息更加准确、规则多样化。(之前的五八到家就是自研的)我们采用了Elastalert报警。

官网的地址:https://github.com/Yelp/elastalert

Elastalert自带的报警方式虽然多种多样,如下所示,但是不能实现根据报警信息分组发送。而且,不太符合国情:

我们需要的是:邮件+短信+钉钉+微信+电话这种常见的组合。

Currently, we have built-in support for the following alert types:

  • Email
  • JIRA
  • OpsGenie
  • Commands
  • HipChat
  • MS Teams
  • Slack
  • Telegram
  • GoogleChat
  • AWS SNS
  • VictorOps
  • PagerDuty
  • PagerTree
  • Exotel
  • Twilio
  • Gitter
  • Line Notify
  • Zabbix

Additional rule types and alerts can be easily imported or written.

不能分组这就很蛋疼,要么就是全体收,要么就是制定几个人收。报警太多我自身的感受就是跟“狼来了”差不多,一天几百个报警,时间一长没几天你就忽略了,真的报警也报淹没了。所以分组报警必要性性就体现出来了。主要目的是为了响应项目的报警发给对应的组内。

网上关于Elastalert 文章很多,但是实际上实用有分量的较少,我自己分析下:

方案 1: 报警方式实用post,

优点:便于拓展,

缺点:新开发一套报警相关的工程,工作量不是一两天的事

方案2: 基于Commands自定义报警组件:

优缺点:对于我来说,主要是Python语法上的挑战。不懂啊,只是硬着头皮看点介绍。

这里我要重点介绍下一位大神:https://blog.csdn.net/sdmei/article/details/89928964

要没有他的文章,我就采用方案1了,因为对于不懂Python外行来说,还是有一定的技术门槛的。

关于elastalert的安装:mac:ElastAlert 安装

二 拓展改造

注意:Recent changes: As of Elastalert 0.2.0, you must use Python 3.6. Python 2 will not longer be supported.

这里首选说明下,要是使用对应的Python版本,

python
Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

我为了测试,就把mac自带的python2.7的升级到3.6.0版本,mac如何升级Python不展开,网上有很多文章。

2.1 告警数据怎么来获取?

这里关注下如何针对大神的文章去改造参数适配:

es_host: 10.10.10.1
es_port: 9200
name: freq-status-500
type: frequency
index: nginx-*
num_events: 30
timeframe:minutes: 1
filter:
- bool:must:- terms: status: ["500","501","502","503","504"]
use_terms_query: true
doc_type: doc
terms_size: 10
query_key:
- domain
- status
realert:minutes: 60
alert:
- command
new_style_string_format: true
command: ["/root/elastalert-0.1.38/myalert/elastalert-alarm/alarm.py","--level=warning","--domain={domain,status}","--rulename=freq-status-500","--type=frequency","--num_events=30","--timeframe=1min"]

上面原作者的监控nginx 500的错误配置。我们业务就是简单的监控ES错误日志:filter 哪里:query error

对应实际来说:监控规则是不用变的,原来发邮件前怎么监控还是继续。主要是方式:就是alert:从 email 变成command。

而且业务所需要的参数:command要输出很多自定义参数,脚本通过这些参数决定发送的组合发送的内容如IP,es对应的index,tradeid,message,appname等具体报警参数需要传入到command。对应的py脚本:alarm.py。

2.2 报警人员如何获取?

这里要先看下配置:我改动较少,沿用原来的yaml配置。

project1:member:zhouwu:mail: zhouwu@sina.comwangliu:mail: wangliu@sina.com

主要还是以项目XXpeoject为主,获取对应的报警人信息。有一点麻烦就是工程比较多的情况下需要收集下不同部门不同项目的报警人邮件,逐一配置。毕竟是Python啊,如果换成Java,还是会好处理很多。但是维护组织结构与对应的负责项目这种 映射关系是不可缺少的。

2.3  报警内容组装

原始版本的内容:

 def make_msg(self):"""get msg by rulenamefreq-status-*, warning: sina_www status of 500 exceed 30 per 2minfreq-reqtime-*, warning: sina_www request time greater than 5sec exceed 30 per 2min"""if re.match("freq-status-", self.rulename):self.msg = "%s: %s status of %s exceed %s per %s" % \(self.level, self.domain, self.status, self.num_events, self.timeframe)elif re.match("freq-reqtime-", self.rulename):self.msg = "%s: %s request time greater than %s exceed %s per %s" % \(self.level, self.domain, self.reqtime_gt, self.num_events, self.timeframe)else:self.msg = ''

这里可以自定义报警内容去替换,我不需要钉钉跟短信,只保留邮件,所以做了调整。

相关代码说明:

alarm.py                --程序入口,参数解析
alert_channel.py        --报警发送通道(短信、语音、邮件、钉钉群)
alert.py                --构造发送对象和消息内容
aliyunsdk_SingleCallByTtsRequest.py   --阿里电话语音第三方库
config-contact.yaml     --报警对象配置文件
config.py               --加载配置文件
requirements.txt        --依赖
util.py                 --工具方法

效果展示:

再测试环境确定对应的ES起来了。然后模拟使用postman给es推送error触发报警。

本地起来了elastalert项目:

python -m elastalert.elastalert --config ./config.yaml --verbose --rule example_rules/my_rule.yaml

以邮件为例:

1 rules loaded
INFO:elastalert:Starting up
INFO:elastalert:Disabled rules are: []
INFO:elastalert:Sleeping for 59.99993 seconds
INFO:elastalert:Queried rule Example frequency rule from 2020-01-05 16:49 CST to 2020-01-05 16:59 CST: 1 / 1 hits
INFO:elastalert:New aggregation for Example frequency rule, aggregation_key: None. next alert at 2020-01-05 09:00:00+00:00.
INFO:elastalert:Ran Example frequency rule from 2020-01-05 16:49 CST to 2020-01-05 16:59 CST: 1 query hits (0 already seen), 1 matches, 0 alerts sent
INFO:elastalert:Disabled rules are: []
INFO:elastalert:Sleeping for 59.999657 seconds
INFO:elastalert:Background configuration change check run at 2020-01-05 17:00 CST
INFO:elastalert:Background alerts thread 1 pending alerts sent at 2020-01-05 17:00 CST
2020-01-05 17:00:12,556:alarm:INFO:mail -> bohu83@163.com,msg -> 

elastalert索引中,hits表示规则命中条数;matches表示规则命中条数,并且匹配规则触发告警数量。

邮件效果:

 数据都是造的,只是为了验证下效果。

没有加html 格式化。初步达到目的。

前后大概花了1天半的时间,开始半天被mac安装python折磨,后面1天主要是改动Python的时候语法错误。

另外,调试的时候遇到的一个坑是es的时间,一开始忽略了.

举个例子:  "@timestamp": "2020-01-05T08:58:11.092Z",

这个时间实际上是1月5日16:58产生的,有个8小时时差。

剩下就是调整报警参数及邮件格式了。不得不承认,不懂Python语法调起来很费劲,全靠请教大师+百度。

期间我还咨询了小米的一个大神,大神说也没用过这个报警组件啊,不知道怎么改。其实看看核心代码不是很长大概200多行吧,熟悉的人半天就搞定了吧,但是对于不熟悉的改造加调试的确需要花时间。你得找机器去安装es.我自测试使用的就是线上版本6.7.  elastalert是0.2 ,Python是3.6.0. 一步一个坑。最大收获就是磨练了自己的耐心。

最后再次感谢大神:他的地址:https://me.csdn.net/sdmei ,没有他的文章我不会尝试修改Python。也不会有本文。

Elastalert的报警功能拓展:分组报警相关推荐

  1. CentOS下ELK基于ElastAlert实现日志的微信报警

    转载来源 :ELK基于ElastAlert实现日志的微信报警 : https://www.jianshu.com/p/f31c0d6020fe 一.ElastAlert介绍 在日志管理上我们使用Ela ...

  2. elasticsearch5之Elastalert 安装使用 配置邮件报警和报警模版

    简介 Elastalert是用python2写的一个报警框架(目前支持python2.6和2.7,不支持3.x),github地址为 https://github.com/Yelp/elastaler ...

  3. Nagios短信分组报警

    Nagios监控对于服务器运维来讲是非常好的工具,可以监控各种操作系统的服务器,windows,linux,aix等等,还可以对路由器和交换机,打印机等网络设备进行监控,再结合邮件,短信,MSN等报警 ...

  4. 1到10选一个数字读心术_厉害了!quot;广东110“互联网报警满足您多场景报警需求!...

    01 报警人 哎,110,这边打架了.(南方口音) 警察 在哪里? 报警人 在fa ben 市场门口嘛. 警察 什么"发奔"市场,没听过这个地方,你能讲清楚点吗? 报警人 就是那个 ...

  5. zabbix配置微信报警

    前言:zabbix一般可以通过邮件以及脚本的方式进行告警,zabbix通过微信报警的方式也是通过脚本来实现 企业微信号内配置 自行申请企业号 在企业号内添加新应用 应用创建完之后查看并启用应用,同时会 ...

  6. 【运维面试】微信报警你们怎么做的?

    前言 关于微信报警,虽然大家都会做,但是在说的时候总是漏下一些关键的信息. 通常解法 创建企业微信,创建部门,并添加成员. 记下成员账号,组织部门ID,AgentID, Secret 三个的值,并配置 ...

  7. Fundebug支持浏览器报警

    摘要: 除了邮件报警和第三方报警,我们新增了浏览器报警功能. 邮件报警与第三方报警 Fundebug是专业的应用BUG监控服务,当您的线上应用,比如网页.小程序.Java等发生BUG时,我们会第一时间 ...

  8. 5.prometheus告警插件-alertmanager、自定义webhook案例编写

    5.prometheus告警插件-alertmanager 参考文章: https://www.bookstack.cn/read/prometheus-book/alert-install-aler ...

  9. 边缘计算开源框架EdgeXFoundry的部署应用开发(三)设备服务开发

    边缘计算开源框架EdgeXFoundry的部署应用开发(三)设备服务开发 使用SDK开发真实设备接入服务 着手编写一个温湿度设备接入 准备相关文件及目录 脚本可选,用于单文件编译测试 编写温湿度设备接 ...

最新文章

  1. React-Native 使用真机和指定模拟器调试
  2. python cv2模块安装_python 连接sql server数据库,pymssql模块安装。
  3. curl 慢 不稳定_慢病毒包装步骤及注意事项
  4. 转: linux 命令行设置网络
  5. VMware虚拟机上安装Linux系统
  6. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤
  7. 深度学习:反向传播(back-propagation)
  8. spring的jar包以及相关的API文档的下载方式
  9. 手环是如何测试人体健康数据?
  10. FreeRTOS源码分析与应用开发08:任务通知
  11. 【转】Netty那点事(一)概述
  12. python2.7.11 for iOS 苹果上的python27环境
  13. [PYTHON] 核心编程笔记(11.Python函数和函数式编程)
  14. js实现正方体旋转动画
  15. Android跑马灯进度条,跑马灯进度条在Powershell中冻结
  16. python写的2048游戏,源代码,pygame
  17. 决策树(四):使用决策树预测隐形眼镜类型
  18. 李嘉诚布局接班人富儿穷养 财富版图正远离中华区
  19. 大数据测试指标(二)
  20. 关于三大运营商招聘网站

热门文章

  1. 报错(SQLite 3.8.3 or later is required (found 3.7.17).)的解决办法
  2. 公司邮箱怎么申请?企业公司邮箱快速注册方法
  3. 打包aab_聚餐买单AA制已经过时了 AAB制、AABB制、BBK制,你选哪个?
  4. 数字证书连接服务器异常,连接时Socket.io + SSL +自签名CA证书出现错误
  5. python中噪音是什么意思_Perlin噪声和Python的ctypes
  6. 各种小芯片Chiplet的机遇
  7. 最小公倍数Java描述,甲每秒跑3米,乙每秒跑4米,丙每秒跑2米, 三人沿600米的环形跑道从同一地点同时同方向跑步, 经过多少时间三人又同时从出发点出发?
  8. November 24th 周杰伦演唱会
  9. 一线网页游戏程序员日志 (十)
  10. linux 网口对应网卡_Intel 700系列 电口万兆网卡 X710T2L评测