ElastAlert 日志关键字报警

2018/07/12 Linux

简介

ElastAlert 是一个简单的框架,用于警告 Elasticsearch 中的数据中的异常,也就是说我们可以通过配置 ElastAlert 的规则获取到 Elasticsearch 索引中的关键字进行报警。

项目地址:https://github.com/Yelp/elastalert

文档地址:http://elastalert.readthedocs.io/en/latest/

1、安装环境说明

OS 内核版本
CentOS7.3 3.10.0-514.16.1.el7.x86_64

2、获取 ElastAlert 源码包

$ cd /usr/local/
$ git clone https://github.com/Yelp/elastalert.git

3、安装 ElastAlert 依赖包

$ yum install gcc libffi-devel python-devel openssl-devel4

4、配置阿里云 pip 镜像源

如果你的系统里没有安装 pip,你需要先进行安装

$ yum -y install python-pip

# 在文件

$ vim ~/.pip/pip.conf

中添加或修改:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

5、安装 setuptools

通过 pip 安装 setuptools 的指定版本,这个是 elastalert 要求的最低版本,pip 如果没有的话通过 east_install install pip 安装一下就行。

$ pip install setuptools==1.1.6

6、安装 ElastAlert

$ cd /usr/local/elastalert/
$ pip install -r requirements.txt
$ pip install elastalert

Elastalert 安装完成之后系统里边会有多出如下三个命令:

elastalert-create-index  # 命令用来创建ES索引的,默认为elastalert_status
elastalert-test-rule      # 测试自定义配置中的rule设置
elastalert-rule-from-kibana # 从Kibana3中直接导出Filters

7、创建 ElastAlert 的日志索引

根据自己的情况,填入 elasticsearch 的相关信息,关于 elastalert_status 部分直接回车默认的即可。 如下图,主要是第一个和第二个,其余的根据自己的情况来。

$ elastalert-create-index

除了红框中的内容需要填写,其它全部默认回车即可:

执行成功后可以在 elasticsearch-head 插件中看到此索引如下图:

8、创建配置文件

在 elastalert 目录里边有一个config.yaml.example 文件,我们通过copy 一份之后修改成自己需要的配置;

$ mkdir -pv /etc/elastalert/rules
$ cp config.yaml.example /etc/elastalert/config.yaml

$ vim /etc/elastalert/config.yaml 

#存放elastalert 规则的文件夹,你的elastalert 放到哪里就放到哪里就行了
# This is the folder that contains the rule yaml files
# Any .yaml file will be loaded as a rule
rules_folder: /etc/elastalert/rules

#Elastalert 多久去查询一下根据定义的规则去elasticsearch 查询是否有符合规则的字段,如果有就会触发报警,如果没有就等待下一次时间再检查,时间定义的单位从周到秒都可以,具体定义方法如下。
# How often ElastAlert will query Elasticsearch
# The unit can be anything from weeks to seconds
run_every:
  #seconds:1
  minutes: 1
  #hours:1
  #days:1
  #weeks:1

#当查询开始一直到结束,最大的缓存时间。
# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 15

#你的Elasticsearch ip地址
# The Elasticsearch hostname for metadata writeback
# Note that every rule can have its own Elasticsearch host
es_host: 10.100.4.40

#Elasticsearch 的端口
# The Elasticsearch port
es_port: 9200

#是不是用TLS 加密
# Connect with TLS to Elasticsearch
#use_ssl: True

#是不是启动TLS证书验证
# Verify TLS certificates
#verify_certs: True

#如果Elasticsearch 有认证的话需要把这个填写上
# Option basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

#配置证书存放的位置
# Use SSL authentication with client certificates client_cert must be
# a pem file containing both cert and key for client
#verify_certs: True
#ca_certs: /path/to/cacert.pem
#client_cert: /path/to/client_cert.pem
#client_key: /path/to/client_key.key

#这个是elastalert 在es里边写的index
# The index on es_host which is used for metadata storage
# This can be a unmapped index, but it is recommended that you run
# elastalert-create-index to set a mapping
writeback_index: elastalert_status

#如果alert当时没有发出去重试多久之后放弃发送;
# If an alert fails for some reason, ElastAlert will retry
# sending the alert until this time period has elapsed
alert_time_limit:
  days: 2

创建规则文件

在 elastalert 目录下有个 example_rules/ 目录复制其中 example_frequency.yaml 修改为需要的配置

$ cp example_rules/example_frequency.yaml /etc/elastalert/rules/my_rule.yaml
$ vim /etc/elastalert/rules/my_rule.yaml

# Alert when the rate of events exceeds a threshold
#Elasticsearch  机器
# (Optional)
# Elasticsearch host
es_host: 192.168.115.65

#Elasticsearch  端口
# (Optional)
# Elasticsearch port
es_port: 9200

#是否使用ssl 链接
# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

#如果elasticsearch 有认证,填写用户名和密码的地方
# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

#rule name 必须是独一的,不然会报错,这个定义完成之后,会成为报警邮件的标题
# (Required)
# Rule name, must be unique
name: My Test Elastalert
#配置一种数据验证的方式,有 any,blacklist,whitelist,change,frequency,spike,flatline,new_term,cardinality 
# any:只要有匹配就报警;
# blacklist:compare_key字段的内容匹配上 blacklist数组里任意内容;
# whitelist:compare_key字段的内容一个都没能匹配上whitelist数组里内容;
# change:在相同query_key条件下,compare_key字段的内容,在 timeframe范围内 发送变化;
# frequency:在相同 query_key条件下,timeframe 范围内有num_events个被过滤出 来的异常;
#spike:在相同query_key条件下,前后两个timeframe范围内数据量相差比例超过spike_height。其中可以通过spike_type设置具体涨跌方向是- up,down,both 。还可以通过threshold_ref设置要求上一个周期数据量的下限,threshold_cur设置要求当前周期数据量的下限,如果数据量不到下限,也不触发;
# flatline:timeframe 范围内,数据量小于threshold 阈值;
# new_term:fields字段新出现之前terms_window_size(默认30天)范围内最多的terms_size (默认50)个结果以外的数据;
# cardinality:在相同 query_key条件下,timeframe范围内cardinality_field的值超过 max_cardinality 或者低于# min_cardinality
# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
#我配置的是frequency,这个需要两个条件满足,在相同 query_key条件下,timeframe 范围内有num_events个被过滤出来的异常
type: frequency

#这个index 是指再kibana 里边的index,支持正则匹配,支持多个index,同时如果嫌麻烦直接* 也可以。
# (Required)
# Index to search, wildcard supported
index: tomcat-*

#触发的次数
# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 5

#和上边的参数关联,也就是说在4分钟内触发5次会报警
# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  minutes: 4

#这个还是非常关键的地方,就是你希望程序的message里边出现了什么样的关键字就报警,这个其实就是elasticsearch 的query语句,支持 AND&OR等。
# (Required)
# A list of Elasticsearch filters used for find events
# These filters are joined with AND and nested in a filtered query
# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
filter:
- query:
    query_string: 
      query: "message: error OR ERROR"
#一但需要报警用那种方式报警,支持如下的方式,同时官方支持自定义,我用常规的邮件方式作为报警方式。
#自定义alert 方式
# (Required)
# The alert is use when a match is found
alert:
- "email"
#在邮件正文会显示你定义的alert_text
alert_text: "Ref Log http://10.100.4.40"
#报警邮箱的smtp server
smtp_host: smtp.xxx.com
#报警邮箱的smtp 端口
smtp_port: 25
#需要把认证信息写到额外配置文件里,需要user和password两个属性
smtp_auth_file: /etc/elastalert/auth/smtp_auth_file.yaml
email_reply_to: zabbix@xxx.com # 发件人邮箱
from_addr: zabbix@xxx.com # 发件人邮箱

#接受报警邮箱的地址,可以写多个,当然后边搞个邮件组最好了。
# (required, email specific)
# a list of email addresses to send alerts to
email:
- "wangenzhi@xxx.com"

接下来我们需要配置smtp认证文件了,touch 一个配置文件

$ mkdir /etc/elastalert/auth
$ vim /etc/elastalert/auth/smtp_auth_file.yaml
文件内容如下

user: 认证邮箱的账号
password: 密码

9、 rule 配置检查

通过elastalert-test-rule 测试一下我们写的rule 是否有问题

$ elastalert-test-rule /etc/elastalert/rules/my_rule.yaml 

测试结果如下,如果有问题会提示问题,如果没有问题就会告诉你successfully。

10、运行 ElastAlert

配置检查成功之后,我们就可以把程序跑起来了,把所有的日志直接打在前端,这样方便验证

$ cd /etc/elastalert/
$ python -m elastalert.elastalert --rule /etc/elastalert/rules/my_rule.yaml --verbose

自己生成一个错误,验证一下是否能够在预设的前提下报警,我的测试结果如下图,如第红框内提示已经触发报警,邮件已经发出了。

查看邮箱内是否有报警邮件:

11、添加 ElastAlert 为系统服务

$ vim /etc/systemd/system/elastalertd.service

[Unit]
Description=elastalertd
After=elasticsearch.service

[Service]
Type=simple
User=root
Group=root
Restart=on-failure
WorkingDirectory=/usr/local/elastalert
ExecStart=/usr/bin/elastalert --config /etc/elastalert/config.yaml --rule /etc/elastalert/rules/my_rule.yaml
[Install]
WantedBy=multi-user.target

注意:如果你有多个rule配置文件在上面 elastalertd.service 文件中可以不指定rule文件如下:

ExecStart=/usr/bin/elastalert --config /etc/elastalert/config.yaml 

启动 Elastalert 服务

$ systemctl start elastalertd.service
$ systemctl status elastalertd.service
$ systemctl enable elastalertd.service

Search

    Table of Contents