Zipkin adalah sistem pelacakan terdistribusi sumber terbuka yang dikembangkan oleh Twitter untuk melacak data secara real-time. Sistem ini digunakan untuk mengumpulkan data pemantauan dari berbagai sistem heterogen. Anda dapat menggunakan Zipkin untuk melaporkan data aplikasi .NET di Analisis Tracing. Metode ini juga berlaku untuk aplikasi C#.
Prasyarat
Gunakan ASP.NET Core untuk instrumentasi aplikasi .NET
Ikuti langkah-langkah berikut untuk menggunakan ASP.NET Core dalam melakukan instrumentasi aplikasi:
- Instal paket NuGet.
// Tambahkan komponen berikut: // zipkin4net.middleware.aspnetcore, middleware ASP.NET Core // zipkin4net, tracer dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net - Daftarkan dan mulai Zipkin.
lifetime.ApplicationStarted.Register(() => { TraceManager.SamplingRate = 1.0f; var logger = new TracingLogger(loggerFactory, "zipkin4net"); // Dapatkan titik akhir Zipkin di konsol Analisis Tracing. Perhatikan bahwa titik akhir tidak mengandung /api/v2/spans. var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); }); lifetime.ApplicationStopped.Register(() => TraceManager.Stop()); app.UseTracing(applicationName); - Tambahkan TracingHandler ke HttpClient yang mengirim permintaan GET atau POST.
public override void ConfigureServices(IServiceCollection services) { services.AddHttpClient("Tracer").AddHttpMessageHandler(provider => TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"])); }
Gunakan OWIN untuk instrumentasi aplikasi .NET
Ikuti langkah-langkah berikut untuk menggunakan Open Web Interface for .NET (OWIN) dalam melakukan instrumentasi aplikasi:
- Instal paket NuGet.
// Tambahkan komponen berikut: // zipkin4net.middleware.aspnetcore, middleware ASP.NET Core // zipkin4net, tracer dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net - Daftarkan dan mulai Zipkin.
// Konfigurasikan tracing. TraceManager.SamplingRate = 1.0f; var logger = new ConsoleLogger(); // Dapatkan titik akhir Zipkin di konsol Analisis Tracing. Perhatikan bahwa titik akhir tidak mengandung /api/v2/spans. var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); //Hentikan TraceManager saat aplikasi dibuang var properties = new AppProperties(appBuilder.Properties); var token = properties.OnAppDisposing; if (token != CancellationToken.None) { token.Register(() => { TraceManager.Stop(); }); } // Atur Middleware Owin appBuilder.UseZipkinTracer(System.Configuration.ConfigurationManager.AppSettings["applicationName"]); - Tambahkan TracingHandler ke HttpClient yang mengirim permintaan GET atau POST.
using (var httpClient = new HttpClient(new TracingHandler(applicationName))) { var response = await httpClient.GetAsync(callServiceUrl); var content = await response.Content.ReadAsStringAsync(); await context.Response.WriteAsync(content); }
Instrumentasi manual aplikasi .NET
Bagian sebelumnya menjelaskan cara menggunakan komponen yang ada untuk melakukan instrumentasi aplikasi .NET. Anda juga dapat melakukan instrumentasi manual pada aplikasi .NET sehingga dapat menggunakan Zipkin untuk melaporkan data aplikasi ke konsol Analisis Tracing.
- Instal paket NuGet.
// Tambahkan zipkin4net, tracer. dotnet add package zipkin4net - Daftarkan dan mulai Zipkin.
TraceManager.SamplingRate = 1.0f; var logger = new ConsoleLogger(); // Dapatkan titik akhir Zipkin di konsol Analisis Tracing. Perhatikan bahwa titik akhir tidak mengandung /api/v2/spans. var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); - Catat data permintaan.
var trace = Trace.Create(); Trace.Current = trace; trace.Record(Annotations.ClientSend()); trace.Record(Annotations.Rpc("client")); trace.Record(Annotations.Tag("mytag", "spanFrist")); trace.Record(Annotations.ServiceName("dotnetManual")); // ...lakukan sesuatu testCall(); trace.Record(Annotations.ClientRecv());CatatanAnda dapat menjalankan kode di atas untuk mencatat operasi root dari sebuah permintaan. Jika perlu mencatat operasi sebelum dan sesudah permintaan, panggil metode Child. Contoh kode:
var trace = Trace.Current.Child(); Trace.Current = trace; trace.Record(Annotations.ServerRecv()); trace.Record(Annotations.Rpc("server")); trace.Record(Annotations.Tag("mytag", "spanSecond")); trace.Record(Annotations.ServiceName("dotnetManual")); // ...lakukan sesuatu trace.Record(Annotations.ServerSend()); - Opsional:Tambahkan tag kustom ke rentang untuk pemecahan masalah cepat. Misalnya, Anda dapat menambahkan tag kustom untuk memeriksa apakah terjadi kesalahan atau untuk mencatat nilai balik dari sebuah 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 melewatkan data dalam header permintaan HTTP. Proses keseluruhan adalah sebagai berikut.
Client Span Server Span ┌──────────────────┐ ┌──────────────────┐ │ │ │ │ │ TraceContext │ Http Request Headers │ TraceContext │ │ ┌──────────────┐ │ ┌───────────────────┐ │ ┌──────────────┐ │ │ │ TraceId │ │ │ X-B3-TraceId │ │ │ TraceId │ │ │ │ │ │ │ │ │ │ │ │ │ │ ParentSpanId │ │ Inject │ X-B3-ParentSpanId │Extract │ │ ParentSpanId │ │ │ │ ├─┼─────────>│ ├────────┼>│ │ │ │ │ SpanId │ │ │ X-B3-SpanId │ │ │ SpanId │ │ │ │ │ │ │ │ │ │ │ │ │ │ Sampled │ │ │ X-B3-Sampled │ │ │ Sampled │ │ │ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │ │ │ │ │ └──────────────────┘ └──────────────────┘- Panggil metode Inject pada klien untuk menyuntikkan informasi konteks.
_injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); - Panggil metode Extract pada server untuk mengekstrak informasi konteks.
Ivar traceContext = traceExtractor.Extract(context.Request.Headers); var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);
- Panggil metode Inject pada klien untuk menyuntikkan informasi konteks.
FAQ
T: Mengapa tidak ada data dilaporkan ke konsol setelah program demo dijalankan?
A: Periksa apakah Anda telah mengonfigurasi titik akhir yang benar di senderConfiguration.
// Dapatkan titik akhir Zipkin di konsol Analisis Tracing. Perhatikan bahwa titik akhir tidak mengandung /api/v2/spans.
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");