溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計

發(fā)布時間:2021-12-22 11:26:49 來源:億速云 閱讀:451 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計”吧!

bee-mite是我給這個項目取的一個名字,看下項目的目錄,代碼其實也不多。(現(xiàn)在獲取sessionid的功能我還沒做,這是很容易的,后面我會添加上去)


Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計


asmip包: 

    實現(xiàn)字節(jié)碼插樁,在類加載之前對字節(jié)碼進行修改,插入埋點。目前已經(jīng)實現(xiàn)了業(yè)務(wù)代碼調(diào)用鏈插樁,在方法執(zhí)行之前攔截獲取類名、方法名,方法調(diào)用的參數(shù),在方法執(zhí)行異常時,獲取到異常信息。還實現(xiàn)了方法執(zhí)行時間的埋點,在方法執(zhí)行之前獲取系統(tǒng)時間,發(fā)送一個日記事件,在方法執(zhí)行結(jié)束之后獲取系統(tǒng)時間,發(fā)送一個事件。


business包: 

    代碼插樁過濾器,使用責(zé)任連模式,對字節(jié)碼進行多次插樁。


ipevent包: 

    事件的封裝,埋點代碼拋出事件給線程池,線程池分派事件給監(jiān)聽器進行處理。


logs包:

    提供事件監(jiān)聽器接口,具體實現(xiàn)交由使用者實現(xiàn),我這里提供了兩個默認的實現(xiàn)類,在logimpl包下,默認的實現(xiàn)類只是將日記打印,在控制臺打印日記信息。

                  
使用方法

如何使用?我在項目中寫了個測試模塊,是個簡單的web項目,一個控制器UserHander,一個service層的實現(xiàn)類UserServiceImpl,當客戶端發(fā)送一個“/user/wujiuye/123”請求時,執(zhí)行鏈就是UserHander的queryUser方法->UserServiceImpl的queryUser方法。


Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計


這是一個spring boot項目。給VM options設(shè)置參數(shù),-javaagent:bee-mite.jar包的絕對路徑,當然后面還要跟個參數(shù),就是包名,要對bee-mite-webdemo項目中哪個包下的業(yè)務(wù)代碼進行插樁,如“com.wujiuye”,就是對“com.wujiuye”包下的所有的類都進行插樁,當然我過濾掉了接口、靜態(tài)方法,還過濾掉了get和set方法。


Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計


運行spring boot項目,在瀏覽器中輸入url,觀察看控制臺打印的信息如下。


Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計


               
用到的技術(shù)


這是用到了asm、javaagent、責(zé)任連模式。因為字節(jié)碼是插入到業(yè)務(wù)代碼中的,當執(zhí)行業(yè)務(wù)代碼的時候會執(zhí)行埋點代碼,如果處理程序也在業(yè)務(wù)代碼中進行那么這將是個耗時的操作,影響性能,拖慢一次請求的響應(yīng)速度,所以當埋點代碼執(zhí)行的時候,我是直接拋出一個消息事件,讓線程池分派消息給監(jiān)聽器處理事件,這樣就可以執(zhí)行耗時操作,比如將日記存儲到數(shù)據(jù)庫進行持久化,也可以使用redis存儲,便于后期進行項目代碼異常排查。

               
字節(jié)碼插樁做了什么


我在bee-mite模塊的test包下寫了兩個測試類,其中UserServiceImpl就是插樁的目標,運行TestAop的main方法,會在項目的targer/classes目錄下生成一個叫TargerProxy.class的文件,這個就是對UserServiceImpl插樁后的字節(jié)碼文件。來看下對比,到底bee-mite都幫我們做了什么。

? 源代碼

Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計    
Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計    
 

? asm對字節(jié)碼進行插樁后

Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計        

因為使用了責(zé)任鏈模式,會對代碼進行兩次插樁,目的就是為了后面容易擴展功能,相信看了對比你也能知道我的bee-mite都幫我插入了哪些代碼,這些代碼都是通過asm自己寫字節(jié)碼指令插入的。當然也不是很難,要說難就是try-catch代碼塊的插入了,沒有文檔看還是好難摸索出來的,visitTryCatchBlock方法的三個label的位置,以及catch塊處理異常算是個難點,我最終通過在源碼類中添加try-catch塊然后javap查看字節(jié)碼發(fā)現(xiàn)異常處理表


Exception table:
         from    to  target type
             0    27    30   Class java/lang/Exception

到此,相信大家對“Java中怎么調(diào)用鏈和方法執(zhí)行耗時統(tǒng)計”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI