您的位置 首页 elasticsearch

es 监控错误日志的2种方案(ElastAlert 从0开始搭建)

es 监控日志中的错误 告警

 

Elasticsearch 日志监控方案-CSDN博客

目前大部分公司都会选择将应用、中间件、系统等日志存储在 Elasticsearch 中,如何发现日志中的异常数据并且及时告警通知 呢?

这里白眉介绍2种方案:

Yelp 公司开源的 ElastAlert 和 Elastic 官方的商业版功能 Watcher。

Watcher 是 Elastic 官方提供的一个对日志数据监控和报警的功能,Watcher 属于收费功能,我们可以在 License Management 中开启 30 天的试用。

kibana开启watcher  :连接

 

如下图所示,日志数据源是一台 Nginx 服务器,在该服务器上安装 Filebeat 收集 Nginx 日志并输出到 Elasticsearch,之后会分别演示用 ElastAlert 和 Watcher 两种方案监控日志并进行告警

 

1- 配置测试nginx

nginx 测试页面配置 :  连接

2- 安装 filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.0-x86_64.rpm
sudo rpm -vi filebeat-7.14.0-x86_64.rpm

 

编辑 /etc/filebeat/filebeat.yml 配置文件,读取 Nginx 日志文件输出到 Elasticsearch 的 nginx 索引中,后缀是当前日期。

vim /etc/filebeat/filebeat.yml

如下

一定注意格式, 这种方式 可以直接用system 来管理

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/*.log
output.elasticsearch:
  hosts: ["192.168.1.8:9200"]
  index: "nginx-%{+yyyy.MM.dd}"
  #username: "elastic"
  #password: "changeme"
setup.ilm.enabled: false
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"

启动 Filebeat:

systemctl start filebeat

 

3- python3 安装

python 安装(linux )3.11.0--带openssl : 连接

 

4- 安装 Elastalert

直接安装比较麻烦,遇到各种python 安装库的问题。

我建议用docker的方式。

(1)docker 方式

尝试了各种 镜像, bitsensor/elastalert:3.0.0-beta.0 系列的都是python2 ,会报错, 最终找了一个 python3的。

通过docker-compose.yaml安装elastalert,

在/data下新建elastalert目录,在/data/elastalert下新建
docker-compose.yaml文件,文件内容如下

version: '2.2'
services:
  elastalert:
    image: anjia0532/elastalert-docker
    container_name: elastalert
    environment:
      - ELASTICSEARCH_HOST=192.168.103.78
      - ELASTICSEARCH_PORT=9200
      - TZ=Asia/Shanghai
      - ELASTICSEARCH_USER="elastic"
      - ELASTICSEARCH_PASSWORD="123456"
    volumes:
      - /data/elastalert/rules:/opt/elastalert/rules
      - /data/elastalert/elastalert_modules:/opt/elastalert/elastalert_modules

注意:修改es的地址、端口、账号、密码

(2) 在/data/elastalert下创建rules、elastalert_modules目录,用于容器启动时挂载用

(3)  在rules 下新建一个 nginx.yaml  来测试nginx 错误日志报警

创建 rules/nginx.yaml 文件,编辑 rule:

规则内容为:在 1 分钟内如果查询 nginx-* 索引的 message 字段匹配 到 error 5 次就触发告警,往指定的 URL 发送一个 HTTP POST 请求。

下边白眉大叔设置的是60分钟。

cat nginx.yaml


# Alert when the rate of events exceeds a threshold

# (Required)
# Elasticsearch host
#es_host: 192.168.1.8
es_host: 10.0.0.208

# (Required)
# Elasticsearch port
es_port: 9200

# (OptionaL) Connect with SSL to elasticsearch
#use_ssl: True

# (Optional) basic-auth username and password for elasticsearch
#es_username: someusername
#es_password: somepassword

# (Required)
# Rule name, must be unique
name: nginx rule

# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
type: frequency

# (Required)
# Index to search, wildcard supported
index: nginx-*

# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 5

# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  minutes: 60

# (Required)
# A list of elasticsearch filters used for find events
# These filters are joined with AND and nested in a filtered query
# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
filter:
- term:
    message: "error"

# (Required)
# The alert is use when a match is found
alert:
- "post"

http_post_url: "https://webhook.site/5c52b885-3deb-493f-bf4a-0f8cafccae62"

 

注意: http_post_url  的地址,是从这里这的一个免费的 webhook

https://webhook.site/#

https://webhook.site 网站提供了测试的 Webhook 接口,每个人的 URL 都是独立的,拷贝这个 URL 复制到 http_post_url 中。

(4)以上的配置都准备完毕后,在/data/elastalert下执行命令:docker-compose up -d ,启动elastalert容器,未下载elastalert镜像的需要耐心等待镜像下载完毕

docker-compose up -d

 

 

 

ElastAlert 会把执行记录存放到一个索引中,可以方便我们审核和调试。使用以下命令创建这个索引的,默认情况下,索引名叫 elastalert_status。

 

root@ydt-net-es-node1:/software #elastalert-create-index
Enter Elasticsearch host: 192.168.1.8
Enter Elasticsearch port: 9200
Use SSL? t/f: f
#如果有认证输入用户名密码
Enter optional basic-auth username (or leave blank): 
Enter optional basic-auth password (or leave blank): 
Enter optional Elasticsearch URL prefix (prepends a string to the URL of every request): 
New index name? (Default elastalert_status) 
New alias name? (Default elastalert_alerts) 
Name of existing index to copy? (Default None) 
Elastic Version: 7.9.3
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
New index elastalert_status created
Done!

发送 2 个请求,1 个是正确请求,1 个是错误请求。

curl 10.0.0.203:8080 -I
curl 10.0.0.203:8080/xxx -I

在 Kibana 上可以看到 Nginx 的日志,错误请求会在 access.log 和 error.log 各写一次,因此这里看到 3 条记录。

设置kibanna -找到  statck management -> 索引模式

具体参考 es 安装 kibana 安装 tar.gz (推荐) : 连接

 

上边执行完,我们的环境就准备好了

测试 告警

运行 elastalert-test-rule 命令检验配置文件是否正确并且可以看到规则匹配的次数,elastalert-test-rule 命令并不会真正触发告警。

 

进入容器:

docker container exec -it elastalert  sh

 

然后执行:

 elastalert-test-rule  ./rules/nginx.yaml

就会检测是否告警

我们来模拟一下, 在其他主机,我们访问nginx, 让其产生功能错误日志,如下:

1分钟内连续发送错误请求 5 次达到触发告警的阈值:

 for i in {1..5};do curl http://10.0.0.203:8080/xxxxxx -I;done

 

然后我们在进行测试一下

elastalert-test-rule ./rules/nginx.yaml

接下来我们看报警

使用以下命令运行 elastalert,可以看到触发了告警:

elastalert --verbose --rule ./rules/nginx.yaml

访问 https://webhook.site 网站可以看到 ElastAlert 发送的 HTTP POST 请求。

 

 

查询 elastalert_status 索引可以看到 ElastAlert 的执行记录。

GET elastalert_status/_search

 

查看日志

docker logs -f elastalert

二、配置企业微信告警

上边我们用的免费的 webhook

Docker部署ELK(配置密码登录)及Elastalert企业微信告警配置_elastalert 企业微信-CSDN博客

接下来我们测试一下 用企业微信告警。

(1)在/data/elastalert/elastalert_modules下新建wechat_qiye_alert.py,文件内容如下:

wechat_qiye_alert.py :连接

(2)

在/data/elastalert/rules下新建wechat_nginx-app-frontend.yaml,名字自定义以.yaml结尾即可,文件内容如下:

es_host: 192.168.103.78
es_port: 9200
es_username: "elastic"
es_password: "123456"
name: nginx-app-frontend   #告警模板名
realert:              #2分钟内不重复告警
  minutes: 2
type: frequency
index: nginx-app-*    #要查询的索引的名称, ES中存在的索引
num_events: 5         #此参数特定于frequency类型,而且是触发警报时的阈值,周期内出现5次
timeframe:            #监控周期为1分钟
  minutes: 1
filter:               #配置监控条件
- query_string:
        query: "http_status: (304|400|404|500|501)"

alert:
- "elastalert_modules.wechat_qiye_alert.WeChatAlerter"
wechat_corp_id: "ww9d9xxxxxxxx5a279" #企业号id
wechat_secret: "uoeDZNoxxxx4D-mr4lDxxxxxxxxx1Bmwtt-k"  #应用秘钥
wechat_agent_id: "1000096"   #应用id
wechat_party_id: "2"   #部门id
wechat_user_id: "Gxxxo|Cxxxl|jxxxxy"  #用户id,多人用 | 分割,全部用 @all
wechat_tag_id: ""  #标签id

alert_text_type: alert_text_only
alert_text: |
  【测试环境】
  发生了 {} 次告警
  告警模块: {}
  告警ip: {}
  详细日志: {}
alert_text_args:
  - num_hits
  - type
  - remote_addr
  - message

通过url访问,制造一些404的报错信息,通过docker logs 容器id,可查看容器日志

 

如果是 监控 errors,可以这样写:

filter:               #配置监控条件
#- query_string:
#        query: "http_status: (304|400|404|500|501)"
- term:
   message: "error"

 

测试, 发送5个 错误信息:

for i in {1..5};do curl http://10.0.0.203:8080/xxxxxx -I;done

 

进容器里运行:

测试是否满足条件

elastalert-test-rule ./rules/nginx.yaml

实际报警:

elastalert --verbose --rule ./rules/nginx.yaml

企业微信收到报警:

 

--其他报警

 

钉钉:

wget https://github.com/xuyaoqiang/elastalert-dingtalk-plugin/archive/master.zip

企业微信报警:

https://github.com/anjia0532/elastalert-wechat-plugin/tree/master/elastalert_modules

企业微信 webhook 报警

通过群里发送消息,的可以用 钉钉的方式, :

企业微信webhook  elastalert测试连接: l连接

欢迎来撩 : 汇总all

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章