Contatori degli eventi in SqlClient

Si applica a:Not supported. .NET Framework .NET Core .NET Standard

Scarica ADO.NET

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 da Microsoft.Data.SqlClientversione 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
...

Vedi anche