Zipkin adalah sistem pelacakan terdistribusi open source yang awalnya dikembangkan oleh Twitter. Sistem ini mengagregasi data pemantauan waktu nyata dari berbagai sistem heterogen. Anda dapat menggunakan pustaka zipkin4net untuk menginstrumen aplikasi .NET dan melaporkan data jejak ke Application Real-Time Monitoring Service (ARMS) Tracing Analysis.
Topik ini mencakup tiga metode instrumentasi untuk aplikasi .NET dan C#.
Pilih metode instrumentasi
Pilih metode yang sesuai dengan framework aplikasi Anda.
| Metode | Paling cocok untuk | Paket NuGet yang diperlukan |
|---|---|---|
| ASP.NET Core | Aplikasi web lintas platform yang dibangun di atas ASP.NET Core | zipkin4net.middleware.aspnetcore, zipkin4net |
| OWIN | Aplikasi web .NET Framework yang menggunakan middleware OWIN | zipkin4net.middleware.aspnetcore, zipkin4net |
| Manual | Pekerjaan latar belakang, konsumen pesan, atau protokol kustom yang memerlukan kontrol rentang detail halus | zipkin4net |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Akun Alibaba Cloud dengan ARMS yang diaktifkan
Lingkungan pengembangan .NET
Titik akhir Zipkin untuk instans ARMS Tracing Analysis Anda (lihat Dapatkan titik akhir Zipkin)
Dapatkan titik akhir Zipkin
Masuk ke Konsol Tracing Analysis.
Di panel navigasi sebelah kiri, klik Cluster Configurations. Lalu, klik tab Access point information.
Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.
Di bagian Client, klik Jaeger atau Zipkin.
Di kolom Related Information, salin URL titik akhirnya.

Jika aplikasi Anda berjalan di lingkungan produksi Alibaba Cloud, gunakan titik akses VPC. Jika tidak, gunakan titik akhir publik. Gunakan titik akhir v2 kecuali Anda memiliki alasan khusus untuk menggunakan v1.
Instrumen dengan ASP.NET Core
Unduh proyek demo lengkap dan ikuti petunjuk dalam file README.md-nya.
Langkah 1: Instal paket NuGet
dotnet add package zipkin4net.middleware.aspnetcore
dotnet add package zipkin4net| Paket | Tujuan |
|---|---|
zipkin4net | Pustaka pelacakan inti. Membuat rentang, mengelola pengambilan sampel, dan melaporkan data jejak ke backend yang kompatibel dengan Zipkin. |
zipkin4net.middleware.aspnetcore | Middleware ASP.NET Core. Secara otomatis membuat rentang server untuk setiap permintaan HTTP masuk. |
Langkah 2: Daftarkan dan mulai tracer
Tambahkan kode berikut ke logika startup aplikasi Anda untuk mengonfigurasi zipkin4net dan menghubungkannya ke titik akhir ARMS Tracing Analysis Anda.
lifetime.ApplicationStarted.Register(() => {
TraceManager.SamplingRate = 1.0f;
var logger = new TracingLogger(loggerFactory, "zipkin4net");
// Ganti dengan titik akhir Zipkin Anda dari Konsol Tracing Analysis.
// Jangan tambahkan /api/v2/spans ke URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
});
lifetime.ApplicationStopped.Register(() => TraceManager.Stop());
app.UseTracing(applicationName);Ganti placeholder berikut dengan nilai aktual Anda:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<your-zipkin-endpoint> | Titik akhir Zipkin dari Konsol Tracing Analysis | http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token |
Langkah 3: Lacak permintaan HTTP keluar
Tambahkan TracingHandler ke pipeline HttpClient Anda agar panggilan HTTP keluar secara otomatis dilacak dan dikorelasikan dengan rentang induk.
public override void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("Tracer").AddHttpMessageHandler(provider =>
TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"]));
}Instrumen dengan OWIN
Open Web Interface for .NET (OWIN) adalah spesifikasi middleware untuk aplikasi web .NET Framework.
Unduh proyek demo lengkap dan ikuti petunjuk dalam file README.md-nya.
Langkah 1: Instal paket NuGet
dotnet add package zipkin4net.middleware.aspnetcore
dotnet add package zipkin4net| Paket | Tujuan |
|---|---|
zipkin4net | Pustaka pelacakan inti. |
zipkin4net.middleware.aspnetcore | Middleware ASP.NET Core. Secara otomatis membuat rentang server untuk setiap permintaan HTTP masuk. |
Langkah 2: Daftarkan dan mulai tracer
// Konfigurasikan pelacakan.
TraceManager.SamplingRate = 1.0f;
var logger = new ConsoleLogger();
// Ganti dengan titik akhir Zipkin Anda dari Konsol Tracing Analysis.
// Jangan tambahkan /api/v2/spans ke URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
// Hentikan TraceManager saat aplikasi dimatikan.
var properties = new AppProperties(appBuilder.Properties);
var token = properties.OnAppDisposing;
if (token != CancellationToken.None)
{
token.Register(() =>
{
TraceManager.Stop();
});
}
// Daftarkan middleware OWIN.
appBuilder.UseZipkinTracer(System.Configuration.ConfigurationManager.AppSettings["applicationName"]);Langkah 3: Lacak permintaan HTTP keluar
Bungkus HttpClient Anda dengan TracingHandler untuk menyebarkan konteks jejak melintasi batas layanan.
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);
}Instrumen secara manual
Gunakan instrumentasi manual untuk mendapatkan kontrol penuh atas pembuatan rentang—misalnya, melacak pekerjaan latar belakang, konsumen pesan, atau protokol kustom.
Unduh proyek demo lengkap dan ikuti petunjuk dalam file README.md-nya.
Langkah 1: Instal paket NuGet
Hanya pustaka pelacakan inti yang diperlukan untuk instrumentasi manual.
dotnet add package zipkin4netLangkah 2: Daftarkan dan mulai tracer
TraceManager.SamplingRate = 1.0f;
var logger = new ConsoleLogger();
// Ganti dengan titik akhir Zipkin Anda dari Konsol Tracing Analysis.
// Jangan tambahkan /api/v2/spans ke URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);Langkah 3: Buat dan catat rentang
Buat rentang akar untuk setiap permintaan atau operasi, lalu catat event siklus hidupnya.
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 operasi Anda di sini
testCall();
trace.Record(Annotations.ClientRecv());Untuk mencatat rentang anak (misalnya, panggilan downstream dalam permintaan yang sama), panggil Child() pada jejak saat ini:
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 operasi Anda di sini
trace.Record(Annotations.ServerSend());(Opsional) Langkah 4: Tambahkan tag kustom
Lampirkan tag kustom ke rentang untuk mempermudah troubleshooting. Misalnya, catat kode status HTTP atau tandai error.
tracer.activeSpan().setTag("http.status_code", "200");Langkah 5: Sebarkan konteks jejak antar layanan
Dalam sistem terdistribusi, konteks jejak ikut serta dalam setiap permintaan RPC sehingga rentang dari layanan berbeda dapat dikorelasikan menjadi satu jejak tunggal. Pustaka zipkin4net menggunakan propagasi B3, yang meneruskan empat nilai melalui header HTTP:
| Bidang Jejak | Header HTTP |
|---|---|
| TraceId | X-B3-TraceId |
| ParentSpanId | X-B3-ParentSpanId |
| SpanId | X-B3-SpanId |
| Sampled | X-B3-Sampled |
Rentang Klien Rentang Server
┌──────────────────┐ ┌──────────────────┐
│ │ │ │
│ KonteksJejak │ Header Permintaan HTTP │ KonteksJejak │
│ ┌──────────────┐ │ ┌───────────────────┐ │ ┌──────────────┐ │
│ │ TraceId │ │ │ X-B3-TraceId │ │ │ TraceId │ │
│ │ │ │ │ │ │ │ │ │
│ │ ParentSpanId │ │ Inject │ X-B3-ParentSpanId │Extract │ │ ParentSpanId │ │
│ │ ├─┼─────────>│ ├────────┼>│ │ │
│ │ SpanId │ │ │ X-B3-SpanId │ │ │ SpanId │ │
│ │ │ │ │ │ │ │ │ │
│ │ Sampled │ │ │ X-B3-Sampled │ │ │ Sampled │ │
│ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │
│ │ │ │
└──────────────────┘ └──────────────────┘Sisi klien — injeksikan konteks jejak ke header permintaan keluar:
_injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers);Sisi server — ekstrak konteks jejak dari header permintaan masuk:
var traceContext = traceExtractor.Extract(context.Request.Headers);
var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);Jika tidak ada konteks jejak dalam header masuk, jejak akar baru akan dibuat. Jika ada, jejak yang sudah ada akan dilanjutkan.
FAQ
T: Mengapa tidak ada data yang muncul di Konsol Tracing Analysis setelah saya menjalankan demo?
J: Verifikasi bahwa URL titik akhir Zipkin dalam konfigurasi HttpZipkinSender Anda benar. Salin titik akhir langsung dari Konsol Tracing Analysis. URL tersebut tidak boleh menyertakan /api/v2/spans.
// Benar: gunakan titik akhir dasar tanpa /api/v2/spans
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");