Sdílet prostřednictvím


Diagnostika v Kestrel

Note

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.

Warning

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.

Autor: Sourabh Shirhatti

Tento článek obsahuje pokyny ke shromažďování diagnostiky, od Kestrel které vám pomůžou s řešením potíží. Probíraná témata zahrnují:

  • Protokolování: Strukturované záznamy zapsané do .NET protokolování ILogger aplikace používají architektury aplikací k zápisu protokolů a uživatelům pro vlastní protokolování v aplikaci.
  • Metriky: Znázornění datových měr v časových intervalech, například požadavků za sekundu Metriky se generují pomocí EventCounter nástroje příkazového řádku dotnet-counters nebo application Insights.
  • DiagnosticSource: DiagnosticSource je mechanismus pro protokolování v produkčním čase s bohatými datovými částmi pro spotřebu v rámci procesu. Na rozdíl od protokolování, které předpokládá, že data opustí proces a očekává serializovatelná data, DiagnosticSource funguje dobře se složitými daty.

Logging

Podobně jako většina komponent v ASP.NET Core Kestrel se používá Microsoft.Extensions.Logging k generování informací protokolu. Kestrel využívá použití více kategorií , které vám umožní selektivně určit, které protokoly nasloucháte.

Název kategorie protokolování Protokolování událostí
Microsoft.AspNetCore.Server.Kestrel ApplicationError, ConnectionHeadResponseBodyWrite, , ApplicationNeverCompleted, RequestBodyStartRequestBodyDone, RequestBodyNotEntirelyReadRequestBodyDrainTimedOutResponseMinimumDataRateNotSatisfied, , InvalidResponseHeaderRemovedHeartbeatSlow
Microsoft.AspNetCore.Server.Kestrel.BadRequests ConnectionBadRequest, , RequestProcessingErrorRequestBodyMinimumDataRateNotSatisfied
Microsoft.AspNetCore.Server.Kestrel.Connections ConnectionAccepted, ConnectionStart, , ConnectionStop, ConnectionPauseConnectionResumeConnectionKeepAliveConnectionRejectedConnectionDisconnectNotAllConnectionsClosedGracefully, NotAllConnectionsAbortedApplicationAbortedConnection
Microsoft.AspNetCore.Server.Kestrel.Http2 Http2ConnectionError, Http2ConnectionClosing, , Http2ConnectionClosed, Http2StreamErrorHttp2StreamResetAbort, HPackDecodingErrorHPackEncodingErrorHttp2FrameReceived, , Http2FrameSendingHttp2MaxConcurrentStreamsReached
Microsoft.AspNetCore.Server.Kestrel.Http3 Http3ConnectionError, Http3ConnectionClosing, Http3ConnectionClosed, Http3StreamAbort, , Http3FrameReceivedHttp3FrameSending

Protokolování připojení

Kestrel podporuje také možnost generovat Debug protokoly na úrovni pro komunikaci na úrovni bajtů a lze je povolit pro jednotlivé koncové body. Pokud chcete povolit protokolování připojení, přečtěte si téma Konfigurace koncových bodů pro Kestrel

Metrics

Metriky jsou reprezentací datových měr v intervalech času, například požadavků za sekundu. Data metrik umožňují sledovat stav aplikace na vysoké úrovni. Kestrel metriky se generují pomocí EventCounter.

Note

Čítače connections-per-second a tls-handshakes-per-second čítače jsou pojmenovány nesprávně. Čítače:

  • Nepoužívejte vždy počet nových připojení nebo metod handshake protokolu TLS za sekundu.
  • Zobrazí počet nových připojení nebo metod handshake protokolu TLS v posledním intervalu aktualizace, jak je požadováno jako příjemce událostí prostřednictvím argumentu EventCounterIntervalSec v argumentu filterPayload to KestrelEventSource.

Doporučujeme uživatelům těchto čítačů škálovat hodnotu metriky na DisplayRateTimeScale základě jedné sekundy.

Name Zobrazovaný název Description
connections-per-second Rychlost připojení Počet nových příchozích připojení na interval aktualizace
total-connections Celkový počet připojení Celkový počet připojení
tls-handshakes-per-second Rychlost handshake protokolu TLS Počet nových metod handshake protokolu TLS v intervalu aktualizace
total-tls-handshakes Celkový počet TLS handshakes Celkový počet metod handshake protokolu TLS
current-tls-handshakes Aktuální metody handshake protokolu TLS Počet metod handshake protokolu TLS v procesu
failed-tls-handshakes Neúspěšné metody handshake protokolu TLS Celkový počet neúspěšných metod handshake protokolu TLS
current-connections Aktuální připojení Celkový počet připojení, včetně nečinných připojení
connection-queue-length Délka fronty připojení Celkový počet připojení zařazených do fronty do fondu vláken. V dobrém systému v stabilním stavu by toto číslo mělo být vždy blízko nule.
request-queue-length Délka fronty požadavku Celkový počet požadavků zařazených do fronty do fondu vláken. V dobrém systému v stabilním stavu by toto číslo mělo být vždy blízko nule. Tato metrika se liší od fronty požadavků IIS/Http.Sys a nelze ji porovnat.
current-upgraded-requests Aktuální upgradované požadavky (WebSockets) Počet aktivních požadavků Protokolu WebSocket

DiagnosticSource

Kestrel DiagnosticSource generuje událost pro požadavky HTTP odmítnuté na vrstvě serveru, jako jsou chybné požadavky a porušení protokolů. Tyto požadavky proto nikdy nepřesáhly do hostitelské vrstvy ASP.NET Core.

Kestrel generuje tyto události s Microsoft.AspNetCore.Server.Kestrel.BadRequest názvem události a jako datovou IFeatureCollection částí objektu. Základní výjimku lze načíst přístupem k kolekci IBadRequestExceptionFeature funkcí.

Řešení těchto událostí je dvoustupňový proces. Musí být vytvořen pozorovatel pro DiagnosticListener :

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();
}

Přihlaste se k odběru ASP.NET Core DiagnosticListener pomocí pozorovatele. V tomto příkladu vytvoříme zpětné volání, které zaznamená podkladovou výjimku.

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();

Chování s připojeným ladicím programem

Při připojení ladicího programu k Kestrel procesu se nevynucují určité časové limity a limity rychlosti. Další informace naleznete v tématu Chování s připojeným ladicím programem.