EKL-7.1.1告警之ElastAlert【邮件、微信、第三方自研平台带源码】(三)
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/13565009.html
目录
一、环境准备
1.1 安装依赖包
1.2 下载包,安装
1.3 修改软连接和yum配置
1.4 验证
二、elastalert安装
2.1 pip方式,安装最新版本
2.2 git源码安装
2.3 根据Elasticsearch版本安装
2.4 创建索引
三、elastalert配置
3.1 自带模板
3.2 支持的告警规则
3.3 支持的告警方式
四、elastalert告警--邮件
4.1 主配置文件config.yaml
4.2 Rule配置
4.3 测试rule配置
4.4 启动elastalert
4.5 测试邮件告警
五、elastalert告警--微信
5.1 配置微信告警
5.2 手动测试出发告警
六、elastalert告警--第三方自研平台-自己开发插件
6.1 源码解读
6.2 开发过程
6.3 配置插件
6.4 测试
一、环境准备
官网要求环境如下:
1 2 3 4 5 | Elasticsearch ISO8601 or Unix timestamped data Python 3.6 pip, see requirements.txt Packages on Ubuntu 14.x: python-pip python-dev libffi-dev libssl-dev |
重点是python3.6!
python3.6升级过程
1.1 安装依赖包
1 | yum -y install wget openssl openssl-devel gcc gcc-c++ |
1.2 下载包,安装
1 2 3 4 5 6 7 8 9 10 11 12 | 下载包 wget https: //www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 解压后新建文件夹将Python-3.6.5放在/usr/local/python3下 # mkdir python3 # mv Python-3.6.5 python3 # cd python3/Python-3.6.5 安装 tar xf Python-3.6.5.tgz ./configure --prefix=/usr/local/python3 --enable-optimizations make -j 4 make altinstall |
1.3 修改软连接和yum配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #1、备份python2 mv /usr/bin/python /usr/bin/python2 #2、创建软连接 ln -s /usr/local/python3/bin/python3 /usr/bin/python ln -s /usr/local/python3/bin/pip3 /usr/bin/pip #3、修改yum配置文件改为 #!/usr/bin/python2 # ls -ol yum* -rwxr-xr-x 1 root 802 May 24 23:05 yum -rwxr-xr-x 1 root 9430 May 24 23:06 yum-builddep -rwxr-xr-x 1 root 9040 May 24 23:05 yum-config-manager -rwxr-xr-x 1 root 7610 May 24 23:06 yum-debug-dump -rwxr-xr-x 1 root 7904 May 24 23:07 yum-debug-restore -rwxr-xr-x. 1 root 10999 Aug 11 2017 yumdownloader -rwxr-xr-x 1 root 11032 May 24 23:07 yum-groups-manager |
1.4 验证
1 2 3 4 | [root@mongodb-1 elastalert]# python -V Python 3.6.5 [root@mongodb-1 elastalert]# pip -V pip 9.0.3 from /usr/local/python3/lib/python3.6/site-packages (python 3.6) |
二、elastalert安装
官网给出了三种安装方式:
2.1 pip方式,安装最新版本
1 | pip install elastalert |
2.2 git源码安装
1 2 3 | $ git clone https: //github.com/Yelp/elastalert.git $ pip install "setuptools>=11.3" $ python setup.py install |
2.3 根据Elasticsearch版本安装
Elasticsearch 5.0+:
1 | $ pip install "elasticsearch>=5.0.0" |
Elasticsearch 2.X:
1 | $ pip install "elasticsearch<3.0.0" |
安装后输入elastalert,按tab健验证:
1 2 | [root@mongodb-1 elastalert]# elastalert elastalert elastalert-create-index elastalert-rule- from -kibana elastalert-test-rule |
安装正常后会有以上4个命令。
2.4 创建索引
这个索引是用来审计、debug,并且ElastAlert 重启后,也可以继续发送上次未发送完成的alert。不是强制要求的,但是强烈建议安装。
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
New index elastalert_status created
Done!
检查索引是否生成成功:
三、elastalert配置
elastalert的配置主要是配置规则,即匹配到哪些情况进行什么操作。类似监控里面的触发器配置,监控项是已经采集到的日志。
3.1 自带模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@rbtnode1 example_rules]# ll total 48 -rwxr-xr-x 1 root root 1453 Aug 24 11:22 example_cardinality.yaml -rwxr-xr-x 1 root root 1944 Aug 24 11:22 example_change.yaml -rwxr-xr-x 1 root root 1346 Aug 24 11:22 example_frequency.yaml -rwxr-xr-x 1 root root 1667 Aug 24 11:22 example_new_term.yaml -rwxr-xr-x 1 root root 1920 Aug 24 11:22 example_opsgenie_frequency.yaml -rw-r--r-- 1 root root 602 Aug 24 11:22 example_percentage_match.yaml -rw-r--r-- 1 root root 524 Aug 24 11:22 example_single_metric_agg.yaml -rw-r--r-- 1 root root 1478 Aug 24 11:22 example_spike_single_metric_agg.yaml -rwxr-xr-x 1 root root 2070 Aug 24 11:22 example_spike.yaml -rwxr-xr-x 1 root root 226 Aug 24 11:22 jira_acct.txt -rw-r--r-- 1 root root 1542 Aug 24 11:22 ssh-repeat-offender.yaml -rw-r--r-- 1 root root 1527 Aug 24 11:22 ssh.yaml |
3.2 支持的告警规则
1 2 3 4 5 6 7 8 | 1、blacklist类型 说明:黑名单规则将检查黑名单中的某个字段,如果它在黑名单中则匹配。(黑名单) 2、whitelist类型 说明:与黑名单类似,此规则将某个字段与白名单进行比较,如果列表中不包含该字词,则匹配。(白名单) 3、change类型 说明:此规则将监视某个字段,并在该字段更改时进行匹配,该领域必须相对于最后一个事件发生相同的变化。(last change) 4、frequency类型 说明:当给定时间范围内至少有一定数量的事件时,此规则匹配。 这可以按照每个query_key来计数。(count) 5、spike类型 说明:当某个时间段内的事件量比上一个时间段的spike_height时间大或小时,这个规则是匹配的。它使用两个滑动窗口来比较事件的当前和参考频率。 我们将这两个窗口称为“参考”和“当前”。(环比) 6、flatline类型 说明:当一个时间段内的事件总数低于一个给定的阈值时,匹配规则。(last值) 7、cardinality类型 说明:当一个时间范围内的特定字段的唯一值的总数高于或低于阈值时,该规则匹配(last值) 8、percentage match类型 说明:当计算窗口内的匹配桶中的文档的百分比高于或低于阈值时,此规则匹配。计算窗口默认为buffer_time。(比率) |
3.3 支持的告警方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Email JIRA OpsGenie Commands HipChat MS Teams Slack Telegram AWS SNS VictorOps PagerDuty Exotel Twilio Gitter |
我这里还会补充微信和第三方自研平台告警方式。
四、elastalert告警--邮件
4.1 主配置文件config.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 用来加载rule的目录,默认是example_rules rules_folder: rules # 用来设置定时向elasticsearch发送请求,也就是告警执行的频率 run_every: seconds: 30 # 用来设置请求里时间字段的范围 buffer_time: seconds: 30 # elasticsearch的host地址,端口 es_host: node01 es_port: 9200 # elastalert产生的日志在elasticsearch中的创建的索引 writeback_index: elastalert_status writeback_alias: elastalert_alerts # 失败重试的时间限制 alert_time_limit: days: 2 |
4.2 Rule配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #规则名称 name: messages #使用前缀时间戳 use_strftine_index: true #监控的索引 index: system-messages-* #在timeframe时间内超过num_events次数即报警 . type: frequency num_events: 5 timeframe: minutes: 5 #10s聚合期 aggregation: seconds: 10 #过滤规则,这里是匹配到messages里面的error或Error字段 filter: - query: query_string: query: "message: error OR Error" #告警方式 alert: - email #告警收件人 email: - "505711559@qq.com,xuequn@kingsoft.com" #邮件发送配置 new_style_string_format: true smtp_host: smtp.163.com smtp_port: 25 smtp_auth_file: /opt/elastalert/smtp_auth_file.yaml from_addr: xuequn_2008@163.com email_reply_to: xuequn_2008@163.com |
/opt/elastalert/smtp_auth_file.yaml文件里面记录的是邮件用户名和密码(授权码):
1 2 3 4 5 | [root@mongodb-1 elastalert]# cat smtp_auth_file.yaml #邮箱用户名 user: xuequn_2008@163.com #不是邮箱密码,是设置的SMTP密码 password: FNZALHSAFASDFASDFA |
4.3 测试rule配置
通过命令 elastalert-test-rule rules/var-log-messages.yaml进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | [root@mongodb-1 elastalert]# elastalert-test-rule rules/ var -log-messages.yaml INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent. To send them but remain verbose, use --verbose instead. Didn't get any results. INFO:elastalert:Note: In debug mode, alerts will be logged to console but NOT actually sent. To send them but remain verbose, use --verbose instead. 1 rules loaded INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts INFO:elastalert:Queried rule messages from 2020-08-27 16:30 CST to 2020-08-27 16:31 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:31 CST to 2020-08-27 16:31 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:31 CST to 2020-08-27 16:32 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:32 CST to 2020-08-27 16:32 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:32 CST to 2020-08-27 16:33 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:33 CST to 2020-08-27 16:33 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:33 CST to 2020-08-27 16:34 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:34 CST to 2020-08-27 16:34 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:34 CST to 2020-08-27 16:35 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:35 CST to 2020-08-27 16:35 CST: 0 / 0 hits INFO:elastalert:Queried rule messages from 2020-08-27 16:35 CST to 2020-08-27 16:35 CST: 0 / 0 hits Would have written the following documents to writeback index ( default is elastalert_status): elastalert_status - { 'rule_name' : 'messages' , 'endtime' : datetime.datetime(2020, 8, 27, 8, 35, 44, 802936, tzinfo=tzutc()), 'starttime' : datetime.datetime(2020, 8, 27, 8, 30, 41, 802936, tzinfo=tzutc()), 'matches' : 0, 'hits' : 0, '@timestamp' : datetime.datetime(2020, 8, 27, 8, 35, 44, 921361, tzinfo=tzutc()), 'time_taken' : 0.09260392189025879} [root@mongodb-1 elastalert]# elastalert-test-rule rules/ var -log-messages.yaml |
以上表示通过测试。
4.4 启动elastalert
启动方式有两种
(1)指定规则文件路径
python -m elastalert.elastalert --verbose --config config.yaml --rule rules/nginx_404.yaml
(2)在全局路径config.yaml下,配置规则存放在加载规则rules目录下
python -m elastalert.elastalert --verbose
4.5 测试邮件告警
手写一个error进入messages文件:
1 | echo "Aug 27 09:40:02 mongodb-1 systemd: Starting Session 10551261 of user root. error" >>/ var /log/messages |
查看规则匹配情况:
邮件接收成功:
五、elastalert告警--微信
微信告警模板已经有人开发了插件:
1 2 | git clone https: //github.com/anjia0532/elastalert-wechat-plugin.git cp elastalert-wechat-plugin/elastalert_modules/* elastalert_modules/ |
5.1 配置微信告警
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | alert: - "elastalert_modules.wechat_qiye_alert.WeChatAlerter" #后台登陆后【设置】->【权限管理】->【普通管理组】->【创建并设置通讯录和应用权限】->【CorpID,Secret】 #设置微信企业号的appid corp_id: xxx #设置微信企业号的Secret secret: xxx #后台登陆后【应用中心】->【选择应用】->【应用id】 #设置微信企业号应用id agent_id: xx #部门id party_id: xx #用户微信号 user_id: xx # 标签id,多个用 | 分隔 |
5.2 手动测试出发告警
六、elastalert告警--第三方自研平台-自己开发插件
6.1 源码解读
我们使用的第三方自研平台是内部的事件系统,通过和elastalert官网提供的相关接口进行二次开发。
https://elastalert.readthedocs.io/en/latest/recipes/adding_alerts.html
新增的Alerters是Alerter的一个子类,在源码elastalert/alerts.py中。新增类基于这个类进行开发,主要是完成两个成员函数。
ElastAlert启动后,alerter类将会被实例化,且周期性的通过aleter方法进行匹配。ElastAlert也会写回到Elasticsearch中。几个重要的属性:
required_options:配置文件中必须传入的参数,如果不传入则无法实例化。
rule:elastalert_modules.event_hub_alert.EventHubAlerter
pipline:告警队列
6.2 开发过程
开发插件过程其实比较简单,集成Alerter类,并实现alert和get_info方法即可。源码如下:
这个就是我开发的一个插件,用于和我们的事件系统进行打通的。
1、required_options:是必须要传的字段,用于初始化中
2、create_default_title
这个是发送告警的标题,如果没有传入的话,就是用这个默认标题。
3、senddata函数
senddata函数用于执行业务逻辑,这里也就是向事件系统提交事件
4、alert函数
alert函数是整个插件的实现者,通过这个函数将匹配到的信息进行对应的告警发送操作。
5、get_info函数
这个函数是必须的,仅仅用于将相关信息记录到es中用。
6.3 配置插件
1 2 3 4 5 6 7 8 9 10 | alert: - email - "elastalert_modules.wechat_qiye_alert.WeChatAlerter" - "elastalert_modules.event_hub_alert.EventHubAlerter" event_alert_name: message出现了error event_alert_dec: message出现了error event_alert_project_name: 美术中心 event_alert_type: 程序故障-通用应用程序故障-通用应用程序BUG |
6.4 测试
模拟一次告警操作。
1 | echo "Aug 27 09:40:02 mongodb-1 systemd: Starting Session 10551261 of user root. error" >>/ var /log/messages |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2018-08-26 学生管理之登录实现
2018-08-26 学生管理之表单设计