全部產品
Search
文件中心

Application Real-Time Monitoring Service:異常分析

更新時間:Apr 29, 2025

為Java應用安裝探針後,ARMS即可開始監控Java應用,您可以在異常分析頁面按照異常名稱、介面名稱、主機對異常次數、異常列表進行篩選分析,最佳化產生異常的代碼。

重要

ARMS應用監控面向已開通新版計費的使用者提供全新的監控詳情頁面,新版計費詳情,請參見產品計費(新版)

對於未開通新版計費的使用者,如需查看新版監控詳情頁面,可在應用列表頁面單擊切換新版

什麼是異常

在ARMS的異常分析功能中,預設情況下,ARMS僅可以採集到被埋點方法拋出的異常,但在使用者的實際業務中,可能一次介面調用記錄不到異常或者記錄一個或多個異常。

例如,假設ARMS探針當前對public void methodA 和public void methodB兩個方法進行了埋點,且兩個方法互相有調用關係,則在下述情境下,ARMS記錄的異常會有所差異。

  • 情境1:methodA、methodB 各自捕獲異常並列印。

    這種情境下,ARMS監控不到任何異常。

        public int methodA() {
            try {
                return methodB();
            } catch (Throwable e) {
                e.printStackTrace();
                return 0;
            }
        }
    
        public int methodB() {
            try {
                return 1 / 0;
            } catch (Throwable e) {
                e.printStackTrace();
                return 0;
            }
        }
  • 情境2:methodA捕獲異常並列印,methodB拋出異常。

    這種情境下,ARMS可以監控到一個 java.lang.ArithmeticException

        public int methodA() {
            try {
                return methodB();
            } catch (Throwable e) {
                e.printStackTrace();
                return 0;
            }
        }
    
        public int methodB() {
            return 1 / 0;
        }
  • 情境3:methodA、methodB各自拋出異常。

    這種情境下,ARMS可以監控到兩個 java.lang.ArithmeticException

        public int methodA() {    
            return methodB();
        }
    
        public int methodB() {
            return 1 / 0;
        }
  • 情境4:methodA封裝並拋出異常、methodB拋出異常。

    這種情境下,ARMS可以監控到一個 java.lang.ArithmeticException和一個java.lang.RuntimeException

        public static int methodA() {
            try {
                return methodB();
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        }
    
        public static int methodB() {
            return 1 / 0;
        }

查看異常分析

  1. 登入ARMS控制台,在左側導覽列選擇應用監控 > 應用列表

  2. 應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。

    說明

    語言列的表徵圖含義如下:

    Java表徵圖:接入應用監控的Java應用。

    image:接入應用監控的Golang應用。

    image:接入應用監控的Python應用。

    -:接入Managed Service for OpenTelemetry的應用。

  3. 在上方導覽列選擇情境化分析 > 異常分析

    image.png

    • 在快捷篩選區域(圖示①),您可以按異常名稱介面名稱主機地址對異常次數、異常列表進行篩選過濾。

    • 在趨勢圖地區(圖示②),您可以查看應用在指定時間範圍拋出該異常的次數,按照異常做堆疊展示。

      單擊image.png表徵圖,可以在彈出的對話方塊中查看該指標在某個時間段的統計情況或對比不同日期在同一時間段的統計情況,通過選擇image.png表徵圖可以切換柱狀圖、趨勢圖進行展示。

    • 在異常列表地區(圖示③),您可以查看異常介面的名稱、異常次數、佔比、異常資訊摘要等。

      在異常列表,您可以執行以下操作:

      • 單擊操作列的概覽,可在右側面板中查看該異常的異常數趨勢、介面和執行個體維度異常分布、異常堆棧等概覽資訊。

        image.png

      • 單擊操作列的調用鏈,可以查看該調用的鏈路詳情。更多資訊,請參見調用鏈分析

相關文檔

應用監控詳細的指標資訊,請參見應用監控指標說明

常見問題

介面調用中異常次數大於介面請求次數

可能原因如下:

  • ARMS會在被埋點的方法拋出異常時記錄異常次數。當一次介面調用過程中多個方法均拋出異常,且這些方法被ARMS探針自動埋點,則ARMS會在一次調用中記錄多個異常。

  • 如果同一個異常從底層方法一直拋到頂層方法,且整個方法棧中有多個方法被ARMS埋點,則該異常會被記錄多次。

探針版本升級後異常有變化

探針每次版本變化,對應的埋點方法可能增加或減少,相應地在這些埋點方法中拋出的異常也就有可能增加或減少。

介面中看到異常次數不為0,但是業務未捕獲到相關異常

在多數被探針埋點的架構代碼中,當某些異常在架構層內部捕獲並處理,但並未拋到使用者業務代碼中時,探針能捕獲此類異常,但是使用者並不能感知到此類異常。

例如,使用MongoTemplate訪問MongoDB未報錯,但是在ARMS控制台看到有訪問MongoDB報錯,是因為MongoTemplate中封裝了重試邏輯,在一次MongoTemplate的方法調用中,當遇到逾時異常時會進行重試,並在多次重試失敗後才拋出異常到調用方。所以,在使用MongoTemplate訪問MongoDB並且底層有逾時重試行為時,就有可能業務並沒有看到異常,但是在ARMS控制台能看到異常。

異常棧與介面實際發生的異常不符合

ARMS探針為了提升資料處理和上報效率,會根據異常的異常類名、異常方法棧前三行、異常方法棧後三行產生一個字串,然後通過CRC64編碼為32位的字串,並在第一次上報的時上報編碼值與原始值,後續相同異常僅上報編碼值,所以會有兩種情況下導致出現異常棧與實際棧不符合:

  • 兩個異常的實際完整方法棧不一致, 但是異常類名、異常方法棧前三行、後三行一致。此時,由於上述處理邏輯會導致編碼值一致,從而出現問題。

  • 兩個異常的異常類名、異常方法棧前三行、後三行不一致,但由於採用了CRC64這種非唯一性編碼,所以仍然有可能兩者的編碼值一致,從而出現問題。

出現上述兩種情況,都可以在自訂配置頁面的異常進階過濾配置地區適當調大同類異常堆棧區分深度參數。image

應用長時間運行後(30天以上)異常只能看到一個ID

為了最佳化資料上報量,在一個異常第一次出現時,ARMS會針對異常進行編碼並上報編碼值與原始值到服務端,服務端會儲存該編碼值與原始值,儲存到期時間為30天。當應用運行30天后,就可能出現無法再通過異常編碼返差異常原始值的情況。

某些異常在ARMS控制台看不到

ARMS探針在預設情況下並不能捕獲所有異常,只有被ARMS探針埋點的方法拋出的異常才能被ARMS探針採集到。

如果您的探針版本在4.1.12及以上,可以在自訂配置頁面的探針開關設定地區開啟異常外掛程式,開啟該外掛程式後,ARMS會在每個異常執行個體建立的時候採集該異常資料。