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

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

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

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

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

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

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

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

اگر قبلاً یک حساب 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

Screen Shot 2017-06-14 at 10.13.43 PM.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 فشار دهیم تا بتوانیم نقاط شکست، logpoint و موارد دیگر را برای کد خود تعیین کنیم. توجه داشته باشید که این یک مرحله اجباری نیست زیرا می‌توانید مستقیماً با 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]

توجه داشته باشید که ما یک پارامتر نسخه را برای دستور توسعه برنامه ارائه کردیم. ما به آن مقدار "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 بپردازیم.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

logging.png

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

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

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

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

gcloud debug logpoints list

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

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

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

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

در مورد ما، ما قصد داریم یک 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/ ببینید.

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

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