Bagikan melalui


Diagnostik dalam Kestrel

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Oleh Sourabh Shirhatti

Artikel ini menyediakan panduan untuk mengumpulkan diagnostik dari Kestrel untuk membantu memecahkan masalah. Topik yang dibahas meliputi:

  • Pengelogan: Log terstruktur yang ditulis ke pengelogan .NET Core. ILogger digunakan oleh kerangka kerja aplikasi untuk menulis log, dan oleh pengguna untuk pengelogan mereka sendiri di aplikasi.
  • Metrik: Representasi pengukuran data selama interval waktu, misalnya, permintaan per detik. Metrik dipancarkan menggunakan EventCounter dan dapat diamati menggunakan alat baris perintah penghitung dotnet atau dengan Application Insights.
  • DiagnosticSource: DiagnosticSource adalah mekanisme untuk pengelogan waktu produksi dengan payload data yang kaya untuk dikonsumsi dalam proses. Tidak seperti pengelogan, yang mengasumsikan data akan meninggalkan proses dan mengharapkan data yang dapat diserialisasikan, DiagnosticSource bekerja dengan baik dengan data yang kompleks.

Pencatatan

Seperti kebanyakan komponen di ASP.NET Core, Kestrel digunakan untuk memancarkan Microsoft.Extensions.Logging informasi log. Kestrel menggunakan penggunaan beberapa kategori yang memungkinkan Anda untuk selektif pada log mana yang Anda dengarkan.

Nama Kategori Pengelogan Peristiwa Pengelogan
Microsoft.AspNetCore.Server.Kestrel ApplicationError, , ConnectionHeadResponseBodyWriteApplicationNeverCompleted, RequestBodyStart, RequestBodyDone, RequestBodyNotEntirelyRead, RequestBodyDrainTimedOut, ResponseMinimumDataRateNotSatisfied, , InvalidResponseHeaderRemoved,HeartbeatSlow
Microsoft.AspNetCore.Server.Kestrel.BadRequests ConnectionBadRequest, , RequestProcessingErrorRequestBodyMinimumDataRateNotSatisfied
Microsoft.AspNetCore.Server.Kestrel.Connections ConnectionAccepted, , ConnectionStartConnectionStop, ConnectionPause, ConnectionResume, ConnectionKeepAlive, ConnectionRejected, ConnectionDisconnect, NotAllConnectionsClosedGracefully, , , NotAllConnectionsAbortedApplicationAbortedConnection
Microsoft.AspNetCore.Server.Kestrel.Http2 Http2ConnectionError, , Http2ConnectionClosingHttp2ConnectionClosed, Http2StreamError, Http2StreamResetAbort, HPackDecodingError, HPackEncodingError, Http2FrameReceived, , Http2FrameSending,Http2MaxConcurrentStreamsReached
Microsoft.AspNetCore.Server.Kestrel.Http3 Http3ConnectionError, , Http3ConnectionClosingHttp3ConnectionClosed, Http3StreamAbort, , Http3FrameReceived,Http3FrameSending

Pengelogan koneksi

Kestrel juga mendukung kemampuan untuk memancarkan Debug log tingkat untuk komunikasi tingkat byte dan dapat diaktifkan berdasarkan per titik akhir. Untuk mengaktifkan pengelogan koneksi, lihat mengonfigurasi titik akhir untuk Kestrel

Metrik

Metrik adalah representasi pengukuran data selama interval waktu, misalnya, permintaan per detik. Data metrik memungkinkan pengamatan status aplikasi pada tingkat tinggi. Kestrel metrik dipancarkan menggunakan EventCounter.

Catatan

Penghitung connections-per-second dan tls-handshakes-per-second diberi nama salah. Penghitung:

  • Jangan selalu berisi jumlah koneksi baru atau jabat tangan TLS per detik
  • Tampilkan jumlah koneksi baru atau jabat tangan TLS dalam interval pembaruan terakhir seperti yang diminta sebagai konsumen Peristiwa melalui EventCounterIntervalSec argumen di filterPayload ke KestrelEventSource.

Kami merekomendasikan konsumen penghitung ini menskalakan nilai metrik berdasarkan DisplayRateTimeScale satu detik.

Nama Nama Tampilan Deskripsi
connections-per-second Laju Koneksi Jumlah koneksi masuk baru per interval pembaruan
total-connections Total koneksi Jumlah total koneksi
tls-handshakes-per-second Laju Jabat Tangan TLS Jumlah jabat tangan TLS baru per interval pembaruan
total-tls-handshakes Total Jabat Tangan TLS Jumlah total jabat tangan TLS
current-tls-handshakes Jabat Tangan TLS Saat Ini Jumlah jabat tangan TLS dalam proses
failed-tls-handshakes Jabat Tangan TLS gagal Jumlah total jabat tangan TLS yang gagal
current-connections Koneksi Saat Ini Jumlah total koneksi, termasuk koneksi diam
connection-queue-length Panjang Antrean Koneksi Jumlah total koneksi yang diantrekan ke kumpulan utas. Dalam sistem yang sehat pada status stabil, angka ini harus selalu mendekati nol
request-queue-length Panjang Antrean Permintaan Jumlah total permintaan yang diantrekan ke kumpulan utas. Dalam sistem yang sehat pada keadaan stabil, angka ini harus selalu mendekati nol. Metrik ini tidak seperti antrean permintaan IIS/Http.Sys dan tidak dapat dibandingkan
current-upgraded-requests Permintaan Yang Ditingkatkan Saat Ini (WebSockets) Jumlah permintaan WebSocket aktif

DiagnosticSource

Kestrel memancarkan DiagnosticSource peristiwa untuk permintaan HTTP yang ditolak pada lapisan server seperti permintaan cacat dan pelanggaran protokol. Dengan demikian, permintaan ini tidak pernah masuk ke lapisan hosting ASP.NET Core.

Kestrel memancarkan peristiwa ini dengan Microsoft.AspNetCore.Server.Kestrel.BadRequest nama peristiwa dan IFeatureCollection sebagai payload objek. Pengecualian yang mendasar dapat diambil dengan mengakses IBadRequestExceptionFeature pada koleksi fitur.

Menyelesaikan peristiwa ini adalah proses dua langkah. Pengamat untuk DiagnosticListener harus dibuat:

class BadRequestEventListener : IObserver<KeyValuePair<string, object>>, IDisposable
{
    private readonly IDisposable _subscription;
    private readonly Action<IBadRequestExceptionFeature> _callback;

    public BadRequestEventListener(DiagnosticListener diagnosticListener, Action<IBadRequestExceptionFeature> callback)
    {
        _subscription = diagnosticListener.Subscribe(this!, IsEnabled);
        _callback = callback;
    }
    private static readonly Predicate<string> IsEnabled = (provider) => provider switch
    {
        "Microsoft.AspNetCore.Server.Kestrel.BadRequest" => true,
        _ => false
    };
    public void OnNext(KeyValuePair<string, object> pair)
    {
        if (pair.Value is IFeatureCollection featureCollection)
        {
            var badRequestFeature = featureCollection.Get<IBadRequestExceptionFeature>();

            if (badRequestFeature is not null)
            {
                _callback(badRequestFeature);
            }
        }
    }
    public void OnError(Exception error) { }
    public void OnCompleted() { }
    public virtual void Dispose() => _subscription.Dispose();
}

Berlangganan ASP.NET Core DiagnosticListener dengan pengamat. Dalam contoh ini, kami membuat panggilan balik yang mencatat pengecualian yang mendasar.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var diagnosticSource = app.Services.GetRequiredService<DiagnosticListener>();
using var badRequestListener = new BadRequestEventListener(diagnosticSource, (badRequestExceptionFeature) =>
{
    app.Logger.LogError(badRequestExceptionFeature.Error, "Bad request received");
});
app.MapGet("/", () => "Hello world");
app.Run();

Perilaku dengan debugger terlampir

Batas waktu habis dan tarif tertentu tidak diberlakukan saat debugger dilampirkan ke Kestrel proses. Untuk informasi selengkapnya, lihat Perilaku dengan debugger terlampir.