Share via


'da tanılama Kestrel

Sourabh Shirhatti tarafından

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 Uygulama Analizler kullanılarak 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şık DiagnosticSource 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, 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

Bağlan günlük kaydı

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 EventCountergönderilir.

Dekont

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 filterPayloadKestrelEventSourcearacılığıyla EventCounterIntervalSec 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.

Ad Görünen Ad Tanım
connections-per-second Bağlan Ion Oranı Güncelleştirme aralığı başına yeni gelen bağlantı sayısı
total-connections Toplam Bağlan 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ğlan ion 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ış.