Diagnostyka w programie Kestrel
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
Przez Sourabh Shirhatti
Ten artykuł zawiera wskazówki dotyczące zbierania danych diagnostycznych, Kestrel aby pomóc w rozwiązywaniu problemów. Omawiane tematy to m.in.:
- Rejestrowanie: dzienniki ustrukturyzowane zapisywane w rejestrowaniu platformy .NET Core. ILogger jest używany przez struktury aplikacji do pisania dzienników i przez użytkowników na potrzeby własnego logowania w aplikacji.
- Metryki: Reprezentacja miar danych w odstępach czasu, na przykład żądania na sekundę. Metryki są emitowane przy użyciu
EventCounter
narzędzia wiersza polecenia dotnet-counters i można je zaobserwować za pomocą narzędzia wiersza polecenia dotnet-counters lub usługi Application Insights. - DiagnosticSource:
DiagnosticSource
to mechanizm rejestrowania w czasie produkcyjnym z zaawansowanymi ładunkami danych do użycia w ramach procesu. W przeciwieństwie do rejestrowania, które zakłada, że dane pozostawią proces i spodziewają się serializacji danych,DiagnosticSource
dobrze współdziałają ze złożonymi danymi.
Rejestrowanie
Podobnie jak większość składników w programie ASP.NET Core, Kestrel używa Microsoft.Extensions.Logging
metody do emitowania informacji dziennika. Kestrel wykorzystuje użycie wielu kategorii , które umożliwiają selektywne selektywne nasłuchiwanie dzienników.
Nazwa kategorii rejestrowania | Rejestrowanie zdarzeń |
---|---|
Microsoft.AspNetCore.Server.Kestrel |
ApplicationError , ConnectionHeadResponseBodyWrite , , , RequestBodyDone InvalidResponseHeaderRemoved RequestBodyStart RequestBodyNotEntirelyRead RequestBodyDrainTimedOut ResponseMinimumDataRateNotSatisfied ApplicationNeverCompleted HeartbeatSlow |
Microsoft.AspNetCore.Server.Kestrel.BadRequests |
ConnectionBadRequest , , RequestProcessingError RequestBodyMinimumDataRateNotSatisfied |
Microsoft.AspNetCore.Server.Kestrel.Connections |
ConnectionAccepted , ConnectionStart , , , ConnectionResume ConnectionDisconnect NotAllConnectionsAborted ConnectionPause ConnectionKeepAlive ConnectionRejected NotAllConnectionsClosedGracefully ConnectionStop ApplicationAbortedConnection |
Microsoft.AspNetCore.Server.Kestrel.Http2 |
Http2ConnectionError , Http2ConnectionClosing , , , Http2StreamResetAbort Http2FrameSending Http2StreamError HPackDecodingError HPackEncodingError Http2FrameReceived Http2ConnectionClosed Http2MaxConcurrentStreamsReached |
Microsoft.AspNetCore.Server.Kestrel.Http3 |
Http3ConnectionError , , Http3ConnectionClosing , Http3ConnectionClosed , Http3StreamAbort , , Http3FrameReceived Http3FrameSending |
Rejestrowanie połączeń
Kestrel Obsługuje również możliwość emitowania Debug
dzienników na poziomie komunikacji na poziomie bajtów i może być włączona dla poszczególnych punktów końcowych. Aby włączyć rejestrowanie połączeń, zobacz konfigurowanie punktów końcowych dla Kestrel
Metryki
Metryki to reprezentacja miar danych w odstępach czasu, na przykład żądania na sekundę. Dane metryk umożliwiają obserwację stanu aplikacji na wysokim poziomie. Kestrel metryki są emitowane przy użyciu polecenia EventCounter
.
Uwaga
Liczniki connections-per-second
i tls-handshakes-per-second
są niepoprawnie nazwane. Liczniki:
- Nie zawsze należy zawierać liczbę nowych połączeń ani uzgadniania protokołu TLS na sekundę
- Wyświetl liczbę nowych połączeń lub uzgadniania protokołu TLS w ostatnim interwale aktualizacji zgodnie z żądaniem jako odbiorca zdarzeń za pośrednictwem argumentu
EventCounterIntervalSec
filterPayload
na .KestrelEventSource
Zalecamy użytkownikom tych liczników skalowanie wartości metryki na DisplayRateTimeScale
podstawie jednej sekundy.
Imię i nazwisko/nazwa | Nazwa wyświetlana | Opis |
---|---|---|
connections-per-second |
Częstotliwość połączeń | Liczba nowych połączeń przychodzących na interwał aktualizacji |
total-connections |
Łączna liczba połączeń | Całkowita liczba połączeń |
tls-handshakes-per-second |
Szybkość uzgadniania protokołu TLS | Liczba nowych uzgadniań protokołu TLS na interwał aktualizacji |
total-tls-handshakes |
Łączna liczba uzgadniań protokołu TLS | Całkowita liczba uzgadniań protokołu TLS |
current-tls-handshakes |
Bieżące uzgadniania protokołu TLS | Liczba uzgadniań protokołu TLS w procesie |
failed-tls-handshakes |
Nieudane uzgadnianie protokołu TLS | Całkowita liczba nieudanych uzgadniań protokołu TLS |
current-connections |
Bieżące połączenia | Całkowita liczba połączeń, w tym bezczynne połączenia |
connection-queue-length |
Długość kolejki połączeń | Łączna liczba połączeń w kolejce do puli wątków. W systemie w dobrej kondycji w stanie stabilnym ta liczba powinna zawsze być zbliżona do zera |
request-queue-length |
Długość kolejki żądań | Łączna liczba żądań w kolejce do puli wątków. W zdrowym systemie w stanie stabilnym ta liczba powinna zawsze być zbliżona do zera. Ta metryka jest w przeciwieństwie do kolejki żądań IIS/Http.Sys i nie można jej porównać |
current-upgraded-requests |
Bieżące uaktualnione żądania (WebSockets) | Liczba aktywnych żądań protokołu WebSocket |
DiagnosticSource
Kestrel Emituje DiagnosticSource
zdarzenie dla żądań HTTP odrzuconych w warstwie serwera, takich jak źle sformułowane żądania i naruszenia protokołów. W związku z tym te żądania nigdy nie tworzą ich w warstwie hostingu ASP.NET Core.
Kestrel Emituje te zdarzenia z Microsoft.AspNetCore.Server.Kestrel.BadRequest
nazwą zdarzenia i IFeatureCollection
jako ładunkiem obiektu. Podstawowy wyjątek można pobrać, korzystając IBadRequestExceptionFeature
z elementu w kolekcji funkcji.
Rozwiązywanie tych zdarzeń jest procesem dwuetapowym. Należy utworzyć obserwatora 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();
}
Zasubskrybuj ASP.NET Core DiagnosticListener
za pomocą obserwatora. W tym przykładzie utworzymy wywołanie zwrotne, które rejestruje podstawowy wyjątek.
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();
Zachowanie z dołączonym debugerem
Niektóre limity czasu i limity szybkości nie są wymuszane, gdy debuger jest dołączony do Kestrel procesu. Aby uzyskać więcej informacji, zobacz Zachowanie z dołączonym debugerem.