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"] #删除掉一些系统字段