Счетчики событий в SqlClient
Область применения: платформа .NET Framework .NET Core .NET Standard
Внимание
Счетчики событий доступны для приложений, предназначенных для .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
...