Contadores de eventos no SqlClient
Aplica-se a: .NET Framework .NET Core .NET Standard
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.SqlClient
versã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
...