
Atualmente tenho um aplicativo em um cluster IIS com balanceamento de carga (NLB) no Server 2008 R2. Este aplicativo aproveita algum código de acesso ao banco de dados legado que ocasionalmente falha o suficiente para desabilitar o pool de aplicativos.
Gostaria de implementar um observador de eventos WMI para monitorar a mudança no status do pool de aplicativos (outras sugestões são bem-vindas), que reiniciaria o pool de aplicativos se ele entrasse em um estado parado.
Isso é uma solução temporária até que um novo código possa ser enviado, mas isso precisa passar por um ciclo Dev/QA/UAT.
Há uma classe WMI para o ApplicationPool no namespace root\webadministration; no entanto, para obter o status, você precisa chamar o método GetState nesse objeto, portanto, não tenho certeza de como observar isso com um evento WMI.
Responder1
Você pode fazer isso com o monitoramento integrado do log de eventos.
Se o pool de aplicativos estiver sendo encerrado devido à proteção rápida contra falhas, provavelmente haverá uma ID de evento 5002 como a seguinte no log de eventos do sistema:
"O pool de aplicativos 'AppPoolName' está sendo desativado automaticamente devido a uma série de falhas no(s) processo(s) que atendem a esse pool de aplicativos."
Crie uma tarefa agendada para um gatilho de log de eventos personalizado. Uma consulta XML manual seria mais ou menos assim:
<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>
Sua ação de tarefa agendada poderia ser executar um script que executa appcmd para reiniciar o pool de aplicativos específico.
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".
Se você tiver vários pools de aplicativos no mesmo servidor, talvez seja necessário refinar o filtro XML para especificar o ID do pool de aplicativos. Aqui está um exemplo de texto XML de evento:
- <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>
Informações sobre filtragem avançada do log de eventos:
https://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx
Use APPCMD para reciclar um pool de aplicativos:
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
Responder2
Para sua informação, se estiver falhando devido à proteção rápida contra failover, você pode desativá-la em vez de ficar na ponta dos pés: