Dokumen ini menjelaskan cara memodifikasi aplikasi Go untuk mengumpulkan data pelacakan dan metrik menggunakan framework OpenTelemetry open source, dan cara menulis log JSON terstruktur ke standard out. Dokumen ini juga memberikan informasi tentang aplikasi contoh yang dapat Anda instal dan jalankan. Aplikasi dikonfigurasi untuk menghasilkan metrik, trace, dan log.
Tentang konteks
Context OpenTelemetry adalah mekanisme untuk membawa nilai cakupan eksekusi di seluruh API dalam suatu proses. Penggunaan konteks yang penting adalah membawa span aktif saat ini sehingga dapat diubah, atau dirujuk sebagai induk dari span baru saat dibuat. Ringkasnya:
Context mengacu pada mekanisme untuk menerapkan nilai cakupan eksekusi, termasuk span aktif saat ini, di seluruh API dalam suatu proses.
Konteks Span adalah objek yang tidak dapat diubah pada setiap span yang mencakup ID rekaman aktivitas, ID span, serta flag dan status untuk rekaman aktivitas.
Propagasi adalah mekanisme yang memindahkan konteks antara layanan dan proses.
context.Context
library standar Go juga membawa nilai
yang dicakup di seluruh batas API. Biasanya, fungsi pengendali di server menerima Context
yang masuk dan meneruskannya melalui rantai panggilan ke klien mana pun yang membuat permintaan keluar.
Library standar Go context.Context
digunakan sebagai implementasi
Konteks OpenTelemetry di Go.
Sebelum memulai
Aktifkan API Cloud Logging API, Cloud Monitoring API, and Cloud Trace API.
Melengkapi aplikasi untuk mengumpulkan trace, metrik, dan log
Untuk melengkapi aplikasi Anda guna mengumpulkan data pelacakan dan metrik, serta untuk menulis JSON terstruktur ke standard out, lakukan langkah-langkah berikut seperti yang dijelaskan di bagian selanjutnya dari dokumen ini:
- Mengonfigurasi fungsi utama
- Mengonfigurasi OpenTelemetry
- Mengonfigurasi logging terstruktur
- Menambahkan instrumentasi ke server HTTP
- Menautkan span trace dengan log dan metrik
- Menambahkan instrumentasi ke klien HTTP
- Menulis log terstruktur
Mengonfigurasi fungsi utama
Untuk mengonfigurasi aplikasi agar menulis log terstruktur serta mengumpulkan metrik dan
rekaman aktivitas menggunakan OpenTelemetry, perbarui fungsi main
untuk
mengonfigurasi paket logging terstruktur Go, slog
, dan untuk mengonfigurasi OpenTelemetry.
Contoh kode berikut mengilustrasikan fungsi main
yang memanggil dua
fungsi helper, setupLogging()
dan setupOpenTelemetry()
. Fungsi helper ini mengonfigurasi paket logging dan OpenTelemetry:
Setelah mengonfigurasi paket logging, untuk menautkan log ke data
rekaman aktivitas, Anda harus meneruskan Context
Go ke logger. Untuk mengetahui informasi selengkapnya,
lihat bagian Menulis log terstruktur dalam
dokumen ini.
Konfigurasi OpenTelemetry
Untuk mengumpulkan dan mengekspor trace dan metrik menggunakan protokol OTLP, konfigurasikan instance TracerProvider
dan MeterProvider
global.
Contoh kode berikut mengilustrasikan fungsi setupOpenTelemetry
,
yang dipanggil dari fungsi main
:
Contoh kode sebelumnya mengonfigurasi TextMapPropagator
global untuk menggunakan
format Konteks Rekaman Aktivitas W3C untuk menyebarkan konteks
rekaman aktivitas. Konfigurasi ini memastikan bahwa span memiliki
hubungan induk-turunan yang benar di dalam rekaman aktivitas.
Untuk memastikan semua telemetri yang tertunda dihapus dan koneksi ditutup
dengan baik, fungsi setupOpenTelemetry
menampilkan fungsi bernama
shutdown
, yang melakukan tindakan tersebut.
Mengonfigurasi logging terstruktur
Untuk menyertakan informasi rekaman aktivitas sebagai bagian dari log berformat JSON yang ditulis
ke output standar, konfigurasikan paket logging terstruktur Go, slog
.
Contoh kode berikut mengilustrasikan fungsi setupLogging
,
yang dipanggil dari fungsi main
:
Kode sebelumnya memanggil fungsi handlerWithSpanContext
, yang mengekstrak
informasi dari instance Context
dan menambahkan informasi tersebut sebagai atribut
ke log. Atribut ini kemudian dapat digunakan untuk mengkorelasikan log dengan trace:
logging.googleapis.com/trace
: Nama resource trace yang terkait dengan entri log.logging.googleapis.com/spanId
: ID span dengan pelacakan yang dikaitkan dengan entri log.logging.googleapis.com/trace_sampled
: Nilai kolom ini harustrue
ataufalse
.
Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat struktur
LogEntry
.
Menambahkan instrumentasi ke server HTTP
Untuk menambahkan instrumentasi trace dan metrik ke permintaan yang ditangani oleh server HTTP, gunakan OpenTelemetry. Contoh berikut menggunakan pengendali otelhttp
untuk menyebarkan konteks, dan untuk instrumentasi rekaman aktivitas dan metrik:
Dalam kode sebelumnya, pengendali otelhttp
menggunakan instance TracerProvider
, MeterProvider
, dan TextMapPropagator
global. Fungsi
setupOpenTelemetry
mengonfigurasi instance ini.
Menautkan span rekaman aktivitas dengan log dan metrik
Untuk menautkan span server dan klien, serta mengaitkan metrik dan log, teruskan instance Go Context
ke permintaan HTTP dan saat Anda menulis log.
Contoh berikut mengilustrasikan pengendali rute yang mengekstrak instance
Go Context
dan meneruskan instance tersebut ke logger dan ke
fungsi callSingle
, yang membuat permintaan HTTP keluar:
Pada kode sebelumnya, panggilan fungsi r.Context()
mengambil Context
Go dari permintaan HTTP.
Menambahkan instrumentasi ke klien HTTP
Untuk memasukkan konteks rekaman aktivitas ke permintaan HTTP keluar dan menambahkan
instrumentasi metrik dan trace, panggil fungsi otelhttp.Get
.
Dalam contoh berikut, fungsi callSingle
melakukan tindakan ini:
Dalam kode sebelumnya, pengendali otelhttp
menggunakan instance TracerProvider
, MeterProvider
, dan TextMapPropagator
global. Fungsi
setupOpenTelemetry
mengonfigurasi instance ini.
Menulis log terstruktur
Untuk menulis log terstruktur yang tertaut ke rekaman aktivitas, gunakan paket logging
terstruktur Go, slog
, lalu teruskan instance Context
Go ke logger.
Instance Context
Go diperlukan saat Anda ingin menautkan log ke span.
Misalnya, pernyataan berikut menunjukkan cara memanggil metode InfoContext
untuk slog
, dan menggambarkan cara menambahkan kolom subRequests
ke instance JSON:
slog.InfoContext(r.Context(), "handle /multi request", slog.Int("subRequests", subRequests))
Menjalankan aplikasi contoh yang dikonfigurasi untuk mengumpulkan telemetri
Aplikasi contoh menggunakan format yang tidak bergantung pada vendor, termasuk JSON untuk log dan OTLP untuk metrik dan trace. Untuk merutekan telemetri ke Google Cloud, contoh ini menggunakan Collector
OpenTelemetry yang dikonfigurasi dengan pengekspor Google. Generator beban di
aplikasi mengeluarkan permintaan ke rute aplikasi.
Mendownload dan men-deploy aplikasi
Untuk menjalankan contoh, lakukan hal berikut:
-
Di konsol Google Cloud, aktifkan Cloud Shell.
Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.
Meng-cloning repository
git clone https://github.com/GoogleCloudPlatform/golang-samples
Buka direktori OpenTelemetry:
cd golang-samples/opentelemetry/instrumentation
Buat dan jalankan contoh:
docker compose up --abort-on-container-exit
Jika Anda tidak menjalankan Cloud Shell, jalankan aplikasi dengan variabel lingkungan
GOOGLE_APPLICATION_CREDENTIALS
yang mengarah ke file kredensial. Kredensial Default Aplikasi menyediakan file kredensial di$HOME/.config/gcloud/application_default_credentials.json
.# Set environment variables export GOOGLE_CLOUD_PROJECT="PROJECT_ID" export GOOGLE_APPLICATION_CREDENTIALS="$HOME/.config/gcloud/application_default_credentials.json" export USERID="$(id -u)" # Run docker compose -f docker-compose.yaml -f docker-compose.creds.yaml up --abort-on-container-exit
Melihat metrik Anda
Instrumentasi OpenTelemetry di aplikasi contoh menghasilkan metrik Prometheus yang dapat Anda tampilkan menggunakan Metrics Explorer:
Prometheus/http_server_duration/histogram
mencatat durasi permintaan server dan menyimpan hasilnya dalam histogram.Prometheus/http_server_request_content_length_total/counter
mencatat durasi konten permintaan untuk rute HTTP/multi
dan/single
. Pengukuran untuk metrik ini bersifat kumulatif, yang berarti setiap nilai mewakili total karena pengumpulan nilai dimulai.Prometheus/http_server_response_content_length_total/counter
mencatat panjang konten respons untuk rute HTTP/multi
dan/single
. Pengukuran untuk metrik ini bersifat kumulatif.
-
Di panel navigasi Konsol Google Cloud, pilih Monitoring, lalu pilih leaderboard Metrics Explorer:
- Pada elemen Metrik, luaskan menu Pilih metrik, masukkan
http_server
di panel filter, lalu gunakan submenu untuk memilih jenis dan metrik resource tertentu:- Di menu Active resources, pilih Prometheus Target.
- Di menu Active metric criteria, pilih Http.
- Di menu Metrik aktif, pilih metrik.
- Klik Terapkan.
- Konfigurasi cara data ditampilkan.
Jika pengukuran untuk metrik bersifat kumulatif, Metrics Explorer otomatis menormalisasi data yang diukur berdasarkan periode penyelarasan, sehingga diagram akan menampilkan rasio. Untuk mengetahui informasi selengkapnya, lihat Jenis, jenis, dan konversi.
Saat nilai bilangan bulat atau ganda diukur, seperti dengan dua metrik
counter
, Metrics Explorer otomatis menjumlahkan semua deret waktu. Untuk melihat data rute HTTP/multi
dan/single
, tetapkan menu pertama entri Aggregation ke None.Untuk informasi selengkapnya tentang cara mengonfigurasi diagram, lihat Memilih metrik saat menggunakan Metrics Explorer.
Melihat trace Anda
Untuk melihat data trace, lakukan langkah berikut:
-
Di panel navigasi konsol Google Cloud, pilih Trace, lalu pilih Trace explorer:
- Di diagram sebar, pilih rekaman aktivitas dengan URI
/multi
. Pada diagram Gantt di panel Trace details, pilih span yang berlabel
/multi
.Sebuah panel yang menampilkan informasi tentang permintaan HTTP akan terbuka. Detail ini mencakup metode, kode status, jumlah byte, dan agen pengguna pemanggil.
Untuk melihat log yang terkait dengan rekaman aktivitas ini, pilih tab Logs & Events.
Tab ini menunjukkan log individual. Untuk melihat detail entri log, luaskan entri log. Anda juga dapat mengklik View Logs dan melihat log menggunakan Logs Explorer.
Untuk mengetahui informasi selengkapnya tentang cara menggunakan penjelajah Cloud Trace, lihat Menemukan dan menjelajahi trace.
Melihat log
Dari Logs Explorer, Anda dapat memeriksa log, dan Anda juga dapat melihat rekaman aktivitas terkait, jika ada.
-
Di panel navigasi konsol Google Cloud, pilih Logging, lalu pilih Logs Explorer:
Temukan log dengan deskripsi
handle /multi request
.Untuk melihat detail log, luaskan entri log. Di kolom
jsonPayload
, ada entri berlabelsubRequests
. Entri ini ditambahkan oleh pernyataan dalam fungsihandleMulti
.Klik Traces pada entri log dengan pesan "handle /multi request", lalu pilih View trace details.
Panel Trace details akan terbuka dan menampilkan trace yang dipilih.
Untuk mengetahui informasi selengkapnya tentang penggunaan Logs Explorer, baca Melihat log menggunakan Logs Explorer.
Langkah selanjutnya
- OpenTelemetry
- Ringkasan OTLP
- Logging terstruktur
- Memecahkan Masalah Google Cloud Managed Service for Prometheus
- Memecahkan masalah Cloud Trace