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 , , ConnectionHeadResponseBodyWrite ApplicationNeverCompleted , RequestBodyStart , RequestBodyDone , RequestBodyNotEntirelyRead , RequestBodyDrainTimedOut , ResponseMinimumDataRateNotSatisfied , , InvalidResponseHeaderRemoved ,HeartbeatSlow |
Microsoft.AspNetCore.Server.Kestrel.BadRequests |
ConnectionBadRequest , , RequestProcessingError RequestBodyMinimumDataRateNotSatisfied |
Microsoft.AspNetCore.Server.Kestrel.Connections |
ConnectionAccepted , , ConnectionStart ConnectionStop , ConnectionPause , ConnectionResume , ConnectionKeepAlive , ConnectionRejected , ConnectionDisconnect , NotAllConnectionsClosedGracefully , , , NotAllConnectionsAborted ApplicationAbortedConnection |
Microsoft.AspNetCore.Server.Kestrel.Http2 |
Http2ConnectionError , , Http2ConnectionClosing Http2ConnectionClosed , Http2StreamError , Http2StreamResetAbort , HPackDecodingError , HPackEncodingError , Http2FrameReceived , , Http2FrameSending ,Http2MaxConcurrentStreamsReached |
Microsoft.AspNetCore.Server.Kestrel.Http3 |
Http3ConnectionError , , Http3ConnectionClosing Http3ConnectionClosed , 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 difilterPayload
keKestrelEventSource
.
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.
ASP.NET Core