Dağıtılmış izleme toplama
Bu makale şunlar için geçerlidir: ✔️ .NET Core 2.1 ve sonraki sürümler ✔️ .NET Framework 4.5 ve üzeri sürümler
İzlenen kod, dağıtılmış izlemenin parçası olarak nesneler oluşturabilir Activity , ancak izlemenin tamamının daha sonra gözden geçirilebilmesi için bu nesnelerdeki bilgilerin merkezi depolama alanında toplanması gerekir. Bu öğreticide, gerektiğinde uygulama sorunlarını tanılamak için kullanılabilir olması için dağıtılmış izleme telemetrisini farklı şekillerde toplayacaksınız. Yeni izleme eklemeniz gerekiyorsa izleme öğreticisine bakın.
OpenTelemetry kullanarak izlemeleri toplama
OpenTelemetry , buluta özel yazılımlar için telemetri oluşturmayı ve toplamayı standartlaştırmayı amaçlayan , Cloud Native Computing Foundation tarafından desteklenen, satıcıdan bağımsız bir açık kaynak projesidir. Bu örneklerde, dağıtılmış izleme bilgilerini konsolda toplar ve görüntülersiniz. OpenTelemetry'yi başka bir yere bilgi gönderecek şekilde yapılandırmayı öğrenmek için OpenTelemetry kullanmaya başlama kılavuzuna bakın.
ASP.NET örnek
Önkoşullar
- .NET Core 7.0 SDK veya sonraki bir sürüm
Örnek uygulama oluşturma
İlk olarak, tanıtım uygulaması olarak kullanmak üzere yeni bir ASP.NET web uygulaması oluşturun.
dotnet new webapp
Bu uygulama bir web sayfası görüntüler, ancak web sayfasına göz atarsak henüz dağıtılmış izleme bilgisi toplanmaz.
Koleksiyonu yapılandırma
OpenTelemetry'yi kullanmak için birkaç NuGet paketine başvuru eklemeniz gerekir.
dotnet add package OpenTelemetry --version 1.4.0-rc1
dotnet add package OpenTelemetry.Exporter.Console --version 1.4.0-rc1
dotnet add package OpenTelemetry.Extensions.Hosting --version 1.4.0-rc1
dotnet add package OpenTelemetry.Instrumentation.AspNetCore --version 1.0.0-rc9.10
Not
Yazma sırasında 1.4.0 Sürüm Adayı 1 derlemesi, OpenTelemetry'nin kullanılabilir en son sürümüdür. Son sürüm kullanıma sunulduktan sonra bunun yerine bunu kullanın.
Ardından , Program.cs dosyasındaki kaynak kodu aşağıdaki gibi görünecek şekilde değiştirin:
using OpenTelemetry;
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddOpenTelemetry()
.WithTracing(builder =>
{
builder.AddAspNetCoreInstrumentation();
builder.AddConsoleExporter();
}).StartWithHost();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Uygulamayı çalıştırın ve barındırılmakta olan web sayfasına göz atmak için bir web tarayıcısı kullanın. OpenTelemetry dağıtılmış izlemeyi etkinleştirdiğinize göre, konsola yazdırılan tarayıcı web istekleri hakkındaki bilgileri görmeniz gerekir:
Activity.TraceId: 9c4519ce65a667280daedb3808d376f0
Activity.SpanId: 727c6a8a6cff664f
Activity.TraceFlags: Recorded
Activity.ActivitySourceName: Microsoft.AspNetCore
Activity.DisplayName: /
Activity.Kind: Server
Activity.StartTime: 2023-01-08T01:56:05.4529879Z
Activity.Duration: 00:00:00.1048255
Activity.Tags:
net.host.name: localhost
net.host.port: 5163
http.method: GET
http.scheme: http
http.target: /
http.url: http://localhost:5163/
http.flavor: 1.1
http.user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76
http.status_code: 200
Resource associated with Activity:
service.name: unknown_service:demo
OpenTelemetry yapılandırmasının tümü ile builder.Services.AddOpenTelemetry()
başlayan yeni kaynak satırlarında gerçekleşir. Dağıtılmış izlemeyi etkinleştirmek için kullanılırdı .WithTracing(...)
. AddAspNetCoreInstrumentation()
, ASP.NET Core web sunucusu tarafından üretilen tüm dağıtılmış izleme Etkinliklerini toplamak için OpenTelemetry'yi etkinleştirdi ve AddConsoleExporter()
OpenTelemetry'ye bu bilgileri konsola göndermesi talimatını verir. Daha az önemsiz bir uygulama için, veritabanı sorguları veya giden HTTP istekleri için izleme toplamak üzere daha fazla izleme kitaplığı ekleyebilirsiniz. Ayrıca konsol dışarı aktarmayı Jaeger, Zipken veya kullanmayı seçtiğiniz başka bir izleme hizmeti için bir dışarı aktarma ile değiştirirsiniz.
Konsol uygulaması örneği
Önkoşullar
- .NET Core 2.1 SDK veya sonraki bir sürüm
Örnek uygulama oluşturma
Herhangi bir dağıtılmış izleme telemetrisi toplanabilmesi için önce bunu üretmeniz gerekir. Bu izleme genellikle kitaplıklarda bulunur, ancak kolaylık olması için kullanarak StartActivitybazı örnek izlemeleri olan küçük bir uygulama oluşturacaksınız. Bu noktada hiçbir koleksiyon gerçekleşmedi ve StartActivity() yan etkisi yoktur ve null döndürür. Daha fazla ayrıntı için izleme öğreticisine bakın.
dotnet new console
.NET 5 ve üzerini hedefleyen uygulamalar zaten gerekli dağıtılmış izleme API'lerine sahiptir. Eski .NET sürümlerini hedefleyen uygulamalar için System.Diagnostics.DiagnosticSource NuGet paketi sürüm 5 veya üzerini ekleyin.
dotnet add package System.Diagnostics.DiagnosticSource
Oluşturulan Program.cs dosyasının içeriğini şu örnek kaynakla değiştirin:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace Sample.DistributedTracing
{
class Program
{
static ActivitySource s_source = new ActivitySource("Sample.DistributedTracing");
static async Task Main(string[] args)
{
await DoSomeWork();
Console.WriteLine("Example work done");
}
static async Task DoSomeWork()
{
using (Activity a = s_source.StartActivity("SomeWork"))
{
await StepOne();
await StepTwo();
}
}
static async Task StepOne()
{
using (Activity a = s_source.StartActivity("StepOne"))
{
await Task.Delay(500);
}
}
static async Task StepTwo()
{
using (Activity a = s_source.StartActivity("StepTwo"))
{
await Task.Delay(1000);
}
}
}
}
Uygulamayı çalıştırmak henüz herhangi bir izleme verisi toplamaz:
> dotnet run
Example work done
Koleksiyonu yapılandırma
OpenTelemetry.Exporter.Console NuGet paketini ekleyin.
dotnet add package OpenTelemetry.Exporter.Console
Program.cs dosyasını ek OpenTelemetry using
yönergeleriyle güncelleştirin:
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
OpenTelemetry TracerProvider oluşturmak için güncelleştirin Main()
:
public static async Task Main()
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample"))
.AddSource("Sample.DistributedTracing")
.AddConsoleExporter()
.Build();
await DoSomeWork();
Console.WriteLine("Example work done");
}
Şimdi uygulama dağıtılmış izleme bilgilerini toplar ve konsolda görüntüler:
> dotnet run
Activity.Id: 00-7759221f2c5599489d455b84fa0f90f4-6081a9b8041cd840-01
Activity.ParentId: 00-7759221f2c5599489d455b84fa0f90f4-9a52f72c08a9d447-01
Activity.DisplayName: StepOne
Activity.Kind: Internal
Activity.StartTime: 2021-03-18T10:46:46.8649754Z
Activity.Duration: 00:00:00.5069226
Resource associated with Activity:
service.name: MySample
service.instance.id: 909a4624-3b2e-40e4-a86b-4a2c8003219e
Activity.Id: 00-7759221f2c5599489d455b84fa0f90f4-d2b283db91cf774c-01
Activity.ParentId: 00-7759221f2c5599489d455b84fa0f90f4-9a52f72c08a9d447-01
Activity.DisplayName: StepTwo
Activity.Kind: Internal
Activity.StartTime: 2021-03-18T10:46:47.3838737Z
Activity.Duration: 00:00:01.0142278
Resource associated with Activity:
service.name: MySample
service.instance.id: 909a4624-3b2e-40e4-a86b-4a2c8003219e
Activity.Id: 00-7759221f2c5599489d455b84fa0f90f4-9a52f72c08a9d447-01
Activity.DisplayName: SomeWork
Activity.Kind: Internal
Activity.StartTime: 2021-03-18T10:46:46.8634510Z
Activity.Duration: 00:00:01.5402045
Resource associated with Activity:
service.name: MySample
service.instance.id: 909a4624-3b2e-40e4-a86b-4a2c8003219e
Example work done
Kaynaklar
Örnek kodda, OpenTelemetry'nin AddSource("Sample.DistributedTracing")
kodda zaten mevcut olan ActivitySource tarafından üretilen Etkinlikleri yakalaması için çağırmıştınız:
static ActivitySource s_source = new ActivitySource("Sample.DistributedTracing");
Herhangi bir ActivitySource'tan gelen telemetri kaynağın adıyla çağrılarak AddSource()
yakalanabilir.
Ihracatçı
Konsol dışarıyı veren hızlı örnekler veya yerel geliştirme için yararlıdır, ancak bir üretim dağıtımında merkezi bir depoya izlemeler göndermek isteyebilirsiniz. OpenTelemetry, farklı dışarı aktarmaları kullanan çeşitli hedefleri destekler. OpenTelemetry'yi yapılandırma hakkında daha fazla bilgi için OpenTelemetry kullanmaya başlama kılavuzuna bakın.
Application Insights kullanarak izlemeleri toplama
Dağıtılmış izleme telemetrisi, ASP.NETveya ASP.NET Core uygulamalar için Application Insights SDK'sı yapılandırıldıktan sonra ya da kod olmayan izleme etkinleştirildikten sonra otomatik olarak yakalanır.
Daha fazla bilgi için Application Insights dağıtılmış izleme belgelerine bakın.
Not
Şu anda Application Insights yalnızca belirli iyi bilinen Etkinlik izlemelerinin toplanmalarını destekler ve kullanıcı tarafından eklenen yeni Etkinlikleri yoksayar. Application Insights, özel dağıtılmış izleme bilgileri eklemek için satıcıya özgü bir API olarak TrackDependency sunar.
Özel mantık kullanarak izlemeleri toplama
Geliştiriciler Etkinlik izleme verileri için kendi özelleştirilmiş koleksiyon mantığını oluşturabilir. Bu örnek, .NET tarafından sağlanan API'yi System.Diagnostics.ActivityListener kullanarak telemetriyi toplar ve konsola yazdırır.
Önkoşullar
- .NET Core 2.1 SDK veya sonraki bir sürüm
Örnek uygulama oluşturma
İlk olarak, dağıtılmış izleme izleme izlemeleri olan ancak hiçbir izleme verisi toplanmamış örnek bir uygulama oluşturacaksınız.
dotnet new console
.NET 5 ve üzerini hedefleyen uygulamalar zaten gerekli dağıtılmış izleme API'lerine sahiptir. Eski .NET sürümlerini hedefleyen uygulamalar için System.Diagnostics.DiagnosticSource NuGet paketi sürüm 5 veya üzerini ekleyin.
dotnet add package System.Diagnostics.DiagnosticSource
Oluşturulan Program.cs dosyasının içeriğini şu örnek kaynakla değiştirin:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace Sample.DistributedTracing
{
class Program
{
static ActivitySource s_source = new ActivitySource("Sample.DistributedTracing");
static async Task Main(string[] args)
{
await DoSomeWork();
Console.WriteLine("Example work done");
}
static async Task DoSomeWork()
{
using (Activity a = s_source.StartActivity("SomeWork"))
{
await StepOne();
await StepTwo();
}
}
static async Task StepOne()
{
using (Activity a = s_source.StartActivity("StepOne"))
{
await Task.Delay(500);
}
}
static async Task StepTwo()
{
using (Activity a = s_source.StartActivity("StepTwo"))
{
await Task.Delay(1000);
}
}
}
}
Uygulamayı çalıştırmak henüz herhangi bir izleme verisi toplamaz:
> dotnet run
Example work done
İzlemeleri toplamak için kod ekleme
Main() öğesini şu kodla güncelleştirin:
static async Task Main(string[] args)
{
Activity.DefaultIdFormat = ActivityIdFormat.W3C;
Activity.ForceDefaultIdFormat = true;
Console.WriteLine(" {0,-15} {1,-60} {2,-15}", "OperationName", "Id", "Duration");
ActivitySource.AddActivityListener(new ActivityListener()
{
ShouldListenTo = (source) => true,
Sample = (ref ActivityCreationOptions<ActivityContext> options) => ActivitySamplingResult.AllDataAndRecorded,
ActivityStarted = activity => Console.WriteLine("Started: {0,-15} {1,-60}", activity.OperationName, activity.Id),
ActivityStopped = activity => Console.WriteLine("Stopped: {0,-15} {1,-60} {2,-15}", activity.OperationName, activity.Id, activity.Duration)
});
await DoSomeWork();
Console.WriteLine("Example work done");
}
Çıkış artık günlüğe kaydetmeyi içerir:
> dotnet run
OperationName Id Duration
Started: SomeWork 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-c447fb302059784f-01
Started: StepOne 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-a7c77a4e9a02dc4a-01
Stopped: StepOne 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-a7c77a4e9a02dc4a-01 00:00:00.5093849
Started: StepTwo 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-9210ad536cae9e4e-01
Stopped: StepTwo 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-9210ad536cae9e4e-01 00:00:01.0111847
Stopped: SomeWork 00-bdb5faffc2fc1548b6ba49a31c4a0ae0-c447fb302059784f-01 00:00:01.5236391
Example work done
ve ForceDefaultIdFormat ayarı DefaultIdFormat isteğe bağlıdır, ancak örneğin farklı .NET çalışma zamanı sürümlerinde benzer çıkışlar üretmesini sağlamaya yardımcı olur. .NET 5 varsayılan olarak W3C TraceContext Id biçimini kullanır, ancak önceki .NET sürümleri kimlik biçimini kullanır Hierarchical . Daha fazla bilgi için bkz . Etkinlik Kimlikleri.
System.Diagnostics.ActivityListener bir Etkinliğin kullanım ömrü boyunca geri çağırmaları almak için kullanılır.
- ShouldListenTo - Her Etkinlik, ad alanı ve üreticisi olarak davranan bir ActivitySource ile ilişkilendirilir. Bu geri çağırma, işlemdeki her ActivitySource için bir kez çağrılır. Örnekleme yapmakla ilgileniyorsanız veya bu kaynak tarafından oluşturulan Etkinlikler için başlatma/durdurma olayları hakkında bildirim almak istiyorsanız true değerini döndürebilirsiniz.
- Sample - Varsayılan olarak StartActivity , bazı ActivityListener örneklenmesi gerektiğini belirtmedikçe bir Activity nesnesi oluşturmaz. Döndürme AllDataAndRecorded , Etkinliğin oluşturulması, IsAllDataRequested true olarak ayarlanması ve ActivityTraceFlags bayrağının Recorded ayarlanması gerektiğini gösterir. IsAllDataRequested, izlenen kod tarafından dinleyicinin Etiketler ve Olaylar gibi yardımcı Etkinlik bilgilerinin doldurulmasını sağlamak istediğini gösteren bir ipucu olarak gözlemlenebilir. Kaydedilen bayrağı W3C TraceContext Kimliği'nde kodlanır ve dağıtılmış izlemede yer alan diğer işlemler için bu izlemenin örneklenmesi gerektiğine dair bir ipucudur.
- ActivityStarted ve ActivityStopped sırasıyla bir Etkinlik başlatıldığında ve durdurulduğunda çağrılır. Bu geri çağırmalar, Etkinlik hakkında ilgili bilgileri kaydetme veya potansiyel olarak değiştirme fırsatı sağlar. Bir Etkinlik yeni başlatıldığında, verilerin çoğu hala eksik olabilir ve Etkinlik durdurulmadan önce doldurulur.
Bir ActivityListener oluşturulduktan ve geri çağırmalar doldurulduktan sonra, geri çağırmalar ActivitySource.AddActivityListener(ActivityListener) çağrılır. Geri çağırma akışını durdurmak için çağrısı ActivityListener.Dispose() . Çok iş parçacıklı kodda, devam eden geri çağırma bildirimlerinin çalışırken veya döndürüldükten kısa bir süre sonra bile alınabileceğini Dispose()
unutmayın.