اطلاعات ردیابی ابزار با استفاده از OpenTelemetry

1. مقدمه

5af4a7e43b0feaab.png

آخرین به روز رسانی: 05-03-2021

قابلیت مشاهده برنامه

مشاهده پذیری و OpenTelemetry

مشاهده پذیری اصطلاحی است که برای توصیف یک ویژگی از یک سیستم استفاده می شود. یک سیستم با قابلیت مشاهده به تیم ها اجازه می دهد تا به طور فعال سیستم خود را اشکال زدایی کنند. در آن زمینه، سه رکن مشاهده پذیری; گزارش‌ها، متریک‌ها و ردیابی‌ها ابزار اساسی سیستم برای به دست آوردن قابلیت مشاهده هستند.

OpenTelemetry مجموعه‌ای از مشخصات و SDK است که ابزار دقیق و صادرات داده‌های تله‌متری (لاگ‌ها، متریک‌ها و ردیابی‌ها) را تسریع می‌کند. OpenTelemetry یک پروژه استاندارد باز و جامعه محور تحت CNCF است. با استفاده از کتابخانه‌هایی که پروژه و اکوسیستم آن ارائه می‌کند، توسعه‌دهندگان می‌توانند برنامه‌های کاربردی خود را به روش خنثی فروشنده و در برابر معماری‌های چندگانه ابزار کنند.

ردیابی توزیع شده

در میان گزارش‌ها، متریک‌ها و ردیابی‌ها، ردیابی تله‌متری است که تأخیر بخش خاصی از فرآیند را در سیستم نشان می‌دهد. به‌ویژه در عصر میکروسرویس‌ها، ردیابی توزیع‌شده محرک قوی برای کشف تنگناهای تأخیر در سیستم توزیع کلی است.

هنگام تجزیه و تحلیل ردیابی های توزیع شده، تجسم داده های ردیابی، کلید درک تاخیرهای کلی سیستم در یک نگاه است. در ردیابی توزیع‌شده، ما مجموعه‌ای از تماس‌ها را برای پردازش یک درخواست واحد به نقطه ورودی سیستم به شکل Trace شامل چند دهانه مدیریت می‌کنیم.

Span واحدی از کار انجام شده در یک سیستم توزیع شده را نشان می دهد که زمان شروع و توقف را ثبت می کند. دهانه ها اغلب روابط سلسله مراتبی بین یکدیگر دارند - در تصویر زیر، تمام دهانه های کوچکتر، گستره های فرزند از یک گستره پیام / بزرگ هستند، و در یک Trace جمع شده اند که مسیر کار را از طریق یک سیستم نشان می دهد.

adbd3ecd69d410cb.png

Google Cloud Trace یکی از گزینه‌های بک‌اند ردیابی توزیع‌شده است و به خوبی با سایر محصولات موجود در Google Cloud ادغام شده است.

چیزی که خواهی ساخت

در این نرم‌افزار، شما می‌خواهید اطلاعات ردیابی را در سرویس‌هایی به نام «Shakesapp» که بر روی یک خوشه Kubernetes در حال اجرا در موتور Google Kubernetes اجرا می‌شود، ابزار کنید. معماری Shakesapp به شرح زیر است:

68873c018a7be7de.png

  • کلاینت ها یک رشته پرس و جو را به سرور ارسال می کنند
  • سرور پرس و جو را از مشتری می پذیرد، همه آثار Shakespare را در قالب متن از Google Cloud Storage واکشی می کند، خطوطی را که حاوی پرس و جو هستند جستجو می کند و شماره خطی را که مطابقت دارد به مشتری برمی گرداند.

شما اطلاعات ردیابی را در سراسر درخواست تنظیم خواهید کرد.

چیزی که یاد خواهید گرفت

  • چگونه با کتابخانه های OpenTelemetry Trace در پروژه Python شروع کنیم
  • نحوه ایجاد یک span با کتابخانه
  • نحوه انتشار زمینه های دهانه در سراسر سیم بین اجزای برنامه
  • نحوه ارسال داده های ردیابی به Google Cloud Trace
  • چگونه ردیابی را در Google Cloud Trace تجزیه و تحلیل کنیم

این کد لبه توضیح می دهد که چگونه میکروسرویس های خود را ابزار دقیق کنید. برای سهولت درک، این مثال فقط شامل 3 مؤلفه (مولد بار، مشتری و سرور) است، اما می‌توانید همان فرآیند توضیح داده شده در این کد لبه را برای سیستم‌های پیچیده‌تر و بزرگ‌تر اعمال کنید.

آنچه شما نیاز دارید

  • آشنایی با پایتون 3

2. راه اندازی و الزامات

تنظیم محیط خود به خود

اگر قبلاً یک حساب Google (Gmail یا Google Apps) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و یک پروژه جدید ایجاد کنید.

اگر قبلاً پروژه ای دارید، روی منوی کشویی انتخاب پروژه در سمت چپ بالای کنسول کلیک کنید:

15b8b6ac4d917005.png

و روی دکمه "پروژه جدید" در گفتگوی حاصل کلیک کنید تا یک پروژه جدید ایجاد کنید:

7136b3ee36ebaf89.png

اگر قبلاً پروژه ای ندارید، باید یک دیالوگ مانند این را ببینید تا اولین پروژه خود را ایجاد کنید:

90977ce514204b51.png

گفتگوی بعدی ایجاد پروژه به شما امکان می دهد جزئیات پروژه جدید خود را وارد کنید:

6d9573e346e930b4.png

شناسه پروژه را به خاطر بسپارید، که یک نام منحصر به فرد در تمام پروژه های Google Cloud است (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.

در مرحله بعد، اگر قبلاً این کار را انجام نداده اید، برای استفاده از منابع Google Cloud و فعال کردن Cloud Trace API، باید صورتحساب را در Developers Console فعال کنید .

eb5325f65619ad6a.png

گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید). قیمت‌های Google Cloud Trace، Google Kubernetes Engine و Google Artifacat Registry در اسناد رسمی ذکر شده‌اند.

کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند که باید این نرم افزار کد را کاملاً رایگان کند.

Google Cloud Shell Setup

در حالی که Google Cloud و Google Cloud Trace می‌توانند از راه دور از لپ‌تاپ شما کار کنند، در این نرم‌افزار از Google Cloud Shell استفاده می‌کنیم، یک محیط خط فرمان که در Cloud اجرا می‌شود.

این ماشین مجازی مبتنی بر دبیان با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. این بدان معنی است که تمام چیزی که برای این کد لبه نیاز دارید یک مرورگر است (بله، روی کروم بوک کار می کند).

برای فعال کردن Cloud Shell از Cloud Console، کافی است روی Activate Cloud Shell کلیک کنید. gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK_OgjogdOgdOg3ZHK39gdOg 2A (تهیه و اتصال به محیط فقط چند لحظه طول می کشد).

ff81d016724c4f67.png

fbe156ee6edfbb2e.png

پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی PROJECT_ID شما تنظیم شده است.

gcloud auth list

خروجی فرمان

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

خروجی فرمان

[core]
project = <PROJECT_ID>

اگر به دلایلی پروژه تنظیم نشد، به سادگی دستور زیر را صادر کنید:

gcloud config set project <PROJECT_ID>

به دنبال PROJECT_ID خود هستید؟ بررسی کنید از چه شناسه ای در مراحل راه اندازی استفاده کرده اید یا آن را در داشبورد Cloud Console جستجو کنید:

a3e716fc9e7454e9.png

Cloud Shell همچنین برخی از متغیرهای محیطی را به صورت پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات آینده مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی فرمان

<PROJECT_ID>

در نهایت، منطقه پیش فرض و پیکربندی پروژه را تنظیم کنید.

gcloud config set compute/zone us-central1-f

شما می توانید مناطق مختلفی را انتخاب کنید. برای اطلاعات بیشتر، به مناطق و مناطق مراجعه کنید.

راه اندازی پایتون

در این کد لبه از "شعر" برای مدیریت دقیق نسخه های بسته استفاده می کنیم. دستور زیر را در Cloud Shell اجرا کنید:

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

یک خوشه Google Kubernetes راه اندازی کنید

در این کد لبه، شما مجموعه‌ای از ریزسرویس‌ها را در موتور Google Kubernetes (GKE) اجرا خواهید کرد. فرآیند این کد لبه به شرح زیر است:

  1. پروژه پایه را در Cloud Shell دانلود کنید
  2. میکروسرویس ها را در ظروف بسازید
  3. بارگذاری کانتینرها در Google Artifact Registry (GAR)
  4. کانتینرها را روی GKE مستقر کنید
  5. کد منبع خدمات را برای ابزار دقیق ردیابی تغییر دهید
  6. به مرحله 2 بروید

موتور Kubernetes را فعال کنید

ابتدا، ما یک خوشه Kubernetes را راه اندازی می کنیم که در آن Shakesapp روی GKE اجرا می شود، بنابراین باید GKE را فعال کنیم. به منوی "Kubernetes Engine" بروید و دکمه ENABLE را فشار دهید.

56c680e93e169731.png

اکنون شما آماده ایجاد یک خوشه Kubernetes هستید.

خوشه Kubernetes را ایجاد کنید

در Cloud Shell، دستور زیر را برای ایجاد یک خوشه Kubernetes اجرا کنید. لطفاً تأیید کنید که مقدار منطقه زیر ناحیه ای است که برای ایجاد مخزن رجیستری مصنوع استفاده کرده اید. اگر منطقه مخزن شما منطقه را پوشش نمی دهد، مقدار منطقه us-central1-f را تغییر دهید.

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

خروجی فرمان

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

رجیستری مصنوعات و راه اندازی اسکافولد

اکنون یک خوشه Kubernetes آماده برای استقرار داریم. در مرحله بعد ما برای یک رجیستری کانتینر برای کانتینرهای فشار و استقرار آماده می کنیم. برای این مرحله، باید GAR و skaffold را برای استفاده از آن راه اندازی کنیم.

راه اندازی رجیستری مصنوع

به منوی "Artifact Registry" بروید و دکمه ENABLE را فشار دهید.

f7493243bae0cdf7.png

پس از چند لحظه، مرورگر مخزن GAR را مشاهده خواهید کرد. روی دکمه "ایجاد مخزن" کلیک کنید و نام مخزن را وارد کنید.

f97f337f5476651.png

در این codelab، من مخزن جدید trace-codelab را نام می‌برم. فرمت آرتیفکت "Docker" و نوع مکان "Region" است. منطقه ای نزدیک به منطقه ای را که برای منطقه پیش فرض موتور محاسباتی Google تنظیم کرده اید، انتخاب کنید. به عنوان مثال، این مثال در بالا "us-central1-f" را انتخاب کرد، بنابراین در اینجا "us-central1 (آیووا)" را انتخاب می کنیم. سپس روی دکمه "CREATE" کلیک کنید.

2f04143077ca56db.png

اکنون "trace-codelab" را در مرورگر مخزن مشاهده می کنید.

7a3c1f47346bea15.png

ما بعداً به اینجا باز خواهیم گشت تا مسیر رجیستری را بررسی کنیم.

راه اندازی داربست

Skaffold ابزار مفیدی است وقتی روی ساخت میکروسرویس هایی کار می کنید که در Kubernetes اجرا می شوند. گردش کار ساخت، هل دادن و استقرار کانتینرهای برنامه ها را با مجموعه کوچکی از دستورات کنترل می کند. Skaffold به طور پیش‌فرض از Docker Registry به‌عنوان رجیستری کانتینر استفاده می‌کند، بنابراین باید skaffold را برای شناسایی GAR در هنگام هل دادن کانتینرها پیکربندی کنید.

دوباره Cloud Shell را باز کنید و تأیید کنید که skaffold نصب شده است. (Cloud Shell به طور پیش فرض skaffold را در محیط نصب می کند.) دستور زیر را اجرا کنید و نسخه skaffold را ببینید.

skaffold version

خروجی فرمان

v1.20.0

اکنون، می توانید مخزن پیش فرض را برای استفاده از skaffold ثبت کنید. برای به دست آوردن مسیر رجیستری، خود را به داشبورد Artifact Registry بروید و روی نام مخزنی که در مرحله قبل تنظیم کرده اید کلیک کنید.

55173fe922f40327.png

سپس مسیرهای پودر سوخاری را در بالای صفحه خواهید دید. کلیک کنید e157b1359c3edc06.png برای کپی کردن مسیر رجیستری در کلیپ بورد.

a9b0fa44c37e0178.png

با کلیک بر روی دکمه کپی، گفتگو را در پایین مرورگر با پیامی مانند:

"us-central1-docker.pkg.dev/psychic-order-307806/trace-codelab" کپی شده است

به پوسته ابر برگردید. دستور skaffold config set default-repo را با مقداری که به تازگی از داشبورد کپی کرده اید اجرا کنید.

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

خروجی فرمان

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

همچنین، باید رجیستری را روی پیکربندی Docker پیکربندی کنید. دستور زیر را اجرا کنید:

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

خروجی فرمان

{
  "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

اکنون می‌توانید مرحله بعدی را برای راه‌اندازی یک ظرف Kubernetes در GKE انجام دهید.

خلاصه

در این مرحله، محیط Codelab خود را تنظیم می کنید:

  • Cloud Shell را راه اندازی کنید
  • یک مخزن Artifact Registy برای رجیستری کانتینر ایجاد کرد
  • برای استفاده از رجیستری کانتینر، skaffold را تنظیم کنید
  • یک خوشه Kubernetes ایجاد کرد که در آن میکروسرویس های Codelab اجرا می شوند

بعدی

در مرحله بعدی، میکروسرویس های خود را روی خوشه ایجاد، فشار داده و مستقر خواهید کرد

3. ساخت، فشار دادن و استقرار میکروسرویس ها

مطالب Codelab را دانلود کنید

در مرحله قبل، ما تمام پیش نیازهای این کد لبه را تنظیم کرده ایم. اکنون شما آماده هستید تا کل میکروسرویس ها را روی آنها اجرا کنید. مواد Codelab در GitHub میزبانی می شوند، بنابراین آنها را با دستور git زیر در محیط Cloud Shell دانلود کنید.

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

ساختار دایرکتوری پروژه به صورت زیر است:

shakesapp-python
├── LICENSE
├── manifests
│   ├── client.yaml
│   ├── loadgen.yaml
│   └── server.yaml
├── proto
│   └── shakesapp.proto
├── skaffold.yaml
└── src
    ├── client
    ├── loadgen
    └── server
  • manifests: فایل های مانیفست Kubernetes
  • proto: تعریف پروتو برای ارتباط بین مشتری و سرور
  • src: دایرکتوری برای کد منبع هر سرویس
  • skaffold.yaml: فایل پیکربندی برای skaffold

دستور skaffold را اجرا کنید

در نهایت شما آماده ساخت، فشار دادن و استقرار کل محتوا در خوشه Kubernetes هستید که به تازگی ایجاد کرده اید. به نظر می رسد که شامل چندین مرحله است، اما واقعیت این است که skaffold همه چیز را برای شما انجام می دهد. بیایید آن را با دستور زیر امتحان کنیم:

cd shakesapp-python
skaffold run --tail

به محض اجرای دستور، خروجی لاگ docker build را مشاهده می کنید و می توانید تأیید کنید که آنها با موفقیت به رجیستری منتقل شده اند.

خروجی فرمان

...
---> 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

پس از فشار دادن همه کانتینرهای سرویس، استقرار Kubernetes به طور خودکار شروع می شود.

خروجی فرمان

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

احتیاط : اگر با خطای «عدم دسترسی فشاری به مخزن تصویر مشخص شده» مواجه شدید، بررسی کنید که آیا دستور skaffold سعی می‌کند تصاویر را بدون توجه به پیکربندی شما در مخزن پیش‌فرض در skaffold، به Docker Hub (docker.io) منتقل کند. در این صورت، مانند زیر گزینه «–default-repo» را به «skaffold run» اضافه کنید.

$ skaffold run –tail –default-repo=us-central1-docker.pkg.dev/[project ID]/[نام مخزن]

پس از استقرار، گزارش‌های واقعی برنامه را خواهید دید که به stdout در هر کانتینر ارسال می‌شوند:

خروجی فرمان

[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"}

در نهایت شما آماده هستید تا برنامه خود را با OpenTelemetry برای ردیابی توزیع شده خدمات شروع کنید.

خلاصه

در این مرحله، مواد Codelab را در محیط خود آماده کرده اید و طبق انتظار اجراهای skaffold را تأیید کرده اید.

بعدی

در مرحله بعد، کد منبع سرویس loadgen را برای ابزار دقیق اطلاعات ردیابی تغییر می دهید.

4. ابزار دقیق برای HTTP

مفهوم ابزار دقیق و انتشار

قبل از ویرایش کد منبع، اجازه دهید به طور خلاصه نحوه عملکرد ردیابی های توزیع شده را در یک نمودار ساده توضیح دهم.

c8c659deaa9c9091.png

در این مثال، ما کد را برای صادر کردن اطلاعات Trace و Span به Cloud Trace و انتشار متن ردیابی در درخواست از سرویس loadgen به سرویس سرور، ابزار می‌کنیم.

برنامه باید ابرداده Trace مانند Trace ID و Span ID را ارسال کند تا Cloud Trace همه گستره هایی را که دارای Trace ID یکسان هستند در یک ردیابی جمع کند. همچنین برنامه نیاز به انتشار زمینه های ردیابی (ترکیب شناسه ردیابی و شناسه دهانه دهانه والد) در درخواست سرویس های پایین دستی دارد، به طوری که آنها می توانند از اینکه با کدام زمینه ردیابی مدیریت می کنند، آگاه شوند.

OpenTelemetry به شما کمک می کند:

  • برای تولید Trace ID و Span ID منحصر به فرد
  • برای صادرات Trace ID و Span ID به باطن
  • برای انتشار زمینه های ردیابی به سایر خدمات

دهانه اول ابزار

خدمات ژنراتور بار ابزار

Cloud Shell Editor را با فشار دادن دکمه باز کنید 776a11bfb2122549.png در سمت راست بالای Cloud Shell. src/loadgen/loadgen.py را از کاوشگر در سمت چپ باز کنید و تابع 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)

در تابع main ، حلقه ای را مشاهده می کنید که تابع call_client را در آن فراخوانی می کند. در پیاده سازی فعلی، بخش دارای 2 خط ورود به سیستم است که شروع و پایان فراخوانی تابع را ثبت می کند. حالا بیایید اطلاعات Span را ابزار کنیم تا تأخیر فراخوانی تابع را ردیابی کنیم.

ابتدا باید یک Span با Trace ID و Span ID منحصر به فرد ایجاد کنید. OpenTelemetry کتابخانه مفیدی را برای آن فراهم می کند. خطوط زیر را برای وارد کردن کتابخانه های OpenTelemetry به کد خود اضافه کنید.

 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

از آنجایی که مولد بار برنامه مشتری را در HTTP از طریق ماژول requests فراخوانی می کند، ما از بسته افزونه برای requests استفاده می کنیم و ابزار دقیق را فعال می کنیم.

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

سپس نمونه Tracer را تنظیم کنید که تنظیمات Trace Context و صادرکننده را کنترل کند

     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}")

توجه داشته باشید که از آنجایی که این یک کد برای درک چگونگی کارکرد ابزار دقیق ردیابی است، ما Tracer را برای ضبط تک تک درخواست‌ها و ارسال آن‌ها به باطن پیکربندی می‌کنیم. ( SimpleSpanProcessor() ) این برای محیط های تولید مناسب نیست، بنابراین هنگام ابزارسازی برنامه تولید خود حتماً این قسمت را تغییر دهید.

اکنون می توانید Spans را با Tracer ساز بزنید. نکته اینجاست که کاری که باید انجام دهید این است که یک Span را به طور صریح تولید کنید و تمام! اگرچه دو خط وجود دارد که ابرداده رویداد را به Span اضافه می کند، اما نیازی نیست که Trace ID و Span ID منحصر به فرد را به صورت دستی ایجاد کنید و آنها را در 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)

برای اینکه Docker build بسته های OpenTelemetry مورد نیاز را دریافت کند، دستور زیر را اجرا کنید:

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

می توانید تأیید کنید که شرح وابستگی مربوطه در pyproject.toml نوشته شده است.

خدمات مشتری ابزار

در قسمت قبل، قسمت محصور شده در مستطیل قرمز را در نقاشی زیر ابزارسازی کردیم. ما اطلاعات دهانه را در سرویس مولد بار ابزار دقیق کردیم. مشابه سرویس مولد بار، اکنون باید سرویس مشتری را ابزار دقیق کنیم. تفاوت با سرویس مولد بار در این است که سرویس مشتری باید اطلاعات Trace ID منتشر شده از سرویس مولد بار در هدر HTTP را استخراج کند و از شناسه برای تولید Spans استفاده کند.

ae074d4513c9931f.png

Cloud Shell Editor را باز کنید و ماژول‌های مورد نیاز را مانند سرویس load generator اضافه کنید.

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

متوجه شدید که به تازگی FlaskInstrumentor را وارد کرده‌اید که ابزار دقیق برای برنامه Flask را از طرف کاربران قادر می‌سازد تا هدرهای HTTP را استخراج کنند تا Trace Contexts را با یک خط کد به دست آورند. جامعه OpenTelemetry ادغام های مفید مشابهی را با سایر کتابخانه های اصلی فراهم می کند. برای اطلاعات بیشتر می توانید به اسناد رسمی مراجعه کنید.

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

قبل از شروع ابزار دقیق، مجدداً باید نمونه Tracer را مشابه آنچه در سرویس مولد بار انجام دادیم آماده کنید.

 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():
    ....

اکنون آماده اضافه کردن ابزار دقیق به هندلر است. main_handler() را پیدا کنید و بخشی را که درخواست gRPC را به سرویس سرور ارسال می کند تغییر دهید.

@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

به طور مشابه برای بارگذاری سرویس ژنراتور، بسته های مورد نیاز را با دستور زیر به pyproject.toml اضافه کنید.

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

سپس برنامه را با دستور skaffold run اجرا کنید و ببینید داشبورد Cloud Trace چه چیزی را نشان می دهد:

skaffold run --tail

پس از مشاهده برخی از پیام‌های ساخت، فشار و استقرار، گزارش‌های برنامه را در قالب‌های JSON مشاهده خواهید کرد. به Cloud Trace > Trace list بروید تا بررسی کنید که آیا اطلاعات ردیابی را دریافت کرده اید یا خیر. از آنجا که سرویس مولد بار درخواست ها را به صورت دوره ای به سرویس مشتری ارسال می کند و شما ردیابی را برای همه درخواست ها فعال کرده اید، شروع به دیدن نقاط زیادی در لیست ردیابی می کنید.

f7440360551980e.png

با کلیک بر روی یکی از آنها، نمودار آبشاری مانند زیر را مشاهده خواهید کرد که تأخیر هر بخش را در طول فرآیند درخواست و پاسخ توضیح می دهد. کادر انتخاب کنار «نمایش رویدادها» را پیدا کنید، سپس حاشیه‌نویسی‌های داخل نمودار آبشار را دریافت خواهید کرد. این حاشیه‌نویسی‌ها آنهایی هستند که با متد span.add_event() در کد قرار داده‌اید.

67596a4a313738.png

ممکن است متوجه شوید که دهانه های سرویس سرور را نمی بینید. درست است زیرا ما Spans را به هیچ وجه در سرویس سرور تنظیم نکرده ایم.

خلاصه

در این مرحله، سرویس مولد بار و سرویس سرویس گیرنده را تنظیم کرده‌اید و تأیید کرده‌اید که می‌توانید با موفقیت Trace Context را در بین سرویس‌ها منتشر کنید و اطلاعات Span را از هر دو سرویس به Cloud Trace صادر کنید.

بعدی

در مرحله بعد، سرویس مشتری و سرویس سرور را برای تأیید نحوه انتشار Trace Context از طریق gRPC، ابزار می‌دهید.

5. ابزار دقیق برای gRPC

در مرحله قبل، نیمه اول درخواست را در این میکروسرویس ابزارسازی کردیم. در این مرحله سعی می کنیم ارتباط gRPC بین سرویس مشتری و سرویس سرور را ابزار کنیم. (مستطیل سبز و بنفش در تصویر زیر)

c4dec3e741c3ab4f.png

ابزار دقیق برای مشتری gRPC

اکوسیستم OpenTelemetry کتابخانه های مفید زیادی را ارائه می دهد که به توسعه دهندگان کمک می کند تا برنامه های کاربردی را ابزار کنند. در مرحله قبل از ابزار دقیق برای ماژول "درخواست ها" استفاده کردیم. در این مرحله، همانطور که می‌خواهیم Trace Context را از طریق gRPC منتشر کنیم، از کتابخانه برای آن استفاده می‌کنیم.

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()

برای خدمات مشتری، کاری که باید برای ابزار دقیق انجام دهیم بسیار کوچک است. کاری که می خواهیم انجام دهیم انتشار Trace Context است که ترکیبی از Trace ID و Span ID از Span فعلی از طریق gRPC است. بنابراین ما GrpcInstrumentatorClient.instrument() را فراخوانی می کنیم تا مشتری gRPC در تابع hander بتواند Trace Context را در هدر HTTP زیر آن جاسازی کند.

اطمینان حاصل کنید که وابستگی های جدیدی را با دستور poetry add به pyproject.toml اضافه کنید:

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

ابزار دقیق برای سرور gRPC

مانند کاری که برای سرویس گیرنده gRPC انجام دادیم، ابزار دقیق را برای سرور gRPC می نامیم. وارداتی مانند موارد زیر را اضافه کنید و GrpcInstrumentationServer().instrument() در بالای فایل فراخوانی کنید.

احتیاط : حتما تماس بگیرید

GrpcInstrumentationServe() 

در این مرحله، نه

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()
+

و در مرحله بعد، صادرکننده را برای ارسال اطلاعات ردیابی به باطن Cloud Trace اضافه می‌کنید. کد زیر را در 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)

مطمئن شوید که بسته های جدید اضافه شده را در سرویس سرور اضافه کنید.

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"

میکروسرویس را اجرا کنید و ردیابی را تایید کنید

سپس کد اصلاح شده خود را با دستور skaffold اجرا کنید.

skaffold run --tail

اکنون دوباره یک دسته از ردیابی ها را در صفحه فهرست ردیابی Cloud Trace مشاهده می کنید. روی یکی از ردیابی ها کلیک کنید و اکنون متوجه می شوید که در سراسر درخواست از سرویس مولد بار تا سرویس سرور را در بر می گیرد.

141cb620245b689d.png

خلاصه

در این مرحله، شما ارتباطات مبتنی بر gRPC را با پشتیبانی از کتابخانه‌های اکوسیستم OpenTelemetry ابزارسازی کردید. همچنین، تأیید کردید که Trace Context تولید شده در سرویس مولد بار با موفقیت به سرویس سرور تحویل داده شد.

6. تبریک می گویم

شما با موفقیت ردیابی های توزیع شده را با OpenTelemery ایجاد کردید و تاخیرهای درخواستی را در سراسر میکروسرویس در Google Cloud Trace تأیید کردید.

برای تمرین های طولانی، می توانید موضوعات زیر را خودتان امتحان کنید.

  • پیاده سازی کنونی تمام دهانه های ایجاد شده توسط بررسی سلامت را ارسال می کند. چگونه آن گستره ها را از Cloud Traces فیلتر می کنید؟ اشاره اینجاست .
  • گزارش‌های رویداد را با دهانه‌ها مرتبط کنید و ببینید که چگونه در Google Cloud Trace و Google Cloud Logging کار می‌کند. اشاره اینجاست .
  • برخی از سرویس ها را با سرویسی به زبان دیگری جایگزین کنید و آن را با OpenTelemetry برای آن زبان ابزار کنید

احتیاط : Google Kubernetes Engine و Google Artifact Registry به طور مداوم منبع را مصرف می کنند.

پاک کن

پس از این کد، لطفاً خوشه Kubernetes را متوقف کنید و مطمئن شوید که پروژه را حذف کرده‌اید تا هزینه‌های غیرمنتظره‌ای در Google Kubernetes Engine، Google Cloud Trace، Google Artifact Registry دریافت نکنید.

ابتدا کلاستر را با دستور زیر حذف کنید:

skaffold delete

خروجی فرمان

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

پس از حذف خوشه، از پنجره منو، "IAM & Admin" > "Settings" را انتخاب کنید و سپس روی دکمه "SHUT DOWN" کلیک کنید.

578ca2b72a161e9d.png

سپس شناسه پروژه (نه نام پروژه) را در فرم موجود در گفتگو وارد کرده و خاموش شدن را تأیید کنید.