全部产品
Search
文档中心

Application Real-Time Monitoring Service:Laporkan data jejak dari aplikasi Go menggunakan Zipkin

更新时间:Mar 12, 2026

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.

Penting
  • 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:

image

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Dapatkan titik akhir Zipkin

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di panel navigasi sebelah kiri, klik Cluster Configurations. Pada halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur Client ke Jaeger atau Zipkin. Dalam contoh ini, Jaeger dipilih.

  5. Salin titik akhir dari kolom Related Information.

Jaeger/Zipkin access point information
Catatan

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.

  1. Unduh proyek demo.

  2. Buka utils.go dan ganti <endpoint> dengan titik akhir Zipkin yang Anda peroleh di Dapatkan titik akhir Zipkin.

  3. Instal dependensi:

    dep ensure
  4. Jalankan aplikasi:

    go run main.go
  5. Verifikasi data jejak di Konsol:

    1. Masuk ke Konsol ARMS.

    2. Di panel navigasi sebelah kiri, pilih Application Monitoring > Applications.

    3. Klik nama aplikasi untuk melihat data jejaknya.

Catatan

Jika ikon icon 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.

1.jpg

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:// atau https://) dan jalur lengkap yang diakhiri dengan /api/v2/spans. Pastikan juga jaringan Anda mengizinkan koneksi outbound ke titik akhir tersebut.

  • Konfigurasi pengambilan sampel: NewModuloSampler dengan nilai lebih besar dari 1 hanya mengambil sampel sebagian permintaan. Atur ke 1 saat pengujian untuk menangkap setiap permintaan.