しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps と Application Insights でパフォーマンスカウンターのような値を利用する

これまで 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 になっているみたいで、非常に残念ながらグラフが壊れます。デフォルト設定のままなのでバグのようです。

f:id:shiba-yan:20160906220158p:plain

残念な感じなので、正式リリースまでには 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 に送信しているだけでした。

f:id:shiba-yan:20160906221229p:plain

使える値は CounterFactory.cs に定義されているので、ここを見るのが手っ取り早いです。パフォーマンスカウンター名と Web Apps のメトリックとのマッピングを行っています。

実際のところ読み取れる値は App Service Plan のスコープではなく、アプリケーション単位のようなので CPU 時間やメモリ使用量など絶対的な値しか取れないです。CPU 使用率や空きメモリ量は無理です。

デフォルトで設定されているパフォーマンスカウンター名に対応していない気がしますが、あまり考えないようにしておいた方が良いかなと思い始めました。