Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk a következő verziókra vonatkozik: ✔️ .NET Core 2.1 és újabb verziók ✔️ .NET-keretrendszer 4.5-ös és újabb verziókra
A rendszerezett kód egy elosztott nyomkövetés részeként hozhat létre Activity objektumokat, de az ezekben az objektumokban lévő információkat központosított tárolóba kell gyűjteni, hogy a teljes nyomkövetés később áttekinthető legyen. Ebben az oktatóanyagban különböző módokon fogja összegyűjteni az elosztott nyomkövetési telemetriát, hogy szükség esetén diagnosztizálhassa az alkalmazásokkal kapcsolatos problémákat. Ha új kialakítást szeretne hozzáadni, tekintse meg a kialakítási oktatóanyagot .
Nyomkövetések gyűjtése az OpenTelemetry használatával
Az OpenTelemetry a Cloud Native Computing Foundation által támogatott, szállítósemleges nyílt forráskódú projekt, amelynek célja a telemetria létrehozása és gyűjtése a natív felhőbeli szoftverekhez. Ezekben a példákban elosztott nyomkövetési információkat gyűjtünk és jelenítünk meg a konzolon. Az OpenTelemetry máshol történő küldésére való konfigurálásáról az OpenTelemetry első lépései című útmutatóban olvashat.
ASP.NET példa
Előfeltételek
- .NET Core 7.0 SDK vagy újabb verzió
Példaalkalmazás létrehozása
Először hozzon létre egy új ASP.NET webalkalmazást bemutató alkalmazásként.
dotnet new webapp
Ez az alkalmazás megjelenít egy weblapot, de még nem gyűjtünk elosztott nyomkövetési adatokat, ha a weblapot böngészjük.
Gyűjtemény konfigurálása
Az OpenTelemetry használatához több NuGet-csomagra kell hivatkoznia.
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
Megjegyzés
Az írás időpontjában az 1.4.0 Release Candidate 1 build volt az OpenTelemetry legújabb verziója. Ha már elérhető a végleges verzió, használja ezt a elemet.
Ezután módosítsa a forráskódot a Program.cs fájlban, hogy az így nézzen ki:
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();
Futtassa az alkalmazást, és használjon webböngészőt a üzemeltetett weblap megkereséséhez. Most, hogy engedélyezte az OpenTelemetry elosztott nyomkövetését, meg kell jelennie a konzolra nyomtatott böngészőbeli webkérelmekkel kapcsolatos információknak:
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
Az OpenTelemetry összes konfigurációja az új forrásvonalakban történik, amelyek a következővel builder.Services.AddOpenTelemetry()kezdődnek: . Az elosztott nyomkövetés engedélyezéséhez használt .WithTracing(...) . AddAspNetCoreInstrumentation()engedélyezve van az OpenTelemetry a ASP.NET Core webkiszolgáló által létrehozott összes elosztott nyomkövetési tevékenység gyűjtéséhez, és AddConsoleExporter() utasítja az OpenTelemetryt, hogy küldje el ezeket az információkat a konzolnak. Egy kevésbé triviális alkalmazás esetében több eszközkódtárat is hozzáadhat, hogy az adatbázis-lekérdezések vagy kimenő HTTP-kérések nyomkövetését is gyűjtse. A konzolexportáló helyett egy Jaeger, Zipken vagy egy másik monitorozási szolgáltatást használ.
Példa konzolalkalmazásra
Előfeltételek
- .NET Core 2.1 SDK vagy újabb verzió
Példaalkalmazás létrehozása
Mielőtt bármilyen elosztott nyomkövetési telemetria összegyűjthető lenne, létre kell hoznia. Ez a kialakítás gyakran kódtárakban található, de az egyszerűség kedvéért létre fog hozni egy kis alkalmazást, amely néhány példát mutat be a használatával StartActivity. Ezen a ponton nem történt gyűjtemény, és a StartActivity() nem rendelkezik mellékhatással, és null értéket ad vissza. További részletekért tekintse meg a kialakítási oktatóanyagot .
dotnet new console
A .NET 5-öt és újabb verziót célzó alkalmazások már tartalmazzák a szükséges elosztott nyomkövetési API-kat. A régebbi .NET-verziókat megcélzó alkalmazásokhoz adja hozzá a System.Diagnostics.DiagnosticSource NuGet csomag 5-ös vagy újabb verzióját.
dotnet add package System.Diagnostics.DiagnosticSource
Cserélje le a létrehozott Program.cs fájl tartalmát a következő példaforrásra:
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);
}
}
}
}
Az alkalmazás futtatása még nem gyűjt nyomkövetési adatokat:
> dotnet run
Example work done
Gyűjtemény konfigurálása
Adja hozzá az OpenTelemetry.Exporter.Console NuGet csomagot.
dotnet add package OpenTelemetry.Exporter.Console
A Program.cs frissítése további OpenTelemetry-irányelvekkel using :
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
Frissítsen Main() az OpenTelemetry TracerProvider létrehozásához:
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");
}
Most az alkalmazás összegyűjti az elosztott nyomkövetési információkat, és megjeleníti azokat a konzolon:
> 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
Források
A példakódban meghívta AddSource("Sample.DistributedTracing") , hogy az OpenTelemetry rögzítse az ActivitySource által létrehozott tevékenységeket, amelyek már megtalálhatók a kódban:
static ActivitySource s_source = new ActivitySource("Sample.DistributedTracing");
Bármely ActivitySource-ból származó telemetriai adatok rögzíthetők a forrás nevével való hívással AddSource() .
Exportőrök
A konzolexportáló hasznos a gyors példákhoz vagy a helyi fejlesztéshez, de éles környezetben valószínűleg nyomkövetéseket szeretne küldeni egy központosított tárolóba. Az OpenTelemetry különböző exportőrökkel támogatja a különböző célhelyeket. Az OpenTelemetria konfigurálásával kapcsolatos további információkért tekintse meg az OpenTelemetry használatának első lépéseit ismertető útmutatót.
Nyomkövetések gyűjtése az Application Insights használatával
Az elosztott nyomkövetési telemetriai adatok automatikusan rögzítve lesznek, miután konfigurálta az Application Insights SDK-t ASP.NET vagy ASP.NET Core alkalmazásokhoz, vagy engedélyezte a kód nélküli kialakítást.
További információt az Application Insights elosztott nyomkövetési dokumentációjában talál.
Megjegyzés
Az Application Insights jelenleg csak bizonyos jól ismert tevékenységállapotok gyűjtését támogatja, és figyelmen kívül hagyja az új felhasználó által hozzáadott tevékenységeket. Az Application Insights a TrackDependency szolgáltatást kínálja szállítóspecifikus API-ként az egyéni elosztott nyomkövetési információk hozzáadásához.
Nyomkövetések gyűjtése egyéni logikával
A fejlesztők szabadon létrehozhatják saját, testre szabott gyűjtési logikájukat a tevékenységkövetési adatokhoz. Ez a példa a .NET által biztosított API használatával gyűjti össze a System.Diagnostics.ActivityListener telemetriát, és kiírja a konzolra.
Előfeltételek
- .NET Core 2.1 SDK vagy újabb verzió
Példaalkalmazás létrehozása
Először létre fog hozni egy példaalkalmazást, amely rendelkezik valamilyen elosztott nyomkövetési kialakítású, de nem gyűjt nyomkövetési adatokat.
dotnet new console
A .NET 5-öt és újabb verziót célzó alkalmazások már tartalmazzák a szükséges elosztott nyomkövetési API-kat. A régebbi .NET-verziókat megcélzó alkalmazásokhoz adja hozzá a System.Diagnostics.DiagnosticSource NuGet csomag 5-ös vagy újabb verzióját.
dotnet add package System.Diagnostics.DiagnosticSource
Cserélje le a létrehozott Program.cs fájl tartalmát a következő példaforrásra:
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);
}
}
}
}
Az alkalmazás futtatása még nem gyűjt nyomkövetési adatokat:
> dotnet run
Example work done
Kód hozzáadása a nyomkövetések gyűjtéséhez
Frissítse a Main() kódot a következő kóddal:
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");
}
A kimenet mostantól tartalmazza a naplózást:
> 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
A beállítás DefaultIdFormat nem ForceDefaultIdFormat kötelező, de segít biztosítani, hogy a minta hasonló kimenetet állítson elő a különböző .NET-futtatókörnyezeti verziókon. A .NET 5 alapértelmezés szerint a W3C TraceContext ID formátumot használja, de a korábbi .NET-verziók alapértelmezés szerint az id formátumot használják Hierarchical . További információ: Tevékenységazonosítók.
System.Diagnostics.ActivityListener egy tevékenység élettartama alatt visszahívások fogadására szolgál.
- ShouldListenTo - Minden tevékenység egy ActivitySource-hoz van társítva, amely névtérként és előállítóként működik. Ezt a visszahívást a folyamat minden tevékenységforrása egyszer meghívja. Igaz értéket ad vissza, ha mintavételezést szeretne végezni, vagy értesítést kap az e forrás által létrehozott tevékenységek indítási/leállítási eseményeiről.
- Sample – Alapértelmezés szerint StartActivity csak akkor hoz létre tevékenységobjektumot, ha néhány ActivityListener azt jelzi, hogy mintát kell venni. AllDataAndRecorded A visszatérés azt jelzi, hogy a tevékenységet létre kell hozni, IsAllDataRequested igaz értékre kell állítani, és ActivityTraceFlags a Recorded jelölő be lesz állítva. Az IsAllDataRequested a rendszerezett kódban is megfigyelhető, hogy a figyelő biztosítani szeretné a kiegészítő tevékenységinformációk, például a Címkék és események feltöltését. A Rögzített jelző a W3C TraceContext id kódjában van kódolva, és az elosztott nyomkövetésben részt vevő egyéb folyamatokra utal, hogy a nyomkövetést mintát kell venni.
- ActivityStarted és ActivityStopped akkor lesz meghívva, amikor egy tevékenység elindul és leáll. Ezek a visszahívások lehetőséget biztosítanak a tevékenységgel kapcsolatos releváns információk rögzítésére vagy módosítására. Amikor egy tevékenység most indult el, előfordulhat, hogy az adatok nagy része még nem teljes, és a tevékenység leállása előtt ki lesz töltve.
Az ActivityListener létrehozása és a visszahívások feltöltése után a hívás ActivitySource.AddActivityListener(ActivityListener) kezdeményezi a visszahívások meghívását. Hívás ActivityListener.Dispose() a visszahívások folyamatának leállításához. Vegye figyelembe, hogy a többszálas kódban a folyamatban lévő visszahívási értesítéseket futás közben Dispose() vagy akár röviddel a visszatérés után is megkaphatja.