Sdílet prostřednictvím


Čítače událostí v SqlClient

Platí pro: .NET .NET Standard

Stáhnout ADO.NET

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

Viz také