Dela via


Diagnostik i Kestrel

Note

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Warning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Important

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Sourabh Shirhatti

Den här artikeln innehåller vägledning för att samla in diagnostik från Kestrel för att felsöka problem. Ämnen som tas upp är:

  • Loggning: Strukturerade loggar som skrivits till .NET-loggning. ILogger används av appramverk för att skriva loggar och av användare för sin egen loggning i en app.
  • Mått: Representation av datamått över tidsintervall, till exempel begäranden per sekund. Mått genereras med hjälp av EventCounter och kan observeras med hjälp av kommandoradsverktyget dotnet-counters eller med Application Insights.
  • DiagnosticSource: DiagnosticSource är en mekanism för loggning under produktionstid med omfattande datanyttolaster för användning inom processen. Till skillnad från loggning, som förutsätter att data lämnar processen och förväntar sig serialiserbara data, DiagnosticSource fungerar det bra med komplexa data.

Logging

Precis som de flesta komponenter i ASP.NET Core används KestrelMicrosoft.Extensions.Logging för att generera logginformation. Kestrel använder sig av flera kategorier som gör att du kan vara selektiv på vilka loggar du lyssnar på.

Namn på loggningskategori Logghändelser
Microsoft.AspNetCore.Server.Kestrel ApplicationError, ConnectionHeadResponseBodyWrite, ApplicationNeverCompleted, RequestBodyStart, RequestBodyDone, RequestBodyNotEntirelyRead, , RequestBodyDrainTimedOut, ResponseMinimumDataRateNotSatisfied, , InvalidResponseHeaderRemovedHeartbeatSlow
Microsoft.AspNetCore.Server.Kestrel.BadRequests ConnectionBadRequest RequestProcessingError RequestBodyMinimumDataRateNotSatisfied
Microsoft.AspNetCore.Server.Kestrel.Connections ConnectionAccepted, ConnectionStart, ConnectionStop, ConnectionPause, ConnectionResume, ConnectionKeepAlive, , ConnectionRejected, ConnectionDisconnect, NotAllConnectionsClosedGracefully, , , NotAllConnectionsAbortedApplicationAbortedConnection
Microsoft.AspNetCore.Server.Kestrel.Http2 Http2ConnectionError, Http2ConnectionClosing, Http2ConnectionClosed, Http2StreamError, Http2StreamResetAbort, HPackDecodingError, , HPackEncodingError, Http2FrameReceived, , Http2FrameSendingHttp2MaxConcurrentStreamsReached
Microsoft.AspNetCore.Server.Kestrel.Http3 Http3ConnectionError, Http3ConnectionClosing, Http3ConnectionClosed, Http3StreamAbort, Http3FrameReceivedHttp3FrameSending

Loggning av anslutningar

Kestrel stöder också möjligheten att generera Debug nivåloggar för kommunikation på bytenivå och kan aktiveras per slutpunkt. För att aktivera anslutningsloggning, se konfigurera slutpunkter för Kestrel

Metrics

Mått är en representation av datamått över tidsintervall, till exempel begäranden per sekund. Måttdata gör det möjligt att övervaka tillståndet för en app på hög nivå. Kestrel mätvärden genereras med hjälp av EventCounter.

Note

Räknarna connections-per-second och tls-handshakes-per-second namnges felaktigt. Räknarna:

  • Innehåller inte alltid antalet nya anslutningar eller TLS-handskakningar per sekund
  • Visa antalet nya anslutningar eller TLS-handskakningar under det senaste uppdateringsintervallet, som begärts av händelsekonsumenten via EventCounterIntervalSec-argumentet i filterPayload till KestrelEventSource.

Vi rekommenderar att konsumenter av dessa räknare skalar måttvärdet baserat på DisplayRateTimeScale en sekund.

Name Visningsnamn Description
connections-per-second Anslutningshastighet Antalet nya inkommande anslutningar per uppdateringsintervall
total-connections Totalt antal anslutningar Det totala antalet anslutningar
tls-handshakes-per-second TLS-handskakningshastighet Antalet nya TLS-handskakningar per uppdateringsintervall
total-tls-handshakes Totalt antal TLS-handskakningar Det totala antalet TLS-handskakningar
current-tls-handshakes Aktuella TLS-handskakningar Antalet TLS-handskakningar i processen
failed-tls-handshakes Misslyckade TLS-handskakningar Det totala antalet misslyckade TLS-handskakningar
current-connections Aktuella anslutningar Det totala antalet anslutningar, inklusive inaktiva anslutningar
connection-queue-length Längd på anslutningskö Det totala antalet anslutningar i kö till trådpoolen. I ett felfritt system i stabilt tillstånd bör det här talet alltid vara nära noll
request-queue-length Längd på begärandekö Det totala antalet begäranden i kö till trådpoolen. I ett felfritt system i stabilt tillstånd bör det här talet alltid vara nära noll. Det här måttet skiljer sig från IIS/Http.Sys-begärandekön och kan inte jämföras
current-upgraded-requests Aktuella uppgraderade begäranden (WebSockets) Antalet aktiva WebSocket-begäranden

DiagnosticSource

Kestrel genererar en DiagnosticSource händelse för HTTP-begäranden som avvisas på servernivå, till exempel felaktiga begäranden och protokollöverträdelser. Därför kommer dessa begäranden aldrig in i värdlagret i ASP.NET Core.

Kestrel genererar dessa händelser med Microsoft.AspNetCore.Server.Kestrel.BadRequest händelsenamnet och en IFeatureCollection som objektnyttolast. Det underliggande undantaget kan hämtas genom att komma åt IBadRequestExceptionFeature i funktionssamlingen.

Att lösa dessa händelser är en tvåstegsprocess. En övervakare för DiagnosticListener måste skapas:

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

Prenumerera på ASP.NET Core DiagnosticListener med observatören. I detta exempel skapar vi en callback som loggar det underliggande undantaget.

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

Beteende med felsökningsprogrammet anslutet

Vissa tidsgränser och hastighetsgränser tillämpas inte när ett felsökningsprogram är kopplat till en Kestrel process. Mer information finns i Beteende med felsökningsprogram kopplat.