Menambahkan trace dan metrik kustom ke aplikasi Anda dengan OpenTelemetry

Dokumen ini menjelaskan cara menambahkan kode kemampuan observasi ke aplikasi Anda dengan menggunakan OpenTelemetry. OpenTelemetry menyediakan library instrumentasi yang menghasilkan telemetri untuk framework populer. Anda dapat memperkaya buatan library telemetri dengan menambahkan instrumentasi kustom yang mengukur perilaku spesifik per aplikasi.

Prinsip dan konsep yang dijelaskan dalam dokumen ini dapat diterapkan ke aplikasi yang ditulis dalam semua bahasa yang didukung oleh OpenTelemetry. Untuk mempelajari instrumentasi lebih lanjut, lihat dokumen berikut:

Kode contoh, yang merupakan aplikasi Go yang sama seperti yang dijelaskan di Membuat rekaman aktivitas dan metrik dengan Go, tersedia di GitHub. Untuk melihat sampel lengkap, klik Lainnya, lalu pilih View on GitHub.

Sebelum memulai

Aktifkan API Cloud Logging, Cloud Monitoring, and Cloud Trace.

Mengaktifkan API

Membuat rekaman aktivitas kustom

Untuk membuat rekaman aktivitas kustom dari aplikasi, tambahkan kode instrumentasi yang membuat span OpenTelemetry. Dalam OpenTelemetry, span adalah elemen penyusun untuk trace.

Untuk membuat span, lakukan langkah berikut:

  1. Memodifikasi aplikasi untuk memperoleh OpenTelemetry Tracer. Dalam OpenTelemetry, pelacak adalah pembuat span. Anda bisa mendapatkan {i>tracer<i} seperti yang ditunjukkan di kode berikut:

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    Nama tracer, yang direpresentasikan oleh scopeName, mengidentifikasi cakupan instrumentasi trace yang dibuat.

  2. Gunakan instance tracer untuk membuat span. Dalam contoh kode berikut, Fungsi computeSubrequests menghasilkan span setiap kali dipanggil:

    func computeSubrequests(r *http.Request, subRequests int) error {
    	// Add custom span representing the work done for the subrequests
    	ctx, span := tracer.Start(r.Context(), "subrequests")
    	defer span.End()
    
    	// Make specified number of http requests to the /single endpoint.
    	for i := 0; i < subRequests; i++ {
    		if err := callSingle(ctx); err != nil {
    			return err
    		}
    	}
    	// record number of sub-requests made
    	subRequestsHistogram.Record(ctx, int64(subRequests))
    	return nil
    }
    

    Dalam contoh kode sebelumnya, span yang dihasilkan dari Fungsi computeSubrequests mewakili pekerjaan yang dilakukan oleh seluruh fungsi tersebut. Hal ini karena langkah pertama dari fungsi ini adalah memulai span menggunakan kata kunci tracer.Start dan defer sebelum span.End() memastikan bahwa span berakhir tepat sebelum fungsi keluar.

Membuat metrik kustom

Untuk membuat metrik dari aplikasi, Anda menambahkan kode instrumentasi yang mencatat pengukuran yang dilakukan selama penggunaan aplikasi dalam proses eksekusi.

Untuk membuat metrik, lakukan tindakan berikut:

  1. Memodifikasi aplikasi untuk memperoleh OpenTelemetry Meter. Dalam OpenTelemetry, meteran menyediakan akses ke instrumen metrik untuk mencatat metrik. Anda bisa mendapatkan pengukur seperti yang ditunjukkan dalam kode:

    const scopeName = "github.com/GoogleCloudPlatform/golang-samples/opentelemetry/instrumentation/app/work"
    
    var (
    	meter                = otel.Meter(scopeName)
    	tracer               = otel.Tracer(scopeName)
    	sleepHistogram       metric.Float64Histogram
    	subRequestsHistogram metric.Int64Histogram
    )
    

    Nama pengukur, yang diwakili oleh scopeName, mengidentifikasi cakupan instrumentasi dari properti yang dibuat metrik.

  2. Gunakan instance meter untuk membuat instrumen yang dapat merekam metrik. Sebagai misalnya, dalam kode berikut, kita menggunakan meter untuk membuat OpenTelemetry Histogram:

    sleepHistogram, err = meter.Float64Histogram("example.sleep.duration",
    	metric.WithDescription("Sample histogram to measure time spent in sleeping"),
    	metric.WithExplicitBucketBoundaries(0.05, 0.075, 0.1, 0.125, 0.150, 0.2),
    	metric.WithUnit("s"))
    if err != nil {
    	panic(err)
    }

    Kode sebelumnya ini menghasilkan histogram bernama sleepHistogram.

  3. Gunakan instance sleepHistogram untuk mencatat waktu tidur, yaitu ditentukan saat fungsi randomSleep dipanggil:

    func randomSleep(r *http.Request) time.Duration {
    	// simulate the work by sleeping 100 to 200 ms
    	sleepTime := time.Duration(100+rand.Intn(100)) * time.Millisecond
    	time.Sleep(sleepTime)
    
    	hostValue := attribute.String("host.value", r.Host)
    	// custom histogram metric to record time slept in seconds
    	sleepHistogram.Record(r.Context(), sleepTime.Seconds(), metric.WithAttributes(hostValue))
    	return sleepTime
    }
    

    Metrik yang direkam dari instrumen ini diekspor dari aplikasi berdasarkan konfigurasi pengekspor OpenTelemetry Anda.

Langkah selanjutnya