【Elastic (ELK) Stack 实战教程】11、使用 ElastAlert 实现 ES 钉钉群日志告警

2023-05-16

目录

一、ElastAlert 概述

二、安装 ElastAlert

2.1 安装依赖

2.2 安装 Python 环境

2.3 安装 ElastAlert

2.4 ElastAlert 配置文件

2.5 创建 ElastAlert 索引

2.6 测试告警配置是否正常

三、ElastAlert 集成钉钉

3.1 下载 ElastAlert 钉钉报警插件

3.2 创建钉钉机器人

3.3 请求 nginx 频繁出现 401 场景

3.3.1 配置 ElastAlert 规则

3.3.2 执行告警规则

3.3.3 测试告警规则

3.4 请求 nginx 频繁出现 5xx 场景

3.4.1 配置 ElastAlert 规则

3.4.2 执行告警规则

3.4.3 测试告警规则

3.5 请求 url 超过 3s 场景

3.5.1 配置 ElastAlert 规则

3.5.2 执行告警规则 

3.5.3 测试告警规则


 

一、ElastAlert 概述

        ElastAlert 是一个开源的警报框架,由 Yelp 开发,它可以从 Elasticsearch 中提取数据并根据预定义的规则生成警报。ElastAlert 可用于监控您的日志和时间序列数据,以便在发生异常、错误或其他有趣的模式时立即采取行动。ElastAlert 能够与许多通知服务(如电子邮件、Slack、PagerDuty、钉钉等)集成,这样在触发警报时可以发送通知。

以下是 ElastAlert 的一些主要特点:

  1. 灵活的规则类型:ElastAlert 提供了多种规则类型,例如 frequency(在给定时间范围内的事件数超过阈值)、spike(事件数突然增加或减少)、flatline(在给定时间范围内的事件数低于阈值)等。这些规则类型可以覆盖许多不同的用例,并可通过编写自定义规则类型进一步扩展。

  2. 过滤器:ElastAlert 支持 Elasticsearch 查询 DSL,您可以编写过滤器来精确选择要监控的事件。这使得 ElastAlert 可以根据您的需求高度定制。

  3. 告警:ElastAlert 支持多种告警通知方式,包括电子邮件、Slack、PagerDuty、JIRA 等。您可以根据需求将警报发送到多个通知目标。

  4. 扩展性:ElastAlert 可以轻松处理大量的数据,并且可以通过运行多个 ElastAlert 实例并行处理多个 Elasticsearch 索引来扩展。

  5. 易于集成:ElastAlert 可以与现有的 Elasticsearch 集群无缝集成,因此您无需进行任何额外的设置即可开始使用它。

        要开始使用 ElastAlert,您需要编写配置文件以指定 Elasticsearch 集群的详细信息,然后编写规则文件以定义要监控的事件和生成警报的条件。ElastAlert 会定期查询 Elasticsearch,检查是否满足任何规则条件,并在满足条件时触发相应的警报。这使得 ElastAlert 成为实时监控和警报的强大工具。

二、安装 ElastAlert

ElastAlert 官方安装文档:Running ElastAlert for the First Time — ElastAlert 0.0.1 documentation

2.1 安装依赖

[root@es-node2 ~]# yum install -y git wget python-pip python3-devel gcc gcc-c++ libffi-devel openssl openssl-devel

2.2 安装 Python 环境

[root@es-node2 ~]# yum install -y python36 python36-devel python36-pip python36-cffi

[root@es-node2 ~]# mkdir -p /root/.pip

# 更换阿里源
[root@es-node2 ~]# vim /root/.pip/pip.conf
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

# 将 Python3 的 pip 包管理器升级到最新版本
[root@es-node2 ~]# python3 -m pip install --upgrade pip

2.3 安装 ElastAlert

#1. 从 GitHub 上克隆 ElastAlert 仓库
[root@es-node2 ~]# git clone https://github.com/Yelp/elastalert.git
[root@es-node2 ~]# cd elastalert
# 如果克隆不下来,则去改网址克隆到本地再上传

#2. 使用 pip 安装 ElastAlert 及其依赖项
[root@es-node2 ~/elastalert-master]# pip install "setuptools>=11.3"
[root@es-node2 ~/elastalert-master]# pip install "setuptools_rust"
# 根据 es 版本选择,我们是 7.8 版本,所以是大于 6 小于 7 版本
[root@es-node2 ~/elastalert-master]# pip3 install "elasticsearch>=7.0.0,<8.0.0"
[root@es-node2 ~/elastalert-master]# pip3 install -r requirements.txt
[root@es-node2 ~/elastalert-master]# python3 setup.py install

2.4 ElastAlert 配置文件

[root@es-node2 ~/elastalert-master]# cp config.yaml.example example_rules/config.yaml
[root@es-node2 ~/elastalert-master]# vim example_rules/config.yaml 

rules_folder: example_rules

run_every:
  minutes: 1

buffer_time:
  minutes: 15

es_host: 192.168.170.132
es_port: 9200

writeback_index: elastalert_status
writeback_alias: elastalert_alerts

alert_time_limit:
  days: 2

        这是一个 ElastAlert 的配置文件,它包含了运行 ElastAlert 时所需的一些基本参数。下面是各个参数的解释:

  1. rules_folder: 用于指定 ElastAlert 规则文件的存放目录。在这个例子中,规则文件位于 example_rules 目录下。

  2. run_every: ElastAlert 查询 Elasticsearch 数据的频率。在这个例子中,每隔 1 分钟查询一次。

  3. buffer_time: 指定查询 Elasticsearch 时所需的时间窗口。在这个例子中,查询过去 15 分钟内的数据。

  4. es_host: Elasticsearch 节点的地址。

  5. es_port: Elasticsearch 服务器的端口。在这个例子中,Elasticsearch 服务器的端口为 9200

  6. writeback_index: ElastAlert 用于存储元数据(如警报历史、错误、静默等)的 Elasticsearch 索引。在这个例子中,元数据存储在名为 elastalert_status 的索引中。

  7. writeback_alias: ElastAlert 用于存储实际警报的 Elasticsearch 索引别名。在这个例子中,警报存储在名为 elastalert_alerts 的别名下。

  8. alert_time_limit 是 ElastAlert 配置文件中的一个参数,用于设置警报的有效时间。在这个例子中,警报的有效期限为 2 天。如果在这个时间段内(2 天内)没有解决警报,ElastAlert 将不再重复发送该警报。

        通过这个配置文件,ElastAlert 可以定期查询 Elasticsearch,检查是否满足预先定义的规则,并在满足条件时触发相应的警报。

2.5 创建 ElastAlert 索引

[root@es-node2 ~/elastalert-master]# elastalert-create-index --config example_rules/config.yaml 

2.6 测试告警配置是否正常

[root@es-node2 ~/elastalert-master]# python3 -m elastalert.elastalert --verbose --config example_rules/config.yaml --rule example_rules/example_frequency.yaml

无报错信息则正常。 

三、ElastAlert 集成钉钉

3.1 下载 ElastAlert 钉钉报警插件

ElastAlert 钉钉报警插件 github 地址:GitHub - xuyaoqiang/elastalert-dingtalk-plugin: elastalert 的钉钉报警插件

[root@es-node2 ~]# unzip elastalert-dingtalk-plugin-master.zip 
[root@es-node2 ~]# cd elastalert-dingtalk-plugin-master/
[root@es-node2 ~/elastalert-dingtalk-plugin-master]# cp -rp elastalert_modules /root/elastalert-master/

3.2 创建钉钉机器人

        首先,我们需要在钉钉中创建一个自定义机器人。进入相应的群组,点击群设置,在群助手中选择添加机器人,然后选择 "自定义" 机器人。按照提示设置机器人的名称和头像,并设置安全设置(例如 IP 地址白名单)。创建成功后,你将获得一个 Webhook URL,我们将在 ElastAlert 规则文件中使用这个 URL。 

  

3.3 请求 nginx 频繁出现 401 场景

3.3.1 配置 ElastAlert 规则

[root@es-node2 ~/elastalert-master]# vim example_rules/nginx_404.yaml
# 告警名称
name: nginx_access_404

# 告警类型
type: frequency

# 告警匹配的 es 索引名称
index: kafka-logstash-nginx-access*

#告警的条件,查询最近1分钟的日志,当10s内发生3次404错误则触发告警
num_events: 3
timeframe:
  seconds: 10
  #minutes: 1

filter:
- query:
    query_string:
      query: "response: 404"


# 告警方式:钉钉
alert_text_type: alert_text_only
alert:
- "elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook: "https://oapi.dingtalk.com/robot/send?access_token=266e1c37a419c558960110cd636630b47cb5208ced71936d37833b98182a40c5"
dingtalk_msgtype: "text"

alert_text: |
  告警程序: ElasticSearch_Alert
  告警节点: {}
  域    名: {}
  调用方式: {}
  请求链接: {}
  触发条件: 10s 内 {} 状态码 超过 {} 次

# 需要匹配的字段名称,与上面按顺序一一对应
alert_text_args:
  - host.name
  - hostname
  - method
  - request
  - response
  - num_hits

3.3.2 执行告警规则

# 前台运行并输出(测试用)
[root@es-node2 ~/elastalert-master]# python3 -m elastalert.elastalert --verbose --config example_rules/config.yaml --rule example_rules/nginx_404.yaml 

# 后台执行,查看 nginx_404.log 输出日志(生产用)
[root@es-node2 ~/elastalert-master]# nohup python3 -m elastalert.elastalert --verbose --config example_rules/config.yaml --rule example_rules/nginx_404.yaml >> nginx_404.log &

[root@es-node2 ~/elastalert-master]# tail -f nginx_404.log 

3.3.3 测试告警规则

测试钉钉告警: 模拟产生 404 日志,通过追加对应时间点的日志即可完成测试(注意把下面时间你当前时间即可)。

[root@es-node3 ~]# echo '218.58.205.220 - - [12/Apr/2023:13:54:02 +0800] "HEAD /favicon.ico HTTP/1.1" 404 0 "chat.sky.com" "-" - "Go-http-client/1.1" "-" 10.100.15.239:80 404 0.009 0.009' >> /var/log/nginx/access.log

3.4 请求 nginx 频繁出现 5xx 场景

3.4.1 配置 ElastAlert 规则

[root@es-node2 ~/elastalert-master]# vi example_rules/nginx_5xx.yaml
# 告警名称
name: nginx_access_5xx

# 告警类型
type: frequency

# 告警匹配的索引名称
index: kafka-logstash-nginx-access*

# 告警的条件,查询最近1分钟的日志,当10s内发生3次500-509错误则触发告警
num_events: 3
timeframe:
  seconds: 10
  #minutes: 1

filter:
- query:
    query_string:
      query: "response: [500 TO 509]"


# 告警方式:钉钉
alert_text_type: alert_text_only
alert:
- "elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook: "https://oapi.dingtalk.com/robot/send?access_token=266e1c37a419c558960110cd636630b47cb5208ced71936d37833b98182a40c5"
dingtalk_msgtype: "text"

alert_text: |
  告警程序: ElasticSearch_Alert
  告警节点: {}
  域    名: {}
  调用方式: {}
  请求链接: {}
  触发条件: 10s 内 {} 状态码 超过 {} 次

alert_text_args:
  - host.name
  - hostname
  - method
  - request
  - response
  - num_hits

3.4.2 执行告警规则

[root@es-node2 ~/elastalert-master]# nohup python3 -m elastalert.elastalert --verbose --config example_rules/config.yaml --rule example_rules/nginx_5xx.yaml >> nginx_5xx.log &

3.4.3 测试告警规则

测试钉钉告警: 模拟产生 500 日志,通过追加对应时间点的日志即可完成测试。

[root@es-node3 ~]# echo '218.58.205.220 - - [12/Apr/2023:14:22:02 +0800] "HEAD /favicon.ico HTTP/1.1" 502 0 "chat.sky.com" "-" - "Go-http-client/1.1" "-" 10.100.15.239:80 404 0.009 0.009' >> /var/log/nginx/access.log
[root@es-node3 ~]# echo '218.58.205.220 - - [12/Apr/2023:14:22:22 +0800] "HEAD /favicon.ico HTTP/1.1" 504 0 "chat.sky.com" "-" - "Go-http-client/1.1" "-" 10.100.15.239:80 404 0.009 0.009' >> /var/log/nginx/access.log

3.5 请求 url 超过 3s 场景

3.5.1 配置 ElastAlert 规则

[root@es-node2 ~/elastalert-master]# vi example_rules/nginx_response.yaml
# 告警名称
name: nginx_response_time

# 告警类型
type: frequency

# 告警匹配的索引名称
index: kafka-logstash-nginx-access*

#告警的条件,查询最近1分钟的日志,当10s内发生3次响应超过3s
num_events: 3
timeframe:
  seconds: 10
  #minutes: 1

filter:
filter:
- query_string:
   query: "response_time: >3"


# 告警方式:钉钉
alert_text_type: alert_text_only
alert:
- "elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook: "https://oapi.dingtalk.com/robot/send?access_token=266e1c37a419c558960110cd636630b47cb5208ced71936d37833b98182a40c5"
dingtalk_msgtype: "text"

alert_text: |
  告警程序: ElasticSearch_Alert
  告警节点: {}
  域    名: {}
  调用方式: {}
  请求链接: {}
  触发条件: 10s 内有 {} 条 Resp 超过 {} 秒

alert_text_args:
  - host.name
  - hostname
  - method
  - request
  - num_hits
  - response_time

3.5.2 执行告警规则 

[root@es-node2 ~/elastalert-master]# nohup python3 -m elastalert.elastalert --verbose --config example_rules/config.yaml --rule example_rules/nginx_response.yaml >> nginx_response.log &

3.5.3 测试告警规则

测试钉钉告警: 模拟 response 大于 3s 的日志,通过追加对应时间点的日志即可完成测试。

[root@es-node3 ~]# echo '218.58.205.220 - - [12/Apr/2023:14:31:12 +0800] "HEAD /favicon.ico HTTP/1.1" 504 0 "chat.sky.com" "-" - "Go-http-client/1.1" "-" 10.100.15.239:80 404 0.009 31' >> /var/log/nginx/access.log

上一篇文章:【Elastic (ELK) Stack 实战教程】10、ELK 架构升级-引入消息队列 Redis、Kafka_Stars.Sky的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Elastic (ELK) Stack 实战教程】11、使用 ElastAlert 实现 ES 钉钉群日志告警 的相关文章

  • 手把手教你FreeRTOS源码详解(四)——信号量、互斥量、递归互斥量

    FreeRTOS源码解析集合 xff08 全网最详细 xff09 手把手教你FreeRTOS源码解析 xff08 一 xff09 内存管理 手把手教你FreeRTOS源码详解 xff08 二 xff09 任务管理 手把手教你FreeRTOS
  • python 随机数 random 库的使用总结

    目录 1 random 库中的常用随机数生成函数 2 一些用法举例 3 随机数种子 seed a 的理解与使用 random 库的主要目的就是生成随机数 1 random 库中的常用随机数生成函数 from random import 1
  • JDBC 配置

    JDBC Java DataBase Connectivity 规范 JDBC是一套协议 xff08 规范 xff09 是java开发人员和数据库厂商达成的协议 是由sun定义一组接口 由数据库厂商来实现 并规定了java开发人员访问数据库
  • Gazebo下载所有模块到本地

    从https bitbucket org osrf gazebo models上下载model库 xff1b 将下载的文件解压 xff0c 将解压后的文件夹重命名为models将models复制到 gazebo文件夹中 xff08 如果 g
  • linux操作系统和系统资源理论基础

    目录 一 xff1a 操作系统 二 xff1a 程序如何被CPU读取 三 xff1a CPU缓存 四 xff1a CPU缓存策略 五 xff1a 如何实现系统多任务 六 xff1a 进程切换过程初探 七 xff1a 进程的调度规则 八 xf
  • containerd的安装和使用

    containerd介绍 containerd是从docker项目中剥离出来的一个容器运行时 几乎囊括了容器管理的所有功能 xff0c 并且containerd内置了CRI插件K8S的kubelet组件可以直接调用containerd xf
  • 部署harbor并实现https(SAN签发证书)

    目录 一 安装docker docker compose 二 安装harbor 三 签发证书 四 修改配置文件 五 运行harbor 六 客户端测试 xff1a 使用系统 xff1a ubuntu 20 04 3 harbor依赖于dock
  • 二进制部署kubernetes高可用集群

    目录 一 集群外围节点准备 二 部署kubeasz 3 3 1集群 三 初始化集群 四 测试集群网络可用性 五 集群扩容 需要master node etcd节点各三台 xff1b harbor服务器 deploy部署节点 负载均衡主机各一
  • coredns部署

    目录 一 获取coredns yaml文件 二 修改coredns yaml文件 三 基于yaml文件启动coredns服务 coredns域名解析流程 xff1a 举例 xff1a 当pod1应用想通过dns域名的方式访问pod2则首先根
  • dashboard的安装使用

    目录 一 下载dashboard的yaml文件 二 修改dsashboard的yaml文件镜像 三 修改dashboard的yaml文件内容 四 创建dashboard 通常而言kubernetes中完成的所有操作都是通过命令行工具kube
  • K8S内部pod之间相互调用案例和详解

    目录 一 部署nginx容器 二 部署tomcat服务 三 使用nginx代理tomcat服务 四 测试 服务发现简介 xff1a 1 service是用于K8S的服务发现的重要组件 xff0c pod作为运行业务的承载方式 xff0c 要
  • 记一次rsyslog配置问题,导致系统无法打印日志

    工作中发现有些机器发生异常 xff0c 想看下messages日志 xff0c 却没有数据 xff0c 看了下rsyslog中日志都定义了打印出的路径 xff0c 但是就是没有日志 查看结果 xff1a 所有的日志文件都没有打印数据 查看了
  • python 字符串操作总结

    目录 1 求字符串长度及字符串转换 2 删除空格 分割字符串 3 连接字符串 4 大小写转换 5 字符串替换 6 统计子字符串的出现次数 7 查找子字符串第一次出现的位置 8 判断字符串的某些属性是否为True 9 字符串转化为数字 10
  • K8S pod 亲和与反亲和 (podAffinity与podAntiAffinity)

    目录 1 简介 xff1a 2 配置须知 xff1a 示例 xff1a 一 创建前端nginx容器 二 创建后端容器 xff0c 与nginx容器做软亲和 三 创建后端容器 xff0c 与nginx容器做硬亲和 1 简介 xff1a 前面介
  • K8S-污点(taints)与容忍(toleration)

    简介 xff1a 污点 xff08 taints xff09 打上了污点的node就不会承载新pod的调度 容忍 xff08 toleration xff09 设置了有容忍的pod xff0c 仍能调度到有污点的node上 一 污点介绍 x
  • Kafka 客户端管理工具 Offset Explorer

    简介 xff1a 我们在项目开发中根据实际业务需求会使用到一些中间件 xff0c 比如缓存redis xff0c 消息队列 xff0c kafka rabbitMQ等 xff0c 在代码中集成后 xff0c 可以通过命令来查看数据的走向 x
  • 力扣(Leetcode)——python3

    目录 动态规划 70 爬楼梯 198 打家劫舍 213 打家劫舍 509 斐波那契数 740 删除并获得点数 746 使用最小花费爬楼梯 1137 第N个泰波那契序列 动态规划 Dynamic Programming 递归 43 迭代 45
  • Python 无参装饰器详解

    1 储备知识 args xff0c kwargs span class token keyword def span span class token function index span span class token punctua
  • 操作系统进程与线程实验二

    操作系统进程与线程实验二 一 实验目的 xff1a 对比进程与线程 xff0c 理解进程与线程的联系与区别 xff0c 学会使用多线程相关函数 一个进程中的多个线程之间使用相同的地址空间 xff0c 共享大部分数据 xff0c 启动一个线程
  • STM32CubeMX+keil5+esp8266(基于hal库的stm32+esp8266连接)

    MX的烧录口和时钟设置 xff1a 配置时钟 xff1a 串口1配置 xff08 用来输出提示信息 xff09 串口2配置波特率115200 xff0c 使能全局中断 xff08 用来做esp8266的串口通信 xff09 命好名生成代码并

随机推荐