本文介紹通過端云互聯請求服務調用鏈路和參數分析,有效地提高問題排查效率。

前提條件

在IntelliJ IDEA中安裝2021.4.1及以上版本Cloud Toolkit。相關操作,請參見在IntelliJ IDEA中安裝和配置Cloud Toolkit。

背景信息

在應用運行過程中,當出現服務調用異?;蛸Y源訪問失敗時,開發人員通常會選擇斷點調試來排查問題。但斷點調試在某些場景下并不適用,可能存在如下問題:

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

啟用端云互聯并打印鏈路信息

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

查看請求鏈路

啟動應用后,當應用發起服務調用或訪問外部資源時,可看到輸出如下鏈路。

端云互聯-請求鏈路分析

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

  • TraceId:用于標記請求的整體處理過程。在分布式微服務調用場景下,TraceId會從最前端的應用節點透傳至下游鏈路各個節點,可根據此TraceId在EDAS控制臺ARMS控制臺查詢整體鏈路處理過程。
  • Service:當前應用的請求處理入口,如Spring Cloud服務、Dubbo服務、HSF服務等。
  • API:鏈路處理過程中的方法簽名。
  • Line:方法處理的具體行數。
  • Cost:此方法及其下游處理的耗時,單位毫秒。
  • Ext:擴展信息,包含請求處理狀態碼、數據庫訪問SQL、資源目標地址等信息。
  • Console link:ARMS控制臺上收集的此鏈路信息。ARMS調用鏈采集為準實時,如打開此鏈接未展示調用鏈,請稍等片刻刷新頁面。

分析請求鏈路

通過查看請求鏈路,可以方便地了解請求處理過程中關鍵節點的概要信息。如果需要進一步分析關鍵節點處理的參數、返回值或異常,可以結合插件中集成的Arthas進一步分析。

  1. 在頂部菜單欄中選擇Tools > Alibaba Cloud > ... > Diagnostic Tools
    插件將會自動下載Arthas包并啟動,在IDEA中的Terminal頁打開。Terminal
    說明 在IntelliJ IDEA中,應用運行在Run或Debug頁,Arthas運行在Terminal頁,使用時請進行相應切換。
  2. 選擇相應進程掛載Arthas,輸入進程序列號并回車。
    進入Arthas界面。Arthas界面
    說明 如本地使用容器模式進行啟動,由于容器外無法看到容器內進程,因此需要手動進入容器掛載Arthas并觀測。
  3. 使用Arthas的Trace命令和Watch命令進行分析,并使用Exit命令退出Arthas。

    在請求鏈路分析中,可得到關鍵節點的類路徑和方法簽名。例如com.alibaba.edas.boot.DemoConsumerController.redisGetAndSet() ,類路徑為com.alibaba.edas.boot.DemoConsumerController,方法名為redisGetAndSet 。可以根據此信息進行分析。

    • Trace命令

      Trace命令可查看方法內部調用路徑,并輸出方法路徑上的每個節點上耗時。在功能上,Arthas Trace命令跟查看請求鏈路相同,兩者埋點機制不同,您可綜合兩者進行分析。

      Trace命令格式如下:

      trace <類路徑> <方法名>

      輸出樣例如下:

      Trace命令輸出樣例

      您可使用Q或Ctrl+C退出此命令。

    • Watch命令

      Watch命令可觀測關鍵節點的方法處理結果,能觀察到的范圍為:入參、返回值、拋出異常。

      Watch命令格式如下:

      watch <類路徑> <方法名> <觀測項> <條件>

      關于詳細命令使用,請參見Arthas官方文檔,此處使用常用的命令參數進行說明。如下命令效果為,觀測com.alibaba.edas.boot.DemoConsumerController的方法redisGetAndSet,輸出方法調用時的入參和返回值,并指定輸出結果的屬性遍歷深度為2。

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

      輸出結果如下:

      watch命令-輸出結果
      說明 示例中的屬性遍歷深度為2,通過調整此參數,可以查看方法調用時復雜嵌套對象的具體屬性值。

      您可使用Q或Ctrl+C退出此命令。

    • Exit命令

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