Telemetri latensi klien HTTP di .NET

Saat Anda membangun aplikasi yang berkomunikasi melalui HTTP, penting untuk mengamati karakteristik performa permintaan. Ekstensi ini AddHttpClientLatencyTelemetry memungkinkan pengumpulan informasi waktu terperinci untuk panggilan HTTP keluar tanpa perubahan pada kode panggilan. Ini dicolokkan ke pipa yang ada HttpClientFactory untuk menangkap waktu setiap tahap di seluruh siklus hidup permintaan, merekam detail protokol HTTP, mengukur dampak pengumpulan sampah ketika runtime menyediakan data tersebut, dan menghasilkan bentuk telemetri yang seragam yang cocok untuk analisis dan penyetelan performa. Aktifkan telemetri ini dengan memanggil AddHttpClientLatencyTelemetry() metode ekstensi. Handler bawaan membuat ILatencyContext untuk setiap permintaan keluar dan mengisi pengukuran pada saat alur dalam selesai. Konsumsi data setelah await base.SendAsync(...) pada handler delegasi berikutnya (ditambahkan setelah telemetri) dan ekspor ke platform backend metrik Anda. Contoh:

Daftarkan metode ekstensi:

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

Akses konteks:

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

Menambahkan paket

dotnet add package Microsoft.Extensions.Http.Diagnostics --version 9.10.0

Untuk informasi selengkapnya, lihat menambahkan paket dotnet atau Mengelola dependensi paket di aplikasi .NET.

Mendaftarkan telemetri latensi klien HTTP

Untuk menambahkan telemetri latensi klien HTTP ke aplikasi Anda, panggil AddHttpClientLatencyTelemetry metode ekstensi saat mengonfigurasi layanan Anda:

var builder = WebApplication.CreateBuilder(args);

// Add HTTP client factory
builder.Services.AddHttpClient();

// Add HTTP client latency telemetry
builder.Services.AddHttpClientLatencyTelemetry();

Pendaftaran ini menambahkan DelegatingHandler ke semua klien HTTP yang dibuat melalui IHttpClientFactory, mengumpulkan informasi latensi terperinci untuk setiap permintaan.

Mengonfigurasi opsi telemetri

Anda mengonfigurasi pengumpulan telemetri melalui HttpClientLatencyTelemetryOptions (pola opsi standar). Anda dapat menyediakan nilai baik dengan delegate atau dengan cara mengikat konfigurasi (misalnya, appsettings.json). Instans opsi diselesaikan sekali per alur handler sehingga perubahan berlaku untuk klien/handler baru.

// Configure with delegate
builder.Services.AddHttpClientLatencyTelemetry(options =>
{
    options.EnableDetailedLatencyBreakdown = true;
});

// Or configure from configuration
builder.Services.AddHttpClientLatencyTelemetry(
builder.Configuration.GetSection("HttpClientTelemetry"));

Opsi konfigurasi

Kelas ini HttpClientLatencyTelemetryOptions menawarkan pengaturan berikut:

Option Tipe Bawaan Description Kapan harus menonaktifkan
AktifkanRincianKeterlambatanMendetail Boolean true Memungkinkan pengaturan waktu fase terperinci pada setiap permintaan HttpClient (misalnya, pembentukan koneksi, header dikirim, bytes pertama diterima, penyelesaian permintaan) untuk menghasilkan perincian total latensi. Menambahkan sedikit biaya tambahan untuk pengukuran CPU/waktu, tanpa overhead pada pengiriman data. Atur ke false hanya dalam skenario throughput yang sangat tinggi di mana overhead minimal diperlukan dan total durasi saja sudah cukup.

Data telemetri yang dikumpulkan

Ketika telemetri latensi klien HTTP diaktifkan, ia menangkap tanda waktu fase, ukuran yang dipilih (jika didukung), dan atribut protokol yang digunakan untuk analisis performa.

Titik pemeriksaan waktu

Tanda waktu direkam untuk tahap kunci siklus hidup permintaan HTTP:

Phase Mulai Peristiwa Akhiri Peristiwa Catatan
Penyelesaian DNS Http.NameResolutionStart Http.NameResolutionEnd Pencarian nama host (dapat di-cache dan dilewati).
Koneksi soket Http.SocketConnectStart Http.SocketConnectEnd CP (dan jabat tangan TLS jika dikombinasikan oleh handler).
Pendirian koneksi Http.ConnectionEstablished Menandai koneksi yang dapat digunakan setelah jabat tangan.
Tajuk permintaan Http.RequestHeadersStart Http.RequestHeadersEnd Menulis header permintaan ke saluran/buffer.
Meminta konten Http.RequestContentStart Http.RequestContentEnd Isi permintaan streaming atau buffering.
Tajuk respons Http.ResponseHeadersStart Http.ResponseHeadersEnd Byte pertama hingga selesai penguraian header.
Konten respons Http.ResponseContentStart Http.ResponseContentEnd Membaca isi respons penuh (hingga tuntas atau penghapusan).

Pengukuran (bergantung pada platform)

Pengukuran mengkuantifikasi faktor penyumbang latensi yang tidak dapat dijangkau oleh titik pemeriksaan fase mentah (seperti tumpang tindih jeda GC, churn koneksi, jumlah atau durasi akumulasi lainnya). Mereka dikumpulkan dalam konteks latensi dalam memori yang dibuat saat Anda memanggil AddHttpClientLatencyTelemetry(). Tidak ada yang dipancarkan secara otomatis: konteks hanya mengumpulkan titik pemeriksaan, ukuran, dan tag hingga permintaan selesai. Jika Anda juga mengaktifkan pengayaan pengelogan klien HTTP dengan AddExtendedHttpClientLogging(), konteks yang selesai diratakan ke dalam satu bidang log terstruktur bernama LatencyInfo (penanda versi, nama server jika tersedia, lalu tandai, titik pemeriksaan, dan ukur urutan nama/nilai).

Bidang log tersebut adalah satu-satunya artefak output tertanam; tidak ada metrik atau pelacakan yang diproduksi kecuali Anda menambahkan pengekspor Anda sendiri. Untuk menjadikannya metrik, baca konteks setelah alur permintaan selesai dan kemudian rekam, misalnya, tumpang tindih jeda GC ke dalam histogram dan inisiasi koneksi ke penghitung, dan opsional dapat didimensikan berdasarkan versi protokol.

Nama Description
Http.GCPauseTime Total durasi jeda GC yang tumpang tindih dengan permintaan.
Http.KoneksiDimulai Dipancarkan ketika koneksi baru yang mendasar (tidak digunakan kembali terkumpul) dibuat.

Tagar

Gunakan tag untuk melampirkan dimensi kategoris yang stabil ke setiap permintaan sehingga Anda dapat membuat segmentasi, memfilter, dan mengagregasi metrik dan log tanpa memproses ulang data mentah. Mereka adalah label klasifikasi dengan kardinalitas rendah (bukan waktu) yang diambil dalam konteks latensi dan, jika pengayaan log klien HTTP diaktifkan, diserialisasikan menjadi satu bidang log LatencyInfo. Aktifkan pengayaan di startup aplikasi dengan menambahkan ekstensi pengelogan (untuk semua klien atau per klien) bersama dengan telemetri latensi, misalnya:

var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHttpClientLatencyTelemetry(); // enables latency context + measures/tags
builder.Services.AddExtendedHttpClientLogging();
var app = builder.Build();

Setelah ini, permintaan keluar yang dicatat melalui alur pengelogan terstruktur akan mencakup LatencyInfo properti yang berisi tag, titik pemeriksaan, dan ukuran yang diratakan. Tidak ada metrik atau traces yang dihasilkan secara otomatis untuk tag; ekspor sendiri (misalnya, ubah nilai tag menjadi dimensi metrik atau Activity tag) jika Anda membutuhkannya di luar catatan log.

Tag Description
Http.Version Versi protokol HTTP dinegosiasikan/digunakan (misalnya, 1.1, 2, 3).

Contoh penggunaan

Komponen-komponen ini memungkinkan pelacakan dan pelaporan latensi pemrosesan permintaan klien HTTP.

Anda dapat mendaftarkan layanan menggunakan metode berikut:

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

Contohnya:

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

Pertimbangan platform

Telemetri latensi klien HTTP berjalan pada semua target yang didukung (.NET 9, .NET 8, .NET Standard 2.0, dan .NET Framework 4.6.2). Titik pemeriksaan waktu penting selalu dicatat. Metrik jeda GC (Http.GCPauseTime) hanya dipancarkan saat berjalan pada .NET 8 atau .NET 9. Implementasi mendeteksi kemampuan platform pada runtime dan mengaktifkan apa yang didukung tanpa konfigurasi tambahan.