Jika Anda memerlukan pelacakan terdistribusi untuk aplikasi Go tetapi sudah menggunakan Zipkin dalam stack Anda, Anda dapat melaporkan data jejak langsung ke Managed Service for OpenTelemetry. Setelah integrasi, Anda dapat melihat topologi aplikasi, jejak, transaksi abnormal dan lambat, serta analisis SQL di Konsol.
Untuk fitur yang lebih lengkap, kemampuan pelacakan lanjutan, dan pengalaman yang lebih baik, sambungkan aplikasi Anda ke Managed Service for OpenTelemetry menggunakan protokol OpenTelemetry. Untuk informasi selengkapnya, lihat Persiapan.
ARMS menyediakan agen komersial yang dikembangkan sendiri dan didukung penuh untuk aplikasi Go. Agen ini memungkinkan instrumentasi non-intrusif serta menyediakan fitur yang lebih lengkap dan stabilitas yang lebih tinggi. Untuk informasi selengkapnya, lihat Pantau aplikasi Go.
Cara kerja
Zipkin adalah sistem pelacakan terdistribusi open source yang dikembangkan oleh Twitter untuk mengumpulkan data pemantauan waktu nyata dari berbagai sistem heterogen.
Aplikasi Go Anda menggunakan library klien Zipkin untuk membuat rentang (spans) dan mengirimkannya ke titik akhir Managed Service for OpenTelemetry melalui HTTP:
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Lingkungan pengembangan Go
Titik akhir Zipkin untuk wilayah Anda (lihat Dapatkan titik akhir Zipkin)
Dapatkan titik akhir Zipkin
Masuk ke Konsol Managed Service for OpenTelemetry.
Di panel navigasi sebelah kiri, klik Cluster Configurations. Pada halaman yang muncul, klik tab Access point information.
Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.
Atur Client ke Jaeger atau Zipkin. Dalam contoh ini, Jaeger dipilih.
Salin titik akhir dari kolom Related Information.

Jika aplikasi Anda berjalan di lingkungan produksi Alibaba Cloud, gunakan titik akhir VPC. Jika tidak, gunakan titik akhir publik. Gunakan titik akhir v2 kecuali Anda memiliki alasan khusus untuk menggunakan v1.
Mulai cepat
Jalankan demo yang telah disediakan untuk memverifikasi bahwa data jejak berhasil mencapai Managed Service for OpenTelemetry sebelum Anda menginstrumentasi aplikasi Anda sendiri.
Unduh proyek demo.
Buka
utils.godan ganti<endpoint>dengan titik akhir Zipkin yang Anda peroleh di Dapatkan titik akhir Zipkin.Instal dependensi:
dep ensureJalankan aplikasi:
go run main.goVerifikasi data jejak di Konsol:
Masuk ke Konsol ARMS.
Di panel navigasi sebelah kiri, pilih Application Monitoring > Applications.
Klik nama aplikasi untuk melihat data jejaknya.
Jika ikon
muncul di kolom Language, berarti aplikasi tersebut terhubung ke Application Monitoring. Jika muncul tanda hubung (-), berarti aplikasi tersebut terhubung ke Managed Service for OpenTelemetry.
Instrumentasi aplikasi Anda
Bagian ini menjelaskan setiap langkah instrumentasi: menambahkan dependensi, membuat tracer, merekam rentang, memberi tag pada rentang, dan menyebarkan konteks antar layanan.
Tambahkan dependensi
Tambahkan library Zipkin Go dan router ke proyek Anda:
[[constraint]]
name = "github.com/openzipkin/zipkin-go"
version = "0.1.1"
[[constraint]]
name = "github.com/gorilla/mux"
version = "1.6.2"Buat tracer
Tracer menghasilkan rentang yang mencatat waktu dan metadata operasi terdistribusi. Konfigurasikan tracer dengan titik akhir pelaporan, identitas layanan lokal, dan strategi pengambilan sampel.
func getTracer(serviceName string, ip string) *zipkin.Tracer {
// Buat reporter yang mengirim rentang ke titik akhir Zipkin.
// Ganti URL dengan titik akhir aktual Anda dari Konsol.
reporter := httpreporter.NewReporter("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_aokcdqnxyz@123456ff_abcdef123@abcdef123/api/v2/spans")
// Atur titik akhir lokal agar rentang diberi tag dengan identitas layanan ini.
endpoint, _ := zipkin.NewEndpoint(serviceName, ip)
// Ambil sampel setiap permintaan. Tingkatkan nilai modulo untuk mengurangi pengambilan sampel
// dan menurunkan biaya pelaporan (misalnya, NewModuloSampler(10) mengambil sampel 1 dari 10).
sampler := zipkin.NewModuloSampler(1)
// Inisialisasi tracer dengan reporter, titik akhir, dan sampler.
tracer, _ := zipkin.NewTracer(
reporter,
zipkin.WithLocalEndpoint(endpoint),
zipkin.WithSampler(sampler),
)
return tracer
}Buat rentang
Rentang akar (root span) mencatat operasi tingkat atas dari suatu permintaan:
span := tracer.StartSpan("some_operation")
// ... lakukan operasi ...
span.Finish()Untuk melacak sub-operasi dalam satu permintaan, buat rentang anak dengan meneruskan konteks induk:
childSpan := tracer.StartSpan("some_operation2", zipkin.Parent(span.Context()))
// ... lakukan sub-operasi ...
childSpan.Finish()Tambahkan tag kustom dan anotasi (opsional)
Tag melampirkan metadata pasangan kunci-nilai ke rentang untuk keperluan penyaringan dan debugging. Misalnya, catat kode status HTTP:
childSpan.Tag("http.status_code", statusCode)Anotasi mencatat event berstempel waktu dalam rentang. Gunakan untuk mencatat error beserta stack trace-nya:
childSpan := tracer.StartSpan("some_operation2", zipkin.Parent(span.Context()))
// ... lakukan operasi ...
var events = make(map[string]string)
events["event"] = "error"
events["stack"] = "Runtime Exception: unable to find userid"
jsonStr, err := json.Marshal(events)
if err == nil {
childSpan.Annotate(time.Now(), string(jsonStr))
}
childSpan.Finish()Sebarkan konteks antar layanan
Konteks jejak — TraceId, ParentSpanId, SpanId, dan Sampled — harus ikut dalam setiap panggilan prosedur jarak jauh (RPC) agar rentang dari berbagai layanan dapat terhubung menjadi satu jejak utuh. Zipkin menggunakan header B3 untuk menyebarkan konteks melalui HTTP dan gRPC.

Sisi klien: suntikkan konteks ke permintaan keluar
req, _ := http.NewRequest("GET", "/", nil)
// Suntikkan konteks jejak sebagai header B3 ke permintaan HTTP.
injector := b3.InjectHTTP(req)
injector(sp.Context())Sisi server: ekstrak konteks dari permintaan masuk
req, _ := http.NewRequest("GET", "/", nil)
b3.InjectHTTP(req)(sp.Context())
b.ResetTimer()
_ = b3.ExtractHTTP(copyRequest(req))Pemecahan masalah
Tidak ada data setelah instrumentasi
Periksa output error dari aplikasi Anda:
failed the request with status code 403: Username atau password tidak valid. Salin seluruh titik akhir — termasuk segmen otentikasi — dari tab Access point information.Tidak ada error tetapi tidak ada data: Pastikan URL titik akhir mencakup protokol (
http://atauhttps://) dan jalur lengkap yang diakhiri dengan/api/v2/spans. Pastikan juga jaringan Anda mengizinkan koneksi outbound ke titik akhir tersebut.Konfigurasi pengambilan sampel:
NewModuloSamplerdengan nilai lebih besar dari 1 hanya mengambil sampel sebagian permintaan. Atur ke1saat pengujian untuk menangkap setiap permintaan.