Contadores de eventos no SqlClient

Aplica-se a: .NET .NET Standard

Baixar ADO.NET

Importante

Os contadores de eventos estão disponíveis tendo como alvo o .NET Core 3.1 e superior ou o .NET Standard 2.1 e superior. Este recurso está disponível começando no Microsoft.Data.SqlClientversão 3.0.0.

Use os contadores de eventos do Microsoft.Data.SqlClient para monitorar o status do seu aplicativo e os recursos de conexão usados por ele. Os contadores de eventos podem ser monitorados por .NET CLI global tools e perfView ou podem ser acessados de maneira programática usando a classe EventListener no namespace System.Diagnostics.Tracing.

Contadores de eventos disponíveis

Atualmente, há 16 contadores eventos diferentes disponíveis para o Microsoft.Data.SqlClient, conforme descrito na seguinte tabela:

Nome Nome de exibição Descrição
conexões rígidas ativas Conexões ativas reais atualmente estabelecidas com servidores O número de conexões que atualmente estão abertas para servidores de banco de dados.
conecta fisicamente Taxa real de conexão para servidores O número de conexões por segundo que estão sendo abertas nos servidores de banco de dados.
desconexões forçadas Taxa de desconexão real de servidores O número de desconexões por segundo que são feitas nos servidores de banco de dados.
active-soft-connects Conexões ativas recuperadas do pool de conexão O número de conexões já abertas sendo consumidas do pool de conexão.
soft-connects Taxa de conexões recuperadas do pool de conexão O número de conexões por segundo que estão sendo consumidas do pool de conexão.
desconexões suaves Taxa de conexões retornadas ao pool de conexão O número de conexões por segundo que estão sendo retornadas ao pool de conexão.
número-de-conexões-não-agrupadas Número de conexões que não utilizam o pool de conexão O número de conexões ativas que não são agrupadas.
número-de-conexões-em-pool Número de conexões gerenciadas pelo pool de conexão O número de conexões ativas gerenciadas pela infraestrutura de pool de conexões.
número-de-grupos-de-pool-de-conexões-ativos Número de cadeias de conexão exclusivas ativas O número de grupos de pools de conexão exclusivos que estão ativos. Esse contador é controlado pelo número de cadeias de conexão exclusivas encontradas no AppDomain.
número-de-grupos-de-pool-de-conexões-inativas Número de cadeias de conexão exclusivas aguardando remoção O número de grupos de pools de conexão exclusivos que estão marcados para remoção. Esse contador é controlado pelo número de cadeias de conexão exclusivas encontradas no AppDomain.
numero-de-pools-de-conexoes-ativas Número de pools de conexão ativos O número total de pools de conexão.
número-de-pools-de-conexão-inativos Número de pools de conexão inativos O número de pools de conexão inativos que não tiveram nenhuma atividade recente e estão aguardando para serem descartados.
número-de-conexões-ativas Quantidade de conexões ativas O número de conexões ativas que estão atualmente em uso.
número-de-conexões-gratuitas Número de conexões prontas no pool de conexão O número de conexões abertas disponíveis para uso nos pools de conexão.
número-de-conexões-de-estase Número de conexões que estão aguardando para serem prontas O número de conexões que estão aguardando a conclusão de uma ação e que não estão disponíveis para uso pelo aplicativo.
número-de-conexões-recuperadas Número de conexões recuperadas da GC O número de conexões que foram recuperadas por meio da coleta de lixo, em que Close ou Dispose não foi chamado pelo aplicativo. Observação: Não fechar nem descartar explicitamente as conexões prejudica o desempenho.

Recuperar valores do contador de eventos

Há duas maneiras principais de consumir EventCounters, dentro ou fora do proc. Para obter mais informações, consulte Consumir EventCounters.

Consumir fora do processo

No Windows, você pode usar PerfView e Xperf para coletar dados de contadores de eventos. Para obter mais informações, confira Habilitar o rastreamento de eventos no SqlClient. Você pode usar dotnet-counters e dotnet-trace, que são ferramentas .NET de plataforma cruzada para monitorar e coletar dados de contadores de eventos.

Exemplo de fora do proc

O comando a seguir executa e coleta valores dos contadores de eventos do SqlClient uma vez por segundo. Substituir EventCounterIntervalSec=1 por um valor mais alto permite coletar um rastreamento menor, com menos granularidade nos dados do contador.

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

O comando a seguir coleta valores dos contadores de eventos do SqlClient uma vez por segundo.

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

O comando a seguir monitora valores dos contadores de eventos do SqlClient uma vez a cada três segundos.

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

O comando a seguir monitora valores dos contadores de eventos do SqlClient selecionados uma vez por segundo.

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

Consumir no processo

Você pode consumir os valores do contador por meio da API EventListener. Um EventListener é uma forma em processo de consumir qualquer evento emitido por instâncias de um EventSource no seu aplicativo. Para obter mais informações, confira EventListener.

Exemplo no processo

O código de exemplo a seguir captura eventos Microsoft.Data.SqlClient.EventSource usando EventCounterIntervalSec=1. Ele grava o nome do contador e seu valor Mean em cada atualização do contador de eventos.

Observação

É necessário especificar o valor da propriedade EventCounterIntervalSec ao habilitar esse evento.

using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
using Microsoft.Data.SqlClient;

// 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
...