Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: .NET
.NET Standard
Důležité
Čítače událostí jsou k dispozici při cílení na .NET Core 3.1 a vyšší nebo .NET Standard 2.1 a vyšší. Tato funkce je dostupná od Microsoft.Data.SqlClientverze 3.0.0.
Čítače událostí můžete použít Microsoft.Data.SqlClient ke sledování stavu aplikace a prostředků připojení, které používá. Čítače událostí můžou být monitorovány pomocí .NET CLI global tools a perfView nebo mohou být programově přístupné pomocí třídy EventListener v oboru názvů System.Diagnostics.Tracing.
Dostupné čítače událostí
V současné době je k dispozici Microsoft.Data.SqlClient 16 různých čítačů událostí, jak je popsáno v následující tabulce:
| Název | Zobrazované jméno | Description |
|---|---|---|
| aktivních pevných připojení | Skutečná aktivní připojení aktuálně vytvořená k serverům | Počet připojení, která jsou aktuálně otevřená databázovým serverům. |
| natvrdo připojuje | Skutečná rychlost připojení k serverům | Počet připojení za sekundu, která se otevírají k databázovým serverům. |
| pevné odpojení | Skutečná rychlost odpojení od serverů | Počet odpojení za sekundu, která se provádějí u databázových serverů. |
| typu aktivní-soft-připojení | Připojení načtená z fondu aktivních připojení | Počet již otevřených připojení spotřebovaných z fondu připojení. |
| měkké připojení | Rychlost připojení načtených z fondu připojení | Počet připojení za sekundu, která se spotřebovávají z fondu připojení. |
| měkké odpojení | Rychlost připojení vrácených do fondu připojení | Počet připojení za sekundu vrácených do fondu připojení. |
| počet nepřidělených do fondu připojení | Počet připojení, která nepoužívají sdružování připojení | Počet aktivních připojení, která nejsou sdružována. |
| počet sdružených připojení | Počet připojení spravovaných fondem připojení | Počet aktivních připojení spravovaných infrastrukturou sdružování připojení. |
| počet aktivních skupin fondu připojení | Počet aktivních jedinečných připojovacích řetězců | Počet aktivních skupin fondu připojení. Tento čítač je řízen počtem jedinečných připojovací řetězec nalezených v doméně AppDomain. |
| počet skupin neaktivních připojovacích poolů | Počet jedinečných připojovacích řetězců čekajících na odstranění | Počet jedinečných skupin fondu připojení, které jsou označené k vyřazení. Tento čítač je řízen počtem jedinečných připojovací řetězec nalezených v doméně AppDomain. |
| počet fondů aktivních připojení | Počet aktivních připojení | Celkový počet spojovacích poolů. |
| počet neaktivních fondů připojení | Počet neaktivních připojovacích fondů | Počet neaktivních fondů připojení, které nemají žádnou nedávnou aktivitu a čekají na odstranění. |
| počet aktivních připojení | Počet aktivních připojení | Počet aktivních připojení, která se aktuálně používají. |
| počet bezplatných připojení | Počet připravených připojení ve fondu připojení | Počet volných připojení dostupných pro použití ve fondech připojení. |
| počet připojení ke stasis | Počet připojení, která aktuálně čekají na připravenost | Počet připojení, která aktuálně čekají na dokončení akce a které nejsou k dispozici pro použití aplikací. |
| počet uvolněných připojení | Počet uvolněných připojení z GC | Počet připojení, která byla obnovena prostřednictvím garbage collection, kde aplikace nevolala Close nebo Dispose.
Poznámka Nezavírání nebo neukončování připojení má negativní vliv na výkon. |
Načtení hodnot čítačů událostí
Existují dva hlavní způsoby využívání EventCounters, buď v rámci procesu, nebo mimo proces. Další informace naleznete v tématu Využití EventCounters.
Využití mimo proc
Ve Windows můžete ke shromažďování dat čítačů událostí použít PerfView a Xperf . Další informace naleznete v tématu Povolení trasování událostí v SqlClient. K monitorování a shromažďování dat čítačů událostí můžete použít dotnet-counters a dotnet-trace, což jsou nástroje .NET pro různé platformy.
Příklad typu Out-of-proc
Následující příkaz se spustí a shromažďuje hodnoty čítačů událostí SqlClient jednou za sekundu. Nahrazení EventCounterIntervalSec=1 vyšší hodnotou umožňuje shromažďování méně podrobných trasování s nižší úrovní detailu v datech čítače.
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"
Následující příkaz shromažďuje hodnoty čítačů událostí SqlClient jednou za sekundu.
dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1
Následující příkaz monitoruje hodnoty čítačů událostí SqlClient jednou za tři sekundy.
dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3
Následující příkaz monitoruje vybrané čítače událostí SqlClient jednou za sekundu.
dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>
Využití v proc
Hodnoty čítače můžete využívat prostřednictvím rozhraní API EventListener . Jedná se EventListener o způsob v rámci procesu, jak konzumovat jakoukoli událost generovanou instancemi EventSource ve vaší aplikaci. Další informace naleznete v tématu EventListener.
Příklad in-proc
Následující ukázkový kód zachycuje Microsoft.Data.SqlClient.EventSource události pomocí EventCounterIntervalSec=1. Zapíše název čítače a jeho Mean hodnotu do každé aktualizace čítače událostí.
Poznámka:
Při povolování této události je nutné zadat EventCounterIntervalSec hodnotu vlastnosti.
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
...