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支持的告警类型包括如下:
. 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: 222222222@qq.com from_addr: yanggao@test.cn alert: #设置触发报警时执行那些报警手段 - "email" email: - "yanggao@test.cn" - "222222222@qq.com" - "11111111@163.com" 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: yanggao@test.cn password: test123 # 邮箱密码信息配置到这个文件
elastalert默认支持的规则有以下几种:
- 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
关于这些不同的规则,官方有一些模板案例可以参考,路径在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运维职业道路上一起成长和进步;





