Contatori degli eventi in SqlClient
Si applica a: .NET Framework .NET Core .NET Standard
Importante
I contatori degli eventi sono disponibili quando la destinazione è .NET Core 3.1 e versioni successive o .NET Standard 2.1 e versioni successive. Questa funzionalità è disponibile a partire dalla Microsoft.Data.SqlClient
versione 3.0.0.
È possibile usare i contatori degli eventi Microsoft.Data.SqlClient per monitorare lo stato dell'applicazione e le risorse di connessione usate. I contatori degli eventi possono essere monitorati da .NET CLI global tools
e perfView
. In alternativa, è possibile accedervi a livello di codice usando la classe EventListener nello spazio dei nomi System.Diagnostics.Tracing.
Contatori degli eventi disponibili
Attualmente sono disponibili 16 diversi contatori degli eventi per Microsoft.Data.SqlClient come descritto nella tabella seguente:
Nome | Nome visualizzato | Descrizione |
---|---|---|
active-hard-connections | Connessioni attive effettive attualmente stabilite con i server | Numero di connessioni attualmente aperte verso i server di database. |
hard-connects | Frequenza di connessione effettiva verso i server | Numero di connessioni al secondo aperte verso i server di database. |
hard-disconnects | Frequenza effettiva di disconnessione dai server | Numero di disconnessioni al secondo eseguite dai server di database. |
active-soft-connects | Connessioni attive recuperate dal pool di connessioni | Numero di connessioni già aperte utilizzate dal pool di connessioni. |
soft-connects | Frequenza delle connessioni recuperate dal pool di connessioni | Numero di connessioni al secondo utilizzate dal pool di connessioni. |
soft-disconnects | Frequenza delle connessioni restituite al pool di connessioni | Numero di connessioni al secondo restituite al pool di connessioni. |
number-of-non-pooled-connections | Numero di connessioni che non usano il pool di connessioni | Numero di connessioni attive che non sono nel pool. |
number-of-pooled-connections | Numero di connessioni gestite dal pool di connessioni | Numero di connessioni attive gestite dall'infrastruttura del pool di connessioni. |
number-of-active-connection-pool-groups | Numero di stringhe di connessione univoche attive | Numero di gruppi univoci di pool di connessioni attivi. Questo contatore è controllato dal numero di stringhe di connessione univoche disponibili in AppDomain. |
number-of-inactive-connection-pool-groups | Numero di stringhe di connessione univoche in attesa di eliminazione | Numero di gruppi univoci di pool di connessioni attivi contrassegnati per l'eliminazione. Questo contatore è controllato dal numero di stringhe di connessione univoche disponibili in AppDomain. |
number-of-active-connection-pools | Numero di pool di connessioni attivi | Numero complessivo di pool di connessioni. |
number-of-inactive-connection-pools | Numero di pool di connessioni inattivi | Numero di pool di connessioni inattivi in cui non si è verificata alcuna attività recente e che sono in attesa di essere eliminati. |
number-of-active-connections | Numero di connessioni attive | Numero di connessioni attive al momento in uso. |
number-of-free-connections | Numero di connessioni pronte nel pool di connessioni | Numero di connessioni aperte disponibili per l'uso nei pool di connessioni. |
number-of-stasis-connections | Numero di connessioni attualmente in attesa di essere preparate | Numero di connessioni attualmente in attesa del completamento di un'azione e che non sono disponibili per l'uso da parte dell'applicazione. |
number-of-reclaimed-connections | Numero di connessioni recuperate da GC | Numero di connessioni che sono state recuperate tramite Garbage Collection laddove l'applicazione non ha chiamato Close o Dispose . Nota La chiusura o l'eliminazione non esplicita delle connessioni danneggia le prestazioni. |
Recuperare i valori dei contatori degli eventi
Esistono due modi principali per utilizzare EventCounters, in-process o out-of-process. Per altre informazioni, vedere Utilizzare EventCounters.
Utilizzare out-of-process
In Windows è possibile usare PerfView e Xperf per raccogliere i dati dei contatori degli eventi. Per altre informazioni, vedere Abilitare la traccia di eventi in SqlClient. È possibile usare dotnet-counters e dotnet-trace, che sono strumenti .NET multipiattaforma per monitorare e raccogliere i dati dei contatori degli eventi.
Esempio di out-of-process
Il comando seguente viene eseguito e raccoglie i valori dei contatori degli eventi SqlClient una volta al secondo. La sostituzione di EventCounterIntervalSec=1
con un valore superiore consente la raccolta di una traccia più piccola con meno granularità nei dati del contatore.
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"
Il comando seguente raccoglie i valori dei contatori degli eventi SqlClient una volta al secondo.
dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1
Il comando seguente monitora i valori dei contatori degli eventi SqlClient una volta ogni tre secondi.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3
Il comando seguente monitora i valori dei contatori degli eventi SqlClient una volta al secondo.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>
Utilizzare in-process
È possibile utilizzare i valori del contatore tramite l'API EventListener. Un oggetto EventListener
è un modo in-process per l'utilizzo di qualsiasi evento scritto da istanze di EventSource nell'applicazione. Per altre informazioni, vedere EventListener.
Esempio di in-process
Il codice di esempio seguente acquisisce gli eventi Microsoft.Data.SqlClient.EventSource
usando EventCounterIntervalSec=1
. Scrive il nome del contatore e il relativo valore Mean
in ogni aggiornamento del contatore degli eventi.
Nota
È necessario specificare il valore della proprietà EventCounterIntervalSec
durante l'abilitazione di questo 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
...