1 简介
Elk日志系统可以很明了的观察出日志个指标的走向,x-pack可以用来报警,但是x-pack是需要收费的。所以使用ElastAlert进行报警。
ElastAlert是通过Elasticsearch集群匹配报警规则的。它的工作原理是将Elasticsearch与两种类型的组件,规则类型和警报相结合。定期查询Elasticsearch并将数据传递给规则类型,该规则类型确定何时找到匹配项。当匹配发生时,它将被赋予一个或多个警报,这些警报根据匹配采取行动。
1、 github 官方地址:https://github.com/Yelp/elastalert
2、 官方文档地址:https://elastalert.readthedocs.io/en/latest/
1.1 系统环境
1、 centos7
2、 elk版本5.6.11
2 安装ElastAlert
1、依赖包
# yum -y install gcc libffi-devel python-devel openssl-devel4
2、下载elastalert
# cd /data/
# git clone https://github.com/Yelp/elastalert.git
3、 通过pip 安装setuptools的指定版本
这个是elastalert 要求的最低版本,pip 如果没有的话通过east_install install pip 安装一下就行
# pip install setuptools==1.1.6
# cd /data/elastalert
# pip install -r requirements.txt
# pip install elastalert
3 配置ElastAlert
3.1 前期配置
1、elastalert 安装完成之后系统里边会有多出如下三个命令
elastalert-create-index 命令用来创建ES索引的,默认为elastalert_status
elastalert-test-rule 测试自定义配置中的rule设置
elastalert-rule-from-kibana 从Kibana3中直接导出Filters
2、执行如下命令在elasticsearch中创建elastalert的日志索引
#elastalert-create-index
Enter Elasticsearch host: 10.10.4.11
Enter Elasticsearch port: 9200
Use SSL? t/f:
Enter optional basic-auth username (or leave blank): elastic 用户名
Enter optional basic-auth password (or leave blank): ****** 密码
Enter optional Elasticsearch URL prefix (prepends a string to the URL of every request):
New index name? (Default elastalert_status) ela #索引名默认elastalert_status
Name of existing index to copy? (Default None)
Elastic Version:5
Mapping used for string:{'index': 'not_analyzed', 'type': 'string'}
New index ela created
执行之后会在es里出项一个ela(正常默认就可以索引名为elastalert_status)命名的索引,这个索引就是elastalert创建的默认索引。
3.2 配置文件配置
1、创建配置文件,在elastalert 目录里边有一个config.yaml.example 文件,我们通过copy 一份之后修改成自己需要的配置
# cd /data/elastalert/
# cp config.yaml.example config.yaml
# vi config.yaml
rules_folder: /data/elastalert/example_rules #规则目录位置
run_every:
minutes: 1
#Elastalert 多久去查询一下根据定义的规则去elasticsearch 查询是否有符合规则的字段,如果有就会触发报警,如果没有就等待下一次时间再检查,时间定义的单位从周到秒都可以。
buffer_time:
minutes: 15 #当查询开始一直到结束,最大的缓存时间。
es_host: 10.10.4.12 #es地址
es_port: 9200 #es端口
es_username: elastic #如果es有密码需要写。Es的用户名
es_password: changeme #es的密码
writeback_index: elastalert_status #es里的索引
alert_time_limit:
days: 2 #如果alert当时没有发出去重试多久之后放弃发送
3.3 rules 的定义
在此只配置_frequency模板,其他的请参考官网进行配置。
# cd /data/elastalert/example_rules/
# cp example_frequency.yaml my_rule.yaml
#此模板为频率报警模板,就是当规定时间,规定字段达到一定数量就会触发报警。此配置我配置为email报警
# vi my_rule.yaml
es_host: 10.10.4.11 #es的IP地址
es_port: 9200 #es的端口
es_username: elastic #es的用户名(如果es没有设置可以不用填写)
es_password: changeme #es的密码
name: Example test
# rule name 必须是独一的,不然会报错,这个定义完成之后,会成为报警邮件的标题
type: frequency #类型:频率
index: nginx_access* #监控的索引。多个使用(,)逗号隔开
num_events: 4 #时间内触发的次数
timeframe:
minutes: 1
#时间。和上边的参数关联。1分钟内有4次会报警
filter:
- term:
status: "404"
#截取的字段status为4041分钟出现4次报警。
alert_text: "Ref Log [http://10.10.4.11](http://10.10.4.11)" #会在报警内容中显示
smtp_host: mail.bytuetech.com #smtp的地址
smtp_port: 25 #端口
smtp_auth_file: /data/elastalert/example_rules/smtp_auth_file.yaml
#用户密码的文件
email_reply_to: [cx******@b******ech.com](mailto:cx******@b******ech.com)
#发送邮件的邮箱
from_addr: c******@b******ech.com
alert:
- "email" #报警类型
email:
- "er****@b*****ech.com"
#收件人地址
接下来配置/data/elastalert/example_rules/smtp_auth_file.yaml文件
#vi /data/elastalert/example_rules/smtp_auth_file.yaml
user: "c*****@b*******h.com"
password: "**********"
4 测试规则的正确性
# elastalert-test-rule my_rule.yaml
Successfully loaded Example test # Successfully显示成功。
·······················
5 运行
5.1 启动,日志直接打印在前端
# cd /data/elastalert
# python -m elastalert.elastalert --verbose --rule my_rule.yaml
之后模拟错误,访问nginx造成404错误。
INFO:elastalert:Queried rule Example test from 2018-11-09 13:52 CST to 2018-11-09 14:06 CST: 71 / 71 hits
INFO:elastalert:Sent email to ['eraser@bytuetech.com']
…………………………………………
INFO:elastalert:Ignoring match for silenced rule Example test
INFO:elastalert:Ran Example test from 2018-11-09 13:52 CST to 2018-11-09 14:06 CST: 71 query hits (0 already seen), 71 matches, 1 alerts sent
INFO:elastalert:Sleeping for 59.420713 seconds
此时收到邮件
5.2 编写systemctl脚本
# /usr/lib/systemd/system
# vi elastalertd.service
[Unit]
Description=elastalertd
After=elasticsearch.service
[Service]
Type=simple
User=root
Group=root
Restart=on-failure
WorkingDirectory=/data/elastalert
ExecStart=/usr/bin/elastalert --config /data/elastalert/config.yaml --rule /data/elastalert/example_rules/my_rule.yaml
[Install]
WantedBy=multi-user.target
开机自启动:systemctl enable elastalertd
启动:systemctl start elastalertd.service
关闭: systemctl stop elastalertd.service
查看状态: systemctl status elastalertd.service
网友评论