前言
在企业中一般日志都采用ELK(elasticsearch、logstash、kibana)进行采集,通过kibana提供的可视化界面进行查看,但是日志告警的的方案很少。因此日志告警将采用elastAlert进行扩展。
从 Elastalert 0.2.0 开始,你必须使用 Python 3.6。将不再支持 Python 2
elastalert 开源地址:https://github.com/Yelp/elastalert
1. elastalert简介
日志告警 即 对日志进行监控,如果发现日志中出现特定的信息,就触发报警功能。这是一种独立的,没有侵入性的技术。
日志告警的优点在于,告警规则可以独立于应用程序,应用程序只需要使用log4j这样的日志框架打印日志,日志告警引擎负责收集分析这些日志,当匹配规则时,发送报警,架构的耦合性是非常低的。
以下阐述一个简单的elastalert产生告警的流程:
1)本地产生日志的程序
2)本地日志收集的文件
3)filebeat采集日志文件,并推送到elasticsearch中
4)elasticsearch提供存储和查询的接口API服务
5)elastalert通过API查询日志,并匹配告警规则,进行告警
2. 工作原理
elastalert的工作方式,如下三点:
1)周期性访问elasticsearch,即 配置 run_every参数
2)数据传入elastalert的规则引擎
3)数据与规则引擎中的规则(加载的rule规则文件)进行匹配
3. 规则类型
ElastAlert包含几种具有常见监视范例的规则类型:
- “匹配Y时间至少有X个事件发生”(
frequency type
) - “当事件发生率增加或减少时进行匹配”(
spike type
) - “在Y时间内少于X个事件时进行匹配”(
flatline type
) - “当某个字段与黑名单/白名单匹配时匹配”(
blacklist
和whitelist type
) - “匹配与给定过滤器匹配的任何事件”(
any type
) - “当某个字段在一段时间内具有两个不同的值时进行匹配”(
change type
)
4. 案例规则
告警规则: 如果在4小时内有50多个带有some_field == some_value的文档,请发送电子邮件至elastalert@example.com
【案例】使用frequency规则,匹配一定时间内至少有一定数量的事件发生时,以下规则匹配。
1 | # ES的ip和端口号 |
字段说明:
- es_host和es_port应指向我们要查询的Elasticsearch集群。
- name:定义规则的唯一名称,否则ElastAlert将不会启动。
- type:每个规则具有不同的类型,可能采用不同的参数。频率类型表示“在时间范围内发生超过num_event个事件时发出警报。”
- index:要查询的索引的名称。如果您使用的是Logstash,则默认情况下索引将匹配“ logstash- * ”。
- num_events:此参数特定于频率类型,并且是触发警报时的阈值。
- timeframe 是必须发生num_events的时间段。
- filter是用于过滤结果的Elasticsearch过滤器列表。在这里,我们为带有some_field匹配some_value的文档提供了一个单项过滤器。如果不需要过滤器,则应将其指定为空列表:filter:[]
- alert是在每次比赛中运行的警报的列表。电子邮件警报要求使用SMTP服务器发送邮件。默认情况下,它将尝试使用localhost。可以使用smtp_host选项进行更改。
- email 是警报将发送到的地址列表。
- Type: change -此规则将监视特定字段,并在该字段更改时匹配。