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

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

站在用戶的角度思考問題,與客戶深入溝通,找到黃浦網站設計與黃浦網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站制作、成都網站設計、企業(yè)官網、英文網站、手機端網站、網站推廣、域名注冊、網絡空間、企業(yè)郵箱。業(yè)務覆蓋黃浦地區(qū)。

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

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

asmip包: 

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

business包: 

    代碼插樁過濾器,使用責任連模式,對字節(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中怎么調用鏈和方法執(zhí)行耗時統(tǒng)計

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

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

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

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

               
用到的技術

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

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

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

? 源代碼

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

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

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

因為使用了責任鏈模式,會對代碼進行兩次插樁,目的就是為了后面容易擴展功能,相信看了對比你也能知道我的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中怎么調用鏈和方法執(zhí)行耗時統(tǒng)計”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網頁名稱:Java中怎么調用鏈和方法執(zhí)行耗時統(tǒng)計
本文網址:http://muchs.cn/article10/ghicdo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供手機網站建設、網頁設計公司、營銷型網站建設、虛擬主機、網站內鏈、靜態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網站建設