运行ElastAlert前提

要求

  • Elasticsearch
  • ISO8601或Unix带时间戳的数据
  • Python 2.7
  • pip, 查看 requirements.txt
  • Ubuntu 14.x上的软件包:python-pip python-dev libffi-dev libssl-dev

下载和配置

1. 下载安装 可以使用pip安装最新发布的ElastAlert版本:

pip install elastalert

或者从github克隆ElastAlert项目并安装

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

2. 修改配置文件

cd /opt/elastalert
cp config.yaml.example config.yaml
[root@elk elastalert]# cat config.yaml
-------------------------------------------------------------------------------------------------------
rules_folder: example_rules        #ElastAlert加载规则配置文件的目录位置。它将尝试加载此文件夹中的每个.yaml文件。
run_every:        #ElastAlert查询Elasticsearch的频率
  minutes: 1      
buffer_time:      #结果缓存时间,从每个查询运行的时间向后延伸。use_count_query或use_terms_query设置为true的规则,将忽略此值。
  minutes: 15
es_host: elasticsearch.example.com     #Elasticsearch集群的地址
es_port: 9200          #Elasticsearch集群的端口
#es_url_prefix: elasticsearch            #可选的; Elasticsearch端点的URL前缀。
#es_send_get_body_as: GET          #可选的; 查询Elasticsearch方法- GET,POST或source
#es_username: someusername     #可选的; 用于连接es_host的用户名。
#es_password: somepassword      #可选的; 用于连接es_host的密码。
#use_ssl: True            #可选的; 连接es_host是否使用TLS; 设为True或False。
#verify_certs: True      #可选的; 是否验证TLS证书; 设为True或False。
#ca_certs: /path/to/cacert.pem            #可选的; 用于验证SSL连接的CA证书捆绑包的路径
#client_cert: /path/to/client_cert.pem   #可选的; PEM证书的路径,用作客户端证书
#client_key: /path/to/client_key.key     #可选的; 私钥文件的路径,用作客户端密钥

writeback_index: elastalert_status      #ElastAlert将存储数据的索引的名称。下一步会创建这个索引。

alert_time_limit:         #如果报警失败,会在两天内重试   
  days: 2

3. 设置Elasticsearch ElastAlert将其查询及其警报的有关信息和元数据保存回Elasticsearch。这对于审计,调试非常有用,它允许ElastAlert重新启动并从中断的位置恢复。这不是ElastAlert运行所必需的,但强烈建议。其中有 4 个 _type,都有自己的 @timestamp 字段,所以同样也可以用 kibana 来查看这个索引的日志记录情况。

首先,我们需要为ElastAlert创建一个索引:

[root@elk elastalert]# elastalert-create-index
Elastic Version:6
Mapping used for string:{'type': 'keyword'}
New index elastalert_status created
Done!

有关此处将包含哪些数据的信息,请参阅ElastAlert元数据索引。

自定义规则文件

[root@elk example_rules]# cat /opt/elastalert/example_rules/autoDispatchAdvanceJob.yaml
------------------------------------------------------------------------------------------

es_host: 10.x.x.x  # Elasticsearch的地址
es_port: 9200
name: autoDispatchAdvanceJob Stop  #  规则名称,不能重复,邮件标题就是这个名字
type: flatline  #  每个规则都有不同的类型,可能采用不同的参数。详细说明:https://elastalert.readthedocs.io/en/latest/ruletypes.html#rule-types
index: elastalert_status # Elasticsearch中的索引名称,需要报警的日志
#num_events: 50     #此参数特定于frequency类型,是触发警报时的阈值。
threshold: 1  # 35分钟内查询内容需要出现的次数                                                
timeframe:                                                                                                         
  minutes: 35  # 时间间隔                                                                                      
	
filter:                                                                                                                      
- query:                                                                                                                  
    query_string:  #  需要日志出现的字符串                                                          
      query: "autoDispatchAdvanceJob"                                                                                                                                                              
alert:     #  告警方式,这里使用QQ邮箱                                                                
- "email"                                                                                                                
smtp_host: smtp.qq.com                                                                                      
smtp_port: 587                                                                                                      
#用户认证文件,需要user和password两个属性                                                  
smtp_auth_file: /ELK/elastalert/smtp-file.yaml  # 这个文件包含发件邮箱的账号密码                                                                                                                 
email_reply_to: "my_test@qq.com"                                                               
from_addr: "my_test@qq.com"
email:  #  可以有多个接收邮箱
- "123456789@qq.com"
- "987564321@qq.com"
[root@elk example_rules]# cat /opt/elastalert/example_rules/smtp-file.yaml
----------------------------------------------------------------------------------------------------

#发送邮件的邮箱
user: "123333321@qq.com"
##不是邮箱密码,是设置的POP3密码
password: "sdffnddflcvdhbi"

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。

运行elastalert

# cd /opt/elastalert
# python -m elastalert.elastalert --config ./config.yaml --verbose

//或者单独执行 rules_folder 里的某个 rule: # python -m elastalert.elastalert --config ./config.yaml --rule ./examele_rules/autoDispatchAdvanceJob.yaml

参考:https://elastalert.readthedocs.io/en/latest/running_elastalert.html#downloading-and-configuring https://blog.csdn.net/mayifan0/article/details/78023783