基于elasticsearch的自定义业务告警的设计思路

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

若是你也有这种场景,那么你就须要一个及时告警的功能。java

实现方案

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

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

没有ELK日志收集的方案

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

有ELK日志收集的方案

最核心的是 elasticsearch组件,全部的告警方案前提条件都是告警日志须要进ES,而后定时从ES中检索出符合业务规定的告警日志(好比ERROR日志),若是检索出来的告警日志知足必定条件就触发告警通知。api

实现方式主要有如下几种:框架

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

  • elastalert
    是Yelp公司基于python写的告警框架,你们能够去GitHub上查看具体使用方法。elastalertide

  • 自定义开发ui

自定义开发实现

主要由如下几个步骤实现:编码

  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);
}
相关文章
相关标签/搜索