Contadores de eventos no SqlClient

Aplica-se a:Not supported. .NET Framework .NET Core .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
active-hard-connections Conexões ativas reais feitas para servidores atualmente O número de conexões que atualmente estão abertas para servidores de banco de dados.
hard-connects Taxa de conexão real para servidores O número de conexões por segundo que estão sendo abertas para servidores de banco de dados.
hard-disconnects Taxa de desconexão real de servidores O número de desconexões por segundo que estão sendo feitas com 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.
soft-disconnects 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.
number-of-non-pooled-connections Número de conexões que não estão utilizando o pool de conexão O número de conexões ativas que não estão no pool.
number-of-pooled-connections Número de conexões gerenciadas pelo pool de conexão O número de conexões ativas que estão sendo gerenciadas pela infraestrutura de pooling de conexão.
number-of-active-connection-pool-groups 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.
number-of-inactive-connection-pool-groups 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.
number-of-active-connection-pools Número de pools de conexão ativos O número total de pools de conexão.
number-of-inactive-connection-pools 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.
number-of-active-connections Quantidade de conexões ativas O número de conexões ativas que estão atualmente em uso.
number-of-free-connections 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.
number-of-stasis-connections 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.
number-of-reclaimed-connections 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 O não fechamento ou o não descarte explícitos das conexões afeta o desempenho.

Recuperar valores do contador de eventos

Há duas maneiras principais de consumir EventCounters, dentro ou fora do proc. Para saber mais, confira Consumir EventCounters.

Consumir fora do proc

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 a coleta de 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 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 Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>

Consumir no proc

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

Exemplo no proc

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;

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

Confira também