1. مقدمه
آخرین به روز رسانی: 05-03-2021
قابلیت مشاهده برنامه
مشاهده پذیری و OpenTelemetry
مشاهده پذیری اصطلاحی است که برای توصیف یک ویژگی از یک سیستم استفاده می شود. یک سیستم با قابلیت مشاهده به تیم ها اجازه می دهد تا به طور فعال سیستم خود را اشکال زدایی کنند. در آن زمینه، سه رکن مشاهده پذیری; گزارشها، متریکها و ردیابیها ابزار اساسی سیستم برای به دست آوردن قابلیت مشاهده هستند.
OpenTelemetry مجموعهای از مشخصات و SDK است که ابزار دقیق و صادرات دادههای تلهمتری (لاگها، متریکها و ردیابیها) را تسریع میکند. OpenTelemetry یک پروژه استاندارد باز و جامعه محور تحت CNCF است. با استفاده از کتابخانههایی که پروژه و اکوسیستم آن ارائه میکند، توسعهدهندگان میتوانند برنامههای کاربردی خود را به روش خنثی فروشنده و در برابر معماریهای چندگانه ابزار کنند.
ردیابی توزیع شده
در میان گزارشها، متریکها و ردیابیها، ردیابی تلهمتری است که تأخیر بخش خاصی از فرآیند را در سیستم نشان میدهد. بهویژه در عصر میکروسرویسها، ردیابی توزیعشده محرک قوی برای کشف تنگناهای تأخیر در سیستم توزیع کلی است.
هنگام تجزیه و تحلیل ردیابی های توزیع شده، تجسم داده های ردیابی، کلید درک تاخیرهای کلی سیستم در یک نگاه است. در ردیابی توزیعشده، ما مجموعهای از تماسها را برای پردازش یک درخواست واحد به نقطه ورودی سیستم به شکل Trace شامل چند دهانه مدیریت میکنیم.
Span واحدی از کار انجام شده در یک سیستم توزیع شده را نشان می دهد که زمان شروع و توقف را ثبت می کند. دهانه ها اغلب روابط سلسله مراتبی بین یکدیگر دارند - در تصویر زیر، تمام دهانه های کوچکتر، گستره های فرزند از یک گستره پیام / بزرگ هستند، و در یک Trace جمع شده اند که مسیر کار را از طریق یک سیستم نشان می دهد.
Google Cloud Trace یکی از گزینههای بکاند ردیابی توزیعشده است و به خوبی با سایر محصولات موجود در Google Cloud ادغام شده است.
چیزی که خواهی ساخت
در این نرمافزار، شما میخواهید اطلاعات ردیابی را در سرویسهایی به نام «Shakesapp» که بر روی یک خوشه Kubernetes در حال اجرا در موتور Google Kubernetes اجرا میشود، ابزار کنید. معماری Shakesapp به شرح زیر است:
- کلاینت ها یک رشته پرس و جو را به سرور ارسال می کنند
- سرور پرس و جو را از مشتری می پذیرد، همه آثار 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 ) وارد شوید و یک پروژه جدید ایجاد کنید.
اگر قبلاً پروژه ای دارید، روی منوی کشویی انتخاب پروژه در سمت چپ بالای کنسول کلیک کنید:
و روی دکمه "پروژه جدید" در گفتگوی حاصل کلیک کنید تا یک پروژه جدید ایجاد کنید:
اگر قبلاً پروژه ای ندارید، باید یک دیالوگ مانند این را ببینید تا اولین پروژه خود را ایجاد کنید:
گفتگوی بعدی ایجاد پروژه به شما امکان می دهد جزئیات پروژه جدید خود را وارد کنید:
شناسه پروژه را به خاطر بسپارید، که یک نام منحصر به فرد در تمام پروژه های Google Cloud است (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID نامیده خواهد شد.
در مرحله بعد، اگر قبلاً این کار را انجام نداده اید، برای استفاده از منابع Google Cloud و فعال کردن Cloud Trace API، باید صورتحساب را در Developers Console فعال کنید .
گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید). قیمتهای Google Cloud Trace، Google Kubernetes Engine و Google Artifacat Registry در اسناد رسمی ذکر شدهاند.
- قیمت گذاری برای Google Cloud Observability
- قیمت گذاری | مستندات موتور Kubernetes
- قیمت گذاری رجیستری مصنوعات | اسناد ثبت مصنوعات
کاربران جدید 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 کلیک کنید. (تهیه و اتصال به محیط فقط چند لحظه طول می کشد).
پس از اتصال به 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 جستجو کنید:
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) اجرا خواهید کرد. فرآیند این کد لبه به شرح زیر است:
- پروژه پایه را در Cloud Shell دانلود کنید
- میکروسرویس ها را در ظروف بسازید
- بارگذاری کانتینرها در Google Artifact Registry (GAR)
- کانتینرها را روی GKE مستقر کنید
- کد منبع خدمات را برای ابزار دقیق ردیابی تغییر دهید
- به مرحله 2 بروید
موتور Kubernetes را فعال کنید
ابتدا، ما یک خوشه Kubernetes را راه اندازی می کنیم که در آن Shakesapp روی GKE اجرا می شود، بنابراین باید GKE را فعال کنیم. به منوی "Kubernetes Engine" بروید و دکمه ENABLE را فشار دهید.
اکنون شما آماده ایجاد یک خوشه 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 را فشار دهید.
پس از چند لحظه، مرورگر مخزن GAR را مشاهده خواهید کرد. روی دکمه "ایجاد مخزن" کلیک کنید و نام مخزن را وارد کنید.
در این codelab، من مخزن جدید trace-codelab
را نام میبرم. فرمت آرتیفکت "Docker" و نوع مکان "Region" است. منطقه ای نزدیک به منطقه ای را که برای منطقه پیش فرض موتور محاسباتی Google تنظیم کرده اید، انتخاب کنید. به عنوان مثال، این مثال در بالا "us-central1-f" را انتخاب کرد، بنابراین در اینجا "us-central1 (آیووا)" را انتخاب می کنیم. سپس روی دکمه "CREATE" کلیک کنید.
اکنون "trace-codelab" را در مرورگر مخزن مشاهده می کنید.
ما بعداً به اینجا باز خواهیم گشت تا مسیر رجیستری را بررسی کنیم.
راه اندازی داربست
Skaffold ابزار مفیدی است وقتی روی ساخت میکروسرویس هایی کار می کنید که در Kubernetes اجرا می شوند. گردش کار ساخت، هل دادن و استقرار کانتینرهای برنامه ها را با مجموعه کوچکی از دستورات کنترل می کند. Skaffold به طور پیشفرض از Docker Registry بهعنوان رجیستری کانتینر استفاده میکند، بنابراین باید skaffold را برای شناسایی GAR در هنگام هل دادن کانتینرها پیکربندی کنید.
دوباره Cloud Shell را باز کنید و تأیید کنید که skaffold نصب شده است. (Cloud Shell به طور پیش فرض skaffold را در محیط نصب می کند.) دستور زیر را اجرا کنید و نسخه skaffold را ببینید.
skaffold version
خروجی فرمان
v1.20.0
اکنون، می توانید مخزن پیش فرض را برای استفاده از skaffold ثبت کنید. برای به دست آوردن مسیر رجیستری، خود را به داشبورد Artifact Registry بروید و روی نام مخزنی که در مرحله قبل تنظیم کرده اید کلیک کنید.
سپس مسیرهای پودر سوخاری را در بالای صفحه خواهید دید. کلیک کنید برای کپی کردن مسیر رجیستری در کلیپ بورد.
با کلیک بر روی دکمه کپی، گفتگو را در پایین مرورگر با پیامی مانند:
"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
مفهوم ابزار دقیق و انتشار
قبل از ویرایش کد منبع، اجازه دهید به طور خلاصه نحوه عملکرد ردیابی های توزیع شده را در یک نمودار ساده توضیح دهم.
در این مثال، ما کد را برای صادر کردن اطلاعات 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 را با فشار دادن دکمه باز کنید در سمت راست بالای 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 استفاده کند.
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 بروید تا بررسی کنید که آیا اطلاعات ردیابی را دریافت کرده اید یا خیر. از آنجا که سرویس مولد بار درخواست ها را به صورت دوره ای به سرویس مشتری ارسال می کند و شما ردیابی را برای همه درخواست ها فعال کرده اید، شروع به دیدن نقاط زیادی در لیست ردیابی می کنید.
با کلیک بر روی یکی از آنها، نمودار آبشاری مانند زیر را مشاهده خواهید کرد که تأخیر هر بخش را در طول فرآیند درخواست و پاسخ توضیح می دهد. کادر انتخاب کنار «نمایش رویدادها» را پیدا کنید، سپس حاشیهنویسیهای داخل نمودار آبشار را دریافت خواهید کرد. این حاشیهنویسیها آنهایی هستند که با متد span.add_event()
در کد قرار دادهاید.
ممکن است متوجه شوید که دهانه های سرویس سرور را نمی بینید. درست است زیرا ما Spans را به هیچ وجه در سرویس سرور تنظیم نکرده ایم.
خلاصه
در این مرحله، سرویس مولد بار و سرویس سرویس گیرنده را تنظیم کردهاید و تأیید کردهاید که میتوانید با موفقیت Trace Context را در بین سرویسها منتشر کنید و اطلاعات Span را از هر دو سرویس به Cloud Trace صادر کنید.
بعدی
در مرحله بعد، سرویس مشتری و سرویس سرور را برای تأیید نحوه انتشار Trace Context از طریق gRPC، ابزار میدهید.
5. ابزار دقیق برای gRPC
در مرحله قبل، نیمه اول درخواست را در این میکروسرویس ابزارسازی کردیم. در این مرحله سعی می کنیم ارتباط gRPC بین سرویس مشتری و سرویس سرور را ابزار کنیم. (مستطیل سبز و بنفش در تصویر زیر)
ابزار دقیق برای مشتری 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 مشاهده می کنید. روی یکی از ردیابی ها کلیک کنید و اکنون متوجه می شوید که در سراسر درخواست از سرویس مولد بار تا سرویس سرور را در بر می گیرد.
خلاصه
در این مرحله، شما ارتباطات مبتنی بر 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" کلیک کنید.
سپس شناسه پروژه (نه نام پروژه) را در فرم موجود در گفتگو وارد کرده و خاموش شدن را تأیید کنید.