Compartir a través de


Extender eventos de supervisión de estado de ASP.NET

Actualización: noviembre 2007

Se puede realizar las tareas siguientes para ampliar las características de supervisión del estado de ASP.NET:

Almacenar en búfer eventos de supervisión de estado de ASP.NET

Puede configurar el SQL y los proveedores de eventos de supervisión de estado del correo (SqlWebEventProvider, SimpleMailWebEventProvider y TemplatedMailWebEventProvider) para utilizar el almacenamiento en búfer de eventos. Esto ayuda a reducir el impacto en el rendimiento de la aplicación debido al envío frecuente de mensajes de correo electrónico o a la realización frecuente de inserciones del servidor SQL. Almacenando en búfer los eventos de supervisión de estado, también se protege el servidor SMTP y SQL Server de la pesada carga que puede provocar un alto volumen de eventos.

Almacenamiento en búfer del proveedor de eventos SQL

Si habilita el almacenamiento en búfer del proveedor de eventos SQL, el proveedor almacena en búfer la información de eventos según el modo de búfer especificado antes de insertar información de búfer en la base de datos en un lote.

De forma predeterminada, el proveedor SqlWebEventProvider no se configura para utilizar el almacenamiento en búfer. Cada vez que se provoca un evento, su información se inserta inmediatamente en la base de datos. Puede invalidar esta configuración predeterminada habilitando el almacenamiento en búfer en el elemento providers del archivo Web.config donde se especifica el proveedor de SQL. Para ello, se establece el atributo buffer del elemento add en true. Si configura su propio proveedor SQL (es decir, si no utiliza SqlWebEventProvider) y no especifica un valor para el atributo buffer, entonces el valor predeterminado es true.

Puede personalizar el comportamiento del almacenamiento en búfer seleccionando un modo de almacenamiento en búfer predefinido. De forma alternativa, puede agregar elementos personalizados a la colección bufferModes. Cada elemento define propiedades como el tamaño del búfer y la frecuencia de vaciado del búfer. Puede configurar el proveedor para utilizar uno de los modos de búfer definidos.

El ejemplo siguiente muestra las opciones de configuración para el proveedor de eventos SQL con el almacenamiento en búfer habilitado.

Nota:

El elemento AnalysisbufferModes ya está configurado en el archivo Web.config raíz y no necesita declararse de nuevo en un archivo Web.config en el nivel de aplicación. El elemento SqlWebEventProviderproviders también está configurado en el archivo Web.config raíz pero el atributo buffer está establecido en false y el atributo bufferMode, en Notification. Por consiguiente, el elemento providers que se muestra en el ejemplo se debe declarar en un archivo Web.config de la aplicación. También se debe utilizar un elemento clear o remove para quitar la configuración de nivel superior del proveedor SqlWebEventProvider.

En el ejemplo, el proveedor de eventos SQL está configurado para utilizar el modo de búfer Analysis cuando está habilitado el almacenamiento en búfer, lo que está definido en el elemento bufferModes. En este modo, el proveedor vacía la información de eventos cada 5 minutos. Vacía hasta 100 eventos por notificación y almacena en búfer hasta 1000 eventos en caso de que se produzca un brusco aumento en la frecuencia de eventos. El proveedor garantiza que no enviará eventos con una frecuencia superior a una vez por minuto.

<healthMonitoring>
  <providers>
    <clear/>
    <add 
      ConnectionStringName="LocalSqlServer" 
      maxEventDetailsLength="1073741823"
      buffer="true" 
      bufferMode="Analysis" 
      name="SqlWebEventProvider"
      type="System.Web.Management.SqlWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
    />
  </providers>
  <bufferModes>
    <add 
      name="Analysis" 
      maxBufferSize="1000" 
      maxFlushSize="100"
      urgentFlushThreshold="100" 
      regularFlushInterval="00:05:00"
      urgentFlushInterval="00:01:00" 
      maxBufferThreads="1"
    />
  </bufferModes>
</healthMonitoring>

Almacenamiento en búfer del proveedor de eventos de correo electrónico

Si habilita el almacenamiento en búfer para los proveedores de eventos de correo, los proveedores almacenan en búfer los eventos antes de enviar mensajes de correo electrónico como notificaciones de eventos. Si configura un proveedor de eventos de correo electrónico y no especifica un valor para el atributo buffer del elemento add para el proveedor de eventos de correo electrónico, el valor predeterminado es true. Puede deshabilitar el almacenamiento en búfer estableciendo el atributo buffer en false.

Puede personalizar el comportamiento del almacenamiento en búfer seleccionando un modo de almacenamiento en búfer predefinido. De forma alternativa, puede agregar elementos personalizados a la colección bufferModes. Cada elemento define propiedades como el tamaño del búfer y la frecuencia de vaciado del búfer. Puede configurar el proveedor para utilizar uno de los modos de búfer definidos. Se recomienda utilizar el modo CriticalNotification.

En el ejemplo siguiente se muestran las opciones de configuración para los proveedores de eventos de correo electrónico con el almacenamiento en búfer deshabilitado para la clase SimpleMailWebEventProvider y habilitado para la clase TemplatedMailWebEventProvider. Se configura el proveedor TemplatedMailWebEventProvider para utilizar el modo de búfer CriticalNotification, que ya está configurado en el archivo Web.config raíz. En modo CriticalNotification, el proveedor intenta vaciar toda la información de eventos en cuanto éstos se reciben. Sin embargo, el intento de vaciado no se realizará correctamente más de una vez por minuto para evitar sobrecargar el servidor de correo electrónico. Los mensajes son de un tamaño manejable. La información es para 20 eventos como máximo.

Si el sistema de supervisión de estado recibe más información de eventos que el máximo permitido, los eventos más antiguos se eliminan al generarse nuevos eventos. El sistema de supervisión de estado intenta evitar la eliminación de eventos vaciando con más frecuencia cuando el búfer se está llenando. Sin embargo, no intentará enviar información de los eventos si éstos se han eliminado. (Sin embargo, en el vaciado siguiente incluirá una notificación de que los eventos fueron eliminados.) Los eventos más recientes se retrasarán como máximo cinco minutos si el proveedor tiene una gran carga, suponiendo que no se eliminen porque el búfer esté lleno.

<healthMonitoring>
  <providers>
    <!-- mail provider with attributes that are always relevant -->
    <add 
      name="SimpleMailWebEventProvider" 
      type="System.Web.Management.SimpleMailWebEventProvider"
      to="SystemAdministrator@contoso.com"
      from="HealthMonitoring@contoso.com"
      buffer="false" 
    />
    <!-- mail provider with attributes that are relevant only 
         when buffering is enabled -->
    <add 
      name="SampleTemplatedMailWebEventProvider" 
      type="System.Web.Management.TemplatedMailWebEventProvider"
      to="SystemAdministrator@contoso.com" 
      from="HealthMonitoring@contoso.com" 
      buffer="true" 
      bufferMode="Critical Notification"
      template="Template.aspx" />
  </providers>
  <bufferModes>
    <add 
      name="Critical Notification" 
      maxBufferSize="100" maxFlushSize="20"
      urgentFlushThreshold="1" 
      regularFlushInterval="Infinite" 
      urgentFlushInterval="00:01:00"
      maxBufferThreads="1"
    />
  </bufferModes> 
</healthMonitoring>

Para que el ejemplo funcione, debe configurar un servidor SMTP en el archivo de configuración como se muestra en el ejemplo siguiente.

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network 
        defaultCredentials="true" 
        host="127.0.0.1" 
        port="25" 
        username="username" 
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

Para obtener más información, vea <mailSettings> (Elemento, Configuración de red).

Nota:

Hay algunos riesgos de seguridad asociados al almacenamiento de contraseñas de texto no codificado en un archivo de configuración. Si conserva las credenciales en el archivo de configuración, debe cifrar el contenido del elemento de configuración < mailSettings > mediante una configuración protegida. Para obtener más información, vea Cifrar información de configuración mediante una configuración protegida.

Configuración del modo de búfer

Puede establecer los siguientes atributos del elemento add en el elemento bufferModes para especificar el comportamiento del búfer:

  • regularFlushInterval   Intervalo de vaciado habitual de información de eventos.

  • urgentFlushThreshold   Número de eventos cuya información se debe almacenar en búfer antes de que éste se vacíe.

La configuración siguiente especifica las garantías realizadas por el proveedor al receptor de eventos.

  • maxBufferSize   Número máximo de eventos cuya información contendrá el búfer. Si el número de eventos en el búfer supera este valor, se eliminan eventos anteriores.

  • maxFlushSize   Número máximo de eventos cuya información vaciará el proveedor a la vez.

  • urgentFlushInterval   Tiempo mínimo que esperará el proveedor antes de realizar otro vaciado urgente. Si no ha transcurrido el tiempo representado por la propiedad urgentFlushInterval desde el último vaciado pero el búfer está lleno, la información más antigua se elimina del búfer. El proveedor realiza el seguimiento del número de eventos eliminados e incluye una advertencia en la siguiente notificación de evento.

Utilizar WMI para realizar el seguimiento de los eventos de supervisión de estado de ASP.NET

Una manera de supervisar el estado de eventos de ASP.NET es utilizar el proveedor de eventos del Instrumental de administración de Windows (WMI), la clase WmiWebEventProvider. Este proveedor convierte los eventos de supervisión de estado Web (eventos Web) en eventos de WMI. WMI proporciona un modelo de objetos estándar en el que las entidades que desee supervisar se pueden representar como objetos. Estas entidades representan equipos, tarjetas de red, impresoras, aplicaciones de software, etc. Las entidades se asignan en el modelo de objetos de WMI de manera que aplicaciones personalizadas las puedan supervisar. La ilustración siguiente muestra la relación entre los eventos Web de ASP.NET, WMI y una aplicación de usuario que realiza escuchas de eventos WMI.

Relación entre ASP.NET y WMI

Conexión entre los eventos de estado y WMI

La supervisión de estado de ASP.NET proporciona la infraestructura para la conexión entre los eventos de estado y WMI. Lo hace mediante la asignación de estos eventos a las clases de WMI, de manera que se puedan tratar como objetos WMI. También proporciona la compatibilidad para procesar los eventos de estado y enviarlos al sistema de WMI. Para obtener información sobre cómo asignar los eventos de ASP.NET a WMI, vea Tutorial: Escuchar eventos WMI en la supervisión de estado ASP.NET. Para obtener más información acerca de WMI, vea Windows Management Instrumentation en el sitio web MSDN.

En la lista siguiente se describen los pasos necesarios para supervisar los eventos de estado con WMI:

  1. Definir la asignación entre las clases de evento Web y los objetos WMI. Este paso ya se ha realizado automáticamente para cada una de las clases de evento web estándar. Estas asignaciones se incluyen en el archivo de formato MOF (Managed Object Format) de ASP.NET, %raízDelSistema%\Microsoft.NET\Framework\<versión>\aspnet.mof.

    Nota:

    Todos los eventos personalizados se asignan al tipo de evento base en WMI. No se puede asignar un evento de supervisión de estado de ASP.NET personalizado a un evento WMI arbitrario.

    Por ejemplo, en el código siguiente se muestra la definición de la clase WMI asignada al tipo WebHeartbeatEvent.

    class HeartbeatEvent : ManagementEvent {
        /*
         * ProcessStatistics    
         */
        DATETIME    ProcessStartTime;
        sint32      ThreadCount;
        sint64      WorkingSet;
        sint64      PeakWorkingSet;
        sint64      ManagedHeapSize;
        sint32      AppdomainCount;    
        sint32      RequestsExecuting;
        sint32      RequestsQueued;
        sint32      RequestsRejected;
    }; 
    

    Para obtener más información sobre archivos MOF, vea Managed Object Format en WMI SDK en MSDN.

  2. Definir el proveedor de supervisión de estado de ASP.NET que procesará los eventos.

    El proveedor estándar es la clase WmiWebEventProvider. De forma predeterminada, ya está configurado en la sección healthMonitoring del archivo Web.config raíz mediante el siguiente elemento:

    <providers>
      <add 
        name="WmiWebEventProvider" 
        type="System.Web.Management.WmiWebEventProvider,System.Web, Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
      />
    </providers>
    
  3. Escribir los valores adecuados en la sección healthMonitoring del archivo de configuración para crear la asociación entre las clases de eventos web y el proveedor de eventos de WMI, la clase WmiWebEventProvider.

    De manera predeterminada, el proveedor de eventos de WMI no está suscrito a ningún evento web. Puede utilizar los siguientes elementos en un archivo Web.config de la aplicación para suscribir el proveedor de eventos de WMI a todos los eventos web. De forma predeterminada, el tipo de evento All Events está configurado en el elemento eventMappings del archivo Web.config raíz. Se asigna a la clase WebBaseEvent.

    <rules>
      <add 
        name="Testing Wmi"
        eventName="All Events" 
        provider="WmiWebEventProvider" 
        profile="Critical"
      />
    </rules>
    
  4. Crear una aplicación para realizar escuchas de eventos WMI o utilizar una aplicación de otro fabricante.

    En el ejemplo de código de Tutorial: Escuchar eventos WMI en la supervisión de estado ASP.NET se crea una aplicación de consola que muestra información de eventos cada vez que se provoca un evento Web.

Personalizar la infraestructura de eventos de estado de WMI

Cuando se produce un evento web, la supervisión de estado de ASP.NET lo envía al objeto WmiWebEventProvider. El objeto de proveedor procesa el evento y rellena los datos correspondientes según la definición de clase de MOF relacionada. A continuación, el proveedor envía estos datos al sistema de WMI utilizando una llamada a código no administrado.

La única opción de personalización para el envío de eventos web a WMI consiste en crear una aplicación personalizada que utilice los eventos de supervisión de estado de ASP.NET una vez que se han emitido como eventos de WMI. En ese caso, el único cambio de configuración que se debe realizar consiste en configurar un nuevo elemento rules como ya se ha mostrado anteriormente. La aplicación realizará escuchas de los eventos de estado de ASP.NET en forma de eventos WMI, como los emite el sistema operativo. Para obtener más información, vea Tutorial: Escuchar eventos WMI en la supervisión de estado ASP.NET.

Nota:

La clase WmiWebEventProvider no se puede ampliar. Las únicas clases de proveedor de eventos que se pueden ampliar son las clases WebEventProvider y BufferedWebEventProvider.

Implementar eventos y proveedores personalizados de supervisión de estado de ASP.NET

De manera predeterminada, algunos eventos ya se capturan en contadores de rendimiento, en el registro de eventos o se envían al sistema de seguimiento de ASP.NET. Puede habilitar otros eventos asignándolos a proveedores existentes. Para obtener más información, vea la sección "Utilizar eventos Web mediante proveedores de eventos" en Información general sobre la supervisión de estado en ASP.NET.

Si ninguno de los eventos web o clases de proveedores existentes satisface sus necesidades, puede ampliar estas clases. En la siguiente tabla se enumeran las maneras de personalizar la supervisión de estado de ASP.NET.

Tarea

Implementación

Ejemplo

Crear una clase de evento Web personalizada.

Crear una clase que hereda de WebBaseEvent e implementa el método virtual Raise. Para agregar datos personalizados a un evento personalizado, reemplace el método FormatCustomEventDetails.

Cómo: Implementar y provocar eventos personalizados de supervisión de estado de ASP.NET

Crear un proveedor de eventos personalizados para procesar un evento Web integrado o personalizado.

Crear una clase que hereda de la clase WebEventProvider (o una de las clases derivadas). Si su proveedor realiza el registro, también hereda de la clase WebEventFormatter.

Cómo: Implementar el ejemplo de proveedor personalizado de supervisión de estado

Vea también

Tareas

Cómo: Bloquear los valores de configuración de ASP.NET

Conceptos

Información general sobre la supervisión de estado en ASP.NET

Información general sobre la configuración de ASP.NET

Referencia

Elemento bufferModes para healthMonitoring (Esquema de configuración de ASP.NET)

Elemento providers para healthMonitoring (Esquema de configuración de ASP.NET)