ElastAlert - 简单,灵活的Elasticserach报警系统.
EalstAlert 是一个针对 Elasticsearch 当中异常数据、毛刺数据或根据其他可选参数获取的数据进行报警的简单框架。
在Yelp,我们用 Elasticserach,Logstash 和 Kibana 对我们日趋增长的数据以及日志进行管理。Kibana 在分析以及查询数据方面表现非常优秀,但是我们也很快认识到需要一款产品用于报警我们异常的数据。在这样的需求驱动下,ElastAlert 应运而生。
如果你希望自己能够通过一些参数筛选自己的实时的 Elasticsearch 数据并进行报警,那么 ElastAlert 对你而言是一个合适的工具。
概览
ElastAlert 程序的设计,是可靠的、高度可定制的、安装方面也是简单的并且可配置的。
它通过将 Elasticsearch 与两个组件,规则类型(rule types)以及警报(alerts)相结合进行实现。Elasticsearch 会定期的被程序查询,得出的数据经由规则类型(rule type)确定何时找到了匹配项。当找到匹配项后,会根据匹配的数据结果给出一个或多个警报。
配置方面是由一组规则(rules)进行管控,每个规则(rules)里面定义了一个查询,一个规则类型以及一组警报。
ElastAlert 包含了具有常见监控范例的几种规则类型:
- 匹配当 Y 时间段内有 X 个事件( frequency 类型 )
- 匹配事件发生率上升或者下降 ( spike 类型 )
- 匹配当 Y 时间段内 X 的时间小于一定值( flatline 类型 )
- 匹配当某个值符合白名单或者黑名单时( blacklist 和 whitelist 类型 )
- 匹配任何符合过滤器的时间( any 类型 )
- 匹配到一段时间内某字段有两个不同的值( change 类型 )
目前支持以下的报警类型:
- Command
- JIRA
- OpsGenie
- SNS
- HipChat
- Slack
- Telegram
- Debug
- Stomp
其他的规则类型和警报可以轻松的被导入或写入。( 详情请见创建规则类型和创建警报 )
除了这种基本用法之外,还有许多其他功能使得ElastAlert更强大:
- 警报链接到 Kibana 的 dashboards 上
- 任意字段的汇总数据
- 将警报结合到定期报告当中
- 使用唯一键值分隔报警
- 拦截以及增强匹配到的数据(这一段不太好理解,希望得到建议)
现在,可以从 ”第一次运行 ElastAlert“ 这一章开始使用了。
高可用性
ElastAlert 有很多特性来保证可用性,尤其是当 Elasticsearch 不可靠或者重启时候:
- ElastAlert 将其状态存储在Elasticsearch 当中,并会在启动时候恢复停止前的状态。
- 当 Elasticsearch 不可达,ElastAlert 会等到其恢复再运行。
- 当警报发生错误时,会自动重试一段时间。
模块化
ElastAlert 可以导入三个主要的组件,进而可以作为模块或者自由订制。
规则类型(Rule types)
规则类型的作用在于处理从 Elasticsearch 返回的数据。一般与规则配置一起初始化,返回的数据是从 Elasticsearch 中通过规则类型(Rule types)中的 filters 规则进行查询的结果集,匹配的输出也是以来这些结果集。更详细的信息可以了解“如何新增规则类型”一章。
警报(Alerts)
警报是根据匹配的结果来触发的一些行为。一个匹配结果一般是一个字典,其中的值是由 Elasticsearch 的返回的文档构成。
增强功能(扩展)
增强功能(扩展)是以某种方式获取到警报后修改或新增警报方式。数据会在给予警报器之前通过匹配字典来进行确认。有关详细信息,请参阅增强功能(扩展)。
配置文件
ElastAler 有一个全局的配置文件config.yaml,它通过下面的几个配置想定义了其操作的几个方面:
buffer_time
: ElastAlert 会保持一个从现在到buffertime的时间窗口并进行持续查询。通过这种方式,ElastAlert 可以查询指定时间的日志数据。这可能会具体的某一个规则所覆盖。这个选项会在use_count_query
或者use_terms_query
被设置为真的时候被忽略。值得注意的是,在实时查询的情况下,结果并非总是会触发基于计数的警报。
es_host
: 用于存储 ElastAlert 依赖的元数据以及一些查询结果的 Elasticsearch 集群,当 ElastAlert 启动后,会查询上一次它执行的相关信息。所以,即使 ElastAlert 被停止或者重启,也绝不会漏报或重报。同时,它也是每个规则所运行的默认集群。如果配置了环境变量 ES_HOST ,这个值会被覆盖。
es_port
: es_host
对应的端口。如果配置了环境变量 ES_PORT,此值会被覆盖。
use_ssl
: 可选项; 通过True或False控制通过TLS连接ES_HOST. 如果配置了环境变量ES_USE_SSL
,这个值将会被覆盖。
verify_certs
: 可选项; 通过设置True或False来控制是否校验 TLS 证书,默认为True。
es_username
: 可选项; 用于连接到es_host
最基本的用户名认证。如果设置了环境变量ES_USERNAME
,这个值将会被覆盖。
es_password
: 可选项; 用于连接到es_host
最基本的密码认证。 如果设置了环境变量ES_PASSWORD
,这个值将会被覆盖。
es_url_prefix
: 可选项; Elasticsearch端点的网址前缀。
es_send_get_body_as
: 可选项; 查询 Elasticsearch 的 http 方法 -GET
,POST
或者source
. 默认的是GET
es_conn_timeout
: 可选项; 设置连接或读取es_host
数据的超时时间; 默认值为10
.
rules_folder
: 规则配置文件的文件夹名称,ElastAlert 会加载这个文件夹以及其子文件夹里面所有的以.yaml结尾的内容。如果配置文件的内容发生改变,ElastAlert 会根据配置各自配置文件进行加载、重载或者删除规则。
scan_subdirectories
: 可选项; 配置 ElastAlert 是否获取规则文件夹中子文件夹的内容 -true
或者false
. 默认为true
run_every
: 配置 ElastAlert 查询 Elasticsearch 的频率。 ElastAlert 会记录下每条规则对应的最后一次查询,并会智能的从该次查询停止的地方继续。该字段的格式可以是(嵌套时间单位)时分秒的形式, 比如minutes:5
. ElastAlert的配置文件中将都会套用这种时间格式。
writeback_index
: 监控es_host
用到的 index 。
max_query_size
: 单个查询所能够下载的文档数的最大值。默认是 10,000, 如果你希望接近(get near)这个数字的话,可以在规则当中使用use_count_query
这个配置项。如果出现文档数量超过最大值,ElastAlert 会根据max_query_size
进行滚动查询直到处理完所有的数据。
scroll_keepalive
: 迭代查询保持的最大时间(以时间为单位)。 一方面避免数据量太大而占去 Elasticsearch 过多的资源,同时保证有足够的时间去处理完所有的数据。 but be mindful to allow sufficient time to finish processing all the results.
max_aggregation
: 警报聚合的最大值。如果一个规则当中有聚合集,所有在一段时间内触发的警报都会一起发送出去。默认值是10000。
old_query_limit
: 查询之间的最大时间,用以提供给ElasticAlert最常运行的查询处启动. 当 ElasticAlert 启动时,它会针对每条规则在 elastialert_metadata
查找最常见的查询,并于该时间点启动,除非它比 older_query_limit
大,换句话说,它将在当前启动.默认值为一个星期.
disable_rules_on_error
: 若真, ElastiAlert 将在规则抛出异常(不是EAException)时禁用它. 它将上传一个追溯消息给到 elastialert_metadata
,并且在 notify_email
配置的情况下,发送邮件通知.该规则将不再运行,除非 ElastiAlert 重新启动或者规则文件被修改.该值默认为True.
notify_email
: 一个邮件地址或者邮件地址列表,用以通知邮件已经发送.目前,仅仅是未捕捉的异常会发送通知邮件.发件人,SMTP主机和回复标题可以通过from_addr
,smtp_host
和email_reply_to
选项进行设置.
from_addr
: 发送邮箱通知时邮件头里的地址.除非在规则配置文件中重写,否则该值将用于警报邮件.默认值为ElastAlert
.
smtp_host
: 发送邮件通知时使用的SMTP主机.除非在规则配置文件中重写,否则该值将用于警报邮件.默认值为 "localhost".
email_reply_to
: 该值设置邮件回复标题.默认值为接收人地址.
aws_region
: 在使用Amazon Elasticsearch Service时候该值使 ElastAlert 标记HTTP请求.它将使用实例角色键值标记请求.如果配置环境变量AWS_DEFAULT_REGION
,该值将被重写.
boto_profile
: 已弃用! 在向 Amazon Elasticserach Service 标记请求时使用的 Boto 配置文件,如果你不希望使用实例的角色键.
profile
: 标记发起Amazon Elasticsearch Service的请求使用的 AWS 配置文件,如果你不希望使用实例角色键.如果配置了环境变量AWS_DEFAULT_PROFILE
,该值将会别覆盖.
replace_dots_in_field_names
: 若True
,ElastAlert将在文档写入Elasticsearch前,把字段名称中的所有点(.)替换成下划线(_).默认值为False
.Elastcserach 2.0 - 2.3 不支持带有点的字段名.
运行 ElastAlert
$python elastalert/elastalert.py
运行ElastAlert时有几个参数可用:
--config
指定所使用的配置文件.默认值为config.yaml
.
--debug
将在调试模式下运行 ElastiAlert. 它将增加日志的内容,修改所有的警报为DebugAlerter
,打印警报并且禁止一般的行为(例如发送警报),并且跳过把查询以及警报数据写到 Elasticsearch 这一过程.
--start<timestamp>
将强制 ElastAlert 在给定时间开始查询,取代默认的从启动当下开始查询.timestamp格式必须为ISO8601.例如,YYYY-MM-DDHH:MM:SS
(UTC) 或者使用YYYY-MM-DDHH:MM:SS-08:00
(PST).注意如果查询的时间范围很大,在规则完成指定时间段内的查询前,不会发送任何警报.强制实时查询,使用"NOW".
--end<timestamp>
将使 ElastAlert 在指定的时间停止查询.默认的,ElastAlert 将周期的无限期的查询.
--rule<rule.yaml>
将仅运行指定的规则.规则文件可以是完整的文件路径或者在rules_folder
及其子文件夹当中的文件名称.
--silence<unit>=<number>
将会沉默给定规则的警报一段时间.规则必须用--rule
进行指定.<unit>是days,weeks,hours,minutes,或者seconds中的一个.<number> 是一个整数.例如,--rule noisy_rule.ymal --silence hours=4
将停止 noisy_rule 发出任何警报 4 个小时.
--verbose
将增加日志的内容,它将展示查询状态的信息.
--es_debug
将启用对 Elasticsearch 所做的所有查询的日志记录.
--es_debug_trace
将启用将所有对Elasticsearch进行查询的 curl 命令并记录到文件中。
--end<timestamp>
将强制 ElastAlert 在给定的时间点后停止查询,而不是默认查询到当前时间.此项仅仅在独立运行时有意义.时间戳格式使用YYYY-MM-DDTHH:MM:SS
(UTC)或者时区YYYY-MM-DDTHH:MM:SS-XX:00
(UTC-XX).
--pin_rules
将停止 ElastAlert 因为其配置文件修改导致的加载,重载或删除规则.
#