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 , RequestBodyDone RequestBodyStart , RequestBodyNotEntirelyRead RequestBodyDrainTimedOut ResponseMinimumDataRateNotSatisfied , , InvalidResponseHeaderRemoved HeartbeatSlow |
Microsoft.AspNetCore.Server.Kestrel.BadRequests |
ConnectionBadRequest , , RequestProcessingError RequestBodyMinimumDataRateNotSatisfied |
Microsoft.AspNetCore.Server.Kestrel.Connections |
ConnectionAccepted , ConnectionStart , , ConnectionStop , ConnectionResume NotAllConnectionsClosedGracefully ConnectionPause ConnectionKeepAlive ConnectionRejected ConnectionDisconnect , NotAllConnectionsAborted ApplicationAbortedConnection |
Microsoft.AspNetCore.Server.Kestrel.Http2 |
Http2ConnectionError , Http2ConnectionClosing , , Http2ConnectionClosed , Http2StreamResetAbort Http2StreamError , HPackDecodingError HPackEncodingError Http2FrameReceived , , Http2FrameSending Http2MaxConcurrentStreamsReached |
Microsoft.AspNetCore.Server.Kestrel.Http3 |
Http3ConnectionError , Http3ConnectionClosing , Http3ConnectionClosed , Http3StreamAbort , , Http3FrameReceived Http3FrameSending |
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 argumentufilterPayload
toKestrelEventSource
.
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.