無(wú)論是異常監(jiān)控還是業(yè)務(wù)監(jiān)控,統(tǒng)統(tǒng)搞定
點(diǎn)擊上方藍(lán)字“設(shè)為星標(biāo)”
大家好,我是【架構(gòu)擺渡人】,一只十年的程序猿。這是實(shí)踐經(jīng)驗(yàn)系列的第十二篇文章,這個(gè)系列會(huì)給大家分享很多在實(shí)際工作中有用的經(jīng)驗(yàn),如果有收獲,還請(qǐng)分享給更多的朋友。
?

監(jiān)控三板斧
在監(jiān)控領(lǐng)域,最常用的三種方式就是Metrics, Tracing,Logging,可以稱之為三板斧。
?

?
Metrics
Tracing
Logging

日志埋點(diǎn)
硬編碼埋點(diǎn)
請(qǐng)求時(shí)間 請(qǐng)求用戶 請(qǐng)求的接口 請(qǐng)求的RT 請(qǐng)求是否成功 請(qǐng)求的錯(cuò)誤碼 是否壓測(cè)請(qǐng)求 等等。。。。
工具類偽代碼如下:
public class BizLogUtils {public staticT run(Supplier supplier, BizLogContent content, BiConsumer {callbackResult) long start = System.currentTimeMillis();try {T result = supplier.get();if (result instanceof ResponseData) {ResponseData resp = (ResponseData)result;content.setBizCode(resp.getCode());}callbackResult.accept(result, content);return result;} catch (Exception e) {if (e instanceof BizException) {BizException he = (BizException)e;content.setBizCode(he.getCode());} else {content.setBizCode(ErrorCode.SERVER_ERROR_CODE.getCode());}content.setErrorMessage(e.getMessage());throw e;} finally {content.setExecTime(System.currentTimeMillis() - start);content.setEnv(EnvConfig.getEnv());BizLogger.info(content);}}}
?
ResponseData 是接口層的統(tǒng)一響應(yīng)類,所以這邊可以直接強(qiáng)制裝換。
?
BizLogContent 就是你要輸出的日志內(nèi)容。
?
在這里把異常給轉(zhuǎn)換成錯(cuò)誤碼進(jìn)行打印,如果有特殊的需求,也可以定義一個(gè)callback讓使用自行進(jìn)行異常到異常碼的轉(zhuǎn)換操作,更靈活。
?
使用方式:
?
BizLogContent bizLogContent = new BizLogContent(xx,xx,xx);return BizLogUtils.run(() -> {// 業(yè)務(wù)邏輯}, bizLogContent, (resp, content)-> {// resp 上面業(yè)務(wù)邏輯的響應(yīng)結(jié)果,有的場(chǎng)景需要獲取結(jié)果中的內(nèi)容埋點(diǎn)// content 也就是bizLogContent,拿到結(jié)果set進(jìn)去});
?
調(diào)整logback的配置,將日志要單獨(dú)輸出到一個(gè)文件,方便采集。格式可以是Json,也就是文本,如果是文本,可以用一個(gè)特殊的分隔符進(jìn)行分隔,比如 2022-01-01|makeOrder|1001|success 。
自定義注解埋點(diǎn)
當(dāng)硬編碼的工具類有了,讓使用更方便的做法就是自定義注解。通過(guò)定義注解,配置要采集的字段信息,通過(guò)注解加切面的方式來(lái)統(tǒng)一進(jìn)行處理,這樣就減少了代碼的侵入性。
?
這邊就不貼代碼了,無(wú)非就是自定義注解,然后進(jìn)行數(shù)據(jù)的提取。這里可以用SPEL表達(dá)式進(jìn)行提取。
?
比如:
?
@BizLog(domain = BizLogConstant.SYNC, biz = BizLogConstant.SYNC_ORDER,bizId = @BizLogField(key = "bizId", value = "#response.data.orderId",addition = {@BizLogField(key = "userId", value = "#request.userId"),@BizLogField(key = "count", value = "#request.count")}))public ResponseData syncOrder(SyncOrderRequest request) {}
?

總結(jié)
大家可以看到,通過(guò)日志埋點(diǎn)成本是非常低的。只需要開(kāi)發(fā)一套日志賣點(diǎn)的工具類即可。然后將埋點(diǎn)的數(shù)據(jù)進(jìn)行日志輸出,然后進(jìn)行日志收集就可以實(shí)現(xiàn)告警,和圖表大盤的構(gòu)建之類的,非常方便。
?
同樣,本文的思路還可以應(yīng)用到其他場(chǎng)景,比如操作日志的輸出,也可以采用類似的方式去實(shí)現(xiàn)埋點(diǎn),日志收集,數(shù)據(jù)展示。
?
原創(chuàng):架構(gòu)擺渡人(公眾號(hào)ID:jiagoubaiduren),歡迎分享,轉(zhuǎn)載請(qǐng)保留出處。
?
