<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          無(wú)論是異常監(jiān)控還是業(yè)務(wù)監(jiān)控,統(tǒng)統(tǒng)搞定

          共 2943字,需瀏覽 6分鐘

           ·

          2022-03-16 06:15

          點(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

          ?
          系統(tǒng)度量,通過(guò)指標(biāo)來(lái)度量系統(tǒng)是否正常,比如現(xiàn)在主流的Prometheus就是基于指標(biāo)來(lái)構(gòu)建監(jiān)控體系。
          ?

          Tracing

          ?
          鏈路跟蹤,用戶的一次請(qǐng)求將貫穿這個(gè)鏈路,想要進(jìn)行優(yōu)化或者知道請(qǐng)求在哪個(gè)環(huán)節(jié)出問(wèn)題,鏈路跟蹤必不可少。很多全鏈路跟蹤都借鑒了Google Dapper的思想。
          ?
          目前主流的鏈路跟蹤有skywalking,Jaeger,Cat等框架。這里面有需要客戶端埋點(diǎn),也有通過(guò)Agent代理方式實(shí)現(xiàn)。
          ?

          Logging

          ?
          日志,無(wú)論是系統(tǒng)異?;蛘叱绦虍惓]敵龅娜罩?,還是業(yè)務(wù)相關(guān)的日志,都能夠直觀的反應(yīng)當(dāng)前業(yè)務(wù)的狀態(tài),日志在監(jiān)控領(lǐng)域中用的也比較多。比如說(shuō)可以基于ELK啊,一些云服務(wù)的日志平臺(tái)去集中收集管理日志,在出問(wèn)題的時(shí)候方便溯源,同時(shí)也能基于關(guān)鍵詞等進(jìn)行告警。
          ?
          其實(shí)上面三種方式都是相輔相成的,各自有各自的適用場(chǎng)景。今天我們主要聊聊日志如何簡(jiǎn)單,快速的可以實(shí)現(xiàn)系統(tǒng)異常和業(yè)務(wù)的監(jiān)控,比較適合一些初創(chuàng)團(tuán)隊(duì),最小的成本方式實(shí)現(xiàn)監(jiān)控。


          日志埋點(diǎn)





          硬編碼埋點(diǎn)


          可以封裝一個(gè)工具類,對(duì)接口進(jìn)行埋點(diǎn)??梢暂敵鲆恍╆P(guān)鍵信息,比如:
          • 請(qǐng)求時(shí)間
          • 請(qǐng)求用戶
          • 請(qǐng)求的接口
          • 請(qǐng)求的RT
          • 請(qǐng)求是否成功
          • 請(qǐng)求的錯(cuò)誤碼
          • 是否壓測(cè)請(qǐng)求
          • 等等。。。。
          ?

          工具類偽代碼如下:

          public class BizLogUtils {    public static  T 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)保留出處。

          ?

          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91精品91久久久久77777 | 日本一区视频在线 | 拉拉免费观看视频大全高清 | 影音先锋AV黄色免费电影! | 麻豆成人无码精品视频 |