EKL-7.1.1告警之ElastAlert【邮件、微信、第三方自研平台带源码】(三)

一、环境准备

官网要求环境如下:

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 安装依赖包

yum -y install wget openssl openssl-devel gcc gcc-c++

 

1.2 下载包,安装

下载包
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、备份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 验证

[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方式,安装最新版本

pip install elastalert

  

2.2 git源码安装

$ git clone https://github.com/Yelp/elastalert.git
$ pip install "setuptools>=11.3"
$ python setup.py install

  

2.3 根据Elasticsearch版本安装

Elasticsearch 5.0+:

$ pip install "elasticsearch>=5.0.0"

  

Elasticsearch 2.X:

$ pip install "elasticsearch<3.0.0"

  

安装后输入elastalert,按tab健验证:

[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 自带模板

[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、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 支持的告警方式

Email
JIRA
OpsGenie
Commands
HipChat
MS Teams
Slack
Telegram
AWS SNS
VictorOps
PagerDuty
Exotel
Twilio
Gitter

  我这里还会补充微信和第三方自研平台告警方式。

  

四、elastalert告警--邮件

4.1 主配置文件config.yaml

# 用来加载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配置

#规则名称
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文件里面记录的是邮件用户名和密码(授权码):

[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进行测试

[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文件:

echo "Aug 27 09:40:02 mongodb-1 systemd: Starting Session 10551261 of user root. error" >>/var/log/messages

查看规则匹配情况:

 

 

 邮件接收成功:

 

 

五、elastalert告警--微信

微信告警模板已经有人开发了插件:

git clone https://github.com/anjia0532/elastalert-wechat-plugin.git
cp elastalert-wechat-plugin/elastalert_modules/* elastalert_modules/

  

5.1 配置微信告警

 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 配置插件

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 测试

模拟一次告警操作。

echo "Aug 27 09:40:02 mongodb-1 systemd: Starting Session 10551261 of user root. error" >>/var/log/messages

  

 

 

 

 

 



posted @ 2020-08-26 14:29  skyflask  阅读(659)  评论(0编辑  收藏  举报