Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í
EventCounternástroje příkazového řádku dotnet-counters nebo application Insights. -
DiagnosticSource:
DiagnosticSourceje 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,DiagnosticSourcefunguje 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
EventCounterIntervalSecv argumentufilterPayloadtoKestrelEventSource.
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.