AzureのPaas環境を監視する時はApplication Insightsを利用することが多いと思います。
実務で監視を行っている時に、Application Insightsの検索結果のリンクをチームに共有することがしばしばあるのですが、このリンクを自動で生成して通知できないものかと以前より思ってまして、リンクの解析をしてみました。
ちなみにここでいうApplication Insightsの検索結果のリンクとは「リンクのコピー」を指します。
今回、解析したのはApplication Insightsのfailures(失敗)のリンクになります。実務ではfailuresが発生するとSlackに通知するようにしていますが、詳細の調査のためにAzure Portal開いてApplication Insightsに遷移して時間で絞ってと諸々めんどくさいので、Deep Linkを生成して該当ポイントに直接アクセス出来たら幸せだろうなぁ、なんて考えたのがきっかけです。
※この記事は2022年11月1日時点の情報になります。
「リンクのコピー」のURL
「リンクのコピー」ですが画面によってURLのフォーマットが異なります。
今回はApplication Insightsのfailures(失敗)のトップ画面にある「リンクのコピー」のURLフォーマットが対象となります。
Application Insightsのfailures(失敗)のURLフォーマットは下記の通りです。動的な値の部分いは太字になっています。
https://portal.azure.com
/#blade
/AppInsightsExtension
/BladeRedirect
/BladeName
/{failures}
/ResourceId
/%252Fsubscriptions%252F{SubscriptionId}%252FresourceGroups%252F{ResourceGroupName}%252Fproviders%252Fmicrosoft.insights%252Fcomponents%252F{ApplicationInsightsName}
/BladeInputs
/{"filters"%3A[]%2C"timeContext"%3A{"durationMs"%3A86400000%2C"createdTime"%3A"2022-11-01T00%3A09%3A38.652Z"%2C"endTime"%3A"2022-11-01T09%3A09%3A00.000Z"%2C"isInitialTime"%3Afalse%2C"grain"%3A1%2C"useDashboardTimeRange"%3Afalse}%2C"selectedOperation"%3Anull%2C"experience"%3A1%2C"roleSelectors"%3A[]%2C"clientTypeMode"%3A"Server"}
上記だとわかりづらいのでシンプルにしてみます。
https://portal.azure.com
/#blade
/AppInsightsExtension
/BladeRedirect
/BladeName
/{BladeName}
/ResourceId
/%2Fsubscriptions%2F{SubscriptionId}%2FresourceGroups%2F{ResourceGroupName}%2Fproviders%2Fmicrosoft.insights%2Fcomponents%2F{ApplicationInsightsName}
/BladeInputs
/{BladeInputs}
シンプルにしてみると動的な項目がわかりやすくなったと思います。
動的な項目は主に以下の3点となります。
- BladeName
- ResourceId
- BladeInputs(filters)
この項目を操作することで動的にリンクを作成することができます。
それでは細かく見ていきましょう。
BladaName
BladeNameはApplication Insightsの調査項目の指定になります。
- searchV1:トランザクションの検索
- availability:可用性
- failures:失敗
- performance:パフォーマンス
「パフォーマンス」や「トランザクションの検索」の「リンクのコピー」のURLを見てみればわかりますが、調査項目ごとに固定になっています。ここではfailuresの「リンクのコピー」をしたのでfailuresが指定されています。
ResourceId
ResourceIdには以下の3つの要素があります。
- SubscriptionId
- ResourceGroupName
- ApplicationInsightsName
この要素に関しては固定でも問題ないかと思いますが、動的に値を渡すことによって汎用性は高くなると思います。
この項目の要点は「/」が「%2F」にエンコードされている点です。
これは「/」をスプリッターとしてサブスクリプション ⇒ リソースグループ ⇒ Application Insightsとリダイレクトで遷移するために必要な設定なのだと思います。そのまま「/」を使うとURLの一部になってしまうので区別するためにエンコードされているのだと思います。
BladeInputs(filters)
BladaInputsは絞り込み条件の設定値になります。JSON形式での設定になります。URLのフォーマットから抜粋すると下記のような構成になっています。
{
"filters": [],
"timeContext": {
"durationMs": 86400000,
"createdTime": "2022-11-01T00:09:38.652Z",
"endTime": "2022-11-01T09:09:00.000Z",
"isInitialTime": false,
"grain": 1,
"useDashboardTimeRange": false
},
"selectedOperation": null,
"experience": 1,
"roleSelectors": [],
"clientTypeMode": "Server"
}
それぞれのプロパティがどういう意味合いなのかについてはすべて把握できていません。このプロパティで重要なのはtimeContextのdurationMsとendTimeになります。
これらのプロパティは期間の指定になるのですが、endTimeがFrom-ToのToでendTimeからdurationMsを引いた時間がstartTimeとして自動的に設定されるようです。createdTimeは「リンクのコピー」を押した時の時間、つまりリンクを作成した時間を意味するようです。createdTimeがstartTimeではないので注意が必要です。
期間を指定する時は上記にもあるようにendTimeを指定して計測する期間をdurationMsでミリセカンド指定します。上記のサンプルの場合は86400000ミリセカンドなのでendTimeから1日を引いた期間の指定になります。
まとめ
URLの中身がわかったので頑張ればリンクの生成は出来ると思います。試しに「リンクのコピー」でコピーしてきたURLのdurationMsの値を変更してブラウザで叩いてみると、期間が変更されているのがわかると思います。ちなみに将来のアップデートでURLのフォーマットが変わるかもしれませんので、その時はその時です。
私のググラビリティが低いのか、Application Insightsのリンクについてリファレンスやdocsを見つけることが出来ませんでした。Application Insights SDKを調べればわかるのかもしれませんが、ノーコードでリンクのURLを生成したかったので地道な調査になってしまいましたとさ。。。これで運用が楽になればいいなぁ。
コメント