Customizando o Health Monitoring


Estou trabalhando em um projeto que utiliza o Health Monitoring para notificações de que alguma falha ocorreu na aplicação. Essa configuração faz com que qualquer exceção não tratada, seja capturada pelo Health Monitoring e a seção customErrors garante uma página amigável para o usuário final.

A maioria dos erros não tratados são ocasionados por certos valores que são passados através de algum campo no formulário e, muito raramente, através de  query strings (no caso deste projeto). A configuração padrão do Health Monitoring traz a stack trace do erro que ocorreu e outras informações relevantes ao problema, como o usuário, tipo da exceção, servidor, processo, etc. O problema é que, para simular o erro em um ambiente de teste ou até mesmo em produção, é necessário termos os mesmos valores especificados pelo usuário, para assim tornar essa simulação o mais próximo do que ocorreu. Para isso, podemos criar um evento customizado e fazer uso dele quando uma exceção for disparada.

Essa classe que representará o evento customizado herda diretamente da classe WebRequestErrorEvent e tem o nome de WebParametersRequestErrorEvent. Ao contrário dos eventos padrões que já estão embutidos no ASP.NET, os eventos customizados devem ser explicitamente disparados e, para poupar código, podemos criar um módulo. O módulo fornece a instancia da classe HttpApplication que nos permite interceptar o evento Error que, por sua vez, é disparado sempre quando um erro não tratado ocorre na aplicação. Com isso, basta simplesmente instanciar e invocar o método Raise do evento customizado.

Finalmente, apenas o que precisamos é configurar devidamente o Health Monitoring no arquivo Web.Config da aplicação, fazendo o mapeamento entre o eventMapping, rules e providers, como é mostrado detalhadamente através do código abaixo:

<system.web>
    <healthMonitoring enabled=”true” heartbeatInterval=”0″>
        <providers>
            <add
                name=”SimpleMailWebEventProvider”
                type=”System.Web.Management.SimpleMailWebEventProvider”
                from=”suporte@site.com.br
                to=”israel@site.com.br
                buffer=”false” />
        </providers>
        <rules>
            <add
                name=”WebParametersRequestErrorEventModule Mail”
                eventName=”WebParametersRequestErrorEvent”
                provider=”SimpleMailWebEventProvider”
                profile=”Default”
                minInstances=”1″
                maxLimit=”Infinite”
                minInterval=”00:00:00″/>
        </rules>
        <eventMappings>
            <add
                name=”WebParametersRequestErrorEvent”
                type=”Logger.WebParametersRequestErrorEvent, Logger”/>
        </eventMappings>
    </healthMonitoring>
    <httpModules>
        <add
            name=”WebParametersRequestErrorEventModule”
            type=”Logger.WebParametersRequestErrorEventModule, Logger”/>
    </httpModules>
<system.net>

Ao receber o e-mail, tenho todos os detalhes do erro que já era fornecido pelo evento WebRequestErrorEvent, e mais os dados contextuais da requisição:

Custom event details:
    Request – QueryStrings
            ID: 123
            Nome: Israel Aece
            E-mail: israel@projetando.net
    Request – Forms
            __VIEWSTATE: /wEPDwUJOTQ4N…m+ks3yA==
            __EVENTVALIDATION: /wEWBALs0J+…ewcwK+BGBh
            txtValor: 123,45
            txtNome: Jack Bauer
            Button1: Button

Download: WebParametersRequestErrorEvent.cs.txt (1.37 kb) e WebParametersRequestErrorEventModule.cs.txt (654.00 bytes)

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s