Contadores de eventos en SqlClient
Se aplica a: .NET Framework .NET Core .NET Standard
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.SqlClient
versió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
...