ubuntu安装elastalert2进行慢日志企微机器人


一、背景介绍

前段时间发现服务器上出现了慢日志,但是如果都靠开发定期到服务器上去查慢日志,这样太麻烦了,所以想做一个慢日志的邮件告警。

二、实现方案

那如何实现慢日志报警呢,首先我们需要开启mysql的慢日志功能,这个我们项目已经有了,可以跳过(不知道怎么开启的可以上网查查,还是比较简单的),有了慢日志之后就需要进行慢日志的采集,由于线上有EFK环境,所以打算将慢日志采集到ElasticSearch中,这样一是可以在kibana中查看多个数据库的慢日志,二是可以基于ES进行日志的告警。

但是采用什么组件进行告警呢,目前有2种方案,一种是使用sentinl(注意:不是阿里的熔断和限流工具sentinel),另一种是基于Elastalert进行告警。

最后分析决定采用Elastalert,但是为什么不用sentinl呢?因为sentinl已经好久不升级维护了,当前github上的最新版本是7.6,但是我们项目使用的ES版本要比这个高,而sentinl对于版本是强相关的,所以没办法使用,最后就选择了Elastalert。但是Elastalert在github上有个2个开源项目,一个是最初的Elastalert(开源地址:GitHub - Yelp/elastalert: Easy & Flexible Alerting With ElasticSearch),这个已经好多年不维护了,另外一个是Elastalert2(开源地址:GitHub - jertel/elastalert2: ElastAlert 2 is a continuation of the original yelp/elastalert project. Pull requests are appreciated!),虽然是Elastalert2但是并不是同一个作者的开源项目,但是ElastAlert 2向后兼容原始ElastAlert规则,所以使用方法与Elastalert一致,而且这个目前还在维护中,最终我决定选择Elastalert2作为进行日志告警的组件。

所以最后的整体实现思路如下:

77b9ac3e1c91489c893647f73d86d740 - ubuntu安装elastalert2进行慢日志企微机器人

三、实操步骤

前提条件:

1、mysql慢日志已配置

2、mysql上的filebeat已安装

3、EFK环境已搭建好

有了上面的前提条件,我们开始完成剩下的步骤

1、配置filebeat采集mysql慢日志

mysql的慢日志样子长这个样子:

1030cd22e6ab46df9d48c6930ee7e889 - ubuntu安装elastalert2进行慢日志企微机器人

filebeat 完整的配置文件如下:

#用来加载rule的目录,默认是example_rules
rules_folder: /opt/elastalert/rules
# 用来设置定时向elasticsearch发送请求,也就是告警执行的频率

run_every:
  minutes: 1
# 用来设置请求里时间字段的范围 

buffer_time:
  minutes: 1
# elasticsearch的host地址

es_host: 192.168.8.8
# elasticsearch的端口

es_port: 9100
# elastalert产生的日志在elasticsearch中的创建的索引

writeback_index: elastalert_status
# 失败重试的时间限制 

alert_time_limit:
  days: 2 

然后启动filebeat,会看到数据已经插入到ES中了

2、安装ElastAlert2

ElastAlert2有2种安装方式:

1)一种是源码的方式安装,由于ElastAlert2是python写的,所以我们需要安装python并编译源码,步骤比较复杂,而且编译依赖的很多包都需要联网下载,我们内网环境无法联网下载这些安装包,所以这个方式不是很合适。

2)另一种是容器的方式安装,由于我们的服务器已经有了docker的环境,只需要把ElastAlert2的镜像导入到服务器上即可,所以我们是采用了这种方式。

2.1 导入ElastAlert2的镜像文件

sudo docker pull jertel/elastalert2

然后使用docker images可以查看到导入的ElastAlert2镜像

wei xin jie tu 20220822224242 - ubuntu安装elastalert2进行慢日志企微机器人

2.2. 配置ElastAlert2的config.yaml

首先在宿主机上创建 /opt/elk/elastalert2文件夹,在下面创建data、rules文件夹

然后在 /opt/elk/elastalert2文件夹下面新建config.yaml文件,文件内容如下:

vim /opt/elk/elastalert2/config.yaml

#用来加载rule的目录,默认是example_rules
rules_folder: /opt/elastalert/rules
# 用来设置定时向elasticsearch发送请求,也就是告警执行的频率

run_every:
  minutes: 1
# 用来设置请求里时间字段的范围 

buffer_time:
  minutes: 1
# elasticsearch的host地址

es_host: 192.168.8.8
# elasticsearch的端口

es_port: 9100
# elastalert产生的日志在elasticsearch中的创建的索引

writeback_index: elastalert_status
# 失败重试的时间限制 

alert_time_limit:
  days: 2 

2.3 创建mysql-slowlog-email.yaml邮件告警配置

在rules文件夹下面创建wx-work.yaml文件,内容如下:

sudo vim wx-work.yaml

name: "wx work webhook alert"
type: any
#es慢日志命中的索引
index: filebeat-*
use_strftime_index: true

#筛选数据
filter:
 - query:
     query_string:
       query: "mysql.slowlog.query : * "

#限定时间内,发生事件次数
num_events: 50
timeframe:
  hours: 0.5

realert:
  # 5分钟内相同的报警不会重复发送
  minutes: 5
  # 指数级扩大 realert 时间,中间如果有报警,
  # 则按照5->10->20->40->60不断增大报警时间到制定的最大时间,
  # 如果之后报警减少,则会慢慢恢复原始realert时间
exponential_realert:
  hours: 1

#字段设置
include: ["timestamp","mysql"]
alert_text: "Alerts at {0} on the computer {1}.\n```"
alert_text_args: ["timestamp","mysql"]

alert:
- post
http_post_url: "中转连接"

2.4 中转连接

在这里我用php脚本做的一个中转

$arr = $request->post();
$contemt = "检测到慢查询【{$arr['@timestamp']}】 SQL: {$arr['mysql']['slowlog']['query']}";
$data = [
    'msgtype' => 'markdown',
    'markdown'    => [
        'content' => $contemt,
    ],
];
Tool::curl('post', "企微机器人连接", $data, true);

2.5 启动容器

docker run -itd --restart=always --name elastalert2 \

-v /opt/elk/elastalert2/data:/opt/elastalert/data \

-v /opt/elk/elastalert2/config.yaml:/opt/elastalert/config.yaml \

-v /opt/elk/elastalert2/rules:/opt/elastalert/rules \

-v /opt/elk/elastalert2/elastalert_modules:/opt/elastalert/elastalert_modules \

-e ELASTICSEARCH_HOST="192.168.8.8" \

-e ELASTICSEARCH_PORT=9100 \

-e CONTAINER_TIMEZONE="Asia/Shanghai" \

-e SET_CONTAINER_TIMEZONE=True \

-e TZ="Asia/Shanghai" \

-e SET_CONTAINER_TIMEZONE=True \

-e ELASTALERT_BUFFER_TIME=10 \

-e ELASTALERT_RUN_EVERY=1 \

jertel/elastalert2

2.6 进入容器启动elastalert2

docker exec -it 容器ID /bin/bash

nohup python -m elastalert.elastalert --verbose --es_debug --config /opt/elastalert/config.yaml &

或者按指定rule启动elastalert2

nohup python -m elastalert.elastalert --verbose --es_debug --config /opt/elastalert/config.yaml --rule /opt/elastalert/rules/wx-work.yaml &

四、测试告警

1、首先我们执行一个慢sql

select sleep(20),user,host from mysql.user;

2、过一会儿会发现企微群收到一条报警

wei xin jie tu 20220918114001 - ubuntu安装elastalert2进行慢日志企微机器人

附一:本地部署elastlaert2

由于自己用的测试服务器内存不够大,用docker安装失败了很多次,所以还是改为本地安装,有条件的朋友可以尝试使用docker安装

所需软件及版本

  • python 3.10
  • opensll 1.1.1 (python 3.10需要)

安装python的话这里就不细说了,百度应该都有,也比较简单

安装步骤

pip install elastalert2 (可能会有setuptools版本低的情况,自行更新)
git clone https://github.com/jertel/elastalert2.git
cd elastalert2
python setup.py install

配置文件的路径和docker安装是一样的,在examole目录下

启动准备

在启动之前,需要做一个index的初始化,直接执行:

elastalert-create-index

New index name (Default elastalert_status)
Name of existing index to copy (Default None)
New index elastalert_status created
Done!

elastalert-create-index会创建一个索引,ElastAlert会把执行记录存放到这个索引中,默认情况下,索引名叫elastalert_status。其中有4个_type,都有自己的@timestamp字段,所以同样也可以用kibana来查看这个索引的日志记录情况。(非必须步骤,但是对于审计很有用)

rule配置文件准备好的,也可以做个测试,检测配置文件是否正常

sudo elastalert-test-rule ./exmaple/rules/wx-work.yaml --config=./example/config.yaml --alert

没问题后就可以启动了

启动

sudo python3.10 -m elastalert.elastalert --verbose --config ./example/config.yaml --rule ./example/rules/exemple_discord_any.yaml

附二:elastlaert2 配置汇总

rule 示例:emall

name: test_err
use_strftine_index: true
index: filebeat-7.3.2-*
type: any

#将多个匹配项汇总到一个警报中。每次找到匹配项时,ElastAlert将等待该aggregation时间段,并将特定规则在该时间段内发生的所有匹配项一起发送。
aggregation:
  seconds: 10
#限定时间内,发生事件次数
num_events: 3
#与上面参数结合使用,在几分钟内
timeframe:
  minutes: 2

realert:
# 5分钟内相同的报警不会重复发送
  minutes: 5
   # 指数级扩大 realert 时间,中间如果有报警,
   # 则按照5->10->20->40->60不断增大报警时间到制定的最大时间,
   # 如果之后报警减少,则会慢慢恢复原始realert时间
exponential_realert:
  hours: 1

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

alert:
- "email"
#在邮件正文会显示你定义的alert_text
alert_text: "You have a err message!"

#用户认证文件,需要user和password两个属性
smtp_host: smtp.163.com
smtp_port: 25
smtp_auth_file: /opt/elastalert/smtp_auth_file.yaml

#从哪个邮箱发送
from_addr: test@163.com
#回复给那个邮箱
email_reply_to: test@163.com

email:
#接收报警邮件的邮箱
 - "test04@163.com"

config 示例

# 用来加载rule的目录,默认是example_rules
rules_folder: rules
# 用来设置定时向elasticsearch发送请求,也就是告警执行的频率
run_every:
  seconds: 30
# 用来设置请求里时间字段的范围
buffer_time:
  seconds: 30
# elasticsearch的host地址,端口
es_host: node01
es_port: 9200
# elastalert产生的日志在elasticsearch中的创建的索引
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
# 失败重试的时间限制
alert_time_limit:
  days: 2

更详细的配置介绍文章:http://t.zoukankan.com/fatzi-p-13020824.html

  • 分享:
评论
还没有评论
    发表评论 说点什么
    蜀ICP备18035236号