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); }
歡迎關注個人我的公衆號:JAVA日知錄