Penghitung peristiwa di SqlClient

Berlaku untuk:Not supported. .NET Framework .NET Core .NET Standard

Mengunduh ADO.NET

Penting

Penghitung peristiwa tersedia saat menargetkan .NET Core 3.1 dan yang lebih tinggi atau .NET Standard 2.1 dan yang lebih tinggi. Fitur ini tersedia dimulai dengan Microsoft.Data.SqlClientversi 3.0.0.

Anda dapat menggunakan Microsoft.Data.SqlClient penghitung peristiwa untuk memantau status aplikasi Anda dan sumber daya koneksi yang digunakannya. Penghitung peristiwa dapat dipantau oleh .NET CLI global tools dan perfView atau dapat diakses secara terprogram menggunakan EventListener kelas di System.Diagnostics.Tracing namespace layanan.

Penghitung peristiwa yang tersedia

Saat ini ada 16 penghitung peristiwa berbeda yang tersedia untuk Microsoft.Data.SqlClient seperti yang dijelaskan dalam tabel berikut:

Nama Nama tampilan Deskripsi
active-hard-connections Koneksi aktif aktual yang saat ini dibuat ke server Jumlah koneksi yang saat ini terbuka untuk server database.
hard-connects Laju koneksi aktual ke server Jumlah koneksi per detik yang sedang dibuka ke server database.
hard-disconnects Tingkat pemutusan aktual dari server Jumlah pemutusan sambungan per detik yang sedang dibuat ke server database.
active-soft-connects Koneksi aktif yang diambil dari kumpulan koneksi Jumlah koneksi yang sudah terbuka yang digunakan dari kumpulan koneksi.
soft-connects Laju koneksi yang diambil dari kumpulan koneksi Jumlah koneksi per detik yang sedang digunakan dari kumpulan koneksi.
pemutusan sambungan sementara Laju koneksi yang dikembalikan ke kumpulan koneksi Jumlah koneksi per detik yang dikembalikan ke kumpulan koneksi.
number-of-non-pooled-connections Jumlah koneksi yang tidak menggunakan pengumpulan koneksi Jumlah koneksi aktif yang tidak dikumpulkan.
jumlah koneksi terkumpul Jumlah koneksi yang dikelola oleh kumpulan koneksi Jumlah koneksi aktif yang dikelola oleh infrastruktur pengumpulan koneksi.
number-of-active-connection-pool-groups Jumlah string koneksi unik aktif Jumlah grup kumpulan koneksi unik yang aktif. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain.
number-of-inactive-connection-pool-groups Jumlah string koneksi unik yang menunggu pemangkasan Jumlah grup kumpulan koneksi unik yang ditandai untuk pemangkasan. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain.
number-of-active-connection-pools Jumlah kumpulan koneksi aktif Jumlah total kumpulan koneksi.
number-of-inactive-connection-pools Jumlah kumpulan koneksi yang tidak aktif Jumlah kumpulan koneksi tidak aktif yang belum memiliki aktivitas terbaru dan menunggu untuk dibuang.
number-of-active-connections Jumlah koneksi aktif Jumlah koneksi aktif yang saat ini sedang digunakan.
jumlah koneksi bebas Jumlah koneksi siap di kumpulan koneksi Jumlah koneksi terbuka yang tersedia untuk digunakan dalam kumpulan koneksi.
number-of-stasis-connections Jumlah koneksi yang saat ini menunggu untuk siap Jumlah koneksi yang saat ini menunggu penyelesaian tindakan dan yang tidak tersedia untuk digunakan oleh aplikasi.
jumlah koneksi yang diklaim kembali Jumlah koneksi yang diklaim kembali dari GC Jumlah koneksi yang telah direklamasi melalui pengumpulan sampah di mana Close atau Dispose tidak dipanggil oleh aplikasi. Catatan Tidak secara eksplisit menutup atau membuang koneksi menyakiti performa.

Mengambil nilai penghitung peristiwa

Ada dua cara utama untuk mengonsumsi EventCounters, baik secara in-proc, atau out-of-proc. Untuk informasi selengkapnya, lihat Menggunakan EventCounters.

Mengonsumsi out-of-proc

Di Windows, Anda dapat menggunakan PerfView dan Xperf untuk mengumpulkan data penghitung peristiwa. Untuk informasi selengkapnya, lihat Mengaktifkan pelacakan peristiwa di SqlClient. Anda dapat menggunakan penghitung dotnet dan dotnet-trace, yang merupakan alat .NET lintas platform untuk memantau dan mengumpulkan data penghitung peristiwa.

Contoh di luar proc

Perintah berikut menjalankan dan mengumpulkan nilai penghitung peristiwa SqlClient sekali setiap detik. Mengganti EventCounterIntervalSec=1 dengan nilai yang lebih tinggi memungkinkan pengumpulan jejak yang lebih kecil dengan granularitas yang lebih sedikit dalam data penghitung.

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

Perintah berikut mengumpulkan nilai penghitung peristiwa SqlClient sekali setiap detik.

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

Perintah berikut memantau nilai penghitung peristiwa SqlClient setiap tiga detik sekali.

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

Perintah berikut memantau nilai penghitung peristiwa SqlClient yang dipilih setiap detik sekali.

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

Mengonsumsi dalam proc

Anda dapat menggunakan nilai penghitung melalui API EventListener . EventListener Adalah cara in-proc untuk mengonsumsi peristiwa apa pun yang ditulis oleh instans EventSource di aplikasi Anda. Untuk informasi selengkapnya, lihat EventListener.

Contoh dalam proc

Kode sampel berikut mengambil Microsoft.Data.SqlClient.EventSource peristiwa menggunakan EventCounterIntervalSec=1. Ini menulis nama penghitung dan nilainya Mean pada setiap pembaruan penghitung peristiwa.

Catatan

Diperlukan untuk menentukan EventCounterIntervalSec nilai properti saat mengaktifkan peristiwa ini.

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

Baca juga