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
  • Email
  • 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_hostemail_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 因为其配置文件修改导致的加载,重载或删除规则.

#

results matching ""

    No results matching ""