Contadores de eventos en SqlClient

Se aplica a:Not supported. .NET Framework .NET Core .NET Standard

Descargar ADO.NET

Importante

Hay disponibles contadores de eventos cuando el destino es .NET Core 3.1 y versiones posteriores o .NET Standard 2.1 y versiones posteriores. Esta característica está disponible a partir de Microsoft.Data.SqlClientversión 3.0.0.

Puede usar contadores de eventos de Microsoft.Data.SqlClient para supervisar el estado de la aplicación y los recursos de conexión que usa. Los contadores de eventos se pueden supervisar mediante .NET CLI global tools y perfView. También se puede acceder a ellos mediante programación si se usa la clase EventListener en el espacio de nombres System.Diagnostics.Tracing.

Contadores de eventos disponibles

Actualmente, hay 16 contadores de eventos distintos disponibles para Microsoft.Data.SqlClient, tal como se describe en la tabla siguiente:

NOMBRE Nombre para mostrar Descripción
active-hard-connections Conexiones activas reales realizadas actualmente a servidores Número de conexiones que están abiertas actualmente a servidores de bases de datos.
hard-connects Velocidad de conexión real a los servidores Número de conexiones por segundo que se abren a servidores de bases de datos.
hard-disconnects Velocidad de desconexión real de los servidores Número de desconexiones por segundo que se producen con servidores de bases de datos.
active-soft-connects Conexiones activas recuperadas del grupo de conexiones Número de conexiones ya abiertas que se consumen desde el grupo de conexiones.
soft-connects Velocidad de las conexiones recuperadas del grupo de conexiones Número de conexiones por segundo que se consumen desde el grupo de conexiones.
soft-disconnects Velocidad de las conexiones recuperadas del grupo de conexiones Número de conexiones por segundo que se devuelven al grupo de conexiones.
number-of-non-pooled-connections Número de conexiones que no usan la agrupación de conexiones Número de conexiones activas que no están agrupadas.
number-of-pooled-connections Número de conexiones administradas por el grupo de conexiones El número de conexiones activas que administra la infraestructura de agrupación de conexiones.
number-of-active-connection-pool-groups Número de cadenas de conexión únicas activas El número de conjuntos de grupos de conexiones únicas que están activos. Este contador depende del número de cadenas de conexión única que haya en el AppDomain.
number-of-inactive-connection-pool-groups Número de cadenas de conexión únicas a la espera de ser eliminadas El número de conjuntos de grupos de conexiones únicas que están marcados para ser eliminados. Este contador depende del número de cadenas de conexión única que haya en el AppDomain.
number-of-active-connection-pools Número de grupos de conexiones activas El número total de grupos de conexiones.
number-of-inactive-connection-pools Número de grupos de conexiones inactivas Número de grupos de conexiones inactivas que no han tenido ninguna actividad recientemente y que están a la espera de ser eliminadas.
number-of-active-connections Número de conexiones activas El número de conexiones activas que se están utilizando actualmente.
number-of-free-connections Número de conexiones listas en el grupo de conexiones Número de conexiones abiertas que se pueden usar en los grupos de conexiones.
number-of-stasis-connections Número de conexiones actualmente a la espera de estar listas Número de conexiones actualmente a la espera de la finalización de una acción y que no están disponibles para su uso por parte de la aplicación.
number-of-reclaimed-connections Número de conexiones reclamadas desde la recolección de elementos no utilizados Número de conexiones que se han reclamado mediante la recolección de elementos no utilizados en las que la aplicación no llamó a Close ni a Dispose. Nota: No cerrar o eliminar explícitamente las conexiones afecta el rendimiento.

Recuperación de valores del contador de eventos

Hay dos formas principales de usar EventCounters, en proceso o fuera de proceso. Para obtener más información, vea Uso de EventCounters.

Uso fuera de proceso

En Windows, puede usar PerfView y Xperf para recopilar datos de los contadores de eventos. Para obtener más información, consulte Habilitación del seguimiento de eventos en SqlClient. Puede usar dotnet-counters y dotnet-trace, que son herramientas de .NET multiplataforma para supervisar y recopilar datos de los contadores de eventos.

Ejemplo fuera de proceso

El siguiente comando ejecuta y recopila valores de los contadores de eventos SqlClient una vez por segundo. Si se reemplaza EventCounterIntervalSec=1 por un valor mayor, se recopila un seguimiento más pequeño con menos granularidad en los datos del contador.

PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"

El siguiente comando recopila valores de los contadores de eventos SqlClient una vez por segundo.

dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1

El siguiente comando supervisa los valores de los contadores de eventos SqlClient una vez cada tres segundos.

dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3

El siguiente comando supervisa los valores de los contadores de eventos SqlClient seleccionados una vez por segundo.

dotnet-counters monitor Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>

Uso en proceso

Puede consumir los valores del contador mediante la API EventListener. Un EventListener es una forma en proceso de consumir un evento que hayan escrito instancias de EventSource en la aplicación. Para obtener más información, vea EventListener.

Ejemplo en proceso

El código de ejemplo siguiente captura eventos Microsoft.Data.SqlClient.EventSource mediante EventCounterIntervalSec=1. Escribe el nombre del contador y su valor Mean en cada actualización del contador de eventos.

Nota

Es necesario especificar el valor de EventCounterIntervalSec propiedad al habilitar este evento.

using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;

// This listener class will listen for events from the SqlClientEventSource class.
// SqlClientEventSource is an implementation of the EventSource class which gives 
// it the ability to create events.
public class EventCounterListener : EventListener
{
    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        // Only enable events from SqlClientEventSource.
        if (eventSource.Name.Equals("Microsoft.Data.SqlClient.EventSource"))
        {
            var options = new Dictionary<string, string>();
            // define time interval 1 second
            // without defining this parameter event counters will not enabled
            options.Add("EventCounterIntervalSec", "1");
            // enable for the None keyword
            EnableEvents(eventSource, EventLevel.Informational, EventKeywords.None, options);
        }
    }

    // This callback runs whenever an event is written by SqlClientEventSource.
    // Event data is accessed through the EventWrittenEventArgs parameter.
    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        if (eventData.Payload.FirstOrDefault(p => p is IDictionary<string, object> x && x.ContainsKey("Name")) is IDictionary<string, object> counters)
        {
            if (counters.TryGetValue("DisplayName", out object name) && name is string cntName
                && counters.TryGetValue("Mean", out object value) && value is double cntValue)
            {
                // print event counter's name and mean value
                Console.WriteLine($"{cntName}\t\t{cntValue}");
            }
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Create a new event listener
        using (var listener = new EventCounterListener())
        {
            string connectionString = "Data Source=localhost; Integrated Security=true";

            for (int i = 0; i < 50; i++)
            {
                // Open a connection
                SqlConnection cnn = new SqlConnection(connectionString);
                cnn.Open();
                // wait for sampling interval happens
                System.Threading.Thread.Sleep(500);
            }
        }
    }
}
Actual active connections currently made to servers           0
Active connections retrieved from the connection pool         26
Number of connections not using connection pooling            0
Number of connections managed by the connection pool          26
Number of active unique connection strings              1
Number of unique connection strings waiting for pruning       0
Number of active connection pools               1
Number of inactive connection pools             0
Number of active connections            26
Number of ready connections in the connection pool            0
Number of connections currently waiting to be ready           0
...

Vea también