共用方式為


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

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

檢查自我診斷記錄檔

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

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

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

如果 Application Insights 仍然不會產生記錄檔,請檢查 stdout Java 應用程式的記錄檔是否有錯誤。 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 選項,請嘗試在沒有該選項的情況下執行代理程式。 如果您指定 -Djsse.enableSNIExtension=false,則從 Application Insights Java 3.4.5 版中,下列錯誤專案會出現在記錄中:

    WARN c.m.applicationinsights.agent - 偵測到系統屬性 -Djsse.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 代理程序升級,請仔細檢閱所有組 態選項 。 3.0 正式運作 (GA) 版本中的 JSON 結構已變更。

這些變更包括:

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

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

  • 、、 和 heartbeatsampling組態節點會移出previewinstrumentation至根層級。 jmxMetrics

某些記錄不會自動收集

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

  • 它符合針對記錄架構所設定的層級。

  • 其符合針對Application Insights 設定的層級。

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

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

另請注意,如果例外狀況對象傳遞至記錄器,記錄訊息(和例外狀況物件詳細數據)會出現在數據表中的 Azure 入口網站 exceptions 中,而不是traces數據表。 若要查看 和 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 版本差異的原因是,相較於較舊的 v2/track版本,晚於 3.2.0 的版本會指向新的擷取端點v2.1/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 即時計量端點。 您可以使用 SSLLABS 之類的線上工具來判斷以端點 URL 為基礎的預期加密套件。

如何新增遺漏的加密套件

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

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

Application Insights 中的啟動時間變慢

Java 8

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

Java 高於第8版

若要修正 Application Insights Java 代理程式的問題,請嘗試下列其中一種方法:

  • 使用具有更多 CPU 功能的 Azure 組態。
  • 停用隱藏特定自動收集遙測中所述的一些檢測。
  • 試用此實驗性功能: 有限 CPU 核心的啟動時間改進。 如果您在使用此功能時遇到任何問題,請傳送意見反應給我們。

您也可以嘗試 Java 原生 的監視解決方案也適用於 JVM 型應用程式:

  • 使用 Spring Boot 時,OpenTelemetry 入門版Microsoft散發。
  • 使用 Quarkus,Microsoft Azure 的 Quarkus Opentelemetry 導出工具。

協力廠商資訊免責聲明

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

與我們連絡,以取得說明

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