これまで Application Insights を Azure Web Apps で使った場合には Servers の値が表示されないので非常に残念でしたが、SDK Labs 扱いの AggregateMetrics を使うと一部取れるようになりました。
公式ブログを見るとパフォーマンスカウンターを扱えるようになったように取れますが、実際には読み取り権限はないので罠っぽいなと思った次第です。
折角 GitHub でソースが公開されているので、直接確認した方が早いです。
ちなみに GitHub などの CI 連携でビルドをしている場合、nuget.config に Application Insights SDK Labs のフィード URL を追加しないとパッケージ復元で失敗します。
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="AppInsights Labs" value="https://www.myget.org/F/applicationinsights-sdk-labs/api/v2" /> </packageSources> </configuration>
最新のビルドをインストールすると、Process CPU の値が % ではなく Processor Time になっているみたいで、非常に残念ながらグラフが壊れます。デフォルト設定のままなのでバグのようです。
残念な感じなので、正式リリースまでには CPU 使用率ぐらい出てほしい感じがあります。CPU の User Time と Kernel Time が取れるので、分毎の差分で何とかならないかなと考えていたりします。
New Relic では普通に出ていた気がするんですが、やはり機能的には残念な感じがします。
仕組みを調べてみた
実際のところ Azure Web Apps に与えられている権限ではパフォーマンスカウンタを読み取ることは出来ないので、App Service のランタイムがパフォーマンスカウンタの値を環境変数経由で渡しているみたいです。
用意されている環境変数は以下の 4 つです。Kudu の環境変数一覧では出ていないです。
- WEBSITE_COUNTERS_ASPNET
- WEBSITE_COUNTERS_APP
- WEBSITE_COUNTERS_CLR
- WEBSITE_COUNTERS_ALL
CLR 系の値が取れるのは便利な気がします。標準で対応しててほしい機能 No.1 ですが。
Debug Console から echo させてみると、JSON が簡単に取れました。AggregateMetrics ではこの値を読み取って、Application Insights に送信しているだけでした。
使える値は CounterFactory.cs に定義されているので、ここを見るのが手っ取り早いです。パフォーマンスカウンター名と Web Apps のメトリックとのマッピングを行っています。
実際のところ読み取れる値は App Service Plan のスコープではなく、アプリケーション単位のようなので CPU 時間やメモリ使用量など絶対的な値しか取れないです。CPU 使用率や空きメモリ量は無理です。
デフォルトで設定されているパフォーマンスカウンター名に対応していない気がしますが、あまり考えないようにしておいた方が良いかなと思い始めました。