Setelah Anda menggunakan Jaeger untuk menginstrumentasi aplikasi .NET dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi .NET. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan komponen OpenTracing, .NET Core, dan gRPC untuk secara otomatis atau manual menginstrumentasi aplikasi .NET dan melaporkan data jejak aplikasi .NET.
Klien Jaeger untuk C# tidak lagi dipelihara. Kami merekomendasikan Anda menggunakan OpenTelemetry SDK untuk .NET untuk melaporkan data jejak. Untuk informasi lebih lanjut, lihat Gunakan OpenTelemetry untuk Melaporkan Data Jejak Aplikasi .NET.
Prasyarat
Informasi latar belakang
Jaeger adalah sistem pelacakan terdistribusi open source yang dibuat dan digunakan oleh Uber. Jaeger kompatibel dengan API OpenTracing dan merupakan anggota dari Cloud Native Computing Foundation (CNCF). Jaeger mengumpulkan data pemantauan waktu nyata dari berbagai sistem heterogen.
Komunitas OpenTracing menyediakan beberapa komponen yang mendukung kerangka kerja .NET berikut:
Kode contoh
Unduh kode contoh dari dotnet-demo.
Instrumentasi aplikasi .NET 6.0
Gunakan komponen OpenTracing untuk secara otomatis menginstrumentasi aplikasi .NET
Untuk menjalankan kode contoh, persyaratan berikut harus dipenuhi:
Jaeger 1.0.2 telah diinstal.
.NET 6.0 telah diinstal.
Di file dotnet-demo/net6.0/Shared/JaegerServiceCollectionExtensions.cs proyek contoh, tentukan titik akhir Jaeger yang digunakan untuk melaporkan data jejak dan nama aplikasi yang ingin dilaporkan untuk menginisialisasi dan mendaftarkan objek ITracer.
public static class JaegerServiceCollectionExtensions { // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini. private static readonly Uri _jaegerUri = new Uri("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces"); public static IServiceCollection AddJaeger(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); services.AddSingleton<ITracer>(serviceProvider => { // Tentukan nama aplikasi. string serviceName = Assembly.GetEntryAssembly().GetName().Name; ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); ISampler sampler = new ConstSampler(sample: true); IReporter reporter = new RemoteReporter.Builder() .WithSender(new HttpSender.Builder(_jaegerUri.ToString()).Build()) .Build(); ITracer tracer = new Tracer.Builder(serviceName) .WithLoggerFactory(loggerFactory) .WithSampler(sampler) .WithReporter(reporter) .Build(); GlobalTracer.Register(tracer); return tracer; }); // Mencegah loop tak terbatas saat OpenTracing melacak permintaan HTTP ke Jaeger. services.Configure<HttpHandlerDiagnosticOptions>(options => { options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri)); }); return services; } }Pergi ke direktori dotnet-demo/net6.0/CustomersApi proyek contoh dan jalankan perintah berikut:
dotnet run --framework:net6.0Mulai aplikasi Anda dan akses URL berikut:
http://localhost:5001/healthDi halaman Applications dari Konsol Managed Service for OpenTelemetry, cari aplikasi berdasarkan nama aplikasi untuk melihat data yang dilaporkan.
Instrumentasi aplikasi .NET Core 3.1
Untuk menjalankan kode contoh, persyaratan berikut harus dipenuhi:
Jaeger 1.0.2 telah diinstal.
.NET Core 3.1 telah diinstal.
Gunakan ASP.NET Core untuk secara otomatis menginstrumentasi aplikasi .NET
Di file dotnet-demo/netcoreapp3.1/Shared/JaegerServiceCollectionExtensions.cs proyek contoh, tentukan titik akhir Jaeger yang digunakan untuk melaporkan data jejak dan nama aplikasi yang ingin dilaporkan untuk menginisialisasi dan mendaftarkan objek ITracer.
public static class JaegerServiceCollectionExtensions { // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini. private static readonly Uri _jaegerUri = new Uri("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces"); public static IServiceCollection AddJaeger(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); services.AddSingleton<ITracer>(serviceProvider => { // Tentukan nama aplikasi. string serviceName = Assembly.GetEntryAssembly().GetName().Name; ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); ISampler sampler = new ConstSampler(sample: true); IReporter reporter = new RemoteReporter.Builder() .WithSender(new HttpSender.Builder(_jaegerUri.ToString()).Build()) .Build(); ITracer tracer = new Tracer.Builder(serviceName) .WithLoggerFactory(loggerFactory) .WithSampler(sampler) .WithReporter(reporter) .Build(); GlobalTracer.Register(tracer); return tracer; }); // Mencegah loop tak terbatas saat OpenTracing melacak permintaan HTTP ke Jaeger. services.Configure<HttpHandlerDiagnosticOptions>(options => { options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri)); }); return services; } }Pergi ke direktori dotnet-demo/netcoreapp3.1/Shared proyek contoh dan jalankan perintah berikut:
// Tambahkan middleware ASP.NET Core 3.1. dotnet add package OpenTracing.Contrib.NetCorePergi ke direktori dotnet-demo/netcoreapp3.1/CustomersApi proyek contoh dan jalankan perintah berikut:
// Tambahkan middleware ASP.NET Core 3.1. dotnet add package OpenTracing.Contrib.NetCore // Jalankan program demo. dotnet run --framework:netcoreapp3.1Mulai aplikasi Anda dan akses URL berikut:
http://localhost:5001/healthDi halaman Applications dari Konsol Managed Service for OpenTelemetry, cari aplikasi berdasarkan nama aplikasi untuk melihat data yang dilaporkan.
Gunakan gRPC untuk secara otomatis menginstrumentasi aplikasi .NET
Instal paket NuGet.
// Tambahkan komponen berikut: // OpenTracing.Contrib.Grpc: middleware gRPC. // Jaeger: komponen implementasi OpenTracing. // Microsoft.Extensions.Logging.Console: komponen log. dotnet add package OpenTracing.Contrib.grpc dotnet add package JaegerInisialisasi objek ITracer.
public static Tracer InitTracer(string serviceName, ILoggerFactory loggerFactory) { Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory) .WithType(ConstSampler.Type) .WithParam(1); Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory) // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini. .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces"); Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory) .WithSender(senderConfiguration); return (Tracer)new Configuration(serviceName, loggerFactory) .WithSampler(samplerConfiguration) .WithReporter(reporterConfiguration) .GetTracer(); }Tambahkan instrumentasi di server. Bangun objek ServerTracingInterceptor dan ikat objek tersebut ke aplikasi.
ILoggerFactory loggerFactory = new LoggerFactory().AddConsole(); ITracer tracer = TracingHelper.InitTracer("dotnetGrpcServer", loggerFactory); ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(tracer); Server server = new Server { Services = { Greeter.BindService(new GreeterImpl()).Intercept(tracingInterceptor) }, Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } };Tambahkan instrumentasi di klien. Bangun objek ServerTracingInterceptor dan ikat objek tersebut ke saluran tertentu.
ILoggerFactory loggerFactory = new LoggerFactory().AddConsole(); ITracer tracer = TracingHelper.InitTracer("dotnetGrpcClient", loggerFactory); ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(tracer); Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure); var client = new Greeter.GreeterClient(channel.Intercept(tracingInterceptor));Pergi ke direktori dotnet-demo/netcoreapp3.1/GreeterServer proyek contoh dan jalankan perintah berikut di terminal untuk memulai server gRPC:
dotnet run --framework:netcoreapp3.1Pergi ke direktori dotnet-demo/netcoreapp3.1/GreeterClient proyek contoh dan jalankan perintah berikut di terminal lain untuk memulai klien gRPC:
dotnet run --framework:netcoreapp3.1Jika pesan
Greeting: Hello youdikembalikan, server dan klien terhubung. Anda dapat melihat data jejak aplikasi contoh yang dilaporkan oleh dotnetGrpcServer dan dotnetGrpcClient di konsol.
Secara manual menginstrumentasi aplikasi .NET
Anda dapat menginstrumentasi aplikasi .NET dengan menggunakan plugin yang ada. Atau, Anda dapat menggunakan Jaeger untuk secara manual menginstrumentasi aplikasi .NET dan melaporkan data jejak aplikasi ke konsol Managed Service for OpenTelemetry.
Instal paket NuGet.
// Jaeger: komponen implementasi OpenTracing. // Microsoft.Extensions.Logging.Console: komponen log. dotnet add package Microsoft.Extensions.Logging.Console dotnet add package JaegerBangun objek ITracer. Objek ITracer adalah objek yang didefinisikan oleh OpenTracing. Anda dapat menggunakan Jaeger untuk membangun objek ini. Saat membangun objek ini, Anda dapat mengonfigurasinya untuk menentukan titik akhir Jaeger dan laju sampel.
public static ITracer InitTracer(string serviceName, ILoggerFactory loggerFactory) { Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory) .WithType(ConstSampler.Type) .WithParam(1); Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory) // Dapatkan titik akhir Jaeger di konsol Managed Service for OpenTelemetry. .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces"); Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory) .WithSender(senderConfiguration); return (Tracer)new Configuration(serviceName, loggerFactory) .WithSampler(samplerConfiguration) .WithReporter(reporterConfiguration) .GetTracer(); }Daftarkan objek ITracer dengan GlobalTracer untuk memudahkan pemanggilan kode.
GlobalTracer.Register(InitTracer("dotnetManualDemo", loggerFactory ));Catat data permintaan.
ITracer tracer = GlobalTracer.Instance; ISpan span = tracer.BuildSpan("parentSpan").WithTag("mytag","parentSapn").Start(); tracer.ScopeManager.Activate(span, false); // ... lakukan sesuatu span.Finish();CatatanAnda dapat menjalankan kode sebelumnya untuk mencatat operasi root dari permintaan. Jika Anda ingin mencatat operasi sebelum dan sesudah permintaan, panggil metode AsChildOf.
Berikut ini adalah contoh kode sampel:
ITracer tracer = GlobalTracer.Instance; ISpan parentSpan = tracer.ActiveSpan; ISpan childSpan =tracer.BuildSpan("childSpan").AsChildOf(parentSpan).WithTag("mytag", "spanSecond").Start(); tracer.ScopeManager.Activate(childSpan, false); // ... lakukan sesuatu childSpan.Finish();Opsional: Untuk menyelesaikan masalah dengan efisien, Anda dapat menambahkan tag kustom ke catatan. Misalnya, Anda dapat menambahkan tag kustom ke permintaan untuk menunjukkan apakah terjadi kesalahan atau menggambarkan nilai yang dikembalikan oleh permintaan.
tracer.activeSpan().setTag("http.status_code", "200");Dalam sistem terdistribusi, permintaan prosedur jarak jauh (RPC) dikirim bersama dengan data jejak. Data jejak berisi nilai-nilai parameter TraceId, ParentSpanId, SpanId, dan Sampled. Anda dapat memanggil metode Extract atau Inject untuk melewati data jejak di header permintaan HTTP. Gambar berikut menunjukkan seluruh proses.

Panggil metode Inject di klien untuk menentukan informasi konteks.
Tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new HttpHeadersInjectAdapter(request.Headers));Panggil metode Extract di server untuk mengekstrak informasi konteks.
ISpanContext extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(request.Headers)); ISpan childSpan = _tracer.BuildSpan(operationName).AsChildOf(extractedSpanContext);
Pergi ke direktori dotnet-demo/netcoreapp3.1/ManualDemo proyek dan jalankan perintah berikut. Program contoh mulai melaporkan data jejak.
dotnet run --framework:netcoreapp3.1Di konsol Managed Service for OpenTelemetry, Anda dapat melihat data jejak yang dilaporkan dari aplikasi contoh dotnetManualDemo yang diinstrumentasi secara manual.
FAQ
T1: Apa yang harus saya lakukan jika tidak ada data jejak yang dilaporkan ke konsol Managed Service for OpenTelemetry setelah saya menjalankan program demo?
A1: Periksa apakah titik akhir dalam senderConfiguration valid.
Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
// Dapatkan titik akhir Jaeger di konsol Managed Service for OpenTelemetry.
.WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");T2: Bagaimana cara menentukan laju sampel?
A2: Untuk informasi lebih lanjut, kunjungi halaman jaeger-client-csharp di GitHub.
