Compartir a través de


Diagnóstico y trazas

En Windows Azure no se dispone de acceso a recursos locales del sistema de archivos ni al log de eventos de Windows.

Esta situación plantea la necesidad de tener un mecanismo diferente a los tradicionales para escribir las trazas de la aplicación. Algo que permita detectar y diagnosticar comportamientos anómalos de la aplicación cuando ésta se encuentra desplegada en la plataforma Windows Azure.

El SDK de Windows Azure proporcionar un 'trace listener' especialmente diseñado para ser utilizado en aplicaciones en la nube. Este listener está implementado en la clase DiagnosticsMonitorTraceListener del namespace Microsoft.WindowsAzure.Diagnostics y deriva de la clase TraceListener del framework de .Net. Trabajar con este listener es, por tanto, idéntico a trabajar con cualquier otro trace listener de .Net.

Si quisiéramos escribir trazas y diagnosticar el estado de un servicio, lo primero sería asegurarse de que en el archivo de configuración (.config) de la aplicación está configurado correctamente el trace listener de Azure:

<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener,
Microsoft.WindowsAzure.Diagnostics,Version=1.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"><filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>

Una vez configurado correctamente el trace listener de Azure, se pueden lanzar trazas desde la aplicación usando las clases Debug y Trace del framework de .Net.

Trace.TraceInformation("La aplicación se está ejecutando"); ... 
Trace.TraceWarning("¡Se produjo un warning!"); ...
Trace.TraceError ("¡Se produjo un error critico!"); ...

Como parámetro al método Trace correspondiente al nivel del error se debe pasar el mensaje que se desea que aparezca en el log. Después se podrá establecer el nivel de detalles del log en un momento dado, tanto en el Development Fabric como en el Fabric real de Windows Azure.

Nota: Hay que destacar que todas aquellos mensajes de traza que se lancen con el nivel Critical, serán enviados también como alertas y sólo deberían ser utilizados en situaciones que exijan una intervención urgente por parte de un operador de la aplicación.

El resultado de las trazas se puede ver en el Development Fabric:

Es posible cambiar el nivel de log en del Development Fabric desde el menú contextual del role correspondiente:

Una vez establecido el nivel de log a Critical, solo las trazas de este nivel aparecen, como se puede observar en la captura.

Evidentemente ver las trazas de la aplicación en el Development Fabric es muy útil durante el desarrollo y depuración de la misma, pero también se necesitará ver como se está comportando la aplicación una vez desplegada en la nube.

Pare ello existe la posibilidad de almacenar las trazas de la aplicación en el almacenamiento de Window Azure. Para ello basta con utilizar el método Start de la clase Diagnostics monitor para configurar una cadena de conexión al almacenamiento de Azure.

Además de inicializar el sistema de trazas e indicarle la cadena de conexión al Windows Azure Storage, en el siguiente ejemplo se configura la periodicidad que debe tenerse en cuenta para enviar la información al almacenamiento. En el ejemplo se configura para que las trazas se envíen cada 1 minutos.

//Get the default initial configuration for Windows Azure Diagnostics   
DiagnosticMonitorConfiguration diagConfig = DiagnosticMonitor.
GetDefaultInitialConfiguration();
//Specify the scheduled transfer
diagConfig.Logs.ScheduledTransferPeriod = System.TimeSpan.
FromMinutes(1.0);
//Start the diagnostic monitor with this updated configuration.
DiagnosticMonitor.Start("DiagnosticsConnectionString",diagConfig);

Tipos de trazas

Windows Azure, además de las trazas generadas por la aplicación, es capaz de recoger múltiple información que puede servir para diagnosticar diferentes situaciones que pueden darse dentro de la plataforma y la aplicación.

Es capaz de recoger la siguiente información:

  • Logs de Windows Azure.
  • Logs de la aplicación.
  • Logs de IIS 7.0.
  • Logs generados por la infraestructura de Windows Azure.
  • Logs de peticiones fallidas.
  • Logs generados en el log de eventos de windows.
  • Contadores de rendimiento.
  • Volcados de memoria.

En el siguiente ejemplo se muestra cómo configurar la aplicación para recoger información sobre los contadores de rendimiento.

// Get default initial configuration.   
var config = DiagnosticMonitor.GetDefaultInitialConfiguration();
// Adding performance counters to the default diagnostic configuration
config.PerformanceCounters.DataSources.Add( new
PerformanceCounterConfiguration(){CounterSpecifier = @"\Processor
(_Total)\% Processor Time", SampleRate = TimeSpan.FromSeconds(5)});
config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter =
LogLevel.Error; config.DiagnosticInfrastructureLogs.
ScheduledTransferPeriod = TimeSpan.FromMinutes(5);
// Start the diagnostic monitor with the modified configuration.
DiagnosticMonitor.Start("DiagnosticsConnectionString", config);

Aunque la configuración sobre la información a recoger puede establecerse dentro de la propia aplicación, éste también puede establecerse una vez desplegada la aplicación a través del API de administración de Windows Azure.

"Depuración" desde la nube

Como se ha comentado anteriormente, una aplicación desplegada no puede ser depurada desde Visual Studio. En la mayoría de los casos será suficiente con el Development Fabric para poder depurar la aplicación desde Visual Studio y encontrar los posibles errores que pudiera tener la aplicación.

Aunque no existe la opción de depurar de forma directa desde Visual Studio, existe la posibilidad de utilizar la característica de Visual Studio "Intellitrace" para poder realizar una depuración desde Visual Studio.

Esta característica es una de las novedades de Visual Studio 2010.Se trata de una herramienta que ofrece la posibilidad de realizar depuración histórica y es una parte clave para tratar los escenarios típicos dónde es muy difícil reproducir un determinado escenario. Desde el punto de vista de Windows Azure la integración de IntelliTrace permite depurar problemas que ocurren en la nube pero que no son reproducibles en el entorno de desarrollo.

Al hacer el despliegue desde Visual Studio se puede activar la característica para aquellos roles que empleen el framework 4.0.


Figura 1.- Pantalla de publicación

Pudiendo configurar la información que se desea recoger.


Figura 2.- Configuración del Intellitrace


Figura 3.- Configuración del Intellitrace


Figura 4.- Ver los log generados por la aplicación