一、為什么要告警
一個(gè)業(yè)務(wù)系統(tǒng)維護(hù)了很長(zhǎng)時(shí)間了系冗,指不定什么時(shí)候會(huì)出現(xiàn)問(wèn)題奕扣。不過(guò)有些系統(tǒng)也是依賴(lài)微信、支付寶平臺(tái)的掌敬,大平臺(tái)都有自身的監(jiān)控和告警能力幫忙分析和定位商戶(hù)系統(tǒng)問(wèn)題惯豆,但并不是所有場(chǎng)景都能涵蓋到。所以個(gè)人負(fù)責(zé)的業(yè)務(wù)模塊需要制定合理的告警機(jī)制奔害,系統(tǒng)發(fā)生故障要第一時(shí)間知道楷兽,而不是被通知。
二华临、告警指標(biāo)
常見(jiàn)的指標(biāo)有請(qǐng)求量芯杀、失敗量、平均耗時(shí)等雅潭,其他指標(biāo)可以根據(jù)業(yè)務(wù)自身的特點(diǎn)來(lái)提取上報(bào)揭厚。
?三、告警閾值
告警的目的是出問(wèn)題了扶供,能夠馬上主動(dòng)發(fā)現(xiàn)問(wèn)題筛圆,簡(jiǎn)單的問(wèn)題甚至可以在被投訴和其他人發(fā)現(xiàn)前就能修復(fù)了。
如果一個(gè)系統(tǒng)上報(bào)的指標(biāo)多了椿浓,經(jīng)常會(huì)發(fā)生沒(méi)有設(shè)置告警閾值的情況太援。
尤其是對(duì)于后來(lái)新增的監(jiān)控指標(biāo)漾岳,尤其要注意是否設(shè)置監(jiān)控閾值。
可以針對(duì)請(qǐng)求量粉寞、失敗量尼荆,失敗率,平均耗時(shí)唧垦,耗時(shí)中位數(shù)設(shè)置合理的閾值捅儒,觸發(fā)閾值后發(fā)送告警通知。
四振亮、告警處理
我們要明確告警的目的巧还,告警是為了及時(shí)發(fā)現(xiàn)問(wèn)題,然后快速處理并恢復(fù)業(yè)務(wù)系統(tǒng)坊秸。告警信息要明確麸祷,不要誤告警。對(duì)于簡(jiǎn)單且能快速處理的問(wèn)題褒搔,可以允許間斷的發(fā)送告警阶牍;而對(duì)于相對(duì)復(fù)雜并且很長(zhǎng)時(shí)間才能解決的問(wèn)題,持續(xù)的告警就沒(méi)有意義星瘾,這時(shí)需要屏蔽告警走孽,問(wèn)題修復(fù)之后再重新恢復(fù)告警機(jī)制。因此告警模塊的靈活性配置是很重要的琳状,根據(jù)業(yè)務(wù)場(chǎng)景可以配置不通的策略磕瓷,另外也要支持屏蔽和恢復(fù)能力。
五念逞、告警收斂
復(fù)雜的業(yè)務(wù)系統(tǒng)往往都是多實(shí)例部署的困食,如果每個(gè)實(shí)例都發(fā)生問(wèn)題然后開(kāi)始發(fā)送告警信息,那么技術(shù)人員會(huì)收到很多條無(wú)意義的信息翎承,不利于告警信息分析硕盹。這時(shí)就要考慮對(duì)告警信息進(jìn)行收集分析了,保證每個(gè)業(yè)務(wù)場(chǎng)景的告警信息同一時(shí)間內(nèi)只是發(fā)送一次审洞。及時(shí)多實(shí)例告警信息做了收集分析莱睁,故障沒(méi)有及時(shí)處理待讳,告警信息會(huì)持續(xù)發(fā)送芒澜,這是就要固定周期內(nèi)發(fā)送告警信息,甚至可以通過(guò)配置進(jìn)行屏蔽掉创淡。告警一定要在系統(tǒng)故障的時(shí)候及時(shí)發(fā)出來(lái)痴晦,避免無(wú)意義的發(fā)送,否則技術(shù)人員會(huì)產(chǎn)生抵觸心里琳彩,甚至手機(jī)端直接屏蔽誊酌。
六部凑、合理閾值
告警模塊要支持不同的業(yè)務(wù)場(chǎng)景設(shè)置不同的告警閾值,如果是一個(gè)固定的閾值可能會(huì)引入一系列的誤告警碧浊。靈活的配置涂邀,配置中心的引入是少不了了。設(shè)置閾值時(shí)箱锐,要考慮同一個(gè)業(yè)務(wù)場(chǎng)景不同的時(shí)間段是不是需要設(shè)置不同的閾值比勉,不同的業(yè)務(wù)場(chǎng)景需要設(shè)置不同的閾值。比如某個(gè)特殊業(yè)務(wù)場(chǎng)景驹止,晚上的請(qǐng)求量比白天的請(qǐng)求量多浩聋;比如有的業(yè)務(wù)場(chǎng)景接口平均響應(yīng)時(shí)間比其他的都長(zhǎng);比如某些業(yè)務(wù)場(chǎng)景在某個(gè)時(shí)間段不進(jìn)行告警分析臊恋。
七衣洁、告警設(shè)計(jì)
成功量和失敗量的統(tǒng)計(jì)可以通過(guò)內(nèi)存變量(AtomicLong)進(jìn)行統(tǒng)計(jì),或者使用RxJava提供的window操作符會(huì)在時(shí)間間隔內(nèi)緩存統(tǒng)計(jì)結(jié)果抖仅,類(lèi)似于buffer緩存一個(gè)list集合坊夫,區(qū)別在于window將這個(gè)結(jié)果集合封裝成了observable。
使用RxJava可以很方便統(tǒng)計(jì)一個(gè)窗口內(nèi)服務(wù)的成功量撤卢、失敗量践樱、延遲分布情況。
像常用的中間件(redis凸丸、kafka拷邢、rocketmq、es)相關(guān)操作都可以通過(guò)切面利用RxJava統(tǒng)計(jì)健康和延遲情況屎慢,然后匯總到告警模塊進(jìn)行分析并觸發(fā)預(yù)警瞭稼。
八、總結(jié)
希望本文章的告警設(shè)計(jì)思路可以給讀者帶來(lái)啟發(fā)腻惠。一個(gè)優(yōu)秀的告警系統(tǒng)环肘,可以減少人力監(jiān)控,也是自動(dòng)化運(yùn)維的一種手段集灌。對(duì)于技術(shù)人員來(lái)說(shuō)悔雹,自己寫(xiě)的業(yè)務(wù)代碼出現(xiàn)問(wèn)題一定要自己第一時(shí)間知道,而不是被人通知欣喧。如果現(xiàn)有的告警能力不能滿(mǎn)足你的要求腌零,一定要從長(zhǎng)遠(yuǎn)的角度出發(fā),制定告警方案唆阿,而不是把大部分精力都放在日志查詢(xún)上益涧。