基於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);
}

歡迎關注個人我的公衆號:JAVA日知錄

相關文章
相關標籤/搜索