Java異常監(jiān)控(監(jiān)控利器)
介紹
說到監(jiān)控,很多人可能會(huì)第一時(shí)間想到各種指標(biāo),比如資源類的cpu,內(nèi)存,磁盤使用率,或者應(yīng)用層的請(qǐng)求數(shù),成功率,延遲等。但是將應(yīng)用程序中的異常文本導(dǎo)出為指標(biāo)進(jìn)行監(jiān)控,這種情況卻很少有人提到。 這個(gè)也是本片文章要介紹的內(nèi)容,一個(gè)很簡(jiǎn)單但是很有用的監(jiān)控利器,java異常監(jiān)控。當(dāng)然,這里也可以是其他語言的異常,比如python,go等。
優(yōu)點(diǎn)說明
這里說明下java異常監(jiān)控的幾大優(yōu)點(diǎn):
- 簡(jiǎn)單:使用java異常監(jiān)控的方式,可以很簡(jiǎn)單的發(fā)現(xiàn)線上的潛在問題,因?yàn)槟苡|發(fā)異常的肯定是意外情況,只要有java異常,就能代表出現(xiàn)了一些意外的情況,同時(shí)排查起來也簡(jiǎn)單,不像是接口的請(qǐng)求數(shù)和成功率,如果出現(xiàn)異常指標(biāo),排查起來耗費(fèi)時(shí)間,而且也很容易誤報(bào)。
- 全面:監(jiān)控指標(biāo)時(shí)很多時(shí)候都是根據(jù)經(jīng)驗(yàn)提前設(shè)置規(guī)則進(jìn)行預(yù)警,比如cpu使用率,請(qǐng)求成功率等,但是如果發(fā)生了意料之外的情況則很可能監(jiān)測(cè)不到。而java異常監(jiān)控可以全面的監(jiān)控到服務(wù)的問題,不管是業(yè)務(wù)代碼拋出的異常,還是沒有預(yù)想到的其他組件拋出的異常,都能被監(jiān)控到。
- 有效:通過每天進(jìn)行java異常巡檢,能夠有效的發(fā)現(xiàn)線上的異常,包括業(yè)務(wù)問題和組件問題,都能第一時(shí)間發(fā)現(xiàn)。同時(shí)也能有效的協(xié)助排查問題,比如線上出問題了,你看下java異常監(jiān)控,就能知道是什么服務(wù)在報(bào)錯(cuò),甚至可能可以直接根據(jù)異常鎖定錯(cuò)誤原因。
- 自定義:開發(fā)可以自定義異常,當(dāng)出現(xiàn)想要監(jiān)控的情況時(shí),在代碼中打印異常日志,這些異常就會(huì)被抓取并展示出來,運(yùn)維人員巡檢時(shí)就會(huì)發(fā)現(xiàn)這些異常并提醒開發(fā)進(jìn)行處理,這樣開發(fā)就可以簡(jiǎn)單的增加自己想要關(guān)注的監(jiān)控事項(xiàng)
使用方式
將java異常導(dǎo)入到prometheus生成指標(biāo)后,就可以開始進(jìn)行監(jiān)控,這里說明幾種監(jiān)控的使用方式:
- 日常巡檢:在grafana上展示java異常數(shù)據(jù),每日進(jìn)行巡檢,可以及時(shí)發(fā)現(xiàn)線上的異常
- 問題排查:需要緊急排查線上問題時(shí),可以展示最近幾分鐘的java異常,作為排查問題的參考
- 實(shí)時(shí)預(yù)警:配置報(bào)警規(guī)則,滿足條件時(shí)實(shí)時(shí)報(bào)警,比如觸發(fā)釘釘報(bào)警,用于快速發(fā)現(xiàn)線上的異常情況
這里提供一個(gè)grafana展示的異常報(bào)警界面。

基礎(chǔ)設(shè)施
- 需要有prometheus用于存儲(chǔ)指標(biāo)
- 需要有g(shù)rafana用于查詢展示指標(biāo)
- 需要有日志集中收集系統(tǒng),方便后續(xù)日志的統(tǒng)一處理
- 需要安裝mtail用于解析和導(dǎo)出異常指標(biāo)
實(shí)現(xiàn)流程
這個(gè)實(shí)現(xiàn)方式比較簡(jiǎn)單,這里先總體介紹下流程,首先是定義好指定的異常格式,然后再log4j這種日志框架中將異常日志額外存儲(chǔ)到一個(gè)文件,接著依靠日志集中收集系統(tǒng),將各個(gè)服務(wù)的異常日志收集到日志機(jī)器上,然后使用mtail追蹤異常日志并解析為指標(biāo),將指標(biāo)導(dǎo)出到prometheus。 指標(biāo)數(shù)據(jù)生成后,就可以配置查詢規(guī)則進(jìn)行g(shù)rafana展示以及進(jìn)行實(shí)時(shí)報(bào)警了。
日志打印
第一步首先是定義好需要收集的異常級(jí)別,一般就是error級(jí)別,不需要額外指定,然后是異常的日志格式,這個(gè)可以根據(jù)自己的需要配置log4j這種框架的日志格式,可以打印拋出異常的方法,異常類,異常信息,所屬模塊等,這里提供一個(gè)log4j2的部分配置以供參考
<Appenders>
<RollingFile name="error_log" fileName="${filepath}/error/${filename}.log"
filePattern="${filepath}/error/${filename}.log-%d{yyyy-MM-dd-HH}">
<ThrowableFilter type="useLocation" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}\t${module}\t%class\t%method\t%line\t%throwable{1}\t%m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${filepath}" maxDepth="2">
<IfFileName glob="*.log-*" />
<IfLastModified age="1h" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="error_log_for_throw" fileName="${filepath}/error/${filename}.log"
filePattern="${filepath}/error/${filename}.log-%d{yyyy-MM-dd-HH}">
<ThrowableFilter type="useThrowable" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}\t${module}\t%throwable{short.className}\t%throwable{short.methodName}\t%throwable{short.lineNumber}\t%throwable{1}\t%m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${filepath}" maxDepth="2">
<IfFileName glob="*.log-*" />
<IfLastModified age="1h" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>自定義日志打印
有個(gè)特殊的情況需要說明下,可以通過指定特殊的日志格式收集業(yè)務(wù)自定義異常,比如提前和開發(fā)說好,當(dāng)出現(xiàn)需要關(guān)注的嚴(yán)重業(yè)務(wù)問題時(shí),可以使用error級(jí)別打印日志,這樣運(yùn)維這邊就會(huì)在巡檢時(shí)發(fā)現(xiàn)并提醒開發(fā)處理。這種方式可以讓開發(fā)自由的增加業(yè)務(wù)異常監(jiān)控,提高了監(jiān)控的全面性。
日志收集
這部分就是日志收集系統(tǒng)的作用,將各個(gè)服務(wù)的異常日志文件統(tǒng)一收集到日志機(jī)器上的一個(gè)文件中,用于后續(xù)的mtail解析
mtail解析和導(dǎo)出異常監(jiān)控信息
把異常日志的文件路徑配置到mtail的啟動(dòng)命令上,讓mtail解析異常日志,這里提供一個(gè)參考的配置。修改后重啟mtail就能以標(biāo)準(zhǔn)格式導(dǎo)出指標(biāo)給prometheus了。
counter java_error_log by ip,type,module,class,method,line,exception
getfilename() == "/java/error/log/file.log" {
/(?P<ip>[\S ]*)\t(?P<type>[\S ]*)\t([\S ]*)\t(?P<module>[\S ]*)\t(?P<class>[\S ]*)\t(?P<method>[\S ]*)\t(?P<line>[\S ]*)\t(?P<exception>[\S \t]*)[\n\t\S\s.]*/ {
java_error_log[$ip][$type][$module][$class][$method][$line][$exception]++
}
}prometheus抓取mtail導(dǎo)出的數(shù)據(jù)
配置prometheus抓取mtail的數(shù)據(jù),這個(gè)增加個(gè)配置重啟prometheus就行了
- job_name: 'mtail-moniter'
static_configs:
- targets: ['11.11.11.11:3903']
labels:
exporter: 'mtail'grafana展示異常數(shù)據(jù)
現(xiàn)在數(shù)據(jù)已經(jīng)存入prometheus中了,可以通過grafana進(jìn)行展示,這里也提供一個(gè)參考的grafana查詢的sql,可以按照時(shí)間維度把最近出現(xiàn)的和 數(shù)量有增長(zhǎng)的異常都查詢出來. 其中 __range 和 {__from:date:seconds}都是grafana的變量
(
sum(
java_error_log
- min_over_time(
java_error_log[$__range]
)
) by(module,class,exception,line,method) > 0
or (
sum(
java_error_log
) by(module,class,exception,line,method) > 0
unless
count(
java_error_log
@ ${__from:date:seconds}) by(module,class,exception,line,method) > 0
)
)結(jié)語
通過以上的簡(jiǎn)單配置就能擁有一個(gè)java異常監(jiān)控,各位讀者可以都去試試,這個(gè)監(jiān)控方式在我司已經(jīng)使用了很久了,能很有效的發(fā)現(xiàn)一些潛在問題。
到此這篇關(guān)于Java異常監(jiān)控(監(jiān)控利器)的文章就介紹到這了,更多相關(guān)java異常監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java必學(xué)必會(huì)之網(wǎng)絡(luò)編程
java必學(xué)必會(huì)之網(wǎng)絡(luò)編程,學(xué)習(xí)了解java網(wǎng)絡(luò)編程、網(wǎng)絡(luò)通信協(xié)議、TCP協(xié)議和UDP協(xié)議,對(duì)各個(gè)協(xié)議進(jìn)行深入學(xué)習(xí),做到必學(xué)必會(huì)2015-12-12
SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印
本文主要介紹了SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
springBoot 創(chuàng)建定時(shí)任務(wù)過程詳解
這篇文章主要介紹了springBoot 創(chuàng)建定時(shí)任務(wù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java數(shù)據(jù)結(jié)構(gòu)之選擇排序算法的實(shí)現(xiàn)與優(yōu)化
選擇排序:(Selection?sort)是一種簡(jiǎn)單直觀的排序算法,也是一種不穩(wěn)定的排序方法。本文主要為大家介紹一下選擇排序的實(shí)現(xiàn)與優(yōu)化,希望對(duì)大家有所幫助2023-01-01
SpringBoot創(chuàng)建多模塊項(xiàng)目的全過程記錄
這篇文章主要給大家介紹了關(guān)于SpringBoot創(chuàng)建多模塊項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
IDEA代碼熱部署和熱加載的三種實(shí)現(xiàn)方案
在日常開發(fā)中,我們需要經(jīng)常修改 Java 代碼,手動(dòng)重啟項(xiàng)目,查看修改后的效果,如果在項(xiàng)目小時(shí),重啟速度比較快,等待的時(shí)間是較短的,我們可以使用代碼熱加載和熱部署解決該問題,本文給大家介紹了三種實(shí)現(xiàn)方案,需要的朋友可以參考下2023-11-11

