Sdílet prostřednictvím


Diagnostika v Kestrel

Poznámka:

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

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 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é protokoly zapsané do protokolování .NET Core 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.

Protokolování

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, RequestBodyDoneRequestBodyStart, RequestBodyNotEntirelyReadRequestBodyDrainTimedOutResponseMinimumDataRateNotSatisfied, , InvalidResponseHeaderRemovedHeartbeatSlow
Microsoft.AspNetCore.Server.Kestrel.BadRequests ConnectionBadRequest, , RequestProcessingErrorRequestBodyMinimumDataRateNotSatisfied
Microsoft.AspNetCore.Server.Kestrel.Connections ConnectionAccepted, ConnectionStart, , ConnectionStop, ConnectionResumeNotAllConnectionsClosedGracefullyConnectionPauseConnectionKeepAliveConnectionRejectedConnectionDisconnect, NotAllConnectionsAbortedApplicationAbortedConnection
Microsoft.AspNetCore.Server.Kestrel.Http2 Http2ConnectionError, Http2ConnectionClosing, , Http2ConnectionClosed, Http2StreamResetAbortHttp2StreamError, 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

Metriky

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.

Poznámka:

Čí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.

Název Zobrazovaný název Popis
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 Total 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

KestrelDiagnosticSource 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.