简介
Elastalert是用python2写的一个报警框架(目前支持python2.6和2.7,不支持3.x),用于警报Elasticsearch数据中的异常。
工作原理
它的工作原理是将Elasticsearch与规则类型和警报类型的组件相结合,定期查询Elasticsearch并将数据传递给规则类型,该类型确定何时找到匹配项。当匹配发生是,它将赋予一个或多个警报,这些警报根据匹配采取行动。
#安装
git clone https://github.com/Yelp/elastalert.git
进入elastalert的目录,执行
pip install -r requirements.txt
python setup.py install
#在elasticsearch中创建elastalert的日志索引
elastalert-create-index
根据自己的情况,填入elasticsearch的相关信息,不知道的直接回车默认即可。
Elastalert将有关其查询及其警报的信息和与数据保存回elasticsearch。它允许elastalert重新启动并从中断的位置恢复。
#创建配置文件,在elastalert 目录里边有一个config.yaml.example 文件,我们通过copy 一份之后修改成自己需要的配置。
cp config.yaml.example config.yaml
vi config.yaml
#rules 的定义
cd example_rules/
cp example_frequency.yaml my_rule.yaml
vi my_rule.yaml
#测试我们写的rule
elastalert-test-rule my_rule.yaml
#运行命令
python -m elastale.elastalert --verbos --rule example_rules/my_rule.yaml
将elastalert配置为系统服务的方式后台运行
#在etc 下创建程序工作目录
mkdir -p /etc/elastalert/rules
#进入工作目录复制刚刚创建好的配置文件
cd /etc/elastalert/
cp /home/actiontec/ELK/elastalert/config.yaml config.yaml
cp /home/actiontec/ELK/elastalert/smtp_auth_file.yaml smtp_auth_file.yaml
#进入rules 目录复制rule 文件及smtp 认证文件
cp /home/actiontec/ELK/elastalert/example_rules/my_rule.yaml my_rule.yaml
#接下来我们需要修改配置文件中涉及到相应配置文件目录了,
修改 config.yaml 中
rules_folder:/etc/elastalert/rules
修改my_rules.yaml 中
smtp_auth_file: /etc/elastalert/smtp_auth_file.yaml
#接下来就是创建systemd服务了
cd /etc/systemd/system/
vi elastalertd.service
[Unit]
Description=elastalertd
After=elasticsearch.service
[Service]
Type=simple
User=actiontec
Group=actiontec
Restart=on-failure
WorkingDirectory=/home/actiontec/ELK/elastalert
ExecStart=/usr/local/bin/elastalert --config /etc/elastalert/config.yaml --rule /etc/elastalert/rules/my_rule.yaml
[Install]
WantedBy=multi-user.target
#
开启服务开机自启动
systemctl enable elastalertd
#启动服务,check 服务启动状态
systemctl start elastalertd
systemctl status elastalertd
安装之后会自带三个命令
elastalert-create-index:ElastAlert会把执行记录存放到一个ES 索引中,该命令就是用来 创建这个索引的,默认情况下,索引名叫elastalert_status。其中有4个 _type,都有 自己的@timestamp字段,所以同样也可以用kibana,来查看这个索引的日志记录情况。
elastalert-rule-from-kibana:从Kibana3已保存的仪表盘中读取Filtering设置,帮助生成config.yaml里的配置。不过注意,它只会读取filtering,不包括queries。
elastalert-test-rule:测试自定义配置中的rule设置。
配置
除了有关 ES 服务器的配置以外,主要包括:
-
run_every
配置,用来设置定时向 ES 发请求,默认 5 分钟。 -
buffer_time
配置,用来设置请求里时间字段的范围,默认 45 分钟。 -
rules_folder
配置,用来加载下一阶段的 rule 设置,默认是example_rules
。
rule 设置各自独立以文件方式存储在rules_folder
设置的目录里。其中可以定义下面这些参数:
-
name
配置,每个 rule 需要有自己独立的 name,一旦重复,进程将无法启动。 -
type
配置,选择某一种数据验证方式。 -
index
配置,从某类索引里读取数据,目前已经支持Ymd格式,需要先设置use_strftime_index: true,然后匹配索引,配置形如:index: logstash-es-test-%Y.%m.%d,表示匹配logstash-es-test名称开头,以年月日作为索引后缀的index。 -
Filter
配置,设置向 ES 请求的过滤条件。 -
Timeframe
配置,累积触发报警的时长。 -
alert
配置,设置触发报警时执行哪些报警手段。
不同的 type 还有自己独特的配置选项。目前 ElastAlert 有以下几种自带 ruletype:
-
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
。
alert
配置是一个数组,目前支持 command, email,jira,opsgenie,sns,hipchat,slack 等方式。