با استفاده از Google Stackdriver Debug، Trace، Logging و Logpoints

این آموزش شما را از طریق تور Google Stackdriver راهنمایی می کند که به شما امکان می دهد کارهای زیر را با برنامه های Google Cloud Platform خود انجام دهید:

  • در برنامه‌های خود که روی App Engine، Compute Engine و Container Engine اجرا می‌شوند، یک عکس فوری Debug بگیرید.
  • مشاهده گزارش های برنامه
  • متریک ها را تنظیم کنید، آنها را نظارت کنید و هشدار دریافت کنید.
  • تماس‌های API خود را ردیابی کنید و زمان‌های پاسخ و تنگناهای احتمالی در کد خود را بررسی کنید.
  • بدون نیاز به استقرار برنامه خود، نقاط گزارش را به برنامه در حال اجرا اضافه کنید. این یک ویژگی واقعا منحصر به فرد (و امیدوارم مفید باشد) است.

در این آموزش قصد داریم کارهای زیر را از ابتدا انجام دهیم:

  1. ایجاد یک پروژه Google Cloud Platform (به طور خاص App Engine)
  2. مخزن منبع پروژه پلتفرم Google Cloud را راه اندازی کنید
  3. از منبع استاندارد Guestbook Python Application موجود در Github استفاده کنید
  4. کد را مستقر کنید
  5. ببینید چگونه می‌توانیم عکس‌های فوری Debug از برنامه در حال اجرا را دریافت کنیم
  6. به Logging و Application Call Traces نگاه کنید
  7. اضافه کردن نقاط ورود به برنامه فعلی در حال اجرا. این ویژگی ابتدا در این پست وبلاگ پوشش داده شد: اضافه کردن گزارش های برنامه به یک برنامه بدون راه اندازی مجدد

بیا شروع کنیم.

این مطلب در ابتدا توسط رومین ایرانی ساخته شده و در اینجا قرار داده شده است .

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

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

اسکرین شات از 10/02/2016 12:45:26.png

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

در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در کنسول Cloud فعال کنید.

گذراندن این کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا اگر آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد (به بخش "پاکسازی" در انتهای این سند مراجعه کنید).

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

Google Cloud Shell

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

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

برای فعال‌سازی Google Cloud Shell، از کنسول توسعه‌دهنده به سادگی روی دکمه سمت راست بالای صفحه کلیک کنید (تنها چند لحظه طول می‌کشد تا محیط را تهیه کرده و به آن متصل شوید):

activateCloudShell.png

سپس شرایط خدمات را بپذیرید و روی پیوند "Start Cloud Shell" کلیک کنید:

x.png

اسکرین شات 14/06/2017 در ساعت 10.13.43 بعد از ظهر.png

پس از اتصال به پوسته ابری، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی 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 خود هستید؟ بررسی کنید که از چه شناسه ای در مراحل راه اندازی استفاده کرده اید یا آن را در داشبورد کنسول جستجو کنید:

Project_ID.png

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

gcloud config set compute/zone us-central1-f

شما می توانید مناطق مختلف را انتخاب کنید. در اسناد مناطق و مناطق بیشتر بیاموزید.

API های فعال StackDriver را بررسی کنید

بیایید نگاهی به API هایی بیندازیم که برای پروژه شما فعال شده اند. از نوار جستجو برای یافتن داشبورد API مانند شکل زیر استفاده کنید.

به API های خاصی که برای پروژه شما فعال شده اند توجه کنید:

هر پروژه Google Cloud Platform میزبانی خصوصی Git را ارائه می دهد، اما ابتدا باید یک مخزن پیش فرض ایجاد کنیم تا بتوانیم با آن کار کنیم. با استفاده از جعبه جستجوی کنسول به مخازن منبع بروید:

برای ایجاد یک مخزن کد جدید به نام "پیش فرض" روی "ایجاد مخزن" کلیک کنید:

با استفاده از Cloud Shell، اکنون قصد داریم این فهرست را در نمونه Google Cloud Shell خود شبیه سازی کنیم. برای انجام این کار، اجازه دهید ابتدا یک دایرکتوری در نمونه Google Cloud Shell خود ایجاد کنیم و همانطور که در زیر نشان داده شده است به آن بروید (خروجی نمونه):

mkdir stackdriver-demo
cd stackdriver-demo/

اکنون می‌توانیم مانند شکل زیر، مخزن پیش‌فرض را از طریق دستور gcloud در اینجا کلون کنیم:

gcloud source repos clone default

این خروجی کنسولی است که باید ببینید:

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

عالی! اجازه دهید کمی بیشتر در کنترل‌های git که راه‌اندازی شده‌اند عمیق‌تر بگردیم. این لزوماً چیزی نیست بلکه فقط چیزی است که شما بهتر بفهمید پشت صحنه چه اتفاقی افتاده است.

به دایرکتوری پیش فرض ایجاد شده بروید و دستور git remote -v را مطابق شکل زیر اجرا کنید

cd default
git remote -v

این همان خروجی کنسول است که باید چیزی شبیه به این ببینید:

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

می توانید ببینید که این به درستی به مخزن Git که با پروژه GCP ما مرتبط است اشاره می کند.

برنامه Guestbook را از Github بیرون بکشید

برنامه‌ای که می‌خواهیم از آن استفاده کنیم یک برنامه App Engine استاندارد به نام Guestbook است و در مخزن رسمی Google Cloud Platform Github در دسترس است. این برنامه همچنین بخشی از اسناد رسمی برای شروع است. پروژه Github در دسترس است: https://github.com/GoogleCloudPlatform/appengine-guestbook-python

اکنون می خواهیم این کد را به نمونه Cloud Shell خود وارد کنیم. دستور و خروجی آن در اینجا نشان داده شده است:

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

این خروجی کنسولی است که باید ببینید:

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

ما اکنون همه کدها را به صورت محلی در نمونه Google Cloud Shell خود داریم. می توانید فایل های مختلفی را که از پروژه Github استخراج شده اند مشاهده کنید.

کد فعلی را با استفاده از Cloud Shell به مخزن Project Git فشار دهید

حالا بیایید این کد را به مخزن GCP Project Git فشار دهیم تا بتوانیم نقاط شکست، نقاط ورود و موارد دیگر را برای کد خود تعیین کنیم. توجه داشته باشید که این یک مرحله اجباری نیست، زیرا می‌توانید مستقیماً با Github، ماشین محلی خود و راه‌های دیگر برای پیوند دادن کد منبع خود یکپارچه شوید.

اما برای هدف ما در اینجا، ما این کد را در مخزن GCP Project Git قرار می دهیم. این کار از طریق دستور فشار git استاندارد مطابق شکل زیر انجام می شود:

git push origin master

این خروجی کنسولی است که باید ببینید:

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

اکنون به کنسول GCP Cloud خود و به طور خاص به بخش توسعه بازگردید. روی Source Code کلیک کنید و برای مخزن پیش فرض، باید بتوانید تمام فایل های پروژه را ببینید. خروجی نمونه در زیر نشان داده شده است:

ما اکنون آماده ایم تا برنامه موتور برنامه Guestbook خود را اجرا کنیم. برای استقرار برنامه، مطمئن شوید که در Google Cloud Shell و در دایرکتوری پیش‌فرض قرار دارید، همانطور که ما در طول این مدت بوده‌ایم. مطابق شکل زیر از دستور gcloud app deploy کنید:

gcloud app deploy --version 1

وقتی از شما خواسته شد که یک منطقه را انتخاب کنید، [1] us-east1 را انتخاب کنید.

این خروجی کنسولی است که باید ببینید:

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

توجه داشته باشید که ما یک پارامتر نسخه را به دستور app deploy ارائه کردیم. ما به آن مقدار "1" دادیم.

از آنجایی که برنامه Guestbook از Google Cloud Datastore برای ماندگاری استفاده می کند، باید فهرست های Datastore را به روز کنیم. ایندکس ها در فایل index.yaml مشخص شده اند و ما به سادگی از دستور gcloud datastore create-indexes مانند شکل زیر استفاده می کنیم:

gcloud datastore create-indexes index.yaml

این خروجی کنسولی است که باید ببینید:

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

ایندکس های Datastore ممکن است کمی طول بکشد تا به روز شوند. برای بررسی وضعیت، "Datastore indexes" را جستجو کرده و بر روی Indexes کلیک کنید. در حالی که نمایه ها در حال ساخت هستند، وضعیتی را با مقدار "Indexing" مانند شکل زیر مشاهده خواهید کرد:

می‌توانیم با رفتن به Compute → App Engine و کلیک بر روی Versions مطابق شکل زیر بررسی کنیم که آیا برنامه ما با نسخه 1 مستقر و در دسترس است یا خیر:

اکنون همه چیز باید خوب به نظر برسد و می توانید با رفتن به https://<PROJECT_ID>.appspot.com به پروژه خود نگاهی بیندازید. باز هم، ممکن است چند دقیقه طول بکشد تا فهرست‌های ذخیره‌گاه داده آماده شوند، بنابراین اگر برنامه به شما خطایی داد (به عنوان مثال: خطای سرور داخلی)، چند دقیقه بعد دوباره امتحان کنید.

اکنون بیایید با ورود به سیستم و ایجاد چند ورودی دفترچه مهمان مانند شکل زیر از برنامه استفاده کنیم:

عالی! ما اکنون آماده ایم تا به ویژگی های Stackdriver بپردازیم.

اجازه دهید ابتدا ببینیم چگونه می توانیم از برنامه در حال اجرا خود عکس فوری بگیریم. اگر می‌خواهید یک کد خاص را اشکال زدایی کنید، متغیرها را بررسی کنید و موارد دیگر، Snapshots مفید هستند. همه اینها زمانی اتفاق می‌افتد که درخواست شما هنوز در حال ارائه است. در صورتی که گزارش‌هایی از مشکلی در برنامه خود دریافت می‌کنید و می‌خواهید سعی کنید اشکال‌زدایی کنید و ببینید در برنامه شما چه اتفاقی می‌افتد، دسته‌ای از متغیرها را بررسی کنید، به صورت مشروط عکس فوری بگیرید و موارد دیگر، بسیار مفید است.

بیایید این کار را اکنون برای برنامه Guestbook انجام دهیم. اگر کسی صفحه اصلی را درخواست کرد و به طور خاص می خواهیم آن را در جایی که لیست احوالپرسی هایی را که در حال حاضر در Datastore وجود دارد بازیابی کند، می خواهیم یک عکس فوری بخواهیم.

کد این مورد در فایل guestbook.py موجود است. و به طور خاص، ما علاقه مندیم که پس از بازیابی کد در زمان اجرا، فهرست احوالپرسی ها را از دیتا استور بازیابی کنیم. این در خط شماره 72 انجام می شود. بنابراین می‌توانیم یک نقطه شکست در خط ۷۴ قرار دهیم تا بدانیم که #۷۲ اجرا می‌شود.

برای انجام این کار، یا از نمای نسخه AppEngine بر روی "Debug" کلیک کنید یا به Stackdriver → Debug بروید. با این کار صفحه نمایش داده شده در زیر نمایش داده می شود. کاری که باید انجام دهید این است که فایل ( guestbook.py ) را در سمت چپ انتخاب کنید، سپس مطابق شکل روی شماره خط کلیک کنید.

این پیامی را نشان می دهد که در کادر قرمز رنگ بالا مشخص شده است، مبنی بر اینکه منتظر است یک عکس فوری فعال شود. اکنون، تنها کاری که باید انجام دهیم این است که صفحه خود را وارد کنید

https://<PROJECT_ID>.appspot.com .

هنگامی که این کار را انجام دادید، عکس فوری فعال می‌شود و می‌بینید که بخش‌های Variables و Call Stack مطابق شکل زیر پر می‌شوند. به نحوه نمایش متغیرها نگاه کنید و می توانید آنها را برای بررسی مقادیر گسترش دهید. این فوق العاده مفید است.

برای مثال، اگر متغیر greetings را گسترش دهید، می‌بینید که رکوردهای مربوط به تعداد ورودی‌های کتاب مهمان را دارد که ایجاد کرده‌اید.

یکی از ویژگی های بسیار مفید این است که در هر زمان یک عکس فوری بگیرید. کافی است در هر زمان بر روی آیکون دوربین کلیک کنید و دوباره منتظر می ماند تا عکس فوری مطابق شکل زیر نمایش داده شود:

برای ردیابی متغیرهای خاص می توانید از فیلد Expressions مانند شکل زیر استفاده کنید. به عنوان مثال، ما می دانیم که یک تبریک متغیر داریم و علاقه مندیم مقدار آن را در لحظه ای که یک عکس فوری زده می شود، بررسی کنیم. همانطور که در تصویر زیر نشان داده شده است، می‌توانیم متغیر تبریک را وارد کنیم. هنگامی که عکس فوری ضربه می زند، آن را با مقادیر نشان داده شده پر می کند.

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

بسیار مهم است که مطمئن شوید عملکرد برنامه وب شما مطابق با الزاماتی است که تعیین کرده اید. Stackdriver Trace یک ابزار کلیدی است که به شما کمک می کند تاخیر را در برنامه های خود درک کنید.

به طور پیش‌فرض برای همه برنامه‌های App Engine فعال است و جزئیات عملکرد بسیار مفیدی را برای تمام نقاط پایانی ما به همراه جدایی در تماس‌های مختلف به ما می‌دهد.

در مورد ما، ما به صفحه اصلی ("/") ضربه زده ایم و ورودی های کتاب مهمان را مشاهده می کنیم / اضافه می کنیم. این برای Trace کافی است تا در مورد تأخیر بیشتر به ما بگوید. به سادگی به Stackdriver Traces Overview بروید و ما یک اسکرین شات را همانطور که در زیر نشان داده شده است می بینیم. به آثار اخیر و تأخیر آنها توجه کنید.

اگر روی یکی از ردیابی ها کلیک کنیم، یعنی روی پیوند URI کلیک کنیم، ردیابی دقیق را به صورت زیر نشان می دهد:

توجه داشته باشید که چگونه می‌تواند تأخیر را به ما نشان دهد و کدام تماس‌ها بیشتر زمان می‌برند. از تجسم بالا می توانید ببینید که پرس و جوی datastore زمان می برد. شاید یکی از گزینه هایی که می توان به آن نگاه کرد، ذخیره سازی داده ها برای کاهش آن تنگنا باشد. باز هم همه اینها به برنامه کاربردی شما بستگی دارد و این باید برای تعیین اینکه کدام مناطق در ردیابی تماس شما ممکن است نیاز به تغییر مجدد داشته باشند بسیار مفید باشد.

با رفتن به Stackdriver Logging (مانند شکل زیر) می توانید گزارش های برنامه خود را در هر زمان مشاهده کنید. فیلترهای متعددی وجود دارد که از خدمات مختلف GCP → انواع گزارش → سطح گزارش → تاریخ و موارد دیگر شروع می شود.

تصویر زیر گزارش‌های مربوط به برنامه App Engine ما و نسخه پیش‌فرض 1 را نشان می‌دهد.

logging.png

در نهایت، بیایید به ویژگی‌ای بپردازیم که باید شما را در مورد امکاناتی که ارائه می‌کند هیجان زده کند. معمولاً به‌عنوان توسعه‌دهنده، تمام تلاش خود را می‌کنیم تا عبارات گزارش را در کد خود قرار دهیم، کد خود را مستقر کنیم و سپس امیدواریم که گزارش تمام آنچه می‌خواهیم بدانیم را به ما بگوید.

اما ما می دانیم که این کافی نیست و فقط در هنگام اشکال زدایی متوجه می شویم که شاید باید چند دستور ورود دیگر را اینجا و آنجا قرار می دادیم. گردش کار معمول پس از آن این است که کد خود را تغییر دهید، بیانیه گزارش اضافی را قرار دهید، مجدداً مستقر کنید و نظارت کنید.

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

هنوز از داخل Cloud Shell، اجازه دهید لیست فعلی نقاط ورود را که پیکربندی کرده‌ایم (که بدیهی است 0 باشد) بررسی کنیم. این کار از طریق دستور gcloud مطابق شکل زیر انجام می شود:

gcloud debug logpoints list

این خروجی کنسولی است که باید ببینید:

Debug target not specified. Using default target: default-1
Listed 0 items.

حال می‌خواهیم یک logpoint به برنامه در حال اجرا اضافه کنیم. برای اضافه کردن یک logpoint، باید کارهای زیر را انجام دهیم:

  • فایل کد منبع و شماره خطی که می خواهیم نقطه ورود را در آن اضافه کنیم را شناسایی کنید.
  • پیام گزارش را شناسایی کنید. این پیام log می تواند کد سخت یا حتی یک عبارت باشد.

در مورد ما، ما قصد داریم یک logpoint را به فایل guestbook.py در خط #74 از طریق دستور logpoints create مانند شکل زیر اضافه کنیم:

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

این خروجی کنسولی است که باید ببینید:

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

ما filename:linenumber و پیام گزارش را در بالا ارائه کردیم. توجه داشته باشید که پیام گزارش ما همچنین حاوی عبارتی است که تعداد احوال‌پرسی‌هایی که از دیتا استور دریافت کرده‌ایم را چاپ می‌کند.

این فرمان با پیام اضافه شدن logpoint باز می گردد. اسکرین شات از Cloud Shell ما در زیر نشان داده شده است:

حالا اگر دستور logpoints list را اجرا کنید، خروجی زیر را مشاهده خواهید کرد:

gcloud debug logpoints list

این خروجی کنسولی است که باید ببینید:

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

برای مشاهده عملی این موضوع، می‌توانیم یک بار دیگر به صفحه اصلی در https://<PROJECT_ID>.appspot.com . این کد را فراخوانی می کند و به نوبه خود نقطه ورود ما را فرا می خواند. به یاد داشته باشید که این به طور پیش فرض در گزارش های برنامه ما ثبت می شود. بنابراین تنها کاری که باید انجام دهیم این است که یک بار دیگر مانند تصویر زیر از Stackdriver Logging بازدید کنیم:

روی درخواست خاص و Voila کلیک کنید! در جزئیات، نقطه ورود ما را مشاهده خواهید کرد که اخراج می شود و پیام ورود به سیستم نشان داده می شود.

امیدواریم از این آموزش لذت برده باشید. این تنها تعداد کمی از قابلیت‌هایی را که پلتفرم Stackdriver به میز ارائه می‌کند، نشان می‌دهد. چیزهای بیشتری برای کشف وجود دارد. وبلاگ رومین ایرانی (نویسنده اصلی این کد لبه) را در https://rominirani.com/ برای آموزش های بیشتر Google Cloud Platform ببینید.

همچنین می‌توانید این کد دیگر به نام «استفاده از نظارت و ورود به سیستم Stackdriver برای مشاهده بهتر سلامت برنامه‌تان» را بررسی کنید.

اگر بازخوردی دارید یا می‌خواهید مشکلات مربوط به این کد را گزارش کنید، لطفاً از پیوند "لطفا یک اشکال پیدا کنید" در پایین سمت چپ این صفحه استفاده کنید.