Compteurs d’événements dans SqlClient
S’applique à : .NET Framework .NET Core .NET Standard
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
...