本文介紹通過端云互聯(lián)請(qǐng)求服務(wù)調(diào)用鏈路和參數(shù)分析,有效地提高問題排查效率。

前提條件

IntelliJ IDEA中安裝2021.4.1及以上版本Cloud Toolkit。相關(guān)操作,請(qǐng)參見IntelliJ IDEA中安裝和配置Cloud Toolkit

背景信息

在應(yīng)用運(yùn)行過程中,當(dāng)出現(xiàn)服務(wù)調(diào)用異常或資源訪問失敗時(shí),開發(fā)人員通常會(huì)選擇斷點(diǎn)調(diào)試來排查問題。但斷點(diǎn)調(diào)試在某些場(chǎng)景下并不適用,可能存在如下問題:

  • 缺乏整體調(diào)用概況:上層服務(wù)收到請(qǐng)求后,往往會(huì)拆分成多個(gè)子請(qǐng)求,最后將這些子請(qǐng)求的處理結(jié)果進(jìn)行匯總。例如,服務(wù)收到請(qǐng)求后可能會(huì)先訪問緩存,當(dāng)緩存訪問超時(shí)后才訪問數(shù)據(jù)庫(kù),最后匯總數(shù)據(jù)返回。服務(wù)發(fā)起了哪些子請(qǐng)求?這些子請(qǐng)求的耗時(shí)如何?斷點(diǎn)調(diào)試難以明確這類問題。
  • 類嵌套太深,調(diào)試效率低下:得益于各種服務(wù)框架封裝,我們進(jìn)行微服務(wù)調(diào)用、緩存訪問、數(shù)據(jù)庫(kù)訪問等操作時(shí)無需知曉太多內(nèi)部處理細(xì)節(jié),但實(shí)際上往往是比較復(fù)雜的。從上層入口到底層異常之間通常嵌套多個(gè)類調(diào)用,并且包含各種同步和異步處理,這種情況下的斷點(diǎn)調(diào)試是非常困難。
  • 斷點(diǎn)調(diào)試本身影響系統(tǒng)性能:斷點(diǎn)調(diào)試過程一般耗時(shí)較長(zhǎng),而另一方面服務(wù)框架處理時(shí)會(huì)進(jìn)行超時(shí)判斷,使用斷點(diǎn)調(diào)試容易使調(diào)試本身的耗時(shí)造成服務(wù)處理超時(shí)。

啟用端云互聯(lián)并打印鏈路信息

  1. 啟動(dòng)IntelliJ IDEA。
  2. 在頂部菜單欄中選擇Tools > Alibaba Cloud > Preferences...
  3. Settings對(duì)話框中選擇Alibaba Cloud Toolkit > Microservice > Microservice
  4. Microservice頁面選中端云互聯(lián),單擊高級(jí)配置
  5. 高級(jí)配置對(duì)話框中選中打印鏈路信息,單擊OK
    端云互聯(lián)-高級(jí)配置
    說明 此能力依賴底層ARMS Agent埋點(diǎn)跟蹤,插件會(huì)在啟動(dòng)應(yīng)用時(shí)進(jìn)行掛載,您無需額外操作。

查看請(qǐng)求鏈路

啟動(dòng)應(yīng)用后,當(dāng)應(yīng)用發(fā)起服務(wù)調(diào)用或訪問外部資源時(shí),可看到輸出如下鏈路。

端云互聯(lián)-請(qǐng)求鏈路分析

鏈路輸出中包含如下信息:

  • TraceId:用于標(biāo)記請(qǐng)求的整體處理過程。在分布式微服務(wù)調(diào)用場(chǎng)景下,TraceId會(huì)從最前端的應(yīng)用節(jié)點(diǎn)透?jìng)髦料掠捂溌犯鱾€(gè)節(jié)點(diǎn),可根據(jù)此TraceIdEDAS控制臺(tái)ARMS控制臺(tái)查詢整體鏈路處理過程。
  • Service:當(dāng)前應(yīng)用的請(qǐng)求處理入口,如Spring Cloud服務(wù)、Dubbo服務(wù)、HSF服務(wù)等。
  • API:鏈路處理過程中的方法簽名。
  • Line:方法處理的具體行數(shù)。
  • Cost:此方法及其下游處理的耗時(shí),單位毫秒。
  • Ext:擴(kuò)展信息,包含請(qǐng)求處理狀態(tài)碼、數(shù)據(jù)庫(kù)訪問SQL、資源目標(biāo)地址等信息。
  • Console link:ARMS控制臺(tái)上收集的此鏈路信息。ARMS調(diào)用鏈采集為準(zhǔn)實(shí)時(shí),如打開此鏈接未展示調(diào)用鏈,請(qǐng)稍等片刻刷新頁面。

分析請(qǐng)求鏈路

通過查看請(qǐng)求鏈路,可以方便地了解請(qǐng)求處理過程中關(guān)鍵節(jié)點(diǎn)的概要信息。如果需要進(jìn)一步分析關(guān)鍵節(jié)點(diǎn)處理的參數(shù)、返回值或異常,可以結(jié)合插件中集成的Arthas進(jìn)一步分析。

  1. 在頂部菜單欄中選擇Tools > Alibaba Cloud > ... > Diagnostic Tools
    插件將會(huì)自動(dòng)下載Arthas包并啟動(dòng),在IDEA中的Terminal頁打開。Terminal
    說明IntelliJ IDEA中,應(yīng)用運(yùn)行在RunDebug頁,Arthas運(yùn)行在Terminal頁,使用時(shí)請(qǐng)進(jìn)行相應(yīng)切換。
  2. 選擇相應(yīng)進(jìn)程掛載Arthas,輸入進(jìn)程序列號(hào)并回車。
    進(jìn)入Arthas界面。Arthas界面
    說明 如本地使用容器模式進(jìn)行啟動(dòng),由于容器外無法看到容器內(nèi)進(jìn)程,因此需要手動(dòng)進(jìn)入容器掛載Arthas并觀測(cè)。
  3. 使用ArthasTrace命令和Watch命令進(jìn)行分析,并使用Exit命令退出Arthas。

    在請(qǐng)求鏈路分析中,可得到關(guān)鍵節(jié)點(diǎn)的類路徑和方法簽名。例如com.alibaba.edas.boot.DemoConsumerController.redisGetAndSet() ,類路徑為com.alibaba.edas.boot.DemoConsumerController,方法名為redisGetAndSet 。可以根據(jù)此信息進(jìn)行分析。

    • Trace命令

      Trace命令可查看方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)。在功能上,Arthas Trace命令跟查看請(qǐng)求鏈路相同,兩者埋點(diǎn)機(jī)制不同,您可綜合兩者進(jìn)行分析。

      Trace命令格式如下:

      trace <類路徑> <方法名>

      輸出樣例如下:

      Trace命令輸出樣例

      您可使用QCtrl+C退出此命令。

    • Watch命令

      Watch命令可觀測(cè)關(guān)鍵節(jié)點(diǎn)的方法處理結(jié)果,能觀察到的范圍為:入?yún)ⅰ⒎祷刂怠伋霎惓!?/p>

      Watch命令格式如下:

      watch <類路徑> <方法名> <觀測(cè)項(xiàng)> <條件>

      關(guān)于詳細(xì)命令使用,請(qǐng)參見Arthas官方文檔,此處使用常用的命令參數(shù)進(jìn)行說明。如下命令效果為,觀測(cè)com.alibaba.edas.boot.DemoConsumerController的方法redisGetAndSet,輸出方法調(diào)用時(shí)的入?yún)⒑头祷刂担⒅付ㄝ敵鼋Y(jié)果的屬性遍歷深度為2。

      watch com.alibaba.edas.boot.DemoConsumerController redisGetAndSet '{params,returnObj}' -x 2

      輸出結(jié)果如下:

      watch命令-輸出結(jié)果
      說明 示例中的屬性遍歷深度為2,通過調(diào)整此參數(shù),可以查看方法調(diào)用時(shí)復(fù)雜嵌套對(duì)象的具體屬性值。

      您可使用QCtrl+C退出此命令。

    • Exit命令

      如果需要結(jié)束使用Arthas,只需輸入exit并回車即可。