Partager via


Compteurs d’événements dans SqlClient

S’applique à : Non pris en charge. .NET Framework .NET Core .NET Standard

Télécharger ADO.NET

Important

Les compteurs d’événements sont disponibles quand vous ciblez .NET Core 3.1 et versions ultérieures ou .NET Standard 2.1 et versions ultérieures. Cette fonctionnalité est disponible à partir de Microsoft.Data.SqlClient version 3.0.0.

Vous pouvez utiliser des compteurs d’événements Microsoft.Data.SqlClient afin de superviser l’état de votre application et les ressources de connexion utilisées. Les compteurs d’événements peuvent être supervisés par .NET CLI global tools et perfView ou être accessibles programmatiquement à l’aide de la classe EventListener de l’espace de noms System.Diagnostics.Tracing.

Compteurs d’événements disponibles

Actuellement, 16 compteurs d’événements différents sont disponibles pour Microsoft.Data.SqlClient, comme décrit dans le tableau suivant :

Name Nom complet Description
active-hard-connections Connexions actives réelles actuellement établies aux serveurs Nombre de connexions actuellement ouvertes aux serveurs de base de données.
hard-connects Taux de connexion réel aux serveurs Nombre de connexions par seconde qui sont ouvertes aux serveurs de base de données.
hard-disconnects Taux de déconnexion réel des serveurs Nombre de déconnexions par seconde qui sont effectuées aux serveurs de base de données.
active-soft-connects Connexions actives récupérées à partir du pool de connexions Nombre de connexions déjà ouvertes consommées à partir du pool de connexions.
soft-connects Taux de connexions récupérées à partir du pool de connexions Nombre de connexions par seconde consommées à partir du pool de connexions.
soft-disconnects Taux de connexions retournées au pool de connexions Nombre de connexions par seconde retournées au pool de connexions.
number-of-non-pooled-connections Nombre de connexions n’utilisant pas de regroupement de connexions Nombre de connexions actives qui ne sont pas regroupées.
number-of-pooled-connections Nombre de connexions gérées par le pool de connexions Nombre de connexions actives qui sont gérées par l'infrastructure de regroupement de connexions.
number-of-active-connection-pool-groups Nombre de chaînes de connexion uniques actives Nombre de groupes du pool de connexion unique qui sont actifs. Ce compteur est contrôlé par le nombre de chaînes de connexion uniques qui se trouvent dans AppDomain.
number-of-inactive-connection-pool-groups Nombre de chaînes de connexion uniques en attente de nettoyage Nombre de groupes du regroupement de connexions unique qui sont marqués pour le nettoyage. Ce compteur est contrôlé par le nombre de chaînes de connexion uniques qui se trouvent dans AppDomain.
number-of-active-connection-pools Nombre de pools de connexions actifs Nombre total de regroupements de connexions.
number-of-inactive-connection-pools Nombre de pools de connexions inactifs Nombre de pools de connexions inactifs sans activité récente et en attente de suppression.
number-of-active-connections Nombre de connexions actives Nombre de connexions actives en cours d'utilisation.
number-of-free-connections Nombre de connexions prêtes dans le pool de connexions Nombre de connexions ouvertes disponibles pour une utilisation dans les pools de connexions.
number-of-stasis-connections Nombre de connexions actuellement en préparation Nombre de connexions actuellement en attente de l’achèvement d’une action et qui ne sont pas disponibles pour une utilisation par l’application.
number-of-reclaimed-connections Nombre de connexions récupérées à partir du nettoyage de la mémoire Nombre de connexions qui ont été récupérées via le nettoyage de la mémoire où Close ou Dispose n’a pas été appelée par l’application. Remarque La fermeture ou la suppression explicite des connexions nuit aux performances.

Récupérer les valeurs des compteurs d’événements

Il existe deux principales façons d’utiliser des compteurs d’événements, dans le processus ou hors processus. Pour plus d’informations, consultez Utiliser des compteurs d’événements.

Consommer hors processus

Dans Windows, vous pouvez utiliser PerfView et Xperf pour collecter les données des compteurs d’événements. Pour plus d’informations, consultez Activer le suivi d’événements dans SqlClient. Vous pouvez utiliser dotnet-counters et dotnet-trace, qui sont des outils .NET multiplateformes pour superviser et collecter les données des compteurs d’événements.

Exemple hors processus

La commande suivante s’exécute et collecte les valeurs des compteurs d’événements SqlClient une fois par seconde. Si vous remplacez EventCounterIntervalSec=1 par une valeur supérieure, vous autorisez la collecte d’une trace plus petite avec moins de précision dans les données des compteurs.

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

La commande suivante collecte les valeurs des compteurs d’événements SqlClient une fois par seconde.

dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1

La commande suivante supervise les valeurs des compteurs d’événements SqlClient une fois toutes les trois secondes.

dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3

La commande suivante supervise les valeurs des compteurs d’événements SqlClient sélectionnés une fois par seconde.

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

Consommer dans le processus

Vous pouvez utiliser les valeurs des compteurs via l’API EventListener. EventListener constitue une méthode dans le processus d’utiliser tout événement écrit par des instances d’une EventSource dans votre application. Pour plus d’informations, consultez EventListener.

Exemple dans le processus

L’exemple de code suivant capture des événements Microsoft.Data.SqlClient.EventSource avec EventCounterIntervalSec=1. Il écrit le nom du compteur et sa valeur Mean lors de chaque mise à jour du compteur d’événements.

Notes

Il est nécessaire de spécifier la valeur de propriété EventCounterIntervalSec lors de l’activation de cet événement.

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
...

Voir aussi