Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

JavaからAzure Application Insightsを使う(3)

今回もApplication Insights やっていきましょう!(YouTube風)

前回までは必要なライブラリを取り込む形のSDK方式でしたが、今回はエージェント方式を試してみます。度々言及していますが、2.6.x系にもエージェントはありますが、3.0 preview を使います。

準備

執筆時点では、3.0 preview-5が最新です。

Releases · microsoft/ApplicationInsights-Java

はじめに applicationinsights-agent-3.0.0-PREVIEW.5.jar をダウンロードしてプロジェクトのルートフォルダにでも放り込んでおきましょう。

次に、ApplicationInsights.jonを用意します。jarと同じ場に展開します。注意点としては、

  • インストルメンテーションキーは、接続文字列として設定します。環境変数とかに設定する方法もあります(WebAppsにデプロイした時など用)
  • オプションは今のところ、preview キーの階層に定義します。 GAしたときに設定がそのまま利用されないようなポカ除けでしょうか。

のような点があります。

{
    "instrumentationSettings": {
        "connectionString": "InstrumentationKey=<<your-instrumentation-key>>",
        "preview": {
            "roleName": "MyWebApplicaiton with Java Agent 3-preview",
            "instrumentation": {
                "logging": {
                    "threshold": "INFO"
                }
            }
        }
    }
}

プロジェクト

前回のSpring Boot Webプロジェクトでも流用してください。そして実行時オプションに以下を追加します。pom.xmの一部です。maven plugin の配下にconfiguration 以下を追加します。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                    -javaagent:C:\ws\blog\appInsight\web.sample.agent3\applicationinsights-agent-3.0.0-PREVIEW.5.jar
                    </jvmArguments>
                </configuration>
            </plugin>
        </plugins>
    </build>

java agent とは?ってところは、 古い記事ですが 独自のプロファイリング・ツールを構築する が参考になると思います(安定のdevelopers works)

適当にmvnから実行すればOkでしょう。

mvn clean package spring-boot:run

何が記録されるのか

Docsを参照するとわかるのですが、まるっと引用します。SDKを取り込まなくてもエージェントを指定するだけで以下の情報がApplication Insightsで収集できます。

  • Requests
    • JMS コンシューマー
    • Kafka コンシューマー
    • Netty/WebFlux
    • Servlets
    • Spring スケジュール
  • 分散トレース伝達での依存関係
    • Apache HttpClient と HttpAsyncClient
    • gRPC
    • java.net.HttpURLConnection
    • JMS
    • Kafka
    • Netty クライアント
    • OkHttp
  • その他の依存関係
    • Cassandra
    • JDBC
    • MongoDB (非同期および同期)
    • Redis (Lettuce および Jedis)
  • ログ
    • java.util.logging
    • Log4j
    • SLF4J/Logback
  • メトリック
    • マイクロメーター (Spring Boot アクチュエータ メトリックを含む)
    • JMX メトリック

まあ、いままでやってきたSDKなどの設定はなんだったのか?という話になってくるわけなんですが。

ポータルでの確認

Web + JDBCでSql Databaseにアクセスしてみた例です。リクエストにSQLDBへの依存メトリクスが関連付いて記録されていることが分ると思います。

f:id:StateMachine:20200731165618p:plain

DBへどんなクエリを発行しているのかも分ります。

f:id:StateMachine:20200731165636p:plain

まとめと雑感

自動的に収集してくれるのですが、きちんと設定しないと余分な情報まで収集されてしまうかなと思います。またSDK方式でやったようなリクエストテレメトリにカスタムプロパティを追加するような方法が分ません。このあたりは以下のように言及されているのですが、

3.0 以降での目標は、標準 API を使用してカスタム テレメトリを送信できるようにすることです。 Micrometer、OpenTelemetry API、および一般的なログ記録フレームワークがサポートされています。 Application Insights Java 3.0 では、テレメトリが自動的にキャプチャされ、自動収集されたすべてのテレメトリと連動して、関連付けが行われます。 このため、現時点では、Application Insights 3.0 を使用した SDK をリリースする予定はありません。 Application Insights Java 3.0 では、Application Insights Java SDK 2.x に送信されるテレメトリを既にリッスンしています。 この機能は、既存の 2.x ユーザーのアップグレード ストーリーの重要な部分であり、OpenTelemetry API が GA になるまでの、カスタム テレメトリ サポートの重要なギャップを埋めるものです。

3.0ではSDKをリリースする予定がなく、今のところ 2.x系のSDKを使ってカスタムすれば勝手にマージしてくれるようにも見えるのですが。Open Telemetry API ってよく分ってないのですが、GA後にまた試してみたいと思います。

ここらの話かな。 OpenTelemetry

参考

Java アプリケーションを任意の環境で監視する - Azure Monitor Application Insights - Azure Monitor | Microsoft Docs

任意の場所の Java アプリケーションを監視する - Azure Monitor Application Insights - Azure Monitor | Microsoft Docs