Счетчики событий в SqlClient

Область применения:Not supported. .NET Framework .NET Core .NET Standard

Скачать ADO.NET

Важно!

Счетчики событий доступны для приложений, предназначенных для .NET Core 3.1 и более поздних версий или .NET Standard 2.1 и более поздних версий. Эта функция доступна начиная с Microsoft.Data.SqlClientверсии 3.0.0.

Счетчики производительности Microsoft.Data.SqlClient можно использовать для мониторинга состояния приложения и используемых им ресурсов подключения. Счетчики событий можно отслеживать с помощью .NET CLI global tools и perfView либо получать к ним доступ программным путем, используя класс EventListener в пространстве имен System.Diagnostics.Tracing.

Доступные счетчики событий

В настоящее время имеется 16 различных счетчиков событий, доступных для Microsoft.Data.SqlClient, как показано в приведенной ниже таблице.

Имя. отображаемое имя; Description
active-hard-connections Фактическое число активных подключений к серверам Число открытых в настоящее время подключений к серверам баз данных.
hard-connects Фактическая скорость подключения к серверам Количество подключений к серверам баз данных, открываемых в секунду.
hard-disconnects Фактическая скорость отключения от серверов Количество разрывов соединений с серверами баз данных в секунду.
active-soft-connects Активные подключения, полученные из пула подключений Количество уже открытых подключений, используемых из пула подключений.
soft-connects Скорость подключений, получаемых из пула подключений Количество подключений, используемых из пула подключений, в секунду.
soft-disconnects Скорость возврата подключений в пул подключений Количество подключений, возвращаемых в пул подключений в секунду.
number-of-non-pooled-connections Число подключений, не использующих пул подключений Количество активных подключений, не помещаемых в пул.
number-of-pooled-connections Число подключений, управляемых пулом подключений Количество активных соединений, которые управляются инфраструктурой пулов соединений.
number-of-active-connection-pool-groups Число уникальных активных строк подключения Количество уникальных активных групп пулов соединений. Этот счетчик управляется числом уникальных строк соединения, найденных в домене приложения.
number-of-inactive-connection-pool-groups Число уникальных строк подключения в очереди на удаление Количество уникальных групп пулов соединений, отмеченных для усечения. Этот счетчик управляется числом уникальных строк соединения, найденных в домене приложения.
number-of-active-connection-pools Число активных пулов подключений Общее число пулов соединений.
number-of-inactive-connection-pools Число неактивных пулов подключений Количество неактивных пулов подключений, не участвовавших в последних операциях и ожидающих удаления.
number-of-active-connections Число активных подключений. Количество текущих активных соединений.
number-of-free-connections Число готовых подключений в пуле подключений Количество открытых подключений, доступных в пулах подключений.
number-of-stasis-connections Число подключений, ожидающих подготовки Число подключений, ожидающих завершения действия и недоступных для использования приложением.
number-of-reclaimed-connections Число подключений, освобожденных в результате сборки мусора Число подключений, которые были освобождены в результате сборки мусора без вызова Close или Dispose приложением. Примечание. Если подключения не закрывать и не удалять явно, производительность может снижаться.

Получение значений счетчиков событий

Счетчики событий можно использовать двумя основными способами — внутри и вне процессов. Дополнительные сведения см. в разделе Использование EventCounters.

Использование вне процессов

В Windows для сбора данных счетчиков событий можно использовать PerfView и Xperf. Дополнительные сведения см. в статье Включение трассировки событий в SqlClient. Для мониторинга и сбора данных счетчиков событий можно использовать dotnet-counters и dotnet-trace, которые являются межплатформенными средствами .NET.

Внепроцессный пример

Приведенная ниже команда запускает счетчики событий SqlClient и собирает их значения каждую секунду. Увеличив значение EventCounterIntervalSec=1, можно уменьшить размер трассировки, но уровень детализации данных счетчиков при этом снижается.

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

Приведенная ниже команда собирает значения счетчиков событий SqlClient каждую секунду.

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

Приведенная ниже команда отслеживает значения счетчиков событий SqlClient каждые три секунды.

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

Приведенная ниже команда отслеживает значения выбранных счетчиков событий SqlClient каждую секунду.

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

Использование внутри процесса

Получать значения счетчиков можно с помощью API EventListener. EventListener — это внутрипроцессный способ использования любого события, записанного экземплярами EventSource в приложении. Дополнительные сведения см. в статье EventListener.

Внутрипроцессный пример

В следующем примере кода события Microsoft.Data.SqlClient.EventSource записываются с помощью EventCounterIntervalSec=1. Имя счетчика и его значение Mean записываются при каждом обновлении счетчика событий.

Примечание.

При включении этого события необходимо указать значение свойства EventCounterIntervalSec.

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

См. также