目录
一、Alerting With Elasticsearch
ElastAlert是一个简单的框架,用于从Elasticsearch中的数据中发出异常,尖峰或其他感兴趣的模式的警报。
它通过将Elasticsearch与两种类型的组件(规则类型和警报)结合使用。定期查询Elasticsearch,并将数据传递到规则类型,该规则类型确定找到任何匹配项。发生匹配时,它会发出一个或多个警报,这些警报根据不同的类型采取相应的措施。
ElastAlert由一组规则配置,每个规则定义一个查询,一个规则类型和一组警报。
特性
- 架构简单,定制灵活
- 支持多种匹配规则(频率、阈值、数据变化、黑白名单、变化率等)
- 支持多种警报类型(邮件、HTTP POST、自定义脚本等)
- 匹配项汇总报警,重复警报抑制,报警失败重试和过期
- 可用性强,状态信息保存到Elasticsearch的索引中
- 过程的调试和审计等
可用性(Reliability)
- ElastAlert 将其状态保存到 Elasticsearch,启动后,将恢复之前停止的状态
- 如果 Elasticsearch 没有响应,ElastAlert 将等到恢复后才继续
- 抛出错误的警报可能会在一段时间内自动重试
模块性(Modularity)
ElastAlert具有三个主要组件(规则类型、警报、增强),可以作为模块导入和定制。
- 规则类型(Rule Types)
规则类型负责处理从Elasticsearch返回的数据。它会使用规则配置进行初始化,传递通过规则过滤器查询Elasticsearch返回的数据,并根据此数据输出匹配项。 - 警报(Alerts)
警报负责根据匹配采取行动。匹配项通常是一个字典,其中包含Elasticsearch中文档中的值,但可以包含由规则类型添加的任意数据。 - 增强(Enhancements)
增强功能是一种拦截警报并以某种方式对其进行修改或增强的方法。在将其提供给警报器之前,将它们传递给匹配字典。
二、Running ElastAlert
安装、命令、测试规则、运行
安装
# Python3.6安装
$ wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
$ tar -zxvf Python-3.6.9.tgz
$ cd Python-3.6.9
$ ./configure
$ make && make install
# 检查Python版本
$ python3 -V
# 安装
$ git clone https://github.com/Yelp/elastalert.git
$ wget https://github.com/daichi703n/elastalert/archive/refs/heads/fix/initialize_alerts_sent.zip
$ cd elastalert/
$ pip3 install "setuptools>=11.3"
$ python3 ./setup.py install
# 报错(pip:No module named setuptools_rust)解决办法
$ pip3 install setuptools-rust
#$ pip3 install "elasticsearch>=5.0.0"
$ pip3 install elasticsearch==7.0.0
命令
# 创建索引
$ elastalert-create-index
# 测试Rule,24小时内以调试模式运行。--config:指定配置文件
$ elastalert-test-rule example_rules/example_frequency.yaml
# 或
$ python3 -m elastalert.elastalert --config ./config.yaml --rule rules/service_exception.yaml --start 2021-05-16T00:00:00+08:00 --debug --es_debug --es_debug_trace trace-20210617.log
# 后台运行
nohup python3 -m elastalert.elastalert --config ./config.yaml --rule ./your_rule.yaml --verbose >> ./elastalert.log 2>&1 &
测试规则(Testing Rule)
可以在调试模式下运行ElastAlert,也可以使用elastalert-test-rule(该脚本可以简化测试的各个方面)
功能:
- 检查配置文件是否加载成功
- 检查Elasticsearch过滤器是否解析
- 与最后的X天(s)运行,显示匹配您的过滤器的点击数
- 在一个结果中显示可用的术语
- 保存返回到JSON文件的文档
- 使用JSON文件或Elasticsearch的实际结果运行ElastAlert
- 打印调试警报或触发真实警报
- 如果存在,则检查结果中是否包含primary_key、compare_key和include术语
- 显示将要写入elastalert_status的元数据文档
参数:
- –schema-only:只对文件执行验证
- –count-only:仅查找匹配文档的数量并列出可用字段
- –days N:指定针对最近的N天运行,默认1天
- –save-json FILE:将所有下载的文档保存为JSON文件
- –data FILE:使用JSON文件代替Elasticsearch作为数据源
- –alert:触发实际警报,而不是调试(日志文本)警报
- –formatted-output:以格式化的JSON输出结果。
运行(Running ElastAlert)
有两种运行ElastAlert的方法。作为守护程序或直接与Python一起使用($ python3 elastalert/elastalert.py)。
参数:
- –config:指定要使用的配置文件,默认值为config.yaml
- –debug:debug模式;1.增加日志记录的详细程度,2.将所有的报警更改为DebugAlerter,抑制它们正常的报警行为,3.跳过写入查询和警报的元数据到Elasticsearch
- –verbose:将增加日志记录的详细程度,与–debug不兼容
- –start :强制从指定的时间查询,而不是当前时间。如:2021-05-16T00:00:00+08:00
- –end :将强制在指定时间之后停止查询,默认到当前时间
- –rule <rule.yaml>:只运行给定的规则
- –silence =:将使给定规则的警报静音一段时间。该规则必须使用–rule指定
- –es_debug:启用对Elasticsearch进行的所有查询的日志记录。
- –es_debug_trace <trace.log>:将启用将对Elasticsearch进行的所有查询的curl命令记录到指定的日志文件
- –pin_rules:禁用动态加载规则
三、Rule Types and Configuration Options
规则类型、配置项、报警配合
https://elastalert.readthedocs.io/en/stable/ruletypes.html
详细请看源码文件elastalert/schema.yaml
Rule Types
- frequency:频率;在给定时间范围内至少有一定数量的事件时,此规则匹配
- num_events:触发警报的事件数
- timeframe:事件数必须发生在的此时间段内,触发报警
- use_count_query:使用count API轮询Elasticsearch
- any:任意;过滤器每次匹配都会警报
- blacklist:黑名单;将对照黑名单检查某个字段,如果该字段在黑名单中,则进行匹配
- compare_key: 用于与黑名单进行比较的字段的名称,如果字段为null,那么这些事件将被忽略
- blacklist:黑名单值的列表
- whitelist:白名单;与黑名单类似
- change:变动;将监视特定字段,并在该字段发生更改时进行匹配
- compare_key:要监视更改的字段的名称
- ignore_null:如果为true,则没有compare_key字段的事件将不会计为已更改
- query_key:对每个query_key的唯一值分别计数。
- timeframe: 可选;时间范围,两次更改之间的最长时间。在这段时间之后,ElastAlert将忘记compare_key字段的旧值
- spike:突刺;当给定时间段内的事件量是前一时间段内的spike_height倍数时,此规则匹配
- spike_height:上一个时间范围内的事件数量与前一个时间范围内的事件数量之比,匹配时触发警报
- spike_type:‘up’, ‘down’ or ‘both’
- timeframe:当前窗口和参考窗口的时间范围
- field_value:可选;使用文档中字段的值而不是匹配文档的数量
- threshold_ref:参考窗口中必须存在的最少数量的事件才能触发警报
- threshold_cur:当前窗口中必须存在的最小数量的事件才能触发警报
- flatline:阈值;当事件总数在一个时间段内低于给定阈值时,此规则匹配
- threshold:不触发警报的最小事件数
- timeframe:时间范围
- new_term:新值;当新值出现在以前从未见过的字段中时,此规则匹配
- fields:监视字段列表
- cardinality:基数阈值;当时间范围内某个字段的唯一值的总数大于或小于阈值时,此规则匹配
- cardinality_field:要计算基数的字段
- timeframe:时间范围
- metric_aggregation:当计算窗口中的度量值高于或低于阈值时,此规则匹配
- metric_agg_key:指标字段
- metric_agg_type:指标类型,‘min’, ‘max’, ‘avg’, ‘sum’, ‘cardinality’, ‘value_count’
- max_threshold:最大阈值
- min_threshold:最小阈值
- spike_aggregation:当计算窗口中某个指标的值是spike_height乘以比前一个时间段大或小时,该规则匹配
- metric_agg_key:指标字段
- metric_agg_type:指标类型,‘min’, ‘max’, ‘avg’, ‘sum’, ‘cardinality’, ‘value_count’
- spike_height:上一个时间范围内的事件数量与前一个时间范围内的事件数量之比,匹配时触发警报
- spike_type:‘up’, ‘down’ or ‘both’
- buffer_time:当前窗口和参考窗口的时间范围
- query_key:按字段分组
- metric_agg_script:计算指标脚本
- threshold_ref:参考窗口中用于触发警报的指标的最小值
- threshold_cur:当前窗口中用于触发警报的指标的最小值
- min_doc_count:当前窗口中触发警报所需的最小事件数
- percentage_match:当计算窗口内匹配桶中文档的百分比高于或低于阈值时,此规则匹配
- match_bucket_filter:匹配桶定义了一个过滤器
- min_percentage:匹配文档的百分比小于此数字,则会触发警报
- max_percentage:匹配文档的百分比大于此数字,则会触发警报
Alerts
每个规则都可以附加任何数量的警报。每个警报器的选项既可以定义在yaml文件,也可以嵌套在警报名称中,允许同一警报器的多个不同设置。
- Command:命令报警,并从匹配项中传递参数
- Email:邮件报警
- Http Post:URL报警
- …
示例:
name: API not 200
index: sg-access-*
type: frequency
num_events: 20
timeframe:
minutes: 1
filter:
- query:
query_string:
query: "NOT statusCode: 200"
alert:
- command
- debug
command: ["python3", "/opt/elastalert/weixin.py", "生产环境报警,报警:", "接口{orgPathName} 出现状态码{statusCode}频率高!","服务 IP: {directBackServer}; 服务端口:{port}"]
四、ElastAlert Metadata Index
ElastAlert使用Elasticsearch来存储有关其状态的各种信息。这不仅可以对ElastAlert的操作进行某种程度的审核和调试,还可以避免在ElastAlert关闭,重新启动或崩溃时丢失数据或重复警报。Elasticsearch群集和索引信息在全局配置文件中使用es_host,es_port和writeback_index进行定义。ElastAlert必须能够写入此索引。脚本elastalert-create-index将为您创建具有正确映射的索引,并可以选择从现有ElastAlert回写索引中复制文档。
ElastAlert将在回写索引(writeback index)中创建三种不同类型的文档。
elastalert_status
记录规则的查询执行日志
elastalert_status是ElastAlert在确定其首次开始时要使用的时间范围,以避免重复查询。对于每个规则,它将从最近的结束时间开始查询。如果ElastAlert在调试模式下运行,它仍将通过查找最近执行的搜索来尝试基于其开始时间,但不会将任何查询的结果写回到Elasticsearch。
elastalert
记录触发的每个警报信息日志
elastalert_error
当ElastAlert中发生错误时,它将同时写入Elasticsearch和stderr
silence
记录何时将抑制给定规则的警报的日志
参考
ElastAlert
elastalert搭建
ElastAlert安装与使用
[Rule Filters说明](