'da tanılama Kestrel
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Bu makalede, sorunları gidermeye yardımcı olmak için 'den Kestrel tanılama toplamaya yönelik yönergeler sağlanır. Ele alınan konular:
- Günlüğe kaydetme: .NET Core günlüğüne yazılan yapılandırılmış günlükler. ILogger , uygulama çerçeveleri tarafından günlükleri yazmak için ve kullanıcılar tarafından bir uygulamada kendi günlükleri için kullanılır.
- Ölçümler: Veri ölçülerinin, örneğin saniye başına istek sayısı gibi zaman aralıkları içinde gösterimi. Ölçümler kullanılarak
EventCounter
gönderilir ve dotnet-counters komut satırı aracı kullanılarak veya Application Insights ile gözlemlenebilir. - DiagnosticSource:
DiagnosticSource
süreç içindeki tüketim için zengin veri yüklerine sahip üretim zamanı günlüğe kaydetme mekanizmasıdır. Verilerin işlemden ayrılacağını ve serileştirilebilir veriler beklediğini varsayan günlük kaydından farklı olarak karmaşıkDiagnosticSource
verilerle iyi çalışır.
Günlük Kaydı
ASP.NET Core'daki çoğu bileşen gibi, Kestrel günlük bilgilerini yaymak için kullanır Microsoft.Extensions.Logging
. Kestrel , hangi günlükleri dinlediğiniz konusunda seçici olmanıza olanak tanıyan birden çok kategoriyi kullanır.
Günlük Kategorisi Adı | Olayları Günlüğe Kaydetme |
---|---|
Microsoft.AspNetCore.Server.Kestrel |
ApplicationError , , ApplicationNeverCompleted ConnectionHeadResponseBodyWrite , , 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 , , Http2ConnectionClosed Http2ConnectionClosing , , Http2StreamError , Http2StreamResetAbort , HPackDecodingError , HPackEncodingError , Http2FrameReceived , Http2FrameSending ,Http2MaxConcurrentStreamsReached |
Microsoft.AspNetCore.Server.Kestrel.Http3 |
Http3ConnectionError , Http3ConnectionClosing , Http3ConnectionClosed , , Http3StreamAbort , Http3FrameReceived , Http3FrameSending |
Bağlantı günlüğü
Kestrel ayrıca bayt düzeyi iletişim için düzey günlükleri yayma Debug
özelliğini destekler ve uç nokta temelinde etkinleştirilebilir. Bağlantı günlüğünü etkinleştirmek için bkz . uç noktaları yapılandırma Kestrel
Ölçümler
Ölçümler, zaman aralıkları (örneğin saniye başına istekler) içindeki veri ölçülerinin bir gösterimidir. Ölçüm verileri, bir uygulamanın durumunun üst düzeyde gözlemlenmesine olanak tanır. Kestrel ölçümleri kullanılarak EventCounter
gönderilir.
Not
connections-per-second
ve tls-handshakes-per-second
sayaçları yanlış adlandırılmıştır. Sayaçlar:
- Her zaman saniye başına yeni bağlantı veya TLS el sıkışması sayısını içermez
- son güncelleştirme aralığındaki yeni bağlantı veya TLS el sıkışmalarının sayısını, içindeki bağımsız değişkeni
filterPayload
KestrelEventSource
aracılığıylaEventCounterIntervalSec
Olayların tüketicisi olarak istenen şekilde görüntüleyin.
Bu sayaçların tüketicilerinin ölçüm değerini bir saniyeye göre ölçeklendirmelerini DisplayRateTimeScale
öneririz.
Veri Akışı Adı | Görünen Ad | Açıklama |
---|---|---|
connections-per-second |
Bağlantı Hızı | Güncelleştirme aralığı başına yeni gelen bağlantı sayısı |
total-connections |
Toplam Bağlantı Sayısı | Toplam bağlantı sayısı |
tls-handshakes-per-second |
TLS El Sıkışma Oranı | Güncelleştirme aralığı başına yeni TLS el sıkışmalarının sayısı |
total-tls-handshakes |
Toplam TLS El Sıkışması | Toplam TLS el sıkışma sayısı |
current-tls-handshakes |
Geçerli TLS El Sıkışmaları | İşlemdeki TLS el sıkışmalarının sayısı |
failed-tls-handshakes |
Başarısız TLS El Sıkışmaları | Başarısız TLS el sıkışmalarının toplam sayısı |
current-connections |
Geçerli Bağlantılar | Boşta bağlantılar dahil olmak üzere toplam bağlantı sayısı |
connection-queue-length |
Bağlantı Kuyruğu Uzunluğu | İş parçacığı havuzuna kuyruğa alınan toplam bağlantı sayısı. Sabit durumdaki sağlıklı bir sistemde, bu sayı her zaman sıfıra yakın olmalıdır |
request-queue-length |
İstek Kuyruğu Uzunluğu | İş parçacığı havuzuna kuyruğa alınan toplam sayı isteği. Sabit durumdaki sağlıklı bir sistemde, bu sayı her zaman sıfıra yakın olmalıdır. Bu ölçüm IIS/Http.Sys istek kuyruğundan farklı ve karşılaştırılamaz |
current-upgraded-requests |
Geçerli Yükseltilmiş İstekler (WebSockets) | Etkin WebSocket isteklerinin sayısı |
DiagnosticSource
Kestrel hatalı biçimlendirilmiş istekler ve protokol ihlalleri gibi sunucu katmanında reddedilen HTTP istekleri için bir DiagnosticSource
olay yayar. Bu nedenle, bu istekler hiçbir zaman ASP.NET Core barındırma katmanına girmez.
Kestrelbu olayları olay adıyla ve nesne yükü olarak bir IFeatureCollection
ile Microsoft.AspNetCore.Server.Kestrel.BadRequest
yayar. Temel alınan özel durum, özellik koleksiyonundaki öğesine erişilerek IBadRequestExceptionFeature
alınabilir.
Bu olayları çözmek iki adımlı bir işlemdir. için DiagnosticListener
bir gözlemci oluşturulmalıdır:
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();
}
Gözlemci ile ASP.NET Çekirdeğine DiagnosticListener
abone olun. Bu örnekte, temel özel durumu günlüğe kaydeden bir geri çağırma oluştururuz.
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();
Hata ayıklayıcı eklenmiş davranış
Hata ayıklayıcı bir işleme eklendiğinde Kestrel belirli zaman aşımları ve hız sınırları uygulanmaz. Daha fazla bilgi için bkz . Hata ayıklayıcı eklenmiş davranış.
ASP.NET Core