sexta-feira, agosto 22, 2008

ASP.NET: Trace

Mais um mecanismo poderosíssimo no ASP.NET é a capacidade de monitorização e de Trace que fornece. Existe a possibilidade de saber que métodos são invocados quando é executada uma página, quais os tempos de execução, que tabelas do SQL Server foram invocadas, quais os parâmetros de entrada daquela página e muito, muito mais.

Estás a desenvolver em ASP.NET e estás a bater com a cabeça na parede por não saber resolver o problema? A resposta pode estar aqui.



Trace no ASP.NET e WebServices


Por Mauro Sant'Anna (mas_mauro@hotmail.com).
Mauro é um "MSDN Regional Director", consultor e instrutor da MAS Informática (www.mas.com.br), tendo ministrado treinamentos na arquitetura .NET desde outubro de 2000.

No artigo anterior examinamos como depurar um programa ASP.NET® ou WebService com o Microsoft Visual Studio .NET®. Na depuração estamos interessados em executar o programa sobre nosso estrito controle e examinar na minúcia as suas entranhas. No "trace" não estamos tão interessados em minúcias e sim executar o programa sem impedimentos e obter informações de mais "alto nível" sobre o que está acontecendo.

A biblioteca ASP.NET pode gerar automaticamente bastante informação de trace. Para ligar o trace não precisamos modificar o programa nem ter acesso ao seu código fonte; basta mudar uma linha no arquivo web.config. Usarei o exemplo desenvolvido anteriormente no artigo sobre depuração, mas você poderá experimentar com qualquer programa Web feito com o Visual Studio .NET.



Existem várias maneiras de ligar e desligar o trace, mas a que eu considero a mais recomendável é modificar uma entrada no arquivo XML web.config. Na tag "trace" devemos mudar enabled="false" para enabled="true":

<trace enabled="true" requestlimit="10" pageoutput="false" tracemode="SortByTime" localonly="true"/>

A modificação pode ser feita no Visual Studio ou em qualquer outro editor de texto. Para ativá-la não é necessário sequer recompilar o programa, basta salvar o arquivo web.config. O aplicativo será automaticamente reinicializado em modo trace no próximo pedido de alguma página do aplicativo.



Nosso aplicativo agora está coletando informações de "trace". Precisamos então de um programa para exibir estas informações. A maneira mais fácil é usar o InternetExplorer e apontar para uma página especial em nosso aplicativo chamada "trace.axd". Por exemplo, se a nossa URL for "http://localhost/Soma/WebForm1.aspx", nosso aplicativo será "http://localhost/Soma/" e a página de trace será http://localhost/Soma/trace.axd. Observe que o trace é válido para todas as páginas do aplicativo. Veja um exemplo de saída:



A página acima contém a lista dos últimos quatro traces armazenados, para um total possível de até dez. A quantidade máxima de páginas pode ser modificada em requestLimit no arquivo web.config. Vamos selecionar um dos links "View Details":





É possível exibir a saída do trace na própria página do aplicativo colocando pageOutput= "true":

<trace enabled="true" requestlimit="10" pageoutput="true" tracemode="SortByTime" localonly="true"/>

A saída do trace agora é misturada com a saída do aplicativo:



Exibir esta página misturada tem vantagens e desvantagens: por um lado não precisamos chamar uma página específica, por outro lado a página fica confusa. É uma questão de gosto.



Em "Request Details" temos algumas informações óbvias. "Session ID" é a chave usada pelo mecanismo de variáveis de sessão do ASP.NET que identifica esta sessão. É a mesma string exibida no meio da URL se você estiver usando sessões sem cookies (entrada no arquivo config.web).

Em "Trace Information" são mostrados os eventos chamados e quanto tempo cada um tomou. É interessante para observar a ordem em que cada evento é disparado e qual está gastando mais tempo. É possível colocar informações nesta seção a partir do seu programa, como veremos a seguir.

Em "Control Tree" temos a lista de todos os controles criados pelo servidor no processamento da página, com informações de quantos bytes cada um gerou na saída e quanto cada um usa no campo escondido __VIEWSTATE para armazenar o estado da página. Essa informação é interessante para saber se temos muitos controles, o que pode tornar o aplicativo mais lento, qual está gerando mais saída e quais estão gastando espaço no __VIEWSTATE, já que tudo que está neste campo vai e volta ao navegador e pode comprometer a performance.

"Cookie Collection" mostra os cookies usados pelo aplicativo. Normalmente um cookie é usado para identificar a sessão e tem o mesmo nome que "Session ID", mas o seu programa pode tanto criar e usar outros cookies diretamente como usar sessões sem cookies.

"Header Collection" mostra exatamente os cabeçalhos enviados pelo navegador Web, conforme o protocolo HTTP. Você pode usar esta entrada para descobrir detalhes do pedido, como por exemplo a versão, modelo e fabricante do navegador que efetuou o pedido.

"Form Collection" ou "Query String Collection" mostra os pares "nome-valor" enviados pelo navegador, correspondendo normalmente aos campos da página.

"Server Variables" mostra os valores das diversas variáveis enviadas ao seu programa pelo servidor Web, conforme o protocolo CGI.



Nossos programas podem colocar informações na saída do "Trace" com o método Context.Trace.Write. Veja um exemplo:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim N1 As Double = TextBox1.Text
Dim N2 As Double = TextBox1.Text
Dim R = N1 + N2
ListBox1.Items.Add(R)
Context.Trace.Write("Test", "Sum with " & N1 & " " & N2)
End Sub


Veja a saída na página Web de trace com a nossa mensagem destacada:





As outras entradas na tag XML Trace têm o seguinte significado:
  • requestLimit: Número inteiro que indica quanta informação de trace deve ser armazenada em memória, em número de páginas; o padrão é 10;
  • traceMode: Indica como deve ser ordenada a saída no grupo "Trace Information". As opções são SortByTime para ordenar em ordem cronológica e SortByCategory para ordenar por categoria (a categoria é a primeira string do método Context.Trace.Write);
  • localOnly: Indica se a informação de trace pode ser vista apenas no servidor (true) ou em qualquer micro (false). Por segurança, ela a princípio pode ser vista apenas no servidor.




Conclusão

O Trace permite facilmente obter diversas informações de execução dos aplicativos ASP.NET de forma a saber melhor o que está acontecendo com o aplicativo, corrigir erros e melhorar a performance.



Artigo de Mauro Sant'Anna, pode consultá-lo aqui.

Sem comentários: