次の方法で共有


トラブルシューティング ガイド: Azure Monitor Application Insights for Java

この記事では、Application Insights 用 Java エージェントを使用して Java アプリケーションをインストルメント化するときに発生する可能性がある一般的な問題を解決するためのトラブルシューティング情報を提供します。 Application Insights は、Azure Monitor プラットフォーム サービスの機能です。

自己診断ログ ファイルを確認する

既定では、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 Monitor 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 - システム プロパティ -Djsse.enableSNIExtension=false が検出されました。 Application Insights に接続の問題がある場合は、これを削除してください。

  • 上記のどのオプションも役に立たなかった場合は、 トラブルシューティング ツールを使用できます

Java 仮想マシン (JVM) の起動に失敗する

Java 仮想マシン (JVM) が起動しない場合は、"zip ファイルまたは JAR マニフェストを開くときにエラーが発生しました" というメッセージが返されることがあります。 この問題のトラブルシューティングを行うには、次の表を参照してください。

問題 アクション
エージェントの Java アーカイブ (JAR) ファイルが見つかりません。 -javaagent JVM 引数に有効なエージェント 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 のすべてのコンテンツがルート レベルに移動されました。

  • samplingjmxMetricsinstrumentationheartbeatなどの構成ノードは、previewからルート レベルに移動されます。

一部のログ記録が自動収集されない

ログ記録は、次の条件を満たす場合にのみキャプチャされます。

  • これは、ログ 記録フレームワーク用に構成されているレベルを満たしています。

  • Application Insights 用に構成されているレベルを満たしています。

たとえば、com.example パッケージからWARN (以上) をログに記録するようにログ 記録フレームワークを構成し、Application Insights が INFO (以上) をキャプチャするように構成されている場合、Application Insights はcom.example パッケージからWARN (以上) のみをキャプチャします。

特定のログ記録ステートメントが、ログ 記録フレームワークで構成されているしきい値を満たしていることを確認するには、通常のアプリケーション ログ (ファイルまたはコンソール) に表示されることを確認します。

また、例外オブジェクトがロガーに渡されると、ログ メッセージ (および例外オブジェクトの詳細) が、traces テーブルではなく exceptions テーブルに Azure portal に表示されます。 tracesテーブルとexceptions テーブルの両方のログ メッセージを表示するには、次のログ (Kusto) クエリを実行します。

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

詳細については、 自動収集ログの構成を参照してください。

SSL 証明書をインポートする

このセクションは、Java エージェントを使用する場合に、Secure Sockets Layer (SSL) 証明書に関連する例外のトラブルシューティングと修正に役立ちます。

この問題を解決するには、次の 2 つの異なるパスがあります。

  • 既定の 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 値が見つからない場合は、ダウンロードした SSL 証明書が既定の Java キーストアにありません。

  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 証明書をそのキーストアにインポートする必要があります。 この問題を解決するために、次の 2 つの手順をお勧めします。

  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 証明書をダウンロードする手順

Note

次の SSL 証明書のダウンロード手順は、次のブラウザーで検証されました。

  • Google Chrome
  • Microsoft Edge
  1. Web ブラウザーで https://westeurope-5.in.applicationinsights.azure.com/api/ping URL アドレスを開きます。

  2. ブラウザーのアドレス バーで、 サイト情報の表示 アイコン (アドレスの横にあるロック記号) を選択します。

  3. [Connection がセキュリティで保護 選択

  4. [証明書の表示] アイコンを選択します。

  5. Certificate Viewer ダイアログ ボックスで、Details タブを選択します。

  6. Certificate 階層一覧で、ダウンロードする証明書を選択します。 (CA ルート証明書、中間証明書、リーフ SSL 証明書が表示されます)。

  7. [エクスポート] ボタンを選択します。

  8. [ 名前を付けて保存 ] ダイアログ ボックスで、証明書 (.crt) ファイルを保存するディレクトリを参照し、[ 保存を選択します。

  9. Certificate Viewer ダイアログ ボックスを終了するには、Close (X) ボタンを選択します。

警告

現在の証明書の有効期限が切れる前に、これらの手順を繰り返して新しい証明書を取得する必要があります。 有効期限の情報は、Certificate Viewer ダイアログ ボックスの Details タブにあります。

Certificate 階層一覧で証明書を選択した後、Certificate フィールド一覧で Validity ノードを見つけます。 そのノード内で Not Before を選択し、 Field Value ボックスに表示される日付と時刻を調べます。 このタイム スタンプは、新しい証明書が有効になるタイミングを示します。 同様に、Validity ノード内の Not After を選択して、新しい証明書の有効期限が切れるタイミングを確認します。

UnknownHostException について

3.2.0 より後のバージョンの Java エージェントにアップグレードした後にこの例外が表示される場合は、例外に示されている新しいエンドポイントを解決するためにネットワークをアップグレードすることで、例外を修正できる可能性があります。 Application Insights のバージョン間の違いは、3.2.0 より後のバージョンは、古いv2/trackと比較して、新しいインジェスト エンドポイント 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.security 構成ファイルのセキュリティ プロバイダーが標準の Java ディストリビューションと異なる理由を調査することをお勧めします。

Application Insights の起動時間が遅い

Java 8

Java 8 には、Java エージェントの JAR ファイル署名検証に関連する既知の問題があります。 この問題により、Application Insights の起動時間が長くなる可能性があります。 この問題を解決するには、次のいずれかのオプションを適用します。

バージョン 8 より高い Java

Application Insights Java エージェントでこの問題を解決するには、次のいずれかの方法を試してください。

Java ネイティブ用の 監視ソリューションを試すこともできます JVM ベースのアプリケーションにも適用できます。

  • Spring Boot では、OpenTelemetry スターターの Microsoft ディストリビューション。
  • Quarkus では、Microsoft Azure 用の Quarkus Opentelemetry エクスポーターです。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。