Aracılığıyla paylaş


SqlClient'da olay izlemeyi etkinleştirme

Şunlar için geçerlidir: .NET Framework .NET .NET Standard

ADO.NET indirin

Windows için Olay İzleme (ETW), hata ayıklama ve test amacıyla sürücü tanımlı olayları günlüğe kaydetmenizi sağlayan verimli, çekirdek düzeyinde bir izleme tesisidir. SqlClient, ETW olaylarının farklı bilgi düzeylerinde yakalanmasını destekler. Olay izlemelerini yakalamaya başlamak için istemci uygulamaları SqlClient'ın EventSource uygulamasındaki olayları dinlemelidir:

Microsoft.Data.SqlClient.EventSource

Geçerli uygulama aşağıdaki Olay Anahtar Sözcüklerini destekler:

Anahtar sözcük adı Değer Description
ExecutionTrace 1 Komut yürütülmeden önce ve sonra Başlat/Durdur olaylarını kaydetmeyi etkinleştirir.
İz 2 Temel uygulama akış izleme olaylarını kaydetmeyi etkinleştirir.
Scope 4 Giriş ve çıkış olaylarını yakalamayı açar
NotificationTrace 8 İzleme olaylarını yakalamayı SqlNotification etkinleştirir.
BildirimKapsamı 16 Kapsam giriş ve çıkış olaylarının yakalanmasını SqlNotification etkinleştirir
PoolerTrace 32 Bağlantı havuzu izleme olaylarının yakalanmasını etkinleştirir.
PoolerScope 64 Bağlantı havuzu kapsam izleme olaylarının yakalanmasını etkinleştirir.
AdvancedTrace 128 Gelişmiş akış izleme olaylarını yakalamayı açar.
AdvancedTraceBin 256 Ek bilgilerle gelişmiş akış izleme olaylarını yakalamayı açar.
CorrelationTrace 512 Bağıntı akışı izleme olaylarını yakalamayı açar.
StateDump 1024 Durum dökümünün tamamını yakalamayı aktif eder SqlConnection
SNITrace 2048 Yönetilen Ağ uygulamasından akış izleme olaylarını yakalamayı açar (yalnızca .NET Core'da geçerlidir)
SNIScope 4096 Yönetilen Ağ uygulamasından kapsam olaylarını yakalamayı açar (yalnızca .NET Core'da geçerlidir)

Example

Aşağıdaki örnek AdventureWorks örnek veritabanında bir veri işlemi için olay izlemeyi etkinleştirir ve olayları konsol penceresinde görüntüler.

using System;
using System.Diagnostics.Tracing;
using Microsoft.Data.SqlClient;

// 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 SqlClientListener : EventListener
{
    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        // Only enable events from SqlClientEventSource.
        if (eventSource.Name.Equals("Microsoft.Data.SqlClient.EventSource"))
        {
            // Use EventKeyWord 2 to capture basic application flow events.
            // See the above table for all available keywords.
            EnableEvents(eventSource, EventLevel.Informational, (EventKeywords)2);
        }
    }

    // This callback runs whenever an event is written by SqlClientEventSource.
    // Event data is accessed through the EventWrittenEventArgs parameter.
    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        // Print event data.
        Console.WriteLine(eventData.Payload[0]);
    }
}

class Program
{
    public static void Main()
    {
        // Create a new event listener.
        using (SqlClientListener listener = new SqlClientListener())
        {
            string connectionString = "Data Source=localhost; " +
                "Initial Catalog=AdventureWorks; Integrated Security=true";

            // Open a connection to the AdventureWorks database.
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                string sql = "SELECT * FROM Sales.Currency";
                SqlCommand command = new SqlCommand(sql, connection);

                // Perform a data operation on the server.
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    // Read the data.
                }
                reader.Close();
            }
        }
    }
}

Yerel SNI'de olay izleme desteği

Microsoft.Data.SqlClient , v2.1 ile başlayan Microsoft.Data.SqlClient.SNI ve Microsoft.Data.SqlClient.SNI.runtime'da olay izleme desteği sağlar. Olaylar , Xperf ve PerfView araçları kullanılarak yerel DLL'lerden toplanabilir.

Microsoft.Data.SqlClient v3.0'dan başlayarak, olay toplama araçları kullanılarak istemci uygulamasında herhangi bir değişiklik yapılmadan olay izleme etkinleştirilebilir.

Microsoft.Data.SqlClient v2.1 sürümünde, olay izlemenin etkinleştirilmesi için olay kaynağı dinleyicisi ile EventCommand yapılandırılması gerekir. EventCommand Yerel SNI için geçerli değerler şunlardır:

// Enables trace events:
EventSource.SendCommand(eventSource, (EventCommand)8192, null);

// Enables flow events:
EventSource.SendCommand(eventSource, (EventCommand)16384, null);

// Enables both trace and flow events:
EventSource.SendCommand(eventSource, (EventCommand)(8192 | 16384), null);

Aşağıdaki örnek, yerel SNI DLL'lerinde olay izlemeyi etkinleştirir.

// Native SNI tracing example
using System;
using System.Diagnostics.Tracing;
using Microsoft.Data.SqlClient;

public class SqlClientListener : EventListener
{
    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        if (eventSource.Name.Equals("Microsoft.Data.SqlClient.EventSource"))
        {
            // Enables both trace and flow events
            EventSource.SendCommand(eventSource, (EventCommand)(8192 | 16384), null);
        }
    }
}

class Program
{
    static string connectionString = @"Data Source = localhost; Initial Catalog = AdventureWorks;Integrated Security=true;";

    static void Main(string[] args)
    {
        // Event source listener configuration is not required in v3.0 onwards.
        using (SqlClientListener listener = new SqlClientListener())
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
        }
    }
}

İzlemeleri toplamak için Xperf kullanma

  1. aşağıdaki komutu kullanarak izlemeyi başlatın.

    xperf -start trace -f myTrace.etl -on *Microsoft.Data.SqlClient.EventSource
    
  2. SQL Server'a bağlanmak için yerel SNI izleme örneğini çalıştırın.

  3. Aşağıdaki komut satırını kullanarak izlemeyi durdurun.

    xperf -stop trace
    
  4. 1. Adımda belirtilen myTrace.etl dosyasını açmak için PerfView kullanın. SNI izleme günlüğü, Microsoft.Data.SqlClient.EventSource/SNIScope ve Microsoft.Data.SqlClient.EventSource/SNITrace olay adları ile bulunabilir.

    SNI izleme dosyasını görüntülemek için PerfView kullanma

İzlemeleri toplamak için PerfView kullanma

  1. PerfView'u başlatın ve menü çubuğundan çalıştırınCollect > Collect.

  2. İzleme dosyası adını, çıkış yolunu ve sağlayıcı adını yapılandırın.

    Perfview'ı toplamadan önce yapılandırma

  3. Koleksiyonu başlatın.

  4. SQL Server'a bağlanmak için yerel SNI izleme örneğini çalıştırın.

  5. PerfView'dan koleksiyonu durdurun. 2. Adımdaki yapılandırmaya göre PerfViewData.etl dosyasının oluşturulması biraz zaman alır.

  6. etl Dosyayı PerfView'da açın. SNI izleme günlüğü, Microsoft.Data.SqlClient.EventSource/SNIScope ve Microsoft.Data.SqlClient.EventSource/SNITrace olay adları ile bulunabilir.

İzlemeleri toplamak için dotnet-trace kullanma

Linux, macOS veya Windows'da izlemeleri yakalamak için dotnet-trace kullanılabilir. dotnet-trace aracı.NET uygulamalarına yönelik izlemeleri toplamak için kullanılır. dotnet-trace hakkında daha fazla bilgi için dotnet-trace performans analizi yardımcı programı Dotnet-trace tarafından oluşturulan izlemeler PerfView'da görüntülenebilir.

  1. Henüz yüklü değilse istemci makinesine .NET SDK'sını yükleyin .

  2. dotnet-trace'i yükleyin.

  3. dotnet-trace komutunu çalıştırın. parametresi, --providers Microsoft.Data.SqlClient'dan gelen izlemeler için sağlayıcı adı ve anahtar sözcüklerinin belirtilmesi gerekir. Anahtar sözcükler seçeneği, olay anahtar sözcükleri tablosundaki anahtar sözcük değerlerinin onaltılık değere dönüştürülmüş bir toplamıdır. Uygulamanın başlangıcından itibaren ayrıntılı düzeydeki MyApplication tüm olayları toplamak için anahtar sözcüklerin toplamı 8191 ve bu toplamın onaltılık olarak gösterimi 1FFF şeklindedir. Ayrıntılı düzey bu komutta 5 tarafından belirtilir.

    dotnet-trace collect --providers Microsoft.Data.SqlClient.EventSource:1FFF:5 -- dotnet MyApplication.dll
    

    Çıktı şudur:

    
    Provider Name                           Keywords            Level               Enabled By
    Microsoft.Data.SqlClient.EventSource    0x0000000000001FFF  Verbose(5)          --providers
    
    Launching: dotnet MyApplication.dll
    Process        : /usr/lib/dotnet/dotnet
    Output File    : /home/appuser/dotnet_20240927_102506.nettrace
    
    [00:00:00:00]   Recording trace 0.00     (B)
    Press <Enter> or <Ctrl+C> to exit...
    
    Trace completed.
    Process exited with code '1'.
    

    Çalışan bir uygulamada bilgi düzeyindeki tüm olayları toplamak için önce uygulamanın işlem kimliğini bulun. Ardından işlemde dotnet-trace komutunu çalıştırın. Bilgi düzeyi tarafından 4belirtilir.

    dotnet-trace ps
    8734  MyApplication  /home/appuser/MyApplication/MyApplication
    
    dotnet-trace collect -–process-id 8734 --providers Microsoft.Data.SqlClient.EventSource:1FFF:4
    

    Uygulamayı ayrı ayrı çalıştırın ve sorunu yeniden oluşturmak için gerektiği kadar çalışmasına izin verin. Bu yüksek bir CPU sorunuysa, genellikle 5-10 saniye yeterlidir.

    Provider Name                           Keywords            Level               Enabled By
    Microsoft.Data.SqlClient.EventSource    0x0000000000001FFF  LogAlways(0)        --providers
    
    Process        : /usr/lib/dotnet/dotnet
    Output File    : /home/appuser/dotnet_20240927_104154.nettrace
    
    [00:00:00:10]   Recording trace 4.096    (KB)
    Press <Enter> or <Ctrl+C> to exit...
    Stopping the trace. This may take several minutes depending on the application being traced.
    
    Trace completed.
    

    İzleme dosyası adı .nettrace ile sona erer. Windows'da izlenmiyorsa, dosyayı bir Windows sistemine kopyalayın. perfView'da izleme dosyasını görüntüleyin.

Dış kaynaklar

Microsoft.Data.SqlClient çapraz platformunu izleme hakkında başka bir örnek kümesi için CSS SQL Ağ Araçları wiki'sine bakın.

Olay izleme hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Resource Description
EventSource Sınıfı ETW olayları oluşturmak için kullanılır.
EventListener Sınıfı Olay kaynaklarından olayları etkinleştirmeye ve devre dışı bırakmaya yönelik yöntemler sağlar.