WMI を使用して IIS 7.5 アプリケーション プールを監視するにはどうすればよいでしょうか?

WMI を使用して IIS 7.5 アプリケーション プールを監視するにはどうすればよいでしょうか?

現在、Server 2008 R2 上の負荷分散された IIS クラスター (NLB) にアプリケーションがあります。このアプリケーションは、レガシー データベース アクセス コードを活用しており、ときどき失敗するとアプリケーション プールが無効になります。

アプリ プールの状態の変化を監視する WMI イベント ウォッチャーを配置し (他の提案も歓迎します)、アプリ プールが停止状態になった場合にアプリ プールを再起動できるようにしたいと思います。

これは、新しいコードをプッシュできるようになるまでの一時的な回避策ですが、Dev/QA/UAT サイクルを経る必要があります。

root\webadministration 名前空間には ApplicationPool の WMI クラスがありますが、ステータスを取得するには、そのオブジェクトの GetState メソッドを呼び出す必要があるため、WMI イベントでそれを監視する方法がわかりません。

答え1

組み込みのイベント ログ監視を使用してこれを実行できる可能性があります。

ラピッド フェール保護によりアプリケーション プールがシャットダウンしている場合は、システム イベント ログに次のようなイベント ID 5002 が記録されている可能性があります。

「アプリケーション プール 'AppPoolName' は、そのアプリケーション プールを提供するプロセスで発生した一連の障害のため、自動的に無効にされます。」

カスタム イベント ログ トリガーのスケジュールされたタスクを作成します。手動の XML クエリは次のようになります。

<QueryList>
 <Query Id="0" Path="System">
 <Select Path="System">*[System[Provider[@Name='Microsoft-Windows-WAS'] and (EventID=5002)]] 
 and *[EventData[Data[@Name='AppPoolID'] and (Data='YourAppPoolFriendlyName')]]</Select>
 </Query>
</QueryList>

スケジュールされたタスク アクションは、appcmd を実行して特定のアプリケーション プールを再起動するスクリプトを実行することです。

appcmd recycle apppool /?
Recycle application pool

APPCMD recycle APPPOOL <identifier> <-parameter1:value1 ...>

Recycles the specified application pool, recycling its the worker processes.
The exact application pool identifier must be provided and must resolve to an
existing application pool.

Supported parameters:

 identifier (required)

    Application pool name of the application pool to recycle

 /apppool.name

    Application pool name of the application pool to recycle (same as
    identifier)


Examples:

 appcmd recycle apppool "MyAppPool"

    Recycle the application pool "MyAppPool".

同じサーバーに複数のアプリケーション プールがある場合は、XML フィルターを調整してアプリケーション プール ID を指定する必要がある場合があります。次にイベント XML テキストのサンプルを示します。

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Microsoft-Windows-WAS" Guid="{524B5D04-133C-4A62-8362-64E8EDB9CE40}" EventSourceName="WAS" /> 
  <EventID Qualifiers="49152">5002</EventID> 
  <Version>0</Version> 
  <Level>2</Level> 
  <Task>0</Task> 
  <Opcode>0</Opcode> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2012-10-01T19:41:43.000000000Z" /> 
  <EventRecordID>408764</EventRecordID> 
  <Correlation /> 
  <Execution ProcessID="0" ThreadID="0" /> 
  <Channel>System</Channel> 
  <Computer>WEBSERVERNAME.company.com</Computer> 
  <Security /> 
  </System>
- <EventData>
  <Data Name="AppPoolID">YourAppPoolFriendlyName</Data> 
  <Binary /> 
  </EventData>
  </Event>

イベント ログの高度なフィルタリングに関する情報:
https://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx

APPCMD を使用してアプリケーション プールをリサイクルします。
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx

答え2

参考までに、迅速なフェイルオーバー保護が原因で失敗する場合は、慎重に回避するのではなく、それを無効にすることができます。

https://stackoverflow.com/a/4802309/448129

関連情報