疑難解答指南:適用於Java的 Azure 監視器 Application Insights

本文提供疑難解答資訊,以解決使用適用於Application Insights的 Java 代理程式檢測 Java 應用程式時可能發生的常見問題。 Application Insights 是 Azure 監視器平台服務的一項功能。

檢查自我診斷記錄檔

根據預設,Application Insights Java 3。x 會在保存 applicationinsights-agent-3.2.11.jar 檔案的相同目錄中產生名為 applicationinsights.log 的記錄檔。

此記錄檔是檢查您可能遇到之任何問題提示的第一個位置。

如果 Application Insights 未產生記錄檔,請檢查以確定您的 Java 應用程式具有保存applicationinsights-agent-3.2.11.jar檔案之目錄的寫 入許可權

如果 Application Insights 仍未產生記錄檔,請檢查 Java 應用程式中的 stdout 記錄檔是否有錯誤。 Application Insights Java 3。x 應該記錄任何會阻止它記錄到記錄檔中 stdout 一般位置的錯誤。

針對連線問題進行疑難解答

Application Insights SDK 和代理程式會傳送遙測,以擷取我們的擷取端點作為 REST 呼叫來內嵌。 若要測試從 Web 伺服器或應用程式主電腦到擷取服務端點的連線能力,請使用來自 PowerShell 的原始 REST 用戶端,或執行 curl 命令。 請參閱 針對 Azure 監視器 Application Insights 中遺失的應用程式遙測進行疑難解答

如果 Application Insights Java 代理程式造成連線問題,請考慮下列選項:

  • 確認 Application Insights 設定的 連接字串

  • 使用 Application Insights Java 3.4.6 版或更新版本來確認 Java 金鑰存放區包含必要的憑證。 若要這樣做,請在 TRACE 層級啟用自我診斷功能。 在 Application Insights 記錄中,您是否看到下列專案?

    TRACE c.m.applicationinsights.agent - Java 密鑰存放區中的 Application Insights 跟證書:false

    如果您看到此專案,請參閱 匯入 SSL 憑證 以匯入 Java 金鑰存放區中的跟證書。

  • 如果您使用 選項 -Djsse.enableSNIExtension=false ,請嘗試在沒有該選項的情況下執行代理程式。 從 Application Insights Java 3.4.5 版中,如果您指定 -Djsse.enableSNIExtension=false,記錄中會出現下列錯誤專案:

    WARN c.m.applicationinsights.agent - 偵測到系統屬性 -Jesse.enableSNIExtension=false。 如果您有 Application Insights 的連線問題,請移除此問題。

  • 如果上述選項都沒有説明,您可以使用 疑難解答工具

無法啟動 Java 虛擬機器 (JVM)

如果 Java 虛擬機 (JVM) 未啟動,則可能會傳回「開啟 zip 檔案或 JAR 指令清單遺失時發生錯誤」訊息。 若要針對此問題進行疑難解答,請參閱下表。

問題 動作
找不到代理程式的 Java 封存 (JAR) 檔案。 請確定您在 JVM 自變數中 -javaagent 指定有效的代理程式 JAR 路徑。
代理程式 JAR 檔案可能已在檔案傳輸期間損毀。 請再次嘗試下載代理程式 JAR 檔案。

Tomcat Java 應用程式需要幾分鐘的時間才能啟動

如果您 啟用 Application Insights 來監視 Tomcat 應用程式,啟動應用程式所需的時間可能會延遲數分鐘。 之所以造成此延遲,是因為 Tomcat 會在應用程式啟動期間嘗試掃描 Application Insights JAR 檔案。 若要加快應用程式的開始時間,您可以從掃描的檔案清單中排除 Application Insights JAR 檔案。 不需要掃描這些 JAR 檔案。

從 Application Insights Java 2 升級。x SDK

如果您已經在使用 Application Insights Java 2。x SDK 在您的應用程式中,您可以繼續使用它。 Application Insights Java 3。x 代理程式會偵測、擷取及相互關聯您透過 2 傳送的任何自定義遙測。x SDK。 它也會隱藏 2 的任何自動收集,以防止重複的遙測。x SDK 會這麼做。 如需詳細資訊,請參閱 從 Java 2 升級。x SDK

從 Application Insights Java 3.0 預覽版升級

如果您要從 Java 3.0 Preview 代理程序升級,請仔細檢閱所有 設定選項 。 JSON 結構會在 3.0 正式發行 (GA) 版本中變更。

這些變更包括:

  • 組態檔名稱已從 ApplicationInsights.json 變更為 applicationinsights.json

  • 節點 instrumentationSettings 已不存在。 中 instrumentationSettings 的所有內容都會移至根層級。

  • 、、 instrumentationjmxMetricsheartbeatsampling設定節點會移出preview根層級。

部分記錄未自動收集

只有在記錄符合下列準則時,才會擷取記錄:

  • 它符合為記錄架構設定的層級。

  • 它符合為 Application Insights 設定的層級。

例如,如果您的記錄架構 WARN 設定為從 com.example 套件記錄 (和更新版本) ,而 Application Insights INFO 設定為擷取 (和更新版本) ,則 Application Insights 只會 WARNcom.example 套件擷取 (和更新版本) 。

若要確定特定的記錄語句符合記錄架構的設定閾值,請確認它出現在檔案或控制台) 的一般應用程式記錄 (中。

另請注意,如果例外狀況對象傳遞至記錄器,記錄訊息 (和例外狀況對象詳細數據) 會出現在數據表的 Azure 入口網站 中,而不是traces數據表中exceptions。 若要查看 和 exceptions 數據表之間的traces記錄訊息,請執行下列記錄 (Kusto) 查詢:

union traces, (exceptions | extend message = outerMessage)
| project timestamp, message, itemType

如需詳細資訊,請參閱 自動收集的記錄組態

匯入 SSL 憑證

本節可協助您在使用 Java 代理程式時,針對安全套接字層 (SSL) 憑證的相關例外狀況進行疑難解答並加以修正。

有兩個不同的路徑可解決此問題:

  • 如果您使用預設 Java 金鑰存放區
  • 如果您使用自訂 Java 金鑰存放區

如果您不確定要遵循哪一個路徑,請檢查是否有 JVM 自變數 -Djavax.net.ssl.trustStore=... 如果您沒有此 JVM 自變數,則可能使用預設的 Java 金鑰存放區。 如果您有這個 JVM 自變數,則可能使用自訂金鑰存放區,而 JVM 自變數會將您指向自訂金鑰存放區。

如果您使用預設 Java 金鑰存放區

預設 Java 金鑰存放區通常已經有所有 CA 跟證書。 不過,可能會有一些例外狀況。 例如,不同的跟證書可能會簽署擷取端點憑證。 建議您遵循下列步驟來解決此問題:

  1. 檢查用來簽署 Application Insights 端點的 SSL 憑證是否已存在於預設密鑰存放區中。 根據預設,信任的 CA 憑證會儲存在 $JAVA_HOME/jre/lib/security/cacerts 中。 若要列出 Java 金鑰存放區中的憑證,請使用下列命令:

    keytool -list -v -keystore <path-to-keystore-file>

    您可以將輸出重新導向至暫存盤,以便稍後輕鬆搜尋:

    keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts > temp.txt

  2. 取得憑證清單之後,請依照步驟下載用來簽署Application Insights端點的 SSL憑證

    下載憑證之後,請使用下列命令在憑證上產生 SHA-1 哈希:

    keytool -printcert -v -file "<downloaded-ssl-certificate>.cer"

    複製 SHA-1 值,並檢查此值是否存在於您先前儲存 的temp.txt 檔案中。 如果您在臨時檔中找不到 SHA-1 值,則預設 Java 金鑰存放區中會遺失下載的 SSL 憑證。

  3. 使用下列命令,將 SSL 憑證匯入預設 Java 金鑰存放區:

    keytool -import -file "<certificate-file>" -alias "<some-meaningful-name>" -keystore "<path-to-cacerts-file>"

    在此範例中,命令會如下所示:

    keytool -import -file "<downloaded-ssl-certificate-file>" -alias "<some-meaningful-name>" -keystore $JAVA_HOME/jre/lib/security/cacerts

如果您使用自訂 Java 金鑰存放區

如果您使用自定義 Java 金鑰存放區,您可能必須將 Application Insights 端點的 SSL 憑證匯入該金鑰存放區。 建議您執行下列兩個步驟來解決此問題:

  1. 請遵循 下列步驟,從 Application Insights 端點下載 SSL 憑證

  2. 執行下列命令,將 SSL 憑證匯入自訂 Java 金鑰存放區:

    keytool -importcert -alias <your-ssl-certificate> -file "<your-downloaded-ssl-certificate-name>.cer" -keystore "<your-keystore-name>" -storepass "<your-keystore-password>" -noprompt

下載 SSL 憑證的步驟

注意事項

下列 SSL 憑證下載指示已在下列瀏覽器上驗證:

  • Google Chrome
  • Microsoft Edge
  1. https://westeurope-5.in.applicationinsights.azure.com/api/ping 網頁瀏覽器中開啟 URL 位址。

  2. 在瀏覽器的網址列中,選取 [ 檢視網站資訊 ] 圖示 (位址) 旁邊的鎖定符號。

  3. 選取 [連線安全]

  4. 選取 [顯示憑證 ] 圖示。

  5. 在 [ 憑證查看器 ] 對話框中,選取 [ 詳細數據] 索引標籤

  6. 在 [ 憑證階層] 清單中,選取您要下載的憑證。 (顯示 CA 跟證書、中繼憑證和分葉 SSL 憑證。)

  7. 選取 [ 匯出 ] 按鈕。

  8. 在 [ 另存新 檔] 對話框中,流覽至您要將憑證儲存 (.crt) 檔案的目錄,然後選取 [ 儲存]

  9. 若要結束 [ 憑證查看器 ] 對話框,請選取 [ 關閉 (X) ] 按鈕。

警告

您必須重複這些步驟,才能在目前的憑證到期之前取得新的憑證。 您可以在 [憑證檢視器] 對話框的 [詳細數據] 索引標籤上找到到期資訊。

在 [憑證階層] 列表中選取憑證之後,請在 [憑證欄位] 清單中尋找 [有效性] 節點。 選取該節點內的 [ 之前 ],然後檢查 [ 域值 ] 方塊中顯示的日期和時間。 此時間戳指出新憑證何時生效。 同樣地,請在 [有效性] 節點內選取 [不在之後],以瞭解新憑證何時到期。

瞭解 UnknownHostException

如果您在升級至 3.2.0 之後的 Java 代理程式版本之後看到此例外狀況,您或許可以藉由升級網路來解析例外狀況中顯示的新端點來修正例外狀況。 Application Insights 版本之間差異的原因是 3.2.0 之前的版本指向新的擷取端點 v2.1/track,相較於較舊 v2/track的 。 新的擷取端點會自動將您重新導向至擷取端點, (例外狀況) 中顯示的新端點,其最接近 Application Insights 資源的記憶體。

遺漏加密套件

如果 Application Insights Java 代理程式偵測到您沒有任何受其連線端點支援的加密套件,代理程式會向您發出警示,並提供遺漏加密套件的連結。

加密套件的背景

加密套件會在用戶端應用程式和伺服器透過 SSL 或傳輸層安全性 (TLS) 連線交換資訊之前開始運作。 用戶端應用程式會起始 SSL 交握。 該程式的一部分牽涉到通知伺服器它支援的加密套件。 伺服器會接收該資訊,並比較用戶端應用程式所支援的加密套件與其支持的演算法。 如果伺服器找到相符專案,它會通知用戶端應用程式,並建立安全連線。 如果找不到相符專案,伺服器會拒絕連線。

如何判斷用戶端加密套件

在此情況下,用戶端是您已檢測應用程式執行所在的 JVM。 從 3.2.5 版開始,如果遺漏的加密套件可能造成其中一個服務端點的連線失敗,Application Insights Java 會記錄警告訊息。

如果您使用舊版的 Application Insights Java,請編譯並執行下列 Java 程式,以取得 JVM 中支援的加密套件清單:

import javax.net.ssl.SSLServerSocketFactory;

public class Ciphers {
    public static void main(String[] args) {
        SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        String[] defaultCiphers = ssf.getDefaultCipherSuites();
        System.out.println("Default\tCipher");
        for (int i = 0; i < defaultCiphers.length; ++i) {
            System.out.print('*');
            System.out.print('\t');
            System.out.println(defaultCiphers[i]);
        }
    }
}

Application Insights 端點支援下列加密套件:

  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

如何判斷伺服器端加密套件

在此情況下,伺服器端是Application Insights擷取端點或 Application Insights Live 計量端點。 您可以使用 SSLLABS 之類的線上工具來判斷以端點 URL 為基礎的預期加密套件。

如何新增遺失的加密套件

如果您使用 Java 9 或更新版本,請檢查以確定 JVM 在 jmods 資料夾中包含jdk.crypto.cryptoki模組。 此外,如果您要使用 jlink建置自定義 Java 執行時間,請確定您包含相同的模組。

否則,這些加密套件應該已經是新式 Java 8+ 散發套件的一部分。 建議您檢查已安裝 Java 散發套件的來源,以調查該 Java 散發套件 java.security 組態檔中的安全性提供者為何與標準 Java 散發套件不同。

Application Insights 和 Java 8 中的啟動時間變慢

Java 8 有一個已知問題,與 Java 代理程式的 JAR 檔案簽章驗證有關。 此問題可能會增加 Application Insights 中的啟動時間。 若要修正此問題,您可以套用下列其中一個選項:

或者,您可以嘗試下列實驗性功能: 針對有限數目的 CPU 核心改善啟動時間。 如果您在使用這項功能時遇到任何問題,請傳送意見反應給我們。

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以將產品意見反應提交給 Azure 意應見反社群