A系统与B系统之间有很多接口交互,但是有一段时间接口经常报错,作为开发如果不能第一时间知道问题且及时解决的话就会收到业务投诉,当月绩效凉凉。

如果你也有这种场景,那么你就需要一个及时告警的功能。

实现方案

实现及时告警分以下两种场景:

  • 有ELK日志收集
  • 没有ELK日志收集

没有ELK日志收集的方案

~~很简单,搭建一个日志收集环境(O(∩_∩)O哈哈~)~~
需要在业务代码中嵌入硬编码,每次catch到异常直接发送告警信息告警平台进行告警

有ELK日志收集的方案

最核心的是 elasticsearch组件,所有的告警方案前提条件都是告警日志需要进ES,然后定时从ES中检索出符合业务规定的告警日志(比如ERROR日志),如果检索出来的告警日志满足一定条件就触发告警通知。

实现方式主要有以下几种:

  • ES WATCHER
    这个是elasticsearch的官方插件,它可以根据数据的变化提供警报和通知,目前是收费的,具体操作配置可以参看官方地址

  • elastalert
    是Yelp公司基于python写的告警框架,大家可以去GitHub上查看具体使用方法。elastalert

  • 自定义开发

自定义开发实现

主要由以下几个步骤实现:

  1. 分离出单独的告警日志,与业务日志分离
  2. 在logstash中解析日志,构建格式化的告警日志,需要有以下几个关键参数:
    日志级别、日志时间、日志描述、开发模块、关联主键、请求参数、响应参数
  3. 定时任务每隔一段时间去ES中检索符合要求的日志,如果检索到就发送告警通知。

核心代码

  1. 日志格式化
    我们直接在客户端构建好格式化的日志,以json的形式输出到日志文件中,这样在logstash解析的时候直接使用json解析即可。
    这一步不是必须的,可以自由构建日志格式,然后在logstash解析的时候使用grok语法进行解析。
public class AlarmLog {
    /**日志级别*/
    private String logLevel;
    /**日志描述*/
    private String message;
    /**关联主键 一般使用requestId*/
    private String refCode;
    /**请求参数*/
    private String parm;
    /**响应数据*/
    private String response;
    /**开发模块,根据此参数配置模块负责人*/
    private String module;
    /**日志时间*/
    private long logTime;
    ...
}
  1. 关键查询
    在单独的定时器项目中使用如下查询语法就可以检索出具体的告警日志。检索出来就可以根据日志中的模块字段找出具体的模块负责人,然后发送告警通知给负责人。
public List<LogDoc> findRangeLogByLevel(DateTime minRange, DateTime maxRange, String logLevel) {
    //需要强制转换成小写
    logLevel = logLevel.toLowerCase();
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(boolQuery()
                    //module 必须有值才能告警
                    .must(existsQuery("module"))
                    .must(termQuery("logLevel", logLevel))
                    .must(rangeQuery("logTime")
                            .from(minRange.getMillis())
                            .to(maxRange.getMillis())))
            .build();

    return elasticsearchTemplate.queryForList(searchQuery, LogDoc.class);
}

更多精彩内容请关注公众号:JAVA日知录

基于elasticsearch的自定义业务告警的设计思路的更多相关文章

  1. Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路

    前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...

  2. 基于Elasticsearch的自定义评分算法扩展

    实现思路: 重写评分方法,调整计算文档得分的过程,然后根据function_score或script_sort进行排序检索.   实现步骤: 1.新建java项目TestProject,引入Elast ...

  3. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  4. 基于django的自定义简单session功能

    基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ...

  5. EventStore的设计思路

    EventStore的设计思路 最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event ...

  6. 基于Elasticsearch搜索平台设计

    背景 随着公司业务的高速发展以及数据爆炸式的增长,当前公司各产线都有关于搜索方面的需求,但是以前的搜索服务系统由于架构与业务上的设计,不能很好的满足各个业务线的期望,主要体现下面三个问题: 不能支持对 ...

  7. 基于特定领域国土GIS应用框架设计及应用

              基于特定领域国土GIS应用框架 设计及应用              何仕国 2012年8月16日   摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...

  8. 自定义生命周期的设计(iOS篇)

    自定义生命周期的设计(iOS篇) 首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻 ...

  9. 基于 WPF 模块化架构下的本地化设计实践

    背景描述 最近接到一个需求,就是要求我们的 WPF 客户端具备本地化功能,实现中英文多语言界面.刚开始接到这个需求,其实我内心是拒绝的的,但是没办法,需求是永无止境的.所以只能想办法解决这个问题. 首 ...

随机推荐

  1. iOS8 新特性

    iOS8新特性主要体现在4方面 1.UIAlertController 对alert&actionSheet的封装 UIAlertController.h 提示框按钮的选择 typedef N ...

  2. wps10.1中将txt转为excel

    1.将想要保存的内容保存为txt格式,用分隔符分隔好(包括空格.制表符.英文的逗号以及分号四种). 2.打开wps 3.点击数据->导入数据,选择刚才的txt文件 4.一步步操作,即可.

  3. Treap + 无旋转Treap 学习笔记

    普通的Treap模板 今天自己实现成功 /* * @Author: chenkexing * @Date: 2019-08-02 20:30:39 * @Last Modified by: chenk ...

  4. 2018CCPC 吉林现场赛 赛后总结

    一直以来都没有比赛完写总结的习惯,导致前面几次比赛都没有写过总结. 这是我写的第一场总结把,有时间有想法还记得细节的话再把前面几次比赛的总结给补上把. 热身赛: 热身赛的时候,写的比较急想着快点做出题 ...

  5. BZOJ-2535 航空管制 toposort

    题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理. 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件. 对于第一问,直接toposort 然后反着输出求出的 ...

  6. PAT 天梯杯 L2-014 列车调度

    火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口 ...

  7. 携程PMO--小罗说敏捷之WIP限制在制品

    转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo)         WIP是什么?   WIP(work in progress)指的就是工作中心在制品区.在经过部分制程之后,还没有 ...

  8. vue.js安装教程

    vue.js环境搭建 1.下载node.js 网址:https://nodejs.org/en/ 版本:v10.16.3 2.安装node.js Node.js下载如下所示: 检查nodejs是否安装 ...

  9. 你该用HTTP2了

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. HTTP版本简史 HTTP/0.9: (1991年)基于GET请求的文本传输协议 HTTPS: (1994年)安全的 ...

  10. 使用xampp将angular项目运行在web服务器

    需求 在开发angular项目时,因为需要做自适配以适应不同的屏幕,而我的电脑只有1366的.所以我现在需要在本地将angular项目运行在xampp上,然后用手机开热点,给本机和另一台大屏电脑或手机 ...