PerformanceCounter. Monitorizando nuestras Aplicaciones.
¿Cómo hacer uso de las capacidades de monitorización que el .net Framework nos ofrece?
Para ver los Performance Counter o Contadores de rendimiento, usaremos la aplicación perfmon.exe

Para ejecutarla : Inicio/Ejecutar/perfmon/Aceptar o bien.... Inicio/Panel de control/Herramientas Adminitrativas/Performance |
Como podemos observar, se trata de una aplicación en la que podemos incluir contadores de rendimiento, que desde nuestra aplicación iremos actualizando.
Un ejemplo podría ser, una aplicación Web en la que deseamos monitorizar el número de intentos de login que se realizan, el número de estas satisfactorio, y el número de intentos de acceso erróneos.
Mediante la clase PerformanceCounter, desde nuestra aplicación, iremos simplemente indicando cada vez que uno de estos eventos ocurre, de la siguiente manera.
// comprueba la validez del par usuario/contraseña
// y maneja las estadísticas de acceso
private bool DoLogin(string user, string pwd)
{
// referencias a los contadores
PerformanceCounter intentosDeLogin;
PerformanceCounter loginsCorrectos;
PerformanceCounter loginsIncorrectos;
// Código de inicialización de los contadores
...
// Comprobar la validez del usuario/contraseña
bool loginCorrecto = false;
loginCorrecto = ComprobarCredenciales(user, pwd);
// Indicar que ha habido un nuevo intento de acceso...
intentosDeLogin.Increment();
// Indicar acceso correcto
if(loginCorrecto) loginsCorrectos.Increment();
// Indicar acceso fallido
else loginsIncorrectos.Increment();
return loginCorrecto;
}
Como vemos, es bastante sencillo. Quizá la parte más complicada en esto de la monitorización es la inicialización de los contadores.
Los contadores se agrupan en el sistema por objetos de rendimiento, que son compartidos por todas las aplicaciones. Cualquier aplicación puede hacer uso de cualquier contador.
Los contadores pueden ser comunes a todas las instancias de nuestra aplicación o podemos asociar el contador a una instancia. Las instancias no van asociadas al proceso, sino a un identificador, con lo que podríamos gestionar contadores para varias instancias desde una misma instancia de nuestra aplicación.
En el ejemplo anterior, podríamos además de especificar usuario y contraseña, indicar un dominio, y usar este dominio como identificador de la instancia, con lo que estaríamos agrupando los contadores por dominio. En la consola de monitorización podríamos elegir entonces el dominio y ver el número de accesos para todos los dominios.
Un ejemplo de contadores multidominio lo tenemos en los contadores del .NET CLR.
Si intentamos agregar cualquiera de los contadores a nuestra consola de monitorización, observaremos que en el panel de la derecha, se nos pedirá especificar el dominio para el que deseamos agregar el contador. En este caso, el .NET CLR utiliza el nombre del ejecutable como identificador de la instancia, con lo que tendremos una instancia por cada proceso .net que se esté ejecutando en ese momento en el sistema.
La clase PerformanceCounter es ThreadSafe, con lo que no debemos preocuparnos a la hora de actualizar los contadores desde diferentes hilos.
Como decíamos, los contadores se agrupan por Categorías, con lo cual, lo primero será crear una categoría para nuestra aplicación. La clase que representa una categoría de contadores es PerformanceCounterCategory.
PerformanceCounterCategory expone el método Exists que nos permite comprobar si una categoría existe o no, y el método Create para crear una nueva categoría. Si intentamos crear una categoría ya existente, se lanzará una excepción.
// Llamar al método create de PerformanceCounterCategory
// para crear una nueva categoría
PerformanceCounterCategory pfc =
PerformanceCounterCategory.Create("PEPITO_SL", // nombre
"Estos son los contadores de la aplicación Pepito SL", // descripción
PerformanceCounterCategoryType.SingleInstance, // si es multi instancia
ccds); // contadores asociados
Esto nos crearía una categoría sin contadores, pero eso no es lo que queremos. El último parámetro de PerformanceCountercategory.Create nos permite especificar los contadores que contendrá nuestra categoría y en los cuales podremos escribir.
Para crear indicar la creación de un contador usaremos la clase CounterCreationData.
En una nueva instancia de esta clase deberemos indicar un nombre para el contador (propiedad CounterName) y un tipo (propiedad CounterType)
Existen distintos tipos de contadores. Creo que en aplicaciones normales los tipos NumberOfItems32 y RateOfCountsPerSecond32 cubrirán la gran mayoría de casuísticas. Dejaremos el restro de tipos a los lectores ávidos de investigar.
CounterCreationData ccd = new CounterCreationData();
ccd.CounterName = "Intentos de Login";
ccd.CounterType = PerformanceCounterType.NumberOfItems32;
ccds.Add(ccd);
Adjunto el código usado en el ejemplo. Para simular los accesos a la web he creado unos test usando el framework de Watin. Watin es un conjunto de clases que nos permite automatizar el explorer para "grabar" pruebas en aplicaciones web.
Para ejecutar el ejemplo, simplemente hay que darle al F5. Arrancarán por un lado la aplicación Web y por el otro, el test realizado en Watin, que empezará a realizar intentos de acceso aleatorios. Faltaría simplemente arrancar el perfmon.exe y agregar los contadores de nuestra aplicación.
Espero que a alguno le sirva.
PerformanceMonitor.zip