背景

当搭建完成EFK,(搭建方法参考:

收集到异常日志需要及时通知到人,这时可以推送告警信息到钉钉、企业微信、邮箱、短信等;

本文将通过elastalert2定时检索Elasticsearch中的异常日志数据并推送到钉钉群为例,帮助大家快速上手。

elastalert2介绍

ElastAlert 2 是一个用于实时监控和警报 Elasticsearch 数据的开源工具,旨在帮助您检测和响应于 Elasticsearch 中的日志、指标或事件数据中发生的关键事件。ElastAlert 2 是 ElastAlert 的改进版本,它通过 Python 编写,支持 Elasticsearch 5.0+ 和 Kibana 6.0+。

以下是 ElastAlert 2 的一些主要特点和功能:

  1. 灵活的规则引擎: ElastAlert 2 允许您定义自定义规则,以捕获感兴趣的事件或模式。这些规则可以使用 YAML 或 JSON 格式来定义,使其易于配置和管理。
  2. 多种告警通知方式: 当规则匹配时,ElastAlert 2 支持多种告警通知方式,包括电子邮件、Slack、Webhooks、JIRA 等,以便您能够及时了解事件并采取适当的措施。
  3. 丰富的查询语法: 您可以使用 Elasticsearch 查询语法来定义规则,从而能够更精确地筛选数据并捕获特定的事件。这样,您可以轻松地执行高级数据分析。
  4. 支持多种数据源: ElastAlert 2 可以与不同类型的数据源集成,包括 Elasticsearch、AWS CloudWatch、Prometheus 等,以便监控和警报多种数据源中的事件。
  5. 可扩展性: 您可以编写自定义输出模块和规则类型,以满足特定需求。这使得 ElastAlert 2 可以轻松适应各种监控和警报场景。
  6. 基于时间的窗口: ElastAlert 2 具有内置的时间窗口功能,以确保规则只在指定的时间段内触发,从而避免误报。
  7. 支持自动缩放: 当您的 Elasticsearch 数据存储量不断增加时,ElastAlert 2 可以自动缩放以适应高负载。
  8. 易于部署和配置: ElastAlert 2 的配置文件使用简单的 YAML 或 JSON 语法,使得部署和维护相对简单。

详情参考官方文档:ElastAlert 2 - Automated rule-based alerting for Elasticsearch — ElastAlert 2 0.0.1 documentation

准备部署配置

文件目录

es的日志在哪个文件里面_数据

docker-compose.yml

version: "3.8"

#网络配置
networks:
  network:
    ipam:
      config:
        - subnet: "10.10.10.0/24"

#服务配置
services:
  #elastalert2-EFK框架的告警组件
  elastalert2:
    image: jertel/elastalert2:2
    container_name: elastalert2
    restart: always
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - ./elastalert2/elastalert.yaml:/opt/elastalert/config.yaml
      - ./elastalert2/rules:/opt/elastalert/rules

elastalert.yaml

rules_folder: /opt/elastalert/rules
run_every:
  seconds: 10

buffer_time:
  minutes: 15

#es地址
es_host: 192.168.10.109
#es端口
es_port: 9200
#es账号
es_username: elastic
#es密码
es_password: B6P0hW7x

writeback_index: elastalert_status

alert_time_limit:
  days: 2

#详细的参数说明参考官方文档:https://elastalert2.readthedocs.io/en/latest/elastalert.html

dingtalk.yaml

name: "dingtalk" #规则的名称。
type: "frequency" # 规则类型为频率,表示要检测的事件是在一定时间范围内出现的次数。
index: "test-*" # 查询日志所在的索引
is_enabled: true
num_events: 1 # 出现几次就告警
timeframe:
  minutes: 1 # 1分钟 出现了 num_events次 匹配记录,就告警
realert:
  minutes: 1 # 1分钟内忽略重复告警
timestamp_field: "@timestamp"
timestamp_type: "iso"
use_strftime_index: false
alert_text_type: alert_text_only
# 下面是告警模板
alert_text: |
  日志告警
  时间: {0}
  文件: {1}
  触发次数: {2}
  匹配次数: {3}
  日志信息: {4}
alert_text_args: # 告警模板中用到的参数
  - "@timestamp"
  - "@log_name"
  - num_hits
  - num_matches
  - message
filter:
  - query:
      query_string:
        query: "level: ERROR" # 告警查询语句
alert:
  - "dingtalk" # 告警类型
dingtalk_access_token: "xxxxxx" # 在钉钉群添加自定义机器人获取AccessToken,
dingtalk_msgtype: "text" # 消息类型

运行

先启动EFK,再运行docker-compose up -d 启动elastaert2。

这样可以通过elastalert2的告警通知,及时收到日志等级为ERROR的消息。

完结!