Partilhar via


Contadores de eventos no SqlClient

Aplica-se a: .NET .NET Standard

Baixar ADO.NET

Importante

Contadores de eventos estão disponíveis quando se tem como alvo .NET Core 3.1 e superiores ou .NET Standard 2.1 e superiores. Esta funcionalidade está disponível a partir da Microsoft.Data.SqlClientversão 3.0.0.

Pode usar Microsoft.Data.SqlClient contadores de eventos para monitorizar o estado da sua aplicação e os recursos de ligação que utiliza. Os contadores de eventos podem ser monitorizados por .NET CLI global tools e perfView ou podem ser acedidos programaticamente usando a Classe EventListener no namespace System.Diagnostics.Tracing.

Contadores de eventos disponíveis

Atualmente, existem 16 contadores de eventos diferentes disponíveis para Microsoft.Data.SqlClient conforme descrito na tabela seguinte.

Nome Nome de exibição Description
ligações ativas e rígidas Conexões ativas reais atualmente feitas a servidores O número de ligações atualmente abertas a servidores de bases de dados.
liga diretamente Taxa de conexão real aos servidores O número de ligações por segundo que estão a ser abertas para servidores de base de dados.
desconexões bruscas Taxa de desconexão real dos servidores O número de desconexões por segundo que estão a ser feitas nos servidores de base de dados.
active-conexões-suaves Conexões ativas recuperadas do pool de conexões O número de conexões já abertas que estão a ser consumidas do pool de conexões.
conecta suavemente Taxa de conexões recuperadas do pool de conexões O número de ligações por segundo que estão a ser consumidas do pool de ligações.
desligamentos suaves Taxa de conexões retornadas ao pool de conexões O número de ligações por segundo que estão a ser devolvidas ao pool de ligações.
número de conexões não agrupadas Número de conexões que não utilizam agrupamento de conexões O número de conexões ativas que não são agrupadas.
número de conexões agrupadas Número de ligações geridas pelo pool de conexões O número de conexões ativas que estão sendo gerenciadas pela infraestrutura do pool de conexões.
número de grupos de pool de conexões ativas Número de cadeias de conexão únicas ativas O número de grupos de pool de conexões 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 conexões inativas Número de cadeias de conexão exclusivas aguardando remoção O número de grupos de pool de conexões exclusivos marcados para poda. Esse contador é controlado pelo número de cadeias de conexão exclusivas encontradas no AppDomain.
número de pools de conexões activas Número de pools de conexões ativos O número total de pools de conexões.
número de pools de conexões inativas Número de pools de conexões inativas O número de pools de ligação inativos que não tiveram atividade recente e estão à espera de serem eliminados.
número de conexões ativas Número 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ões O número de conexões abertas disponíveis para uso nos pools de conexões.
número de conexões de estase Número de conexões atualmente aguardando para serem prontas O número de conexões atualmente 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 do GC O número de ligações que foram recuperadas através da recolha de lixo porque a aplicação não chamou Close ou Dispose. Observação Não fechar ou descartar conexões explicitamente prejudica o desempenho.

Recuperar valores de contadores de eventos

Existem duas formas principais de consumir EventCounters, ou in-proc ou out-of-proc. Para mais informações, consulte Consume EventCounters.

Consumir fora do processo

No Windows, pode usar o PerfView e o Xperf para recolher dados de contadores de eventos. Para obter mais informações, consulte Habilitar rastreamento de eventos em SqlClient. Pode usar dotnet-counters e dotnet-trace, que são ferramentas .NET multiplataforma para monitorizar e recolher dados de event counters.

Exemplo fora de processo

O comando seguinte executa e recolhe os valores dos contadores de eventos do SqlClient uma vez por segundo. Substituir EventCounterIntervalSec=1 por um valor mais alto permite a recolha de um traço menor com menos granularidade nos dados do contador.

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

O comando seguinte recolhe os 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 seguinte monitoriza os 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

Os seguintes comandos monitorizam valores selecionados de contadores de eventos SqlClient uma vez por segundo.

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

Consumir in-processo

Pode consumir os valores dos contadores através da API EventListener . Um EventListener é uma forma interna de consumir qualquer evento gerado por instâncias de um EventSource na sua aplicação. Para mais informações, consulte EventListener.

Exemplo em processo

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

Observação

É necessário especificar o valor da EventCounterIntervalSec propriedade ao ativar 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
...

Consulte também