本文主要介绍ELK平台上面如何实现日志告警的。日志告警的方法有很多种,比如使用logstash工具的email插件就可以实现单独的邮件告警。也可以使用kibana自带的插件watch来实现日志告警。但是watch这个插件只能实现邮件方式的告警。而今天我要介绍的这个工具elastalert是通过python语言开发的。支持很多种常见的告警方式,包括邮件、短信、微信、钉钉等。
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
克隆代码仓库到本地
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!
配置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默认支持的规则有以下几种:
关于这些不同的规则,官方有一些模板案例可以参考,路径在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"] #删除掉一些系统字段