Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ölçümler zaman içinde bildirilen sayısal ölçümlerdir. Bunlar genellikle bir uygulamanın durumunu izlemek ve uyarılar oluşturmak için kullanılır.
.NET 8'den itibaren, System.Net.Http ve System.Net.NameResolution bileşenleri, .NET'in yeni System.Diagnostics.Metrics APIkullanılarak ölçümleri yayımlayacak şekilde yapılandırılmıştır.
Bu ölçümler, standartla tutarlı olduklarından emin olmak ve Prometheus ve Grafanagibi popüler araçlarla iyi çalıştıklarından emin olmak için OpenTelemetry ile işbirliği içinde tasarlanmıştır.
Bunlar aynı zamanda çok boyutlu , yani ölçümler etiketler (öznitelikler veya etiketler olarak da bilinir) olarak adlandırılan anahtar-değer çiftleriyle ilişkilendirilir. Etiketler, analize yardımcı olmak için ölçümün kategorilere ayrılmasını sağlar.
Bahşiş
Yerleşik enstrümanların öznitelikleriyle birlikte kapsamlı bir listesi için bkz. System.Net ölçümleri.
System.Net ölçümleri toplama
Yerleşik ölçüm izlemelerinden yararlanmak için bir .NET uygulamasının bu ölçümleri toplayacak şekilde yapılandırılması gerekir. Bu genellikle bunları dış depolama ve analiz için , örneğin izleme sistemlerine dönüştürme anlamına gelir.
.NET'te ağ ölçümlerini toplamanın çeşitli yolları vardır.
- Basit ve bağımsız bir örnek kullanarak hızlı bir genel bakış almak için, Dotnet-counters ile ölçüm toplama kısmına bakınız.
- Üretim zamanı ölçüm toplama ve izleme için OpenTelemetry ve Prometheus ile Grafana kullanabilir veya Azure İzleyici Application Insights . Ancak bu araçların karmaşıklıkları nedeniyle geliştirme zamanında kullanılması zor olabilir.
- Geliştirme zamanı ölçümleri toplama ve sorun giderme için, uygulamanızda ölçümleri ve dağıtılmış izlemeyi başlatmanın ve sorunları yerel olarak tanılamanın basit ama genişletilebilir bir yolunu sağlayan Aspire'i kullanmanızı öneririz.
- Ayrıca, ASP.NET projenize OpenTelemetry izleme ve ölçüm yapılandırma API'lerini eklemenin kullanışlı bir yolu olan Aspire düzenlemesi olmadan Aspire Service Defaults projesini yeniden kullanmak de mümkündür.
dotnet-counters ile ölçümleri toplama
dotnet-counters, .NET ölçümlerini geçici olarak incelemeye ve birinci düzey performans araştırmalarına yönelik platformlar arası bir komut satırı aracıdır.
Bu öğreticinin amacı doğrultusunda, çeşitli uç noktalara paralel HTTP istekleri gönderen bir uygulama oluşturun.
dotnet new console -o HelloBuiltinMetrics
cd ..\HelloBuiltinMetrics
Program.cs içeriğini aşağıdaki örnek kodla değiştirin:
using System.Net;
string[] uris = ["http://example.com", "http://httpbin.org/get", "https://example.com", "https://httpbin.org/get"];
using HttpClient client = new()
{
DefaultRequestVersion = HttpVersion.Version20
};
Console.WriteLine("Press any key to start.");
Console.ReadKey();
while (!Console.KeyAvailable)
{
await Parallel.ForAsync(0, Random.Shared.Next(20), async (_, ct) =>
{
string uri = uris[Random.Shared.Next(uris.Length)];
try
{
byte[] bytes = await client.GetByteArrayAsync(uri, ct);
await Console.Out.WriteLineAsync($"{uri} - received {bytes.Length} bytes.");
}
catch { await Console.Out.WriteLineAsync($"{uri} - failed."); }
});
}
dotnet-counters yüklendiğinden emin olun:
dotnet tool install --global dotnet-counters
HelloBuiltinMetrics uygulamasını başlatın.
dotnet run -c Release
ayrı bir CLI penceresinde dotnet-counters başlatın ve işlem adını ve izlenme ölçümlerini belirtin, ardından HelloBuiltinMetrics uygulamasındaki bir tuşa basarak istek göndermeye başlayın. Ölçümler gelmeye başladığında, dotnet-counters konsolu sürekli olarak en son sayılarla yeniler.
dotnet-counters monitor --counters System.Net.Http,System.Net.NameResolution -n HelloBuiltinMetrics
dotnet-counters çıkış
dotnet-counters output
Aspire ile ölçüm toplama
ASP.NET uygulamalarında izlemeleri ve ölçümleri toplamanın basit bir yolu Aspire kullanmaktır. Aspire, dağıtılmış uygulamalar oluşturmayı ve bunlarla çalışmayı kolaylaştırmak için .NET'e yönelik bir uzantı kümesidir. Aspire kullanmanın avantajlarından biri, telemetrinin .NET için OpenTelemetry kitaplıkları kullanılarak yerleşik olmasıdır.
Aspire için varsayılan proje şablonları bir ServiceDefaults proje içerir. Aspire çözümündeki her hizmetin Service Defaults projesine bir başvurusu vardır. Hizmetler bunu OTel'i ayarlamak ve yapılandırmak için kullanır.
Service Defaults proje şablonu OTel SDK, ASP.NET, HttpClient ve Runtime Instrumentation paketlerini içerir. Bu enstrümantasyon bileşenleri Extensions.cs dosyasında yapılandırılır. Aspire Panosu'nda telemetri görselleştirmesini desteklemek için, Hizmet Varsayılanları projesi varsayılan olarak OTLP verme işlemini de içerir.
Aspire Panosu, telemetri gözlemini yerel hata ayıklama döngüsüne getirerek geliştiricilerin uygulamaların telemetri ürettiğinden emin olmasını sağlayacak şekilde tasarlanmıştır. Telemetri görselleştirmesi, bu uygulamaları yerel olarak tanılamaya da yardımcı olur. Hizmetler arasındaki çağrıları gözlemleyebilmek, üretimdeki hata ayıklama zamanında olduğu kadar yararlıdır. Project'i Visual Studio'dan veya AppHost projeyi komut satırından dotnet runAppHost aldığınızda Aspire panosu otomatik olarak başlatılır.
Hızlı tanıtım
kullanarak
dotnet newoluşturun:dotnet new aspire-starter-9 --output AspireDemoVeya Visual Studio'da yeni bir proje oluşturun ve Aspire 9 Starter Uygulaması şablonunu seçin:
Extensions.csprojesindeServiceDefaultsaçın veConfigureOpenTelemetryyöntemine kaydırın. Ağ ölçerlerine abone olanAddHttpClientInstrumentation()çağrısına dikkat edin..WithMetrics(metrics => { metrics.AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddRuntimeInstrumentation(); }).NET 8+ üzerinde,
AddHttpClientInstrumentation()'nın manuel ölçüm abonelikleriyle değiştirilebileceğini unutmayın:.WithMetrics(metrics => { metrics.AddAspNetCoreInstrumentation() .AddMeter("System.Net.Http") .AddMeter("System.Net.NameResolution") .AddRuntimeInstrumentation(); })AppHostprojesini çalıştırın. Bunun Aspire Panosu'nu başlatması gerekir.webfrontenduygulamasının Hava Durumu sayfasına gidin veHttpClientyönelik birapiservicetalep oluşturun. Birden çok istek göndermek için sayfayı birkaç kez yenileyin.Panoya dönün, Ölçümler sayfasına gidin ve
webfrontendkaynağını seçin. Aşağı kaydırdığınızda yerleşikSystem.Netölçümlerine göz atabilmeniz gerekir.
Aspire hakkında daha fazla bilgi için bkz:
- Aspire'a Genel Bakış
- Aspire 'da Telemetri
- panoyu
Aspire orkestrasyonu olmadan Hizmet Varsayılanları projesini yeniden kullanma
Aspire Service Defaults projesi, düzenleme için AppHost gibi Aspire'in geri kalanını kullanmasa bile ASP.NET projeler için OTel'i yapılandırmak için kolay bir yol sağlar. Hizmet Varsayılanları projesi Visual Studio veya dotnet newaracılığıyla bir proje şablonu olarak kullanılabilir. OTel'i yapılandırır ve OTLP dışa aktarıcıyı ayarlar. Ardından OTel ortam değişkenlerini kullanarak OTLP uç noktasını telemetri gönderecek şekilde yapılandırabilir ve uygulamanın kaynak özelliklerini sağlayabilirsiniz.
ServiceDefaults'ı Aspire dışında kullanma adımları şunlardır:
Visual Studio'da Yeni Proje Ekle'yi kullanarak çözüme ServiceDefaults projesini ekleyin veya
dotnet newkullanın:dotnet new aspire-servicedefaults --output ServiceDefaultsASP.NET uygulamanızdan ServiceDefaults projesine başvurun. Visual Studio'da >seçin ve ServiceDefaults projesini seçin"
Uygulama oluşturucu başlatmanızın bir parçası olarak OpenTelemetry kurulum işlevini
ConfigureOpenTelemetry()çağırın.var builder = WebApplication.CreateBuilder(args) builder.ConfigureOpenTelemetry(); // Extension method from ServiceDefaults. var app = builder.Build(); app.MapGet("/", () => "Hello World!"); app.Run();
Tam bir rehber için bkz. Örnek: OTLP ve bağımsız Aspire Panosu ile OpenTelemetry kullanma.
OpenTelemetry ve Prometheus ile Grafana'da ölçümleri görüntüleme
Prometheus ve Grafana ile örnek bir uygulamayı bağlamayı görmek için, OpenTelemetry'yi Prometheus, Grafana ve Jaegerile kullanma başlığı altında izlenecek yolu izleyin.
Çeşitli uç noktalara paralel istekler göndererek HttpClient vurgulamak için örnek uygulamayı aşağıdaki uç noktayla genişletin:
app.MapGet("/ClientStress", async Task<string> (ILogger<Program> logger, HttpClient client) =>
{
string[] uris = ["http://example.com", "http://httpbin.org/get", "https://example.com", "https://httpbin.org/get"];
await Parallel.ForAsync(0, 50, async (_, ct) =>
{
string uri = uris[Random.Shared.Next(uris.Length)];
try
{
await client.GetAsync(uri, ct);
logger.LogInformation($"{uri} - done.");
}
catch { logger.LogInformation($"{uri} - failed."); }
});
return "Sent 50 requests to example.com and httpbin.org.";
});
+ simgesini üst araç çubuğunda seçip ardından Dashboardbölümünü seçerek bir Grafana panosu oluşturun. Görüntülenen pano düzenleyicisinde, HTTP/1.1 Bağlantılarını AçBaşlık kutusuna ve aşağıdaki sorguyu PromQL ifade alanına girin.
sum by(http_connection_state) (http_client_open_connections{network_protocol_version="1.1"})
Yeni panoyu kaydetmek ve görüntülemek için Uygula'i seçin. Havuzdaki etkin ve boş http/1.1 bağlantılarının sayısını görüntüler.
Grafana'da HTTP/1.1 Bağlantıları 
Zenginleşme
Zenginleştirme, bir ölçüme özel etiketlerin (öznitelikler veya etiketler olarak da bilinir) eklenmesidir. Bu, bir uygulama ölçümlerle oluşturulmuş panolara veya uyarılara özel bir kategori eklemek istediğinde kullanışlıdır.
http.client.request.duration aracı, geri çağırmaları HttpMetricsEnrichmentContext'e kaydederek zenginleştirmeyi destekler.
Bunun düşük düzeyli bir API olduğunu ve her HttpRequestMessageiçin ayrı bir geri çağırma kaydı gerektiğini unutmayın.
Geri çağırma kaydını tek bir yerde yapmanın basit bir yolu, özel bir DelegatingHandleruygulamaktır. Bu, istekleri iç işleyiciye iletilip sunucuya gönderilmeden önce kesmenize ve değiştirmenize olanak tanır:
using System.Net.Http.Metrics;
using HttpClient client = new(new EnrichmentHandler() { InnerHandler = new HttpClientHandler() });
await client.GetStringAsync("https://httpbin.org/response-headers?Enrichment-Value=A");
await client.GetStringAsync("https://httpbin.org/response-headers?Enrichment-Value=B");
sealed class EnrichmentHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpMetricsEnrichmentContext.AddCallback(request, static context =>
{
if (context.Response is not null) // Response is null when an exception occurs.
{
// Use any information available on the request or the response to emit custom tags.
string? value = context.Response.Headers.GetValues("Enrichment-Value").FirstOrDefault();
if (value != null)
{
context.AddCustomTag("enrichment_value", value);
}
}
});
return base.SendAsync(request, cancellationToken);
}
}
IHttpClientFactoryile çalışıyorsanız AddHttpMessageHandlerkaydetmek için EnrichmentHandler kullanabilirsiniz:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Net.Http.Metrics;
ServiceCollection services = new();
services.AddHttpClient(Options.DefaultName).AddHttpMessageHandler(() => new EnrichmentHandler());
ServiceProvider serviceProvider = services.BuildServiceProvider();
HttpClient client = serviceProvider.GetRequiredService<HttpClient>();
await client.GetStringAsync("https://httpbin.org/response-headers?Enrichment-Value=A");
await client.GetStringAsync("https://httpbin.org/response-headers?Enrichment-Value=B");
Not
Performans nedenleriyle, zenginleştirme geri çağırması yalnızca http.client.request.duration aracı etkinleştirildiğinde çağrılır, yani ölçümleri bir şeyin toplaması gerekir.
Bu bir dotnet-monitor, Prometheus exporter, MeterListenerveya MetricCollector<T>olabilir.
IMeterFactory ve IHttpClientFactory entegrasyonu
HTTP ölçümleri yalıtım ve test edilebilirlik göz önünde bulundurularak tasarlanmıştır. Bu özellikler, Ölçümler'i birbirinden yalıtılmış tutmak için ölçümlerin özel bir IMeterFactory örneği tarafından yayımlanmasını sağlayan Meterkullanılmasıyla desteklenir.
Varsayılan olarak, tüm metrikleri yaymak için global bir Meter kullanılır. Bu, MeterSystem.Net.Http kitaplığına ait. Bu davranış, IMeterFactory veya SocketsHttpHandler.MeterFactory'ye özel bir HttpClientHandler.MeterFactory örneği atanarak geçersiz kılınabilir.
Not
Meter.Name, System.Net.Http ve HttpClientHandlertarafından yayılan tüm ölçümler için SocketsHttpHandler şeklindedir.
.NET 8+ üzerinde Microsoft.Extensions.Http ve IHttpClientFactory ile çalışırken, varsayılan IHttpClientFactory uygulaması IMeterFactory kayıtlı IServiceCollection örneğini otomatik olarak seçer ve dahili olarak oluşturduğu birincil işleyiciye atar.
Not
.NET 8'den başlayarak, AddHttpClient yöntemi ölçüm hizmetlerini başlatmak ve varsayılan AddMetrics uygulamasını IMeterFactoryile kaydetmek için IServiceCollection otomatik olarak çağırır. Varsayılan IMeterFactory, Meter örneklerini ada göre önbelleğe alır, yani her Meteriçin adı System.Net.Http olan bir IServiceCollection vardır.
Test ölçümleri
Aşağıdaki örnekte, IHttpClientFactory NuGet paketinden xUnit, MetricCollector<T>ve Microsoft.Extensions.Diagnostics.Testing kullanarak birim testlerinde yerleşik ölçümlerin nasıl doğrulanması gösterilmektedir:
[Fact]
public async Task RequestDurationTest()
{
// Arrange
ServiceCollection services = new();
services.AddHttpClient();
ServiceProvider serviceProvider = services.BuildServiceProvider();
var meterFactory = serviceProvider.GetService<IMeterFactory>();
var collector = new MetricCollector<double>(meterFactory,
"System.Net.Http", "http.client.request.duration");
var client = serviceProvider.GetRequiredService<HttpClient>();
// Act
await client.GetStringAsync("http://example.com");
// Assert
await collector.WaitForMeasurementsAsync(minCount: 1).WaitAsync(TimeSpan.FromSeconds(5));
Assert.Collection(collector.GetMeasurementSnapshot(),
measurement =>
{
Assert.Equal("http", measurement.Tags["url.scheme"]);
Assert.Equal("GET", measurement.Tags["http.request.method"]);
});
}
Ölçümler ile EventCounters karşılaştırması
Ölçümler, özellikle çok boyutlu olmaları nedeniyle EventCounter'lardan daha özellik bakımından zengin. Bu çok boyutluluk, Prometheus gibi araçlarda karmaşık sorgular oluşturmanıza ve EventCounters ile mümkün olmayan bir düzeyde içgörüler elde etmenize olanak tanır.
Bununla birlikte, .NET 8'den itibaren yalnızca System.Net.Http ve System.Net.NameResolutions bileşenleri Ölçümler kullanılarak izlenir; başka bir deyişle, yığının System.Net.Sockets veya System.Net.Securitygibi alt düzeylerinden sayaçlara ihtiyacınız varsa EventCounters kullanmanız gerekir.
Ayrıca Ölçümler ile bunların eşleşen EventCounter'ları arasında bazı anlamsal farklılıklar vardır.
Örneğin, HttpCompletionOption.ResponseContentReadkullanırken current-requests EventCounter, istek gövdesinin son baytının okunduğu ana kadar bir isteğin etkin olduğunu kabul eder.
Ölçümler karşılığı http.client.active_requests, etkin istekleri sayarken yanıt gövdesini okuma süresini içermez.
Daha fazla ölçüme mi ihtiyacınız var?
Önerileriniz varsa, metrikler aracılığıyla ifşa edilebilecek başka yararlı bilgiler için bir dotnet/runtime sorunuoluşturun.