Application Insightsで収集したフロントエンドとバックエンドのデータを関連づける (未解決)

方法知ってたら、教えてください!!!
お礼に、ハトマスクあげます。
回避策を中の人に聞けたりすると嬉しいんだけどなぁ。

なんでやるの?

低速なリクエストの診断ができるようになると楽になるんじゃないかなーと。

こんな感じでまとめてくれるっぽい。

https://docs.microsoft.com/ja-jp/azure/application-insights/media/app-insights-asp-net-dependencies/04-dependencies.png

あとまぁ、つなげられそうだから、つなげてみたい。(手段が先行するタイプ)

目標

ページビューからSQLまで計測結果がつながればいいかな。こんな感じ。

* ページビュー  (取れてる)
  * 依存(AJAX)  (取れてる)
    * リクエスト (取れてる)
      * 依存(SQL) (取れてない)

どうやってやるの?

Azure Application Insights Telemetry の相関付け | Microsoft Docs が参考になる。

さっきの構造だと、以下のようになればOK。

type id operation_Id operation_ParentId
ページビュー aaa aaa
依存(AJAX) 111 aaa aaa
リクエス 222 aaa 111
依存(SQL) 333 aaa 222
  • ページビューのoperation_Idを全てのtypeで利用する
  • operation_ParentIdは、呼び出し元のidを使う。

わかっていること

ページビュー -> 依存(AJAX)の所は、Application Insightsのライブラリがいい感じで関連付けてくれていた。(operation_Idも、operation_ParentIdも適切な値が設定されている)
なので、リクエスト -> 依存(SQL)の方もうまくできるに違いない。

とすれば、残りは依存(AJAX)とリクエスト、つまり、フロントエンドとバックエンドをつなげるところだけをなんとかすればいいはず。

調べること

以下の2点の実装方法。

  • フロントエンドからoperation_Idと、operation_ParentIdをバックエンドに送る方法
  • バックエンドで受け取った値を使って、Applicaton Insightsにデータを送る方法

フロントエンド

実装されているようだ。

// Default true. If false, the SDK will add two headers ('x-ms-request-root-id' and 'x-ms-request-id)
// to all dependency requests (within the same domain) to correlate them with corresponding requests on the server side.
disableCorrelationHeaders: boolean;
API Reference

ただ、デベロッパーツールで確認するとヘッダが追加されてない。検索したらIssueが上がってた。

github.com

クロスドメインの場合は動かないらしい。残念。
Java側の方も検索したら以下のIssueが上がってたんだけど...

github.com

Headers X-ms-request-id and X-ms-request-root-id are deprecated. Please do not use them for the fresh implementation. They can cause problems with Azure Storage REST API calls.
Also please support Request-Context header for http request and response. It is widely used for app-id propagation.
See http://apmtips.com/blog/2017/10/18/two-types-of-correlation/ and https://docs.microsoft.com/en-us/azure/application-insights/application-insights-correlation

x-ms...は使わないで、Request-Context使ってねってことみたい。ヒェェェェェ。
なんか沼にはまりそう。

バックエンド

フロントエンドから送ってきたデータをOperationIdとして使う場合、カスタムのInitializerクラスを実装して、ApplicationInsights.xmlに設定したWebOperationIdTelemetryInitializerと入れ替えれば良さそう。

実装方法は、WebOperationIdTelemetryInitializer を参考にすれば良い。operation_ParentIdは、setParentIdで設定できる...んじゃないかな?
フロントエンドよりは希望がもてそう。

ApplicationInsights-Java/WebOperationIdTelemetryInitializer.java at 2e18ce1d71d4a9b198aa2e0f608793956870a867 · Microsoft/ApplicationInsights-Java · GitHub

と、ここで体力と気力が切れたので、調査はおしまいにする。
さぁ、DEAD OR ALIVE Xtreme Venus Vacation やるぞー!!