Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie Anwendungen erstellen, die über HTTP kommunizieren, ist es wichtig, die Leistungsmerkmale der Anforderung zu beobachten.
Die AddHttpClientLatencyTelemetry Erweiterung ermöglicht die Erfassung detaillierter Timing-Informationen für ausgehende HTTP-Aufrufe, ohne Änderungen am aufrufenden Code vorzunehmen.
Es wird in die vorhandene HttpClientFactory Pipeline eingebunden, um Phasenzeiten über den Anforderungslebenszyklus hinweg zu erfassen, HTTP-Protokolldetails aufzuzeichnen, die Garbage Collection-Auswirkungen zu messen, wenn die Laufzeit diese Daten bereitstellt, und eine einheitliche Telemetrieform auszugeben, die für die Leistungsanalyse und die Optimierung geeignet ist. Aktivieren Sie diese Telemetrie, indem Sie die AddHttpClientLatencyTelemetry() Erweiterungsmethode aufrufen.
Der integrierte Handler erstellt für jede ausgehende Anfrage eine ILatencyContext und füllt Metriken aus, sobald die innere Pipeline abgeschlossen ist. Nutzen Sie sie nach await base.SendAsync(...) in einem späteren Delegierungshandler (der nach der Erfassung der Telemetrie hinzugefügt wurde) und exportieren Sie sie an Ihr Metrikrücksystem. Beispiel:
Registererweiterungsmethode:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http.Diagnostics;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
// An example of some accessor that is able to read latency context
builder.Services.AddSingleton<ILatencyContextAccessor, LatencyContextAccessor>();
// Register HTTP client latency telemetry first so its delegating handler runs earlier.
builder.Services.AddHttpClientLatencyTelemetry();
// Register export handler (runs after telemetry; sees finalized ILatencyContext).
builder.Services.AddTransient<HttpLatencyExportHandler>();
// Register an HttpClient that will emit and export latency measures.
builder.Services
.AddHttpClient("observed")
.AddHttpMessageHandler<HttpLatencyExportHandler>();
var host = builder.Build();
await host.RunAsync();
Zugreifen auf den Kontext:
public sealed class HttpLatencyExportHandler : DelegatingHandler
{
// ILatencyContextAccessor is just an example of some accessor that is able to read latency context
private readonly ILatencyContextAccessor _latency;
public HttpLatencyExportHandler(ILatencyContextAccessor latency) => _latency = latency;
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken ct)
{
var rsp = await base.SendAsync(request, ct).ConfigureAwait(false);
var ctx = _latency.Current;
if (ctx != null)
{
var data = ctx.LatencyData;
// Record/export gc and conn with version as a dimension here.
}
return rsp;
}
}
Hinzufügen des Pakets
dotnet add package Microsoft.Extensions.Http.Diagnostics --version 9.10.0
Weitere Informationen finden Sie unter dotnet package add or Manage package dependencies in .NET applications.
Registrierung der HTTP-Clientlatenzmessungs-Telemetrie
Um Ihrer Anwendung HTTP-Clientlatenz-Telemetrie hinzuzufügen, rufen Sie die AddHttpClientLatencyTelemetry Erweiterungsmethode beim Konfigurieren Ihrer Dienste auf:
var builder = WebApplication.CreateBuilder(args);
// Add HTTP client factory
builder.Services.AddHttpClient();
// Add HTTP client latency telemetry
builder.Services.AddHttpClientLatencyTelemetry();
Diese Registrierung fügt allen HTTP-Clients, die über DelegatingHandlererstellt wurden, einen IHttpClientFactory hinzu, der detaillierte Latenzinformationen für jede Anforderung sammelt.
Konfigurieren von Telemetrieoptionen
Sie konfigurieren die Telemetriesammlung über das HttpClientLatencyTelemetryOptions (Standardoptionenmuster).
Sie können Werte entweder mit einem Delegat oder durch Konfigurationsbindung angeben (z. B. appsettings.json).
Die Optionsinstanz wird einmal pro Handlerpipeline aufgelöst, sodass Änderungen auf neue Clients/Handler angewendet werden.
// Configure with delegate
builder.Services.AddHttpClientLatencyTelemetry(options =>
{
options.EnableDetailedLatencyBreakdown = true;
});
// Or configure from configuration
builder.Services.AddHttpClientLatencyTelemetry(
builder.Configuration.GetSection("HttpClientTelemetry"));
Konfigurationsoptionen
Die HttpClientLatencyTelemetryOptions Klasse bietet die folgenden Einstellungen:
| Option | Typ | Standard | Description | Wann sie deaktiviert werden sollen |
|---|---|---|---|---|
| Detaillierte Latenzaufgliederung aktivieren | Boolean | true |
Ermöglicht eine differenzierte Phasenanzeige für jede HttpClient-Anforderung (z. B. Verbindungseinrichtung, gesendete Header, erstes Byte, Abschluss), um eine Aufschlüsselung der Gesamtlatenz zu erzeugen. Fügt kleine zusätzliche Kosten für die CPU-/Zeitmessung hinzu, kein Overhead durch Verkabelung. |
false Wird nur in Szenarien mit sehr hohem Durchsatz festgelegt, in denen nur ein minimaler Aufwand erforderlich ist und die Gesamtdauer allein ausreichend ist. |
Gesammelte Telemetriedaten
Wenn die Telemetrie der HTTP-Clientlatenz aktiviert ist, erfasst sie Phasenzeitstempel, ausgewählte Maßnahmen (sofern unterstützt) und Protokollattribute, die zur Leistungsanalyse verwendet werden.
Timingprüfpunkte
Zeitstempel werden für wichtige Phasen des HTTP-Anforderungslebenszyklus aufgezeichnet:
| Phase | Startereignis | End-Ereignis | Hinweise |
|---|---|---|---|
| DNS-Auflösung | Http.NameResolutionStart | Http.NameResolutionEnd | Hostnamen-Nachschlagevorgang (kann zwischengespeichert und übersprungen werden). |
| Socketverbindung | Http.SocketConnectStart | Http.SocketConnectEnd | CP (und TLS-Handshake, wenn kombiniert von Handler). |
| Verbindungsherstellung | Http.ConnectionEstablished | Markiert die verwendbare Verbindung nach dem Handshake. | |
| Anforderungsheader | Http.RequestHeadersStart | Http.RequestHeadersEnd | Schreiben von Anforderungsheadern in die Übertragungs-/Pufferleitung. |
| Anfordern von Inhalten | Http.RequestContentStart | Http.RequestContentEnd | Textkörper der Streaming- oder Pufferanforderung. |
| Antwortkopfzeilen | Http.ResponseHeadersStart | Http.ResponseHeadersEnd | Erster Byte bis zur Vollendung der Header-Analyse. |
| Antwortinhalt | Http.ResponseContentStart | Http.ResponseContentEnd | Lesen des vollständigen Antworttexts (zum Abschluss oder Zur Entsorgung). |
Maßnahmen (plattformabhängig)
Misst Latenzbeiträge, die durch Rohphasen-Checkpoints nicht erfasst werden können (GC-Pause-Überlappungen, Verbindungsumschläge, andere akkumulierte Anzahlen oder Dauern). Sie werden in einem In-Memory-Latenzkontext gesammelt, der beim Aufrufen von AddHttpClientLatencyTelemetry() erstellt wird. Nichts wird automatisch ausgegeben: Der Kontext sammelt einfach Prüfpunkte, Measures und Tags, bis die Anforderung abgeschlossen ist. Wenn Sie auch die HTTP-Clientprotokollanreicherung mit AddExtendedHttpClientLogging() aktivieren, wird der fertige Kontext zu einem einzigen strukturierten Protokollfeld mit dem Namen LatencyInfo (Versionsmarkierung, Servername, falls verfügbar, dann Tag, Prüfpunkt und Messname/Wert-Sequenzen) umgewandelt.
Dieses Protokollfeld ist das einzige integrierte Ausgabeartefakt. Es werden keine Metriken oder Ablaufverfolgungen erstellt, es sei denn, Sie fügen Ihren eigenen Exporter hinzu. Um sie als Metriken anzuzeigen, lesen Sie den Kontext, nachdem die Anforderungspipeline durchgelaufen ist, und zeichnen Sie z. B. die Überlappungen von GC-Pausen in einem Histogramm und die Verbindungsinitiierungen in einem Zähler auf, optional nach Protokollversion dimensioniert.
| Name | Description |
|---|---|
| Http.GCPauseTime | Gesamtdauer der GC-Pause, die die Anforderung überlappt. |
| Http.ConnectionInitiated | Wird ausgegeben, wenn eine neue zugrunde liegende Verbindung (keine Wiederverwendung im Pool) erstellt wird. |
Stichwörter
Verwenden Sie Tags, um stabile kategorisierte Dimensionen an jede Anforderung anzufügen, sodass Sie Metriken und Protokolle segmentieren, filtern und aggregieren können, ohne Rohdaten erneut zu verarbeiten. Diese sind Klassifikationsbezeichnungen mit niedriger Kardinalität (keine zeitlichen Angaben), die im Latenzkontext erfasst werden. Wenn die HTTP-Client-Protokoll-Erweiterung aktiviert ist, werden sie in ein einzelnes LatencyInfo-Protokollfeld serialisiert. Aktivieren Sie die Anreicherung beim Starten der Anwendung, indem Sie die Protokollierungserweiterung (für alle Clients oder pro Client) zusammen mit Latenztelemetrie hinzufügen, z. B.:
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHttpClientLatencyTelemetry(); // enables latency context + measures/tags
builder.Services.AddExtendedHttpClientLogging();
var app = builder.Build();
Danach werden ausgehende Anforderungen, die über die strukturierte Protokollierungs-Pipeline protokolliert werden, die Eigenschaft LatencyInfo enthalten, welche die flachen Tags, Prüfpunkte und Maßnahmen umfasst. Für Tags werden keine Metriken oder Traces automatisch ausgegeben, exportieren Sie sie selbst (z. B. indem Sie Tagwerte in Metrikdimensionen oder Activity Tags umwandeln), wenn Sie sie außerhalb von Protokollen benötigen.
| Tag | Description |
|---|---|
| Http.Version | HTTP-Protokollversion ausgehandelt/verwendet (z. B. 1.1, 2, 3). |
Verwendungsbeispiel
Diese Komponenten ermöglichen das Nachverfolgen und Melden der Latenz der HTTP-Clientanforderungsverarbeitung.
Sie können die Dienste mithilfe der folgenden Methoden registrieren:
public static IServiceCollection AddHttpClientLatencyTelemetry(
this IServiceCollection services);
public static IServiceCollection AddHttpClientLatencyTelemetry(
this IServiceCollection services,
IConfigurationSection section);
public static IServiceCollection AddHttpClientLatencyTelemetry(
this IServiceCollection services,
Action<HttpClientLatencyTelemetryOptions> configure);
Beispiel:
var builder = Host.CreateApplicationBuilder(args);
// Register IHttpClientFactory:
builder.Services.AddHttpClient();
// Register redaction services:
builder.Services.AddRedaction();
// Register latency context services:
builder.Services.AddLatencyContext();
// Register HttpClient logging enrichment & redaction services:
builder.Services.AddExtendedHttpClientLogging();
// Register HttpClient latency telemetry services:
builder.Services.AddHttpClientLatencyTelemetry();
var host = builder.Build();
Überlegungen zur Plattform
Die Telemetrie der HTTP-Clientlatenz wird für alle unterstützten Ziele (.NET 9, .NET 8, .NET Standard 2.0 und .NET Framework 4.6.2) ausgeführt. Kern-Timing-Prüfpunkte werden immer gesammelt. Die GC Pause-Metrik (Http.GCPauseTime) wird nur ausgegeben, wenn sie auf .NET 8 oder .NET 9 ausgeführt wird. Die Implementierung erkennt Plattformfunktionen zur Laufzeit und ermöglicht, was ohne zusätzliche Konfiguration unterstützt wird.