別のBlogとかにちょっと浮気していたら、コチラに書くのは一年以上たってしましたが、今回はApplication Insights についてです。
あまりウォッチしていない間に、3.2が GAしていて、現時点で3.2.3 がリリース中です。前回、Application Insights にふれたときは、3.0 が Preview 中でしたの、リリースが重ねられ改良されてきたことがうかがえます。
JavaからAzure Application Insightsを使う(3) - Azureの小ネタ (改)
おさらい
3.0 系のApplication Insights は エージェント式で、なんらアプリケーションに組み込まなくても問題ありません。Java起動時に、-javaagent:/applicationinsights.jar
のようにライブラリを指定すればかってにJVMの仕組みをつかって、メトリクスやログをフックして出力してくれます。
さらに、Web Apps/Functionsでは、 プラットフォーム上で組み込んでくれるので、なんら意識することすらありませんでした。
とはいえ、アプリケーションに組み込む 2.6系と比べて、劣る部分もあって、3.0系のエージェント方式では独自のテレメトリを送信できませんでした。どうするかというと、3.0系のエージェントを組み込みつつ、2.6系のSDKでカスタムするという、2.6系と3.0系を混合するような方法しかありませんでした。これでも、Application Insights 側がよしなにやってくれるので、問題はなかったのです。
カスタムテレメトリ対応
ようやく 3.2 でカスタムテレメトリに対応しました。リリース履歴をみると、PREVIEW機能として提供されていたっぽいのですが知りませんでした。 3.0系では、アプリケーションに組み込むような Application Insights SDK は提供されないそうで、標準APIでの対応となるそうです。そこで使われるのが Open Telemetry とのことです。
このOpen Telemetry をつかってカスタムテレメトリに対応するそうですが、現時点ですべての機能に対応しているわけではなさそうで、2.6系のSDKにくらべて、Open Telemetry は対応がすくないです。
https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-in-process-agent より
ユースケースとしては、リクエストテレメトリに何らかの情報を追加したい場合が多いので、とりあえずこれがサポートされたことは喜ばし感じです。
試してみる
現時点で、WebApps で利用される Application Insights for Javaのバージョンは、 3.1.1 ですので、すぐに利用することはできません。どうしてもというなら、コンテナ化してデプロイするとよいでしょう。ただし、コンテナ側のApplication Insights をDisable にする必要があると思います(適当)
Docsをみると依存は、 1.6.0
でしたが、最新の1.7.1
で問題なさそうです。
<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.7.1</version> </dependency>
リクエストテレメトリのカスタムディメンジョンにプロパティを追加するには、io.opentelemetry.api.trace.Span
から current
を取り出し属性を追加すれば、このリクエストに対応するテレメトリに記録されます。
@GetMapping("/") String root() { Span.current().setAttribute("foo","bar"); Span.current().setAttribute("user.name","shibayan"); Span.current().setAttribute("user.age","40"); retrun ...; }
結果、このようにカスタムディメンジョンに記録されます。
ライブメトリクス の サンプルテレメトリ
ライブメトリクスはサポートされていましたが、右側のペインに表示されるべき サンプルテレメトリは、長い間対応していませんでしたが、ようやく対応されました。
リクエストを送ると、ほぼリアルタイムでテレメトリがあがってきて、ログを眺めるのに便利です。
というわけで、ログは出さないと出ませんので(進次郎構文)、転ばぬ先の杖としてちゃんと設定しておきましょう。