Informasi rekaman aktivitas instrumen menggunakan OpenTelemetry

1. Pengantar

5af4a7e43b0feaab.pngS

Terakhir diperbarui: 05-03-2021

Kemampuan observasi aplikasi

Kemampuan observasi dan OpenTelemetry

Kemampuan observasi adalah istilah yang digunakan untuk menggambarkan atribut suatu sistem. Sistem dengan kemampuan observasi memungkinkan tim men-debug sistem secara aktif. Dalam konteks tersebut, tiga pilar kemampuan observasi; log, metrik, dan trace adalah instrumentasi dasar bagi sistem untuk memperoleh kemampuan observasi.

OpenTelemetry adalah serangkaian spesifikasi dan SDK yang mempercepat instrumentasi dan ekspor data telemetri (log, metrik, dan trace) yang diperlukan kemampuan observasi. OpenTelemetry adalah project standar terbuka dan berbasis komunitas di bawah CNCF. Dengan memanfaatkan library yang disediakan oleh project dan ekosistemnya, developer dapat menginstrumentasikan aplikasi mereka dengan cara yang netral vendor dan terhadap beberapa arsitektur.

Pelacakan Terdistribusi

Di antara log, metrik, dan trace, trace adalah telemetri yang memberi tahu latensi bagian tertentu dari proses dalam sistem. Khususnya di era microservice, trace terdistribusi merupakan pendorong kuat untuk mengetahui bottleneck latensi dalam sistem terdistribusi secara keseluruhan.

Saat menganalisis trace terdistribusi, visualisasi data trace adalah kunci untuk memahami keseluruhan latensi sistem secara sekilas. Dalam pelacakan terdistribusi, kami menangani serangkaian panggilan untuk memproses satu permintaan ke titik entri sistem dalam bentuk Pelacakan yang berisi beberapa Span.

Span mewakili unit kerja individual yang dilakukan dalam sistem terdistribusi, mencatat waktu mulai dan berhenti. Span sering memiliki hubungan hierarkis satu sama lain - pada gambar di bawah ini, semua span yang lebih kecil adalah span turunan dari span /messages yang besar, dan dirangkai menjadi satu Trace yang menunjukkan jalur kerja melalui suatu sistem.

adbd3ecd69d410cb.png

Google Cloud Trace adalah salah satu opsi untuk backend trace terdistribusi dan terintegrasi dengan baik dengan produk lain di Google Cloud.

Yang akan Anda bangun

Dalam codelab ini, Anda akan memanfaatkan informasi rekaman aktivitas di layanan yang disebut "Shakesapp" yang berjalan di cluster Kubernetes yang berjalan di Google Kubernetes Engine. Arsitektur Shakesapp dijelaskan di bawah ini:

68873c018a7be7de.pngS

  • Klien mengirimkan {i>string<i} kueri ke server
  • Server menerima kueri dari klien, mengambil semua karya Shakespare dalam format teks dari Google Cloud Storage, menelusuri baris yang berisi kueri, dan menampilkan nomor baris yang cocok dengan klien.

Anda akan menginstrumentasikan informasi rekaman aktivitas di seluruh permintaan.

Yang akan Anda pelajari

  • Cara mulai menggunakan library OpenTelemetry Trace di project Python
  • Cara membuat span dengan library
  • Cara menyebarkan konteks span di seluruh kabel di antara komponen aplikasi
  • Cara mengirim data trace ke Google Cloud Trace
  • Cara menganalisis trace di Google Cloud Trace

Codelab ini menjelaskan cara melengkapi microservice. Agar mudah dipahami, contoh ini hanya berisi 3 komponen (generator beban, klien, dan server), tetapi Anda dapat menerapkan proses yang sama seperti yang dijelaskan dalam codelab ini ke sistem yang lebih kompleks dan besar.

Yang Anda butuhkan

  • Pengetahuan tentang Python 3

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

Jika belum memiliki Akun Google (Gmail atau Google Apps), Anda harus membuatnya. Login ke Google Cloud Platform console (console.cloud.google.com) dan buat project baru.

Jika Anda sudah memiliki project, klik menu pull-down pilihan project di kiri atas konsol:

15b8b6ac4d917005.pngS

dan klik tombol 'PROJECT BARU' dalam dialog yang dihasilkan untuk membuat project baru:

7136b3ee36ebaf89.pngS

Jika belum memiliki project, Anda akan melihat dialog seperti ini untuk membuat project pertama:

90977ce514204b51.pngS

Dialog pembuatan project berikutnya memungkinkan Anda memasukkan detail project baru:

6d9573e346e930b4.pngS

Ingat project ID yang merupakan nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project_ID selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

Selanjutnya, jika belum melakukannya, Anda harus mengaktifkan penagihan di Developers Console untuk menggunakan resource Google Cloud dan mengaktifkan Cloud Trace API.

eb5325f65619ad6a.png

Menjalankan melalui codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "pembersihan" di akhir dokumen ini). Harga Google Cloud Trace, Google Kubernetes Engine, dan Google Artifacat Registry tercantum dalam dokumentasi resmi.

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai $300, yang menjadikan codelab ini sepenuhnya gratis.

Penyiapan Google Cloud Shell

Meskipun Google Cloud dan Google Cloud Trace dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yaitu lingkungan command line yang berjalan di Cloud.

Mesin virtual berbasis Debian ini memuat semua alat pengembangan yang akan Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Ini berarti bahwa semua yang Anda perlukan untuk codelab ini adalah browser (ya, ini berfungsi di Chromebook).

Untuk mengaktifkan Cloud Shell dari Konsol Cloud, cukup klik Aktifkan Cloud Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (hanya perlu waktu beberapa saat untuk melakukan penyediaan dan terhubung ke lingkungan).

ff81d016724c4f67.png

fbe156ee6edfbb2e.png

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke PROJECT_ID.

gcloud auth list

Output perintah

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika, untuk beberapa alasan, project belum disetel, cukup jalankan perintah berikut:

gcloud config set project <PROJECT_ID>

Mencari PROJECT_ID Anda? Periksa ID yang Anda gunakan di langkah-langkah penyiapan atau cari di dasbor Cloud Console:

a3e716fc9e7454e9.png

Cloud Shell juga menetapkan beberapa variabel lingkungan secara default, yang mungkin berguna saat Anda menjalankan perintah di masa mendatang.

echo $GOOGLE_CLOUD_PROJECT

Output perintah

<PROJECT_ID>

Terakhir, tetapkan zona dan konfigurasi project default.

gcloud config set compute/zone us-central1-f

Anda dapat memilih berbagai zona yang berbeda. Untuk informasi selengkapnya, lihat Region & Zona.

Penyiapan Python

Dalam codelab ini, kita menggunakan "puisi" untuk mengelola versi paket secara ketat. Jalankan perintah berikut di Cloud Shell:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3 -
source $HOME/.poetry/env

Menyiapkan Cluster Google Kubernetes

Dalam codelab ini, Anda akan menjalankan cluster microservice di Google Kubernetes Engine (GKE). Proses codelab ini adalah sebagai berikut:

  1. Mendownload project dasar pengukuran ke Cloud Shell
  2. Membangun microservice ke dalam container
  3. Mengupload container ke Google Artifact Registry (GAR)
  4. Men-deploy container ke GKE
  5. Mengubah kode sumber layanan untuk instrumentasi rekaman aktivitas
  6. Lanjutkan ke langkah 2

Mengaktifkan Kubernetes Engine

Pertama, kita menyiapkan cluster Kubernetes tempat Shakesapp berjalan di GKE, jadi kita perlu mengaktifkan GKE. Buka menu "Kubernetes Engine" dan tekan tombol ENABLE.

56c680e93e169731.png

Sekarang Anda siap untuk membuat cluster Kubernetes.

Membuat cluster Kubernetes

Di Cloud Shell, jalankan perintah berikut untuk membuat cluster Kubernetes. Konfirmasi bahwa nilai zona berada di bawah region yang telah Anda gunakan untuk pembuatan repositori Artifact Registry. Ubah nilai zona us-central1-f jika region repositori Anda tidak mencakup zona tersebut.

gcloud container clusters create otel-trace-codelab --zone us-central1-f \
--num-nodes 1 \
--machine-type e2-highcpu-4

Output perintah

Creating cluster otel-trace-codelab in us-central1-f... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/psychic-order-307806/zones/us-central1-f/clusters/otel-trace-codelab].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-f/otel-trace-codelab?project=psychic-order-307806
kubeconfig entry generated for otel-trace-codelab.
NAME                LOCATION       MASTER_VERSION    MASTER_IP        MACHINE_TYPE  NODE_VERSION      NUM_NODES  STATUS
otel-trace-codelab  us-central1-f  1.18.12-gke.1210  104.154.162.176  e2-medium     1.18.12-gke.1210  3          RUNNING

Artifact Registry dan penyiapan skaffold

Sekarang kita memiliki cluster Kubernetes yang siap untuk di-deploy. Selanjutnya, kita akan menyiapkan container registry untuk container push dan deploy. Untuk langkah ini, kita perlu menyiapkan GAR dan skaffold agar dapat menggunakannya.

Penyiapan Artifact Registry

Buka menu "Artifact Registry" dan tekan tombol ENABLE.

f7493243bae0cdf7.png

Setelah beberapa saat, Anda akan melihat browser repositori GAR. Klik "CREATE REPOSITORY" dan masukkan nama repositori.

f97f337f5476651.png

Dalam codelab ini, saya memberi nama repositori baru trace-codelab. Format artefak adalah "Docker" dan jenis lokasi adalah "Wilayah". Pilih region yang dekat dengan region yang Anda tetapkan untuk zona default Google Compute Engine. Misalnya, contoh ini memilih "us-central1-f" di atas, jadi di sini kita pilih "us-central1 (Iowa)". Kemudian klik tombol "CREATE" tombol.

2f04143077ca56db.pngS

Sekarang Anda melihat "trace-codelab" di browser repositori.

7a3c1f47346bea15.pngS

Kita akan kembali ke sini nanti untuk memeriksa jalur registry.

Penyiapan Skaffold

Skaffold adalah alat yang praktis saat Anda membangun microservice yang berjalan di Kubernetes. Platform ini menangani alur kerja membangun, mendorong, dan men-deploy container aplikasi dengan serangkaian perintah yang kecil. Skaffold secara default menggunakan Docker Registry sebagai container registry, sehingga Anda perlu mengonfigurasi skaffold untuk mengenali GAR saat mengirim container.

Buka Cloud Shell lagi dan pastikan skaffold telah diinstal. (Cloud Shell menginstal skaffold ke dalam lingkungan secara default.) Jalankan perintah berikut dan lihat versi skaffold.

skaffold version

Output perintah

v1.20.0

Sekarang, Anda dapat mendaftarkan repositori default yang akan digunakan oleh skaffold. Untuk mendapatkan jalur registry, buka dasbor Artifact Registry dan klik nama repositori yang baru saja Anda siapkan di langkah sebelumnya.

55173fe922f40327.pngS

Kemudian Anda akan melihat jejak breadcrumb di bagian atas halaman. Klik ikon e157b1359c3edc06.png untuk menyalin jalur registry ke papan klip.

a9b0fa44c37e0178.png

Saat mengklik tombol salin, Anda melihat dialog di bagian bawah browser dengan pesan seperti:

&quot;us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab&quot; telah disalin

Kembali ke Cloud Shell. Jalankan perintah skaffold config set default-repo dengan nilai yang baru saja Anda salin dari dasbor.

skaffold config set default-repo us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab

Output perintah

set value default-repo to us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab for context gke_stackdriver-sandbox-3438851889_us-central1-b_stackdriver-sandbox

Selain itu, Anda perlu mengonfigurasi registry ke konfigurasi Docker. Jalankan perintah berikut:

gcloud auth configure-docker us-central1-docker.pkg.dev --quiet

Output perintah

{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "us-central1-docker.pkg.dev": "gcloud"
  }
}
Adding credentials for: us-central1-docker.pkg.dev

Sekarang Anda siap melanjutkan ke langkah selanjutnya untuk menyiapkan container Kubernetes di GKE.

Ringkasan

Pada langkah ini, Anda akan menyiapkan lingkungan codelab:

  • Menyiapkan Cloud Shell
  • Membuat repositori Artifact Registy untuk container registry
  • Menyiapkan skaffold untuk menggunakan container registry
  • Membuat cluster Kubernetes tempat microservice codelab berjalan

Berikutnya

Pada langkah berikutnya, Anda akan membangun, mengirim, dan men-deploy microservice ke cluster

3. Membangun, mengirim, dan men-deploy microservice

Mendownload materi codelab

Pada langkah sebelumnya, kami telah menyiapkan semua prasyarat untuk codelab ini. Sekarang Anda siap menjalankan seluruh microservice di atasnya. Materi codelab dihosting di GitHub, jadi download materi tersebut ke lingkungan Cloud Shell dengan perintah git berikut.

cd ~
git clone https://github.com/GoogleCloudPlatform/opentelemetry-trace-codelab-python.git

Struktur direktori project adalah sebagai berikut:

shakesapp-python
├── LICENSE
├── manifests
│   ├── client.yaml
│   ├── loadgen.yaml
│   └── server.yaml
├── proto
│   └── shakesapp.proto
├── skaffold.yaml
└── src
    ├── client
    ├── loadgen
    └── server
  • manifes: File manifes Kubernetes
  • proto: definisi proto untuk komunikasi antara klien dan server
  • direktori src: untuk kode sumber setiap layanan
  • skaffold.yaml: File konfigurasi untuk skaffold

Menjalankan perintah skaffold

Terakhir, Anda siap membangun, mengirim, dan men-deploy seluruh konten ke cluster Kubernetes yang baru saja Anda buat. Suara ini mengandung beberapa langkah, tetapi skaffold yang sebenarnya dapat melakukan semuanya untuk Anda. Mari kita coba dengan perintah berikut:

cd shakesapp-python
skaffold run --tail

Segera setelah menjalankan perintah, Anda akan melihat output log docker build dan dapat mengonfirmasi bahwa perintah tersebut berhasil dikirim ke registry.

Output perintah

...
---> Running in c39b3ea8692b
 ---> 90932a583ab6
Successfully built 90932a583ab6
Successfully tagged us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step1
The push refers to repository [us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice]
cc8f5a05df4a: Preparing
5bf719419ee2: Preparing
2901929ad341: Preparing
88d9943798ba: Preparing
b0fdf826a39a: Preparing
3c9c1e0b1647: Preparing
f3427ce9393d: Preparing
14a1ca976738: Preparing
f3427ce9393d: Waiting
14a1ca976738: Waiting
3c9c1e0b1647: Waiting
b0fdf826a39a: Layer already exists
88d9943798ba: Layer already exists
f3427ce9393d: Layer already exists
3c9c1e0b1647: Layer already exists
14a1ca976738: Layer already exists
2901929ad341: Pushed
5bf719419ee2: Pushed
cc8f5a05df4a: Pushed
step1: digest: sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe size: 2001

Setelah semua container layanan dikirim, deployment Kubernetes akan dimulai secara otomatis.

Output perintah

sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8 size: 1997
Tags used in deployment:
 - serverservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/serverservice:step4@sha256:8acdbe3a453001f120fb22c11c4f6d64c2451347732f4f271d746c2e4d193bbe
 - clientservice -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/clientservice:step4@sha256:b71fce0a96cea08075dc20758ae561cf78c83ff656b04d211ffa00cedb77edf8
 - loadgen -> us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab/loadgen:step4@sha256:eea2e5bc8463ecf886f958a86906cab896e9e2e380a0eb143deaeaca40f7888a
Starting deploy...
 - deployment.apps/clientservice created
 - service/clientservice created
 - deployment.apps/loadgen created
 - deployment.apps/serverservice created
 - service/serverservice created

Perhatian: Jika Anda mendapatkan error seperti "Tidak ada akses push ke repositori image tertentu", periksa apakah perintah skaffold mencoba mengirim image ke Docker Hub (docker.io), terlepas dari konfigurasi Anda pada repo default di skaffold. Dalam hal ini, coba tambahkan "–default-repo" opsi "skaffold run" seperti di bawah ini.

$ skaffold run –tail –default-repo=us-central1-docker.pkg.dev/[ID project]/[nama repositori]

Setelah deployment, Anda akan melihat log aplikasi sebenarnya yang dimunculkan ke stdout di setiap container seperti ini:

Output perintah

[server] {"event": "starting server: 0.0.0.0:5050", "severity": "info", "timestamp": "2021-03-17T05:25:56.758575Z"}
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Starting gunicorn 20.0.4
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[client] [2021-03-17 05:25:54 +0000] [1] [INFO] Using worker: threads
[client] [2021-03-17 05:25:54 +0000] [7] [INFO] Booting worker with pid: 7
[client] {"event": "server address is serverservice:5050", "severity": "info", "timestamp": "2021-03-17T05:25:54.888627Z"}
[client] {"event": "request to server with query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.550923Z"}
[server] {"event": "query: world", "severity": "info", "timestamp": "2021-03-17T05:26:11.567048Z"}
[loadgen] {"event": "check connectivity: http://clientservice:8080/_healthz", "severity": "info", "timestamp": "2021-03-17T05:26:11.533605Z"}
[loadgen] {"event": "/_healthz response: ok", "severity": "info", "timestamp": "2021-03-17T05:26:11.544267Z"}
[loadgen] {"event": "confirmed connection ot clientservice", "severity": "info", "timestamp": "2021-03-17T05:26:11.544527Z"}

Terakhir, Anda siap untuk mulai menginstrumentasikan aplikasi dengan OpenTelemetry untuk pelacakan layanan yang terdistribusi.

Ringkasan

Pada langkah ini, Anda telah menyiapkan materi codelab di lingkungan Anda dan mengonfirmasi operasi skaffold seperti yang diharapkan.

Berikutnya

Pada langkah berikutnya, Anda akan memodifikasi kode sumber layanan loadgen untuk menginstrumentasikan informasi trace.

4. Instrumentasi untuk HTTP

Konsep instrumentasi dan propagasi rekaman aktivitas

Sebelum mengedit kode sumber, saya akan menjelaskan secara singkat cara kerja trace terdistribusi dalam diagram sederhana.

c8c659deaa9c9091.png

Dalam contoh ini, kami menginstrumentasikan kode untuk mengekspor informasi Trace dan Span ke Cloud Trace dan menyebarkan konteks trace di seluruh permintaan dari layanan loadgen ke layanan server.

Aplikasi harus mengirim metadata Trace seperti ID Trace dan ID Span agar Cloud Trace dapat menyusun semua span yang memiliki ID Trace yang sama ke dalam satu trace. Selain itu, aplikasi harus menyebarkan konteks trace (kombinasi ID Trace dan ID Span dari span induk) saat meminta layanan downstream, sehingga aplikasi dapat mengetahui konteks trace mana yang ditangani.

OpenTelemetry membantu Anda:

  • untuk membuat Trace ID dan ID Span unik
  • untuk mengekspor ID Rekaman Aktivitas dan ID Span ke backend
  • untuk menyebarkan konteks trace ke layanan lain

Rentang pertama instrumen

Layanan generator beban instrumen

Buka Cloud Shell Editor dengan menekan tombol 776a11bfb2122549.pngSdi kanan atas Cloud Shell. Buka src/loadgen/loadgen.py dari penjelajah di panel kiri dan temukan fungsi main.

src/loadgen/loadgen.py

def main():
    ...
    # start request loop to client service
    logger.info("start client request loop")
    addr = f"http://{target}"
    while True:
        logger.info("start request to client")
        call_client(addr)
        logger.info("end request to client")
        time.sleep(2.0)

Dalam fungsi main, Anda akan melihat loop yang memanggil fungsi call_client di dalamnya. Dalam implementasi saat ini, sectoin memiliki 2 baris log yang merekam awal dan akhir panggilan fungsi. Sekarang, mari kita pelajari informasi Span untuk melacak latensi panggilan fungsi.

Pertama, Anda perlu membuat Span dengan ID Rekaman Aktivitas dan ID Span yang unik. OpenTelemetry menyediakan pustaka yang berguna untuknya. Tambahkan baris berikut untuk mengimpor library OpenTelemetry ke dalam kode Anda.

 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.instrumentation.requests import RequestsInstrumentor
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

Karena generator pemuatan memanggil aplikasi klien di HTTP melalui modul requests, kita menggunakan paket ekstensi untuk requests dan mengaktifkan instrumentasi.

 from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
+
+RequestsInstrumentor().instrument()

Kemudian, siapkan instance Tracer yang menangani setelan Pengekspor dan Trace Contenxt

     target = os.environ.get("CLIENT_ADDR", "0.0.0.0:8080")

+    exporter = CloudTraceSpanExporter()
+    trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+    tracer = trace.get_tracer(__name__)
+    propagate.set_global_textmap(CloudTraceFormatPropagator())
+    trace.set_tracer_provider(TracerProvider())
+
     # connectivity check to client service
     healthz = f"http://{target}/_healthz"
     logger.info(f"check connectivity: {healthz}")

Perhatikan bahwa karena ini adalah codelab untuk memahami cara kerja instrumentasi rekaman aktivitas, kita mengonfigurasi Tracer untuk merekam setiap permintaan dan mengirimkannya ke backend. (SimpleSpanProcessor()) Ini tidak cocok dengan lingkungan produksi, jadi pastikan untuk mengubah bagian ini saat Anda melengkapi aplikasi produksi.

Sekarang Anda dapat memanfaatkan Span dengan Tracer. Intinya di sini adalah yang perlu Anda lakukan adalah menghasilkan Span secara eksplisit, dan selesai! Meskipun ada dua baris yang menambahkan metadata peristiwa ke Span, Anda tidak perlu membuat Trace ID dan ID Span unik secara manual dan menyematkannya ke Span.

     logger.info("start client request loop")
     addr = f"http://{target}"
     while True:
-        logger.info("start request to client")
-        call_client(addr)
-        logger.info("end request to client")
+        with tracer.start_as_current_span("loadgen") as root_span:
+            root_span.add_event(name="request_start")
+            logger.info("start request to client")
+            call_client(addr)
+            root_span.add_event(name="request_end")
+            logger.info("end request to client")
         time.sleep(2.0)

Agar build Docker dapat mengambil paket OpenTelemetry yang diperlukan, jalankan perintah berikut:

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-requests=^0.20b0"

Anda dapat mengonfirmasi bahwa deskripsi dependensi yang sesuai ditulis dalam pyproject.toml.

Layanan klien instrumen

Di bagian sebelumnya, kita telah melengkapi bagian yang tertutup dalam persegi panjang merah pada gambar di bawah ini. Kami menginstrumentasikan informasi span dalam layanan generator beban. Sama seperti layanan generator beban, sekarang kita perlu menginstrumentasikan layanan klien. Perbedaan dengan layanan generator beban adalah bahwa layanan klien harus mengekstrak informasi ID Pelacakan yang disebarkan dari layanan generator beban di header HTTP dan menggunakan ID tersebut untuk membuat Span.

ae074d4513c9931f.png

Buka Cloud Shell Editor dan tambahkan modul yang diperlukan seperti yang kami lakukan untuk layanan generator beban.

src/client/client.py

 import flask
 import grpc
 import structlog
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import \
+    CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc

Anda perhatikan bahwa Anda baru saja mengimpor FlaskInstrumentor yang mengaktifkan instrumentasi otomatis untuk aplikasi Flask atas nama pengguna mengekstrak header HTTP guna mendapatkan Konteks Trace dengan satu baris kode. Komunitas OpenTelemetry menyediakan integrasi berguna yang serupa dengan library besar lainnya. Untuk informasi selengkapnya, Anda dapat membaca dokumentasi resmi.

 app = flask.Flask(__name__)
+FlaskInstrumentor().instrument_app(app)

Sebelum memulai instrumentasi, sekali lagi, Anda perlu menyiapkan instance Tracer yang mirip dengan yang kita lakukan di layanan generator beban.

 logger.info(f"server address is {SERVER_ADDR}")

+exporter = CloudTraceSpanExporter()
+trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(exporter))
+propagate.set_global_textmap(CloudTraceFormatPropagator())
+trace.set_tracer_provider(TracerProvider())

 @app.route("/")
 def main_handler():
    ....

Sekarang siap menambahkan instrumentasi di pengendali. Cari main_handler() dan ubah bagian yang menampilkan permintaan gRPC ke layanan server.

@app.route("/")
def main_handler():
    q, count = random.choice(list(queries.items()))

    # get Tracer
    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("client") as cur_span:
        channel = grpc.insecure_channel(SERVER_ADDR)
        stub = shakesapp_pb2_grpc.ShakespeareServiceStub(channel)
        logger.info(f"request to server with query: {q}")
        cur_span.add_event("server_call_start")
        resp = stub.GetMatchCount(shakesapp_pb2.ShakespeareRequest(query=q))
        cur_span.add_event("server_call_end")
        if count != resp.match_count:
            raise UnexpectedResultError(
                f"The expected count for '{q}' was {count}, but result was {resp.match_count } obtained"
            )
        result = str(resp.match_count)
        logger.info(f"matched count for '{q}' is {result}")
    return result

Demikian pula untuk layanan generator pemuatan, tambahkan paket yang diperlukan ke pyproject.toml dengan perintah berikut.

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-flask=^0.20b0"

Kemudian, coba luncurkan aplikasi dengan perintah skaffold run dan lihat apa yang ditampilkan dasbor Cloud Trace:

skaffold run --tail

Setelah melihat beberapa pesan build, push, dan deploy, Anda akan melihat log aplikasi dalam format JSON. Buka Cloud Trace > Daftar trace untuk memeriksa apakah Anda mendapatkan informasi trace. Karena layanan generator beban mengirimkan permintaan ke layanan klien secara berkala dan Anda telah mengaktifkan trace untuk semua permintaan, Anda akan mulai melihat banyak titik pada daftar trace.

f7440360551980e.png

Dengan mengklik salah satunya, Anda akan melihat grafik waterfall seperti di bawah ini yang menjelaskan latensi dari setiap bagian selama proses permintaan dan respons. Temukan kotak centang di samping "Tampilkan Peristiwa", lalu Anda akan mendapatkan anotasi di dalam grafik waterfall. Anotasi ini adalah anotasi yang Anda instrumentasikan dalam kode dengan metode span.add_event().

67596a4a313738.png

Anda mungkin memperhatikan bahwa Anda tidak melihat span dari layanan server. Itu benar karena kita belum menginstrumentasikan Span dalam layanan server sama sekali.

Ringkasan

Pada langkah ini, Anda telah menginstrumentasikan layanan generator beban dan layanan klien serta mengonfirmasi bahwa Anda berhasil menyebarkan Konteks Trace di seluruh layanan dan mengekspor informasi Span dari kedua layanan ke Cloud Trace.

Berikutnya

Pada langkah berikutnya, Anda akan melengkapi layanan klien dan layanan server untuk mengonfirmasi cara menyebarkan Konteks Pelacakan melalui gRPC.

5. Instrumentasi untuk gRPC

Pada langkah sebelumnya, kita telah melengkapi paruh pertama permintaan di microservice ini. Pada langkah ini, kami mencoba melengkapi komunikasi gRPC antara layanan klien dan layanan server. (Persegi panjang hijau dan ungu pada gambar di bawah)

c4dec3e741c3ab4f.png

Instrumentasi otomatis untuk klien gRPC

Ekosistem OpenTelemetry menawarkan banyak library berguna yang membantu developer melengkapi aplikasi. Pada langkah sebelumnya, kita menggunakan instrumentasi otomatis untuk "permintaan" ruang lingkup modul ini. Pada langkah ini, saat kami mencoba menyebarkan Konteks Rekaman Aktivitas melalui gRPC, kita akan menggunakan library untuknya.

src/client/client.py

 import flask
 import grpc
 import structlog
 from opentelemetry import propagate, trace
 from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
 from opentelemetry.instrumentation.flask import FlaskInstrumentor
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient
 from opentelemetry.sdk.trace import TracerProvider
 from opentelemetry.sdk.trace.export import SimpleSpanProcessor
 from opentelemetry.propagators.cloud_trace_propagator import \
     CloudTraceFormatPropagator
 import shakesapp_pb2
 import shakesapp_pb2_grpc


 app = flask.Flask(__name__)
 FlaskInstrumentor().instrument_app(app)
+GrpcInstrumentorClient().instrument()

Untuk layanan klien, yang perlu kita lakukan untuk instrumentasi cukup kecil. Yang ingin kita lakukan adalah menyebarkan Konteks Rekaman Aktivitas, yang merupakan kombinasi ID Rekaman Aktivitas dan ID Span dari Span saat ini melalui gRPC. Jadi, kita memanggil GrpcInstrumentatorClient.instrument() sehingga klien gRPC dalam fungsi hander dapat menyematkan Konteks Trace ke header HTTP di bawahnya.

Pastikan untuk menambahkan dependensi baru ke pyproject.toml dengan perintah poetry add:

poetry add "opentelemetry-instrumentation-grpc=^0.20b0"

Instrumentasi otomatis untuk server gRPC

Seperti yang kami lakukan untuk klien gRPC, kami menyebut instrumentasi otomatis untuk server gRPC. Tambahkan impor seperti berikut dan panggil GrpcInstrumentationServer().instrument() di bagian atas file.

Perhatian: Pastikan untuk memanggil

GrpcInstrumentationServe() 

Pada langkah ini, bukan

GrpcInstrumentationClient()

.

src/server/server.py

 import grpc
 import structlog
 from google.cloud import storage
 from grpc_health.v1 import health_pb2, health_pb2_grpc
+from opentelemetry import propagate, trace
+from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
+from opentelemetry.instrumentation.grpc import GrpcInstrumentorServer
+from opentelemetry.sdk.trace import TracerProvider
+from opentelemetry.sdk.trace.export import SimpleSpanProcessor
+from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator

 import shakesapp_pb2
 import shakesapp_pb2_grpc


 BUCKET_NAME = "dataflow-samples"
 BUCKET_PREFIX = "shakespeare/"

+# enable auto gRPC server trace instrumentation
+GrpcInstrumentorServer().instrument()
+

Kemudian, Anda akan menambahkan pengekspor untuk mengirim informasi trace ke backend Cloud Trace. Tambahkan kode berikut di fungsi serve().

def serve():
+    # start trace exporter
+    trace.set_tracer_provider(TracerProvider())
+    trace.get_tracer_provider().add_span_processor(
+        SimpleSpanProcessor(CloudTraceSpanExporter())
+    )
+    propagators.set_global_textmap(CloudTraceFormatPropagator())
+
+    # add gRPC services to server
     server = grpc.server(futures.ThreadPoolExecutor(max_workers=4))
     service = ShakesappService()
     shakesapp_pb2_grpc.add_ShakespeareServiceServicer_to_server(service, server)
     health_pb2_grpc.add_HealthServicer_to_server(service, server)

Pastikan untuk menambahkan paket yang baru ditambahkan di layanan server.

poetry add "opentelemetry-exporter-gcp-trace=^1.0.0rc0"
poetry add "opentelemetry-instrumentation-grpc=^0.20b0"
poetry add "opentelemetry-propagator-gcp=^1.0.0rc0"
poetry add "opentelemetry-instrumentation=^0.20b0"

Menjalankan microservice dan mengonfirmasi rekaman aktivitas

Kemudian jalankan kode yang telah dimodifikasi dengan perintah skaffold.

skaffold run --tail

Sekarang, Anda akan melihat banyak trace di halaman daftar Trace Cloud Trace. Klik salah satu trace dan sekarang Anda akan menemukan bahwa permintaan mencakup permintaan mulai dari layanan load generator hingga layanan server.

141cb620245b689d.png

Ringkasan

Pada langkah ini, Anda telah menginstrumentasikan komunikasi berbasis gRPC dengan dukungan dari library ekosistem OpenTelemetry. Selain itu, Anda juga mengonfirmasi bahwa Trace Context yang dihasilkan di layanan generator beban berhasil dikirim ke layanan server.

6. Selamat

Anda telah berhasil membuat rekaman aktivitas terdistribusi dengan OpenTelemery dan latensi permintaan yang dikonfirmasi di seluruh microservice di Google Cloud Trace.

Untuk latihan yang diperpanjang, Anda dapat mencoba sendiri topik berikut.

  • Penerapan saat ini mengirimkan semua span yang dihasilkan oleh health check. Bagaimana cara memfilter span tersebut dari Cloud Trace? Petunjuknya ada di sini.
  • Kaitkan log peristiwa dengan span dan lihat cara kerjanya di Google Cloud Trace dan Google Cloud Logging. Petunjuknya ada di sini.
  • Ganti beberapa layanan dengan layanan dalam bahasa lain dan coba instrumentasikannya dengan OpenTelemetry untuk bahasa tersebut

Perhatian: Google Kubernetes Engine dan Google Artifact Registry menggunakan resource secara terus-menerus.

Pembersihan

Setelah codelab ini, hentikan cluster Kubernetes dan pastikan untuk menghapus project sehingga Anda tidak menerima tagihan yang tidak terduga di Google Kubernetes Engine, Google Cloud Trace, Google Artifact Registry.

Pertama, hapus cluster dengan perintah berikut:

skaffold delete

Output perintah

Cleaning up...
 - deployment.apps "clientservice" deleted
 - service "clientservice" deleted
 - deployment.apps "loadgen" deleted
 - deployment.apps "serverservice" deleted
 - service "serverservice" deleted

Setelah menghapus cluster, dari panel menu, pilih "IAM & "Admin" &gt; "Setelan", lalu klik "MATIKAN" tombol.

578ca2b72a161e9d.pngS

Kemudian masukkan Project ID (bukan Nama Project) dalam formulir di dialog dan konfirmasi penonaktifan.