Menambahkan rekaman aktivitas dan metrik kustom ke aplikasi

Dokumen ini menjelaskan cara menambahkan kode visibilitas ke aplikasi Anda dengan menggunakan OpenTelemetry. OpenTelemetry menyediakan library instrumentasi yang menghasilkan telemetri untuk framework populer. Anda dapat meningkatkan telemetri yang dihasilkan library dengan menambahkan instrumentasi kustom yang mengukur perilaku khusus aplikasi Anda.

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 dengan yang dijelaskan dalam Membuat rekaman aktivitas dan metrik dengan Go, tersedia di GitHub. Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di GitHub.

Sebelum memulai

Enable the Cloud Logging, Cloud Monitoring, and Cloud Trace APIs.

Enable the APIs

Membuat rekaman aktivitas kustom

Untuk membuat trace kustom dari aplikasi, Anda menambahkan kode instrumentasi yang membuat rentang OpenTelemetry. Di OpenTelemetry, span adalah elemen penyusun untuk trace.

Untuk membuat span, lakukan hal berikut:

  1. Ubah aplikasi Anda untuk mendapatkan Tracer OpenTelemetry. Di OpenTelemetry, pelacak adalah pembuat span. Anda dapat memperoleh pelacak seperti yang ditunjukkan dalam 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 pelacak, yang diwakili oleh scopeName, mengidentifikasi cakupan instrumentasi dari rekaman aktivitas yang dihasilkan.

  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
    }
    

    Pada contoh kode sebelumnya, span yang dihasilkan dari fungsi computeSubrequests mewakili pekerjaan yang dilakukan oleh seluruh fungsi. Hal ini karena langkah pertama fungsi adalah memulai span baru menggunakan tracer.Start dan kata kunci 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 diambil selama eksekusi aplikasi.

Untuk membuat metrik, lakukan tindakan berikut:

  1. Ubah aplikasi Anda untuk mendapatkan Meter OpenTelemetry. Di OpenTelemetry, pengukur menyediakan akses ke instrumen metrik untuk merekam metrik. Anda dapat memperoleh meter seperti yang ditunjukkan dalam 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 pengukur, yang diwakili oleh scopeName, mengidentifikasi cakupan instrumentasi dari metrik yang dihasilkan.

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

    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, yang 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 dicatat dari instrumen ini diekspor dari aplikasi Anda berdasarkan konfigurasi pengekspor OpenTelemetry.

Langkah selanjutnya