elasticsearch5之Elastalert 安装使用 配置邮件报警和报警模版

简介

Elastalert是用python2写的一个报警框架(目前支持python2.6和2.7,不支持3.x),github地址为 https://github.com/Yelp/elastalert。他提供不同场景的规则配置,若觉得规则、告警不满足需求时,可以用python编写插件Adding a New Rule Type、Adding a New Alerter。

环境

系统:centos6.8
python:2.7.12(请参看升级centos6 默认python版本到2.7.12
elasticsearch:5.5
kibana:5.5

Elastalert内置的告警方式:
  • Email JIRA
  • OpsGenie
  • Commands
  • HipChat MS
  • Teams Slack
  • Telegram
  • AWS SNS
  • VictorOps
  • PagerDuty
  • Exotel
  • Twilio
  • Gitter
安装
pip安装elastalert

安装pip包管理工具(参考

$ pip install elastalert

或者 git clone (推荐)

$ git clone https://github.com/Yelp/elastalert.git

安装模块

$ pip install "setuptools>=11.3"
$ python setup.py install

根据不同的Elasticsearch版本安装elasticsearch-py。
Elasticsearch 5.x/2.x

$ pip install "elasticsearch>=5.0.0" ##5.x
$ pip install "elasticsearch<3.0.0" ##2.x

将源码放置在你指定的目录下:

$ cd /usr/local/elastalert/
$ cp config.yaml.example config.yaml
$ mkdir es_rules

[xxx@crmnginx elastalert]$ egrep  -v '^#|^$' config.yaml
rules_folder: es_rules
run_every:
  minutes: 5
buffer_time:
  minutes: 5
es_host: 10.xx.xx.xxx
es_port: xxxx
use_ssl: false
verify_certs: false
es_username: elastic 
es_password: changeme
writeback_index: elastalert_status
alert_time_limit:
  days: 2

$ ll
[root@crmnginx elastalert]# ll
total 124
drwxr-xr-x. 4 root root  4096 Nov 12 09:39 build
-rw-r--r--. 1 root root  9737 Nov 12 09:39 changelog.md
-rw-r--r--. 1 root root  2001 Nov 12 14:39 config.yaml
-rw-r--r--. 1 root root  2029 Nov 12 09:39 config.yaml.example
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 dist
-rw-r--r--. 1 root root   261 Nov 12 09:39 docker-compose.yml
-rw-r--r--. 1 root root   264 Nov 12 09:39 Dockerfile-test
drwxr-xr-x. 3 root root  4096 Nov 12 09:39 docs
drwxr-xr-x. 2 root root  4096 Nov 12 11:15 elastalert
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 elastalert.egg-info
drwxr-xr-x. 2 root root  4096 Nov 12 14:14 elastalert_modules
drwxr-xr-x. 2 root root  4096 Nov 12 14:51 es_rules
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 example_rules
-rw-r--r--. 1 root root 11359 Nov 12 09:39 LICENSE
-rw-r--r--. 1 root root   480 Nov 12 09:39 Makefile
-rw-r--r--. 1 root root 15945 Nov 12 09:39 README.md
-rw-r--r--. 1 root root    87 Nov 12 09:39 requirements-dev.txt
-rw-r--r--. 1 root root   372 Nov 12 09:39 requirements.txt
-rw-r--r--. 1 root root   100 Nov 12 09:39 setup.cfg
-rw-r--r--. 1 root root  1650 Nov 12 09:39 setup.py
-rw-r--r--. 1 root root   117 Nov 12 11:14 smtp_auth_file.yaml
-rw-r--r--. 1 root root   780 Nov 12 09:39 supervisord.conf.example
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 tests
-rw-r--r--. 1 root root   606 Nov 12 09:39 tox.ini
配置解析

此处的配置文件是指config.yaml文件。

  • rules_folder:ElastAlert将加载规则配置文件的地方,它将尝试加载文件夹中的每个.yaml文件(这里是加载es_rules目录下)。
  • run_every:ElastAlert查询Elasticsearch的频率。
  • buffer_time:是查询窗口的大小,从每个查询运行的时间向后延伸。对于其中use_count_query或use_terms_query设置为true的规则,此值将被忽略。
  • es_host:是Elasticsearch集群的地址,ElastAlert将存储有关其状态、查询运行、警报和错误的数据。每个规则也可以设置不同的elasticsearch主机进行查询。
  • es_port:Elasticsearch对应的端口。
  • use_ssl: (可选的)是否使用TLS;连接到es_host;设置为True或False。
  • verify_certs: (可选的)是否验证TLS证书; 设置为True或False,默认是True。
  • client_cert: (可选的)PEM证书的路径。
  • client_key: (可选的) 作为客户端密钥使用的私钥文件的路径。
  • ca_certs: (可选的) 用于验证SSL连接的CA证书的路径。
  • es_username: (可选的) 用于连接Elasticsearch的basic-auth用户名。
  • es_password: (可选的) 用于连接Elasticsearch的密码。
  • es_url_prefix: (可选的) Elasticsearch端点的URL前缀。
  • es_send_get_body_as: (可选的) 查询Elasticsearch方法- GET,POST或- source,默认是GET。
  • writeback_index:是ElastAlert将存储数据的索引名称。
  • alert_time_limit: 是失败警报的重试窗口。
创建Elasticsearch索引

elastalert-create-index这个命令会在elasticsearch创建索引,便于ElastAlert将有关其查询及其警报的信息和元数据保存回Elasticsearch。这不是必须的步骤,但是强烈建议创建。因为对于审计,测试很有用,并且重启elastalert不影响计数和发送alert。默认情况下,创建的索引叫 elastalert_status。

$ elastalert-create-index  --host 10.xxx.xx.xxx --port xxxx --username xxx --password xxx --no-ssl --no-verify-certs 

创建成功之后,我们可以在Elasticsearch中看到所创建的索引elastalert_status:

$ curl  -u xxx  'localhost:9200/_cat/indices?v' |grep elastalert_status
green  open   elastalert_status                                               eWjVRAzjTX2vmhvAK931Ng   5   1        110            0    513.8kb          266kb
elastalert_status

ElastAlert 根据elastalert_status去确定首次启动的时候在什么时间范围内去查询,以避免重复查询。对于每个规则,它将从最近的结束时间开始查询。包括:

  • @timestamp:文件上传到Elasticsearch的时间。这是在运行查询并且已经处理结果之后。
  • rule_name:相应规则的名称。
  • starttime:查询的开始时间戳。
  • endtime:查询结束时间戳。
  • hits:查询结果的数量。
  • matches:处理命中后规则返回的匹配数。请注意,这并不一定意味着警报被触发。
  • time_taken:此查询运行所需的秒数。
配置SMTP邮件报警

在/usr/local/elastalert/目录下创建文件smtp_auth_file.yaml,内容如下:

[root@crmnginx elastalert]$ cat smtp_auth_file.yaml 
#邮箱用户名
user: no-xx@chtxx.com 
##不是邮箱密码,是设置的SMTP密码
password: YdYfxxx
配置规则

在es_rules目录下修改配置文件,如下:

$ cd /opt/elastalert/es_rules
[xxx@crmnginx elastalert]$ egrep  -v '^#|^$' es_rules/frequency.yaml 
 es_host: 10.xxx.xx.xxx 
 es_port: 9200
 use_ssl: false
 verify_certs: false
 es_username: xxx
 es_password: xxx
 name: es_rule
 writeback_index: elastalert_status
 type: frequency
 index: logstash-nginx-* 
 num_events: 5
 timeframe:
   minutes: 5
 filter:
 - query:
     query_string:
       query: "status:>=400"
     query_string:
       query: "status: >=500"
#SMTP configration
 smtp_host: smtp.263.net
 smtp_port: 25

#SMTP auth
 smtp_auth_file: /usr/local/elastalert/smtp_auth_file.yaml  
 email_reply_to: no-xxx@chxxx.com
 from_addr: no-xxx@chxxx.com

# (Required)
# The alert is use when a match is found
 alert:
 - "email"

# (required, email specific)
# a list of email addresses to send alerts to
 email:
 - "xxx@chxxx.com"

上述规则表示:在elastalert执行的五分钟内,出现五条有status:>=400 或者 status: >=500的日志,则触发告警,并且告警通知将以email的形式从no-xxx@chxxx.com邮箱发送给xxx@chxxx.com

规则配置解析:
  • es_host、es_port:应该指向我们要查询的Elasticsearch集群。

  • name:是这个规则的唯一名称。如果两个规则共享相同的名称,ElastAlert将不会启动。

  • type:每个规则都有不同的类型,可能会采用不同的参数。该frequency类型表示“在timeframe时间内匹配成功次数超过num_events发出警报”。有关其他类型的信息,请参阅规则类型。

  • index:要查询的索引的名称。配置,从某类索引里读取数据,目前已经支持Ymd格式,需要先设置use_strftime_index:true,然后匹配索引,配置形如:index: logstash-es-test%Y.%m.%d,表示匹配logstash-es-test名称开头,以年月日作为索引后缀的index。

  • num_events:此参数特定于frequency类型,是触发警报时的阈值。

  • timeframe:timeframe是num_events必须发生的时间段。

  • filter:是用于过滤结果的Elasticsearch过滤器列表。有关
    详细信息,请参阅编写过滤规则。

  • email:是要发送警报的地址列表。

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

命令如下:

$ python -m elastalert.elastalert --config ./config.yaml #运行命令,加载所有rules
$ python -m elastalert.elastalert --config ./config.yaml --rule ./es_rules/frequency.yaml ## 或者单独执行 rules_folder 里的某个 rule
给Elasticsearch添加测试数据:
$ curl -X POST "http://127.0.0.1:9200/logstash-nginx-xx/test"  -d '{
"@timestamp": "2018-11-12T10:54:41.000Z",
"status": "500"
}'
产看邮件报警

在这里插入图片描述
目前邮件发送使用的是默认模版,可读性很差,现在我们来配置一套html写的模版。
先看rule文件:

# cat frequency.yaml      
 es_host: 10.xx.xx.xx 
 es_port: 9200
 use_ssl: false
 verify_certs: false
 es_username: xx
 es_password: xxx
 name: es_htjf_java_rule
 writeback_index: elastalert_email_status
 #writeback_index: elastalert_status
 type: frequency 
 #type: any 
 index: logstash-xx* 
 num_events: 5
 timeframe:
   minutes: 5
 filter:
 - query:
     query_string:
       query: "(level:(error|WARN) AND javameassage:error  OR javameassage:*exception)"
      # query: "level:error "

 #SMTP configration
 smtp_host: smtp.xx.net
 smtp_port: 25

#SMTP auth
 smtp_auth_file: /usr/local/elastalert/smtp_auth_file.yaml 
 email_reply_to: xxx@xx.com 
 from_addr: xx@xxx.com

# (Required)
# The alert is use when a match is found
 alert:
 - "email"

 email_format: html
 alert_subject: "Htjf项目{0}服务正式环境Error告警"
 alert_subject_args:
 - logtype
 alert_text_type: alert_text_only
 alert_text: "<div style='display:block;background-color: red;padding: 10px;border-radius: 5px;color: white;font-weight: bold;' >   <p>{}</p></div><br><a href='http://loxx.xxx.com/app/kibana#/context/logstash-xx*2019-10/logs/{}?_a=(columns:!(javameassage,level,logtype,_index,traceid,javaclass),filters:!(),predecessorCount:10,sort:!(&apos;@timestamp&apos;,desc),successorCount:10)&_g=()' target='_blank' style='padding: 8px 16px;background-color:  #46bc99;text-decoration:none;color: white;border-radius: 5px;'>Click to Kibana</a><br><h3>告警详情</h3><table><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@timestamp:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@version:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_id:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_index:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>logtype:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>threadId:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td  style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>num_hits:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>num_matches:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>env:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>source:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>javaclass:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>level:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr></table>"
 alert_text_args:
 - javameassage
 - _id
 - "@timestamp"
 - "@version"
 - _id
 - _index
 - logtype
 - threadId
 - num_hits
 - num_matches
 - env
 - source
 - javaclass
 - level


 email:
 - "xuxx@xx.com"
 - "bug@xxx.com"
 - "zhuxx@xx.com"

生成的报警信息是这样的

在这里插入图片描述

红色部分:
是报警的详细代码报错

浅绿色部分:
点击查看相应的kibana报错行的上下文10行的信息,开发接收到报警后,可以直接定位到报错行及其报错行的上下文 快速定位问题。页面如下:
在这里插入图片描述
html代码位置href=‘http://logs.xxx.com/app/kibana#/context/logstash-xxx*2019-10/logs/{}?_a=(columns:!(javameassage,level,logtype,_index,traceid,javaclass),filters:!(),predecessorCount:10,sort:!(’@timestamp’,desc),successorCount:10)&_g=()’
换成自己kibana地址。
有必要提醒大家的是{}里的内容是变量的形式传入的 对应alert_text_args中的第二个变量_id.

报警详情:
根据自己收集日志字段 按展示变量的顺序添加需要展示的字段信息。一对{}表示一个变量,例如我的第一个{}是- javameassage 变量里的内容,第二个{}对应- id 以此类推。

告警主题部分

alert_subject: "Htjf项目{0}服务正式环境Error告警"
 alert_subject_args:
 - logtype

使用变量,大括号里要加上位置 ,{0} 表示alert_subject_args中第一个变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值