A系统与B系统之间有不少接口交互,可是有一段时间接口常常报错,做为开发若是不能第一时间知道问题且及时解决的话就会收到业务投诉,当月绩效凉凉。html
若是你也有这种场景,那么你就须要一个及时告警的功能。java
实现及时告警分如下两种场景:python
~~很简单,搭建一个日志收集环境(O(∩_∩)O哈哈~)~~
须要在业务代码中嵌入硬编码,每次catch到异常直接发送告警信息告警平台进行告警json
最核心的是 elasticsearch组件,全部的告警方案前提条件都是告警日志须要进ES,而后定时从ES中检索出符合业务规定的告警日志(好比ERROR日志),若是检索出来的告警日志知足必定条件就触发告警通知。api
实现方式主要有如下几种:框架
ES WATCHER
这个是elasticsearch的官方插件,它能够根据数据的变化提供警报和通知,目前是收费的,具体操做配置能够参看官方地址elasticsearch
elastalert
是Yelp公司基于python写的告警框架,你们能够去GitHub上查看具体使用方法。elastalertide
自定义开发ui
主要由如下几个步骤实现:编码
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; ... }
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); }