Application Insights2.xでSpring Bootを可視化する

# Application Insights2.xとSpring Boot

APMとしてApplication Insights2.xを使い、Spring Bootの稼働状態を可視化する方法について解説します。
Application Insightは3.xがすでに出ていますが、正直2.xの方が使い勝手がいいです…

# エージェントと設定ファイルの用意

以下の2つのファイルを準備します。

* applicationinsights-agent-2.6.3.jar
* AI-Agent.xml

applicationinsights-agent-2.6.3.jarは以下からダウンロードします。

https://github.com/microsoft/ApplicationInsights-Java/releases/tag/2.6.3


**AI-Agent.xml**

```xml
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsightsAgent>
   <Instrumentation>
      <BuiltIn enabled="true"> 
         <!-- capture logging via Log4j 1.2, Log4j2, and Logback, default is true -->
         <Logging enabled="true" />
         <!-- capture outgoing HTTP calls performed through Apache HttpClient, OkHttp,
              and java.net.HttpURLConnection, default is true -->
         <HTTP enabled="true" /> 
         <!-- capture JDBC queries, default is true -->
         <JDBC enabled="true" />
         <!-- capture Redis calls, default is true -->
         <Jedis enabled="true" /> 
         <!-- capture query plans for JDBC queries that exceed this value (MySQL, PostgreSQL),
              default is 10000 milliseconds -->
         <MaxStatementQueryLimitInMS>1000</MaxStatementQueryLimitInMS> 
      </BuiltIn>
   </Instrumentation>
</ApplicationInsightsAgent>
```

コンテナで動かす場合はDockerfileに以下のように記述し、エージェントと設定ファイルをJVMに認識させます。AI-Agent.xmlはapplicationinsights-agent-2.6.3.jarと同じところに配置し、かつその場所がWORKDIRである必要があります。

**Dockerfileの抜粋** 

```Dockerfile
COPY ./build/resources/main/applicationinsights-agent-2.6.3.jar /usr/local/applicationinsights-agent-2.6.3.jar
COPY ./build/resources/main/AI-Agent.xml /usr/local/AI-Agent.xml
WORKDIR /usr/local
CMD java -Xmx2g -javaagent:/usr/local/applicationinsights-agent-2.6.3.jar -jar /usr/local/api-SNAPSHOT.jar
```

## 依存関係の設定

依存する以下のJARをbuild.gradleで認識させる必要があります。

|      |                                                             | **バージョン/2021-09-07 時点** | **用途**                                                     | **必要性**                   |
| ---- | ----------------------------------------------------------- | ------------------------------ | ------------------------------------------------------------ | ---------------------------- |
| 1    | com.microsoft.azure:applicationinsights-spring-boot-starter | 2.6.3                          | Application Insightsについての設定をapplication.propertiesに集約することができる | 必須                         |
| 2    | com.microsoft.azure:azure-spring-boot-metrics-starter       | 2.3.5                          | MicrometerのラッパーでJVM内部の主要なメトリクスを自動で吸い上げてくれる | 必須                         |
| 3    | com.microsoft.azure:applicationinsights-logging-log4j2      | 2.6.3                          | ログをテレメトリーとして送信する。一連の流れとして可視化するという意味では良いがログの量が多いと負荷がかかる | ログ量次第 |

**build.gradle** 

```gradle
dependencies {
        implementation 'com.microsoft.azure:applicationinsights-spring-boot-starter:2.6.3'
        implementation 'com.microsoft.azure:azure-spring-boot-metrics-starter:2.3.5'
        implementation 'com.microsoft.azure:applicationinsights-logging-log4j2:2.6.3'
```

com.microsoft.azure:azure-spring-boot-metrics-starterの導入でNoClassDefFoundError: javax/xml/bind/JAXBExceptionが発生した場合は依存関係に以下を追加します。

```gradle
implementation 'javax.xml.bind:jaxb-api:2.3.0'
```

# 送信先のApplication Insightsの指定

送信先のApplication Insightsを指定する方法は複数ありますが、環境変数を指定する方法が一番可搬性があります。

```
APPINSIGHTS_INSTRUMENTATIONKEY=$instrumentationKey
```

例

```
APPINSIGHTS_INSTRUMENTATIONKEY=e286f9f0-bbf5-430b-9f2c-xxxxxxxxxxx
```

# データソース別にメトリクスを取得する

あとで書きます…