elastalert日志告警工具的使用

原文链接: http://blog.51cto.com/zgui2000/2417611

1. 日志告警工具elastalert的使用:

  本文主要介绍ELK平台上面如何实现日志告警的。日志告警的方法有很多种,比如使用logstash工具的email插件就可以实现单独的邮件告警。也可以使用kibana自带的插件watch来实现日志告警。但是watch这个插件只能实现邮件方式的告警。而今天我要介绍的这个工具elastalert是通过python语言开发的。支持很多种常见的告警方式,包括邮件、短信、微信、钉钉等。

2. elastalert简介:

  Elastalert是用python2写的一个报警框架(目前支持python2.6和2.7,不支持3.x),github地址为 https://github.com/Yelp/elastalert。 他提供不同场景的规则配置。它的工作原理是将Elasticsearch与两种类型的组件,规则类型和警报相结合。定期查询Elasticsearch并将数据传递给规则类型,该类型确定何时找到匹配项。当匹配发生时,它将被赋予一个或多个警报,这些警报根据匹配采取行动。
  Elastalert支持的告警类型包括如下:

. Email

. JIRA

. OpsGenie

. Commands

. HipChat

. MS Teams

. Slack

. Telegram

. AWS SNS

. VictorOps

. PagerDuty

. Exotel

. Twilio

. Gitter

3. elastalert安装:

克隆代码仓库到本地
git clone https://github.com/Yelp/elastalert.git
进入到本地代码目录,因为依赖setuptools所以先安装setuptools
pip install "setuptools>=11.3"
然后安装几个依赖
yum -y install glib gcc python-devel  libffi-devel openssl-devel
开始安装  elastalert
python setup.py install
最后根据ES版本开始安装elasticsearch
pip install "elasticsearch>=6.2.4"
创建默认的索引
elastalert-create-index

New index name (Default elastalert_status)
Name of existing index to copy (Default None)
New index elastalert_status created
Done!

4. elastalert配置:

  配置elastalert主要有两个文件需要配置,一个是config.yaml,还有一个是rules.yaml文件。用途如下:
  打开config.yaml.example。在其中,您会找到几个配置选项。可以在不更改任何这些设置的情况下运行ElastAlert。

  1. rules_folder 是ElastAlert将加载规则配置文件的地方。 它将尝试加载文件夹中的每个.yaml文件。 没有任何有效的规则,ElastAlert将不会启动。 ElastAlert还会加载新的规则,停止运行缺少的规则,并在该文件夹中的文件更改时重新启动修改的规则。 对于本教程,我们将使用example_rules文件夹。
  2. run_every 用来设置定时向elasticsearch发送请求
  3. buffer_time 查询窗口的大小,从每个查询运行的时间向后延伸
  4. es_host 是弹性搜索集群的地址,ElastAlert将存储有关其状态,查询运行,警报和错误的数据。 每个规则也可以使用不同的弹性搜索主机进行查询
  5. es_port 是对应于es_host的端口
  6. es_username: Optional; basic-auth username for connecting to es_host
  7. es_password: Optional; basic-auth password for connecting to es_host.
  8. elastalert产生的日志在elasticsearch中的创建的索引,默认名称是 elastalert_status,需要用命令elastalert-create-index提前创建
  9. Alert_time_limit 失败重试的时间限制
我配置的config.yaml文件如下:

rules_folder: example_rules
run_every:
  minutes: 5
buffer_time:
  minutes: 15
es_host: 192.168.1.19
es_port: 9200
es_username: "elastic"
es_password: "223344"
writeback_index: elastalert_status
alert_time_limit:
  days: 2

  除了配置config.yaml之外,还有一个规则文件需要配置: 在elasticalert/ruletypes.py中定义的各种RuleType类构成了ElastAlert背后的主要逻辑。 在每个规则的内存中保存一个实例,通过使用给定的过滤器查询Elasticsearch返回的所有数据,并基于该数据生成匹配。
要选择规则类型,请将type选项设置为规则配置文件中规则类型的名称:

# 一分钟loglevel日志级别字段出现五次ERROR就通过邮箱告警
es_host: 192.168.1.19
es_port: 9200
name: cmm  #每个rule需要有自己独立的name,一旦重复,进程将无法启动

type: frequency  #选择某一种数据验证方式,支持很多种数据验证方式
index: elk-stand-bq-cmm-infoupdate-*  #从某类索引里读取数据

num_events: 5  #将触发警报的事件数量,指的是一分钟内连续5此出现ERROR级别的日志就告警

timeframe:   #累计触发报警的时长(连续多长时间有异常才发报警)
  minutes: 1  

filter:   #设置向ES请求的过滤条件,以下表示通过查询loglevel字段值是ERROR的
- query:
    query_string:
      query: "loglevel: ERROR"

# 下面是配置邮箱告警
smtp_host: smtp.exmail.qq.com
smtp_port: 25
smtp_auth_file: /usr/local/elastalert/example_rules/email_auth.yaml
email_reply_ro: [email protected]
from_addr: [email protected]
alert:  #设置触发报警时执行那些报警手段
- "email"

email:
- "[email protected]"
- "[email protected]"
- "[email protected]"

alert_subject: "service  ERROR !!!"  #配置日志的标题和内容格式,内容调用了字段的值
alert_text: "
system_name: {} \n
Date: {} \n
Host: {} \n
Thread: {} \n
global_pipeline_number: {} \n
msg: {} \n
"
alert_text_args:
- system_name
- timestamp
- beat.hostname
- threads_number
- global_pipeline_number
- logmessage

[root@SZ1PRDELK00AP009 example_rules]# cat /usr/local/elastalert/example_rules/email_auth.yaml
user: [email protected]
password: test123
# 邮箱密码信息配置到这个文件

  elastalert默认支持的规则有以下几种:

  1. any:只要有匹配就报警;
  2. blacklist:compare_key字段的内容匹配上 blacklist数组里任意内容;
  3. whitelist:compare_key字段的内容一个都没能匹配上whitelist数组里内容;
  4. change:在相同query_key条件下,compare_key字段的内容,在 timeframe范围内 发送变化;
  5. frequency:在相同 query_key条件下,timeframe 范围内有num_events个被过滤出 来的异常;我的实验就是参考了这个规则配置的
  6. spike:在相同query_key条件下,前后两个timeframe范围内数据量相差比例超过spike_height。其中可以通过spike_type设置具体涨跌方向是- up,down,both 。还可以通过threshold_ref设置要求上一个周期数据量的下限,threshold_cur设置要求当前周期数据量的下限,如果数据量不到下限,也不触发;
  7. flatline:timeframe 范围内,数据量小于threshold 阈值;
  8. new_term:fields字段新出现之前terms_window_size(默认30天)范围内最多的terms_size (默认50)个结果以外的数据;
  9. cardinality:在相同 query_key条件下,timeframe范围内cardinality_field的值超过 max_cardinality 或者低于min_cardinality

  关于这些不同的规则,官方有一些模板案例可以参考,路径在example_rules下面,比如:

example_cardinality.yaml
example_change.yaml
example_frequency.yaml
example_new_term.yaml
example_opsgenie_frequency.yaml
example_percentage_match.yaml
example_single_metric_agg.yaml
example_spike_single_metric_agg.yaml
example_spike.yaml

  配置好rule文件之后,也可以先语法检查一下:

elastalert-test-rule example_rules/rules_yunyun.yaml,没有python的语法报错说明规则写的没有问题

  启动elastialert进程:

python -m elastalert.elastalert --verbose --rule example_rules/rules_yunyun.yaml

登录邮箱查看告警邮件内容:

  关于kibana的使用,还有一个问题最近得到了解决。就是在kibana里面的field字段特别多,有一些是用户不希望看到的,是系统自带的。这些字段其实是可以在filebeat端就可以过滤掉的。过滤的配置如下:

# 配置在output之前
processors:
- drop_fields:
    fields: ["input_type", "beat", "offset", "source","tags","@timestamp"]  #删除掉一些系统字段

博文的更详细内容请关注我的个人微信公众号 “云时代IT运维”,本公众号旨在共享互联网运维新技术,新趋势; 包括IT运维行业的咨询,运维技术文档分享。重点关注devops、jenkins、zabbix监控、kubernetes、ELK、各种中间件的使用,比如redis、MQ等;shell和python等运维编程语言;本人从事IT运维相关的工作有十多年。2008年开始专职从事Linux/Unix系统运维工作;对运维相关技术有一定程度的理解。本公众号所有博文均是我的实际工作经验总结,基本都是原创博文。我很乐意将我积累的经验、心得、技术与大家分享交流!希望和大家在IT运维职业道路上一起成长和进步;

你可能感兴趣的:(elastalert日志告警工具的使用)