您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何設(shè)計(jì)elasticsearch的自定義業(yè)務(wù)告警”,在日常操作中,相信很多人在如何設(shè)計(jì)elasticsearch的自定義業(yè)務(wù)告警問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何設(shè)計(jì)elasticsearch的自定義業(yè)務(wù)告警”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
A系統(tǒng)與B系統(tǒng)之間有很多接口交互,但是有一段時(shí)間接口經(jīng)常報(bào)錯(cuò),作為開(kāi)發(fā)如果不能第一時(shí)間知道問(wèn)題且及時(shí)解決的話就會(huì)收到業(yè)務(wù)投訴,當(dāng)月績(jī)效涼涼。
如果你也有這種場(chǎng)景,那么你就需要一個(gè)及時(shí)告警的功能。
實(shí)現(xiàn)及時(shí)告警分以下兩種場(chǎng)景:
有ELK日志收集
沒(méi)有ELK日志收集
很簡(jiǎn)單,搭建一個(gè)日志收集環(huán)境(O(∩_∩)O哈哈~)需要在業(yè)務(wù)代碼中嵌入硬編碼,每次catch到異常直接發(fā)送告警信息告警平臺(tái)進(jìn)行告警
最核心的是 elasticsearch組件,所有的告警方案前提條件都是告警日志需要進(jìn)ES,然后定時(shí)從ES中檢索出符合業(yè)務(wù)規(guī)定的告警日志(比如ERROR日志),如果檢索出來(lái)的告警日志滿足一定條件就觸發(fā)告警通知。
實(shí)現(xiàn)方式主要有以下幾種:
ES WATCHER 這個(gè)是elasticsearch的官方插件,它可以根據(jù)數(shù)據(jù)的變化提供警報(bào)和通知,目前是收費(fèi)的,具體操作配置可以參看官方地址
elastalert 是Yelp公司基于python寫(xiě)的告警框架,大家可以去GitHub上查看具體使用方法。elastalert
自定義開(kāi)發(fā)
主要由以下幾個(gè)步驟實(shí)現(xiàn):
分離出單獨(dú)的告警日志,與業(yè)務(wù)日志分離
在logstash中解析日志,構(gòu)建格式化的告警日志,需要有以下幾個(gè)關(guān)鍵參數(shù): 日志級(jí)別、日志時(shí)間、日志描述、開(kāi)發(fā)模塊、關(guān)聯(lián)主鍵、請(qǐng)求參數(shù)、響應(yīng)參數(shù)
定時(shí)任務(wù)每隔一段時(shí)間去ES中檢索符合要求的日志,如果檢索到就發(fā)送告警通知。
日志格式化 我們直接在客戶端構(gòu)建好格式化的日志,以json的形式輸出到日志文件中,這樣在logstash解析的時(shí)候直接使用json解析即可。 這一步不是必須的,可以自由構(gòu)建日志格式,然后在logstash解析的時(shí)候使用grok語(yǔ)法進(jìn)行解析。
public class AlarmLog { /**日志級(jí)別*/ private String logLevel; /**日志描述*/ private String message; /**關(guān)聯(lián)主鍵 一般使用requestId*/ private String refCode; /**請(qǐng)求參數(shù)*/ private String parm; /**響應(yīng)數(shù)據(jù)*/ private String response; /**開(kāi)發(fā)模塊,根據(jù)此參數(shù)配置模塊負(fù)責(zé)人*/ private String module; /**日志時(shí)間*/ private long logTime; ... }
關(guān)鍵查詢 在單獨(dú)的定時(shí)器項(xiàng)目中使用如下查詢語(yǔ)法就可以檢索出具體的告警日志。檢索出來(lái)就可以根據(jù)日志中的模塊字段找出具體的模塊負(fù)責(zé)人,然后發(fā)送告警通知給負(fù)責(zé)人。
public List<LogDoc> findRangeLogByLevel(DateTime minRange, DateTime maxRange, String logLevel) { //需要強(qiáng)制轉(zhuǎn)換成小寫(xiě) 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); }
到此,關(guān)于“如何設(shè)計(jì)elasticsearch的自定義業(yè)務(wù)告警”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。