しばやん雑記

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

Windows Containers でも Application Insights でパフォーマンスカウンターを読めるようにする

デフォルトのままで Windows Containers で動かすアプリに Application Insights をインストールすると、パフォーマンスカウンターの値が正しく取れない問題があります。

実際に実行すると CPU やメモリ周りの値が Quick Pulse で取れてません。

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

アプリケーションの運用ではパフォーマンスカウンターの値が欲しくなるケースが多いので、今回 Web App for Containers が Windows 対応したのをきっかけに真面目に調べました。

最初は Application Insights 側の問題かと思ってましたが、実際には権限の問題でした。Performance Monitor Users グループに Application Pool Identity のユーザーを追加すれば読めるようになりました。

# escape=`

FROM microsoft/dotnet-framework:4.7.2-sdk-windowsservercore-ltsc2016 as build

COPY . .

RUN nuget restore; `
    msbuild .\AspNetApplication\AspNetApplication.csproj /nologo /v:m /t:Build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile


FROM microsoft/aspnet:4.7.2-windowsservercore-ltsc2016

RUN net localgroup 'Performance Monitor Users' /add 'IIS APPPOOL\DefaultAppPool'

COPY --from=build ./publish/ /inetpub/wwwroot

Dockerfile に 1 行追加するだけです。デフォルトのイメージでは IIS APPPOOL\DefaultAppPool が使われるので、このユーザーをグループに固定で追加します。

古い Docker ではパフォーマンスカウンターが読めない問題もあったみたいですが、今は直っています。

例によって ACR Build で作成したイメージを、開発環境の Hyper-V Containers と Azure Container Instances で動かしてみると、CPU とメモリの値が表示されるようになりました。

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

サーバー名はコンテナ ID になるので、簡単にどの環境で動いているか識別することが出来ますが、肝心の Web App for Containers では上手く動作せず、常に 0 が返ってきてしまっています。

全く同じイメージを使っているので、ホスト OS や Docker のバージョンによって差が出るのかも知れません。フォーラムにでも書く予定です。

それ以外の環境では問題なくパフォーマンスカウンターが読めるので、Servers で確認も簡単です。

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

Azure Container Instances でも ASP.NET 関係のパフォーマンスカウンターは読めていないので何とかしたいですが、最低限のカウンターは読めているので何とかなりそうです。

通常の App Service ではパフォーマンスカウンターは読めないので、プラットフォーム側に用意された値しか使えないですが、Windows Containers になれば自由度が増します。

そろそろ Azure Cloud Services からの完全移行が Web App for Containers で可能ではないかと考えているので、マイグレーション方法を確認予定です。