terça-feira, 1 de abril de 2008

Trace - Rastreando a requisição

Através do ASP.NET Trace podemos obter várias informações de uma requisição. Esta funcionalidade permite ainda que adicionemos informações de depuração nas nossas aplicações e não será necessário retirá-las quando colocarmos nossa aplicação em produção.

Para utilizarmos desse funcionalidade, temos que habilitar o trace, fazendo isso o ASP.NET já adiciona várias informações para diagnóstico do trace, o ASP.NET também adiciona as mensagens customizadas que tenhamos colocado.

Todas as mensagens podem ser analisadas na própria página requisitada, ou através de uma página separada, onde é possível analisar um histórico de requisições.

Habilitando Trace por página

Podemos habilitar o trace de uma página adicionando o atributo e valor Trace=”true” na diretiva da página @Page, conforme código 1.

<%@Page Language="C#" AutoEventWireup="true" CodeFile="TraceDaPagina.aspx.cs" Inherits="TraceDaPagina" Trace="true" %>

Código 1 – Habilitando o trace da página

Ao executar nossa aplicação e requisitar esta página nos será exibido o retorno de nossa página e adicionado ao final várias informações sobre a requisição, conforme Imagem 1:



Imagem 1 - Trace da página

O ASP.NET já adiciona várias informações para que possamos analisar a requisição. Há informações de detalhes da requisição, como data, hora, id da sessão, tipo de requisição e outros. Na seção Trace Information podemos ver os vários métodos da página e o tempo gasto em cada um deles, desta forma poderíamos analisar se algum método está gastando muito tempo e ver se este está fazendo algum processamento desnecessário.

É possível ver também a hierarquia de controles da página e o tamanho em Bytes que cada controle gera. Temos informações de sessão, aplicação, cookie, cabeçalho da requisição e da resposta e várias outras.

Dica de segurança: Quando o trace está ativo, várias informações estão disponíveis para os usuários da aplicação. Tenha a certeza que o trace esteja desabilitado quando a aplicação estiver em produção.

Escrevendo informações customizadas

O ASP.NET disponibiliza o objeto Trace, que é do tipo TraceContext, disponível em vários contextos. Na página podemos utilizar Page.Trace, no global.asax podemos utilizar o HttpContext.Current.Trace.

O TraceContext disponibiliza dois métodos, Write e Warn, que adicionam mensagens ao log do trace, o último adiciona mensagens em vermelho no trace. Estes métodos são sobrecarregados e possuem várias formas de utiliza-los com os diferentes parâmetros. É possível ainda utilizar a propriedade IsEnabled para saber se o trace está habilitado ou não.

No código 1, abaixo, são utilizados os métodos e a propriedade citadas. É chamado também o método Thread.sleep que recebe um número de milisegundos que é o tempo que a thread responsável pela execução da requisição será colocada para dormir.

public partial class TraceDaPagina : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (Trace.IsEnabled)

{

Trace.Warn("Testando performance", "Começo do teste");

Trace.Write("Testando performance", "Antes de dormir");

Thread.Sleep(2000);

Trace.Write("Testando performance", "Após o for");

}

}

Código 1 – Utilizando o objeto Trace

Veja como isto aparece nas informações do Trace na imagem 2.





Imagem 2 - Adicionando informações ao Trace

Definindo Trace para toda aplicação

Já vimos que é possível configurar o trace individualmente nas páginas. Outra possibilidade é configurarmos o trace para toda aplicação. Para isto basta configurarmos o elemento trace do web.config, quando configurado, o ASP.NET armazena informações de traces até o número máximo de requisições que definirmos. O padrão são 10 requisições, que pode ser alterado e armazendo as mais recentes ou as mais antigas.

Podemos habilitar o trace para toda aplicação e posteriormente desativar o trace por página, também utilizando o atributo Trace da diretiva @Page. Veja o código 2 um exemplo:



<configuration>

<system.web>

<trace localonly="true" requestlimit="40" enabled="true"></trace>

</system.web>

</configuration>

Código 2 – Configurando trace no web.config

Habilitando o trace desta maneira você poderá visualizar as informações de trace por requisição através do recurso trace.axd. conforme Imagem 3.


Imagem 3 - Trace.axd

Os atributos configuráveis no elemento trace do web.config são:

Attribute

Description

enabled

Padrão false, true para habilitar o trace por aplicação.

pageOutput

Padrão false, true para mostrar informações de trace na página requisitada e no visualizador de trace(trace.axd).

requestLimit

Padrão 10. Número de requisições com informações de trace para serem armazenadas no servidor.

traceMode

Padrão SortByTime. Se ordena as informações de trace por data e hora(SortByTime) ou por categoria(SortByCategory).

localOnly

Padrão true. Se o visualizador de trace está disponível somente na máquina Web server.

mostRecent

Padrão false, true para mostrar as informações de trace mais recentes, desta forma ao atingir o requestLimit, as requisições mais antigas darão lugar as requisições mais recentes.

Idéia de prática

O try, catch e finally é um recurso interessante para tratamento de exceção, sabe o que o trace de uma requisição a uma página, que teria o o código 3 em seu codebehind mostraria?

protected void Page_Load(object sender, EventArgs e)

{

LoopDeDivisoes();

}

public void LoopDeDivisoes()

{

Trace.Warn("Entrou no Loop de Divisoes");

for (int i = 5; i >= 0; i--)

{

int retorno = ResultadoDaDivisao(10, i);

Trace.Write(string.Format("Retorno do método {0}", retorno));

}

}

protected int ResultadoDaDivisao(int valorA, int valorB)

{

int resultadoDivisao = -1;

Trace.Write(string.Format("{0} / {1}", valorA, valorB));

try

{

resultadoDivisao = valorA / valorB;

Trace.Write(string.Format("Resultado: {0}", resultadoDivisao));

return resultadoDivisao;

}

catch (DivideByZeroException)

{

Trace.Write("Erro de divisão por 0");

throw;

}

finally

{

Trace.Write("Finally do Resultado da divisão");

}

}

Código 3 – Prática de trace manipulando exceções

Trace

http://msdn2.microsoft.com/en-us/library/system.diagnostics.trace.aspx

http://msdn2.microsoft.com/en-us/library/kthye016.aspx

http://msdn2.microsoft.com/en-us/library/1y89ed7z.aspx

http://msdn2.microsoft.com/en-us/library/y13fw6we%28VS.71%29.aspx

http://msdn2.microsoft.com/en-us/library/z48bew18.aspx