Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: .NET
.NET Standard
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
...