ElastAlert 错误日志告警

文章目录

  • 前言
  • 一、ElastAlert 概览
    • 1.1 简介
    • 1.2 ElastAlert 特性
  • 二、ElastAlert 下载部署
    • 2.1 安装 Python3 环境
    • 2.2 下载 ElastAlert
    • 2.3 部署 ElastAlert
  • 三、接入平台
    • 3.1 对外接口层
    • 3.2 服务层

前言

ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件,Elastalert 通过查询 Elasticsearch 中的记录与定于的告警规则进行对比,判断是否满足告警条件。发生匹配时将为该告警触发一个或多个告警动作。告警规则由 ElastAlert 的 rules 定义,每个规则定义一个查询。

一、ElastAlert 概览

1.1 简介

ElastAlert 程序的设计是可靠的、高度可定制的、安装方面也是简单的并且可配置的。

它通过将 Elasticsearch 与两个组件,规则类型(rule types)以及警报(alerts)相结合进行实现。Elasticsearch 会定期的被程序查询,得出的数据经由规则类型(rule type)确定何时找到了匹配项。当找到匹配项后,会根据匹配的数据结果给出一个或多个警报。

配置方面是由一组规则(rules)进行管控,每个规则(rules)里面定义了一个查询,一个规则类型以及一组警报。

目前支持以下的报警类型:

  • Command
  • Email
  • JIRA
  • OpsGenie
  • SNS
  • HipChat
  • Slack
  • Telegram
  • Debug
  • Stomp

1.2 ElastAlert 特性

  1. 架构简单,定制灵活
  2. 支持多种匹配规则(频率、阈值、数据变化、黑白名单、变化率等)
  3. 支持多种警报类型(邮件、HTTP POST、自定义脚本等)
  4. 匹配项汇总报警,重复警报抑制,报警失败重试和过期
  5. 可用性强,状态信息保存到Elasticsearch的索引中

二、ElastAlert 下载部署

2.1 安装 Python3 环境

切换到 /data 目录下

cd /data

安装 openssl

yum -y install wget openssl openssl-devel gcc gcc-c++

下载 Python 安装包

wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz

解压缩

tar -zxvf Python-3.6.9.tgz

cd Python-3.6.9 目录

cd Python-3.6.9

安装配置

./configure

编译

make && make install

建立软连接去除系统自带的 Python2

mv /usr/bin/python /usr/bin/python_old
ln -s /usr/local/python/bin/python3 /usr/bin/python
ln -s /usr/local/python/bin/pip3 /usr/bin/pip
pip install --upgrade pip

查看版本

[root@boe-dc-38 bin]# python -V
Python 3.6.9
[root@boe-dc-38 bin]# pip -V
pip 21.3.1 from /usr/local/python/lib/python3.6/site-packages/pip (python 3.6)

2.2 下载 ElastAlert

1.克隆 ElastAlert 项目

git clone https://github.com/Yelp/elastalert.git

2.安装

cd elastalert
pip install elasticsearch>=7.0.0
pip install -r requirements.txt
python setup.py install

3.安装成功后可以看到四个命令

[root@boe-dc-38 bin]# ll /usr/local/python/bin/elastalert*
-rwxr-xr-x 1 root root 396 Nov 17 13:40 /usr/local/python/bin/elastalert
-rwxr-xr-x 1 root root 422 Nov 17 13:40 /usr/local/python/bin/elastalert-create-index
-rwxr-xr-x 1 root root 430 Nov 17 13:40 /usr/local/python/bin/elastalert-rule-from-kibana
-rwxr-xr-x 1 root root 416 Nov 17 13:40 /usr/local/python/bin/elastalert-test-rule

4.软连接到 /usr/bin 下,方便使用

ln -s /usr/local/python/bin/elastalert* /usr/bin
  • elastalert 报警执行的命令,会根据报警规则执行相应操作。
  • elastalert-create-index 会创建一个索引,ElastAlert 会把执行记录存放到这个索引中,默认情况下,索引名叫 elastalert_status。其中有 4 个 _type,都有自己的 @timestamp 字段,所以同样也可以用 Kibana 来查看这个索引的日志记录情况。
  • elastalert-rule-from-kibana 从 Kibana3 已保存的仪表盘中读取 Filtering 设置,帮助生成config.yaml 里的配置。不过注意它只会读取 filtering,不包括 queries。
  • elastalert-test-rule 测试自定义配置中的 rule 设置。

5.创建 elastalert 索引

elastalert-create-index

在这里插入图片描述

2.3 部署 ElastAlert

1.主配置文件config.yaml

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

2.邮件告警配置

python -m elastalert.elastalert --verbose --config /data/elastalter/config.yaml --rule /data/elastalter/example_rules/visual-chart.yaml

三、接入平台

3.1 对外接口层

@Slf4j
@RestController
@RequestMapping("/webhook")
public class WebhookController {@AutowiredWebhookService webhookService;/*** 接收elastalert告警消息** @param request* @return*/@RequestMapping("/elastalert")public Result elastalert(HttpServletRequest request) throws IOException {//设置流的编码request.setCharacterEncoding("UTF-8");StringBuffer data = new StringBuffer();String line = null;BufferedReader reader = null;reader = request.getReader();while (null != (line = reader.readLine())) {data.append(line);}String result = data.toString().replace("@timestamp","timestamp");ElastalertAlarmMessageDTOS elastalertAlarmMessageDTOS = JSON.parseObject(result, ElastalertAlarmMessageDTOS.class);String jsonFlatten = JsonFlatten.jsonFlatten(elastalertAlarmMessageDTOS.getLog());elastalertAlarmMessageDTOS.setLog(jsonFlatten);log.info("请求数据===================>" + elastalertAlarmMessageDTOS);webhookService.handleElastalert(elastalertAlarmMessageDTOS);return Result.success();}
}

3.2 服务层

/*** 处理Elastalert消息** @param alarmMessages 告警消息*/
public void handleElastalert(ElastalertAlarmMessageDTOS alarmMessages) {String subject = String.format(MailConstants.ELASTALERT_SUBJECT_TEMPLATE, alarmMessages.get_index());String content = String.format(MailConstants.ELASTALERT_CONTENT_TEMPLATE_LARD, alarmMessages.get_index(),alarmMessages.get_index(), alarmMessages.getTimestamp(), alarmMessages.getLog(),alarmMessages.getMessage(), alarmMessages.get_id());try {msgService.sendLark(subject, content);} catch (Exception e) {log.error("发送错误日志告警通知异常, 主题:{}, 内容:{}", subject, content);}String indexName = serviceService.serviceName(alarmMessages.get_index());// 获取服务名称String serviceName = getServiceName(indexName);// 根据服务名获取服务信息TService service = serviceService.findByName(serviceName);if (service == null) {log.warn("处理Elastalert告警信息失败, 原因:未找到对应服务信息, 服务名称:{}", serviceName);}TElastalertAlarmRecord alarmRecord = new TElastalertAlarmRecord();alarmRecord.setAlarmTime(alarmMessages.getTimestamp().toString());alarmRecord.setBuId(service.getBuId());alarmRecord.setPath(alarmMessages.getLog());alarmRecord.setServiceName(serviceName);alarmRecord.setAlarmMessage(alarmMessages.getMessage());alarmRecordService.save(alarmRecord);// 查找该BU关联的用户List<TUser> users = userService.findByBuId(service.getBuId());users.removeIf(user -> MailConstants.WARN_SKIP_USERS.contains(user.getEmpNo()));if (CollectionUtils.isEmpty(users)) {log.warn("发送Elastalert告警通知邮件失败, 原因:未找到对应的负责人, 服务名称:{}", serviceName);}String[] to = users.stream().map(TUser::getEmail).collect(Collectors.toList()).toArray(new String[0]);String contentMail = String.format(MailConstants.ELASTALERT_CONTENT_TEMPLATE_LARD_MAIL, alarmMessages.get_index(),alarmMessages.get_index(), alarmMessages.getTimestamp(), alarmMessages.getLog(),alarmMessages.getMessage(), alarmMessages.get_id());try {msgService.sendHTMLMail(to, null, subject, contentMail);} catch (Exception e) {log.error("发送Elastalert告警通知邮件异常, 收件人:{}, 主题:{}, 内容:{}", to, subject, content);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/457359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb后端——控制反转IOC/依赖注入DI

控制反转&#xff1a;why&#xff0c;目标是要做到控制反转 依赖注入&#xff1a;how&#xff0c;如何实现控制反转&#xff0c;控制反转有很多方法&#xff0c;依赖注入是其中一种方法 控制反转&#xff08;Inversion of Control, IoC&#xff09;和依赖注入&#xff08;Depe…

JavaEE企业级应用软件开发—Spring框架入门学习笔记(一)

一、认识框架 实际开发中&#xff0c;随着业务的发展&#xff0c;软件系统变得越来越复杂&#xff0c;如果所有的软件都从底层功能开始开发&#xff0c;那将是一个漫长而繁琐的过程。此外&#xff0c;团队协作开发时&#xff0c;由于没有统一的调用规范&#xff0c;系统会出现大…

Java+SpringBoot:构建稳定高效的计算机基础教学平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

ORM模型类

模型 创建两个表 创建模型类 from django.db import models# Create your models here. class BookInfo(models.Model):name models.CharField(max_length10, uniqueTrue) # 书名pub_date models.DateField(nullTrue) # 发布时间read_count models.IntegerField(default…

【力扣 51】N 皇后(回溯+剪枝+深度优先搜索)

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…

【自然语言处理-工具篇】spaCy<1>--介绍及安装指南

目录 前言 安装指南 pip conda spaCy升级 总结 前言 spaCy是一个开源的自然语言处理库,用于处理和分析文本数据。它提供了许多功能,包括分词、词性标注

三网码支付系统源码,三网免挂有PC软件,有云端源码,附带系统搭建教程

搭建教程 1.先上传云端源码 然后配置Core/Config.php文件里面数据库信息注改&#xff1b;数据库帐号密码 2.云端源码里面Core/Api_Class/Instant_Url_List.php文件配置终端地址注改&#xff1b;第4 http://终端地址/ 3.导入云端数据库 账号admin 密码123456注改&#xff1…

Mysql进阶(事务)

一、数据库事务 数据库事务是访问并可能操作数据项的一个数据库操作序列&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作完成。 通俗的来讲&#xff0c;就是一次对数据库操作过程&#xff0c;这个过程由多条sql执行&#xff0c;这么…

二叉树的锯齿形遍历,力扣

目录 题目&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 解题方法&#xff1a; 相似题目对比分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 补充说明&#xff1a; 思路优化&#xff1a; 代码实现(层序遍历倒序)&#xff1a; 题…

MySQL进阶45讲【12】为什么你的MySQL偶尔会卡一下

1 前言 平时的工作中&#xff0c;不知道大家有没有遇到过这样的场景&#xff0c;一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持…

企业计算机服务器中了halo勒索病毒如何解密,halo勒索病毒数据恢复

对于众多的企业来说&#xff0c;数据是一个企业的发展的根基&#xff0c;通过数据可以更好地规划调整企业的发展方向&#xff0c;提高企业生产效率。但网络是一把双刃剑&#xff0c;网络技术的发展不仅会为企业带来极大便利&#xff0c;但也为企业数据安全带来严重威胁。近期&a…

如何决定K8S Pod的剔除优先级

在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;当节点资源面临压力时&#xff0c;如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后&#xff0c;引入了基于Pod优先级的调度策略&#xff0c;即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…