هشدارها: خطاهای مبتنی بر ورود به موضوعات Pub/Sub

۱. مقدمه

آخرین به‌روزرسانی: ۲۱ ژوئن ۲۰۲۳

هشدار در مورد خطاهای مبتنی بر گزارش برای در دسترس بودن

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

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

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

انتشار/زیرموضوعات به عنوان کانال اطلاع رسانی هشدار

یک موضوع Pub/Sub می‌تواند به عنوان یک کانال اعلان Google Cloud Monitoring برای ارسال هشدار به یک اشتراک Pub/Sub استفاده شود. این به شما امکان می‌دهد هشدارهای Cloud Monitoring خود را با سایر سیستم‌ها، از جمله سرویس‌های اعلان شخص ثالث، ادغام کنید.

برای استفاده از یک موضوع Pub/Sub به عنوان کانال اعلان، ابتدا باید یک موضوع Pub/Sub و یک اشتراک Pub/Sub ایجاد کنید. سپس، باید یک کانال اعلان Cloud Monitoring ایجاد کنید که از موضوع Pub/Sub به عنوان مقصد استفاده کند.

وقتی یک هشدار فعال می‌شود، Cloud Monitoring پیامی را به موضوع Pub/Sub ارسال می‌کند. مشترک اشتراک Pub/Sub می‌تواند پیام را پردازش کرده و اقدام مناسب را انجام دهد.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما قصد دارید یک برنامه را مستقر کنید، یک موضوع Pub/Sub ایجاد کنید و یک هشدار مبتنی بر گزارش ایجاد کنید که خطاها را در یک بخش خاص از برنامه بررسی می‌کند و از موضوع Pub/Sub به عنوان یک کانال اعلان استفاده می‌کند.

آنچه یاد خواهید گرفت

  • نحوه ایجاد یک موضوع Pub/Sub
  • نحوه ایجاد هشدار مبتنی بر گزارش

این آزمایشگاه کد بر ایجاد هشدار برای خطاها تمرکز دارد. مفاهیم و کدهای غیرمرتبط حذف شده‌اند و برای کپی و پیست ساده در اختیار شما قرار گرفته‌اند.

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

  • یک حساب Google Cloud با مجوزهای:
  • برنامه‌های Cloud Run را مستقر کنید
  • ایجاد موضوعات عمومی/فرعی
  • ایجاد هشدارها

۲. راه‌اندازی

یک پروژه Google Cloud انتخاب یا ایجاد کنید

برای انتخاب یک پروژه موجود، از منوی کشویی استفاده کنید:

b35bf95b8bf3d5d8.png

برای ایجاد یک پروژه جدید در گوگل کلود، می‌توانید مراحل زیر را دنبال کنید:

  1. به کنسول پلتفرم ابری گوگل بروید.
  2. روی دکمه ایجاد پروژه کلیک کنید.
  3. یک نام برای پروژه خود وارد کنید.
  4. یک حساب پرداخت برای پروژه خود انتخاب کنید.
  5. روی دکمه‌ی ایجاد کلیک کنید.

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

در اینجا جزئیات بیشتری در مورد هر مرحله آورده شده است:

  • نام: نام پروژه شما باید در سازمان شما منحصر به فرد باشد.
  • حساب صورتحساب: می‌توانید از یک حساب صورتحساب موجود استفاده کنید یا یک حساب جدید ایجاد کنید.
  • ایجاد: پس از وارد کردن تمام اطلاعات مورد نیاز، روی دکمه ایجاد کلیک کنید تا پروژه شما ایجاد شود.

برای اطلاعات بیشتر، لطفاً به مستندات Google Cloud در مورد ایجاد پروژه‌ها مراجعه کنید.

۳. برنامه API را مستقر کنید

برنامه یا API نمونه در مورد چیست؟

برنامه ما یک برنامه API موجودی ساده است که یک نقطه پایانی API REST را با چند عملیات برای فهرست کردن اقلام موجودی و دریافت تعداد موجودی هر کالا ارائه می‌دهد.

زمانی که API را مستقر کردیم و فرض کردیم که در آدرس https://<somehost> میزبانی می‌شود، می‌توانیم به نقاط انتهایی API به صورت زیر دسترسی پیدا کنیم:

https://<somehost>/inventory

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

https://<somehost>/inventory/{productid}

این یک رکورد واحد با شناسه محصول و سطح موجودی در دسترس برای آن محصول ارائه می‌دهد.

داده‌های پاسخ برگشتی با فرمت JSON هستند.

توجه : این برنامه API فقط برای اهداف آزمایشی است و نشان‌دهنده یک پیاده‌سازی API امن و قوی نیست. هدف از ارائه آن، در دسترس قرار دادن یک برنامه سریع برای بررسی هدف اصلی آزمایشگاه، یعنی عملیات ابری گوگل، است.

داده‌های نمونه و درخواست/پاسخ API

این برنامه برای ساده نگه داشتن امور، در قسمت بک‌اند به پایگاه داده وابسته نیست. این برنامه شامل ۳ شناسه محصول نمونه و سطح موجودی آنها است.

شناسه محصول

سطح موجودی در دسترس

۱-۱

۱۰

آی-۲

۲۰

آی-۳

۳۰

نمونه درخواست و پاسخ API در زیر نشان داده شده است:

درخواست API

پاسخ API

https://<somehost>/inventory

[ { "I-1": 10، "I-2": 20، "I-3": 30 }]

https://<somehost>/inventory/I-1

{"شناسه محصول": "I-1", "تعداد": 10}

https://<somehost>/inventory/I-2

{"شناسه محصول": "I-2", "تعداد": 20}

https://<somehost>/inventory/I-200

{"شناسه محصول": I-200، "تعداد": -1}

مخزن را کلون کنید

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

از کنسول GCP روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

bce75f34b2c53987.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

f6ef2b5f13479f3a.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز شماست. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و بر روی Google Cloud اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. تمام کارهای شما در این آزمایشگاه را می‌توان به سادگی با یک مرورگر انجام داد.

راه اندازی جی کلود

در Cloud Shell، شناسه پروژه خود را تنظیم کرده و آن را به عنوان متغیر PROJECT_ID ذخیره کنید.

PROJECT_ID=[YOUR-PROJECT-ID]

set config gcloud project $PROJECT_ID

حالا، دستور زیر را اجرا کنید:

clone $ git https://github.com/rominirani/cloud-code-sample-repository.git

این کار باعث ایجاد پوشه‌ای با عنوان cloud-code-sample-repository در این پوشه می‌شود.

(اختیاری) برنامه را روی Cloud Shell اجرا کنید

شما می‌توانید با دنبال کردن مراحل زیر، برنامه را به صورت محلی اجرا کنید:

  1. از طریق ترمینال، با استفاده از دستور زیر به نسخه پایتون API بروید:

cloud-code-sample-repository $ cd

$ cd python-flask-api

  1. در ترمینال، دستور زیر را وارد کنید (در زمان نوشتن این مطلب، Cloud Shell با پایتون ۳.۹.x نصب شده ارائه می‌شود و ما از نسخه پیش‌فرض استفاده خواهیم کرد. اگر قصد دارید آن را به صورت محلی روی لپ‌تاپ خود اجرا کنید، می‌توانید از پایتون ۳.۸+ استفاده کنید):

app.py python $ .py

  1. برای شروع سرور پایتون به صورت محلی می‌توانید دستور زیر را اجرا کنید.

1f798fbddfdc2c8e.png46edf454cc70c5a6.png

روی پیش‌نمایش روی پورت ۸۰۸۰ کلیک کنید. ۵. این یک پنجره مرورگر باز می‌کند. شما یک خطای ۴۰۴ خواهید دید و مشکلی نیست. URL را اصلاح کنید و آن را به «/inventory» بعد از نام میزبان تغییر دهید.

مثلاً روی دستگاه من، به این شکل است:

https://8080-cs-557561579860-default.cs-asia-southeast1-yelo.cloudshell.dev/inventory

این لیست اقلام موجودی را همانطور که قبلاً توضیح داده شد نمایش می‌دهد:

709d57ee2f0137e4.png

  1. اکنون می‌توانید با رفتن به ترمینال و فشردن کلیدهای Ctrl-C، سرور را متوقف کنید.

برنامه را مستقر کنید

اکنون این برنامه API را در Cloud Run مستقر خواهیم کرد. این فرآیند شامل استفاده از کلاینت خط فرمان gcloud برای اجرای دستور جهت استقرار کد در Cloud Run است .

از ترمینال، دستور gcloud زیر را اجرا کنید:

$ gcloud run deploy --source .

این کار سوالات متعددی از شما خواهد پرسید که برخی از نکات آن در زیر ذکر شده است:

  1. نام سرویس (python-flask-api): یا با این پیش‌فرض پیش بروید یا چیزی شبیه به my-inventory-api انتخاب کنید.
  2. API [run.googleapis.com] در پروژه [613162942481] فعال نشده است. آیا می‌خواهید آن را فعال کرده و دوباره امتحان کنید (این کار چند دقیقه طول می‌کشد)؟ (بله/خیر)؟ بله
  3. لطفا یک منطقه را مشخص کنید: 31 (us-west-1) را انتخاب کنید
  4. API [artifactregistry.googleapis.com] در پروژه [613162942481] فعال نشده است. آیا می‌خواهید آن را فعال کرده و دوباره امتحان کنید (این کار چند دقیقه طول می‌کشد)؟ (بله/خیر)؟ بله
  5. استقرار از منبع به یک مخزن Docker در رجیستری Artifact برای ذخیره کانتینرهای ساخته شده نیاز دارد. یک مخزن با نام [cloud-run-source-deploy] در منطقه [us-west1] ایجاد خواهد شد.
  6. آیا می‌خواهید ادامه دهید (بله/خیر)؟ بله
  7. آیا به [my-inventory-api] (y/N) اجازه فراخوانی‌های احراز هویت نشده داده می‌شود؟ بله

در نهایت، این فرآیند شروع می‌شود تا کد منبع شما گرفته شود، آن را کانتینرایز (containerize) کنید، به Artifact Registry منتقل کنید و سپس سرویس Cloud Run + revision را مستقر کنید. شما باید در طول این فرآیند صبور باشید (ممکن است ۳-۴ دقیقه طول بکشد) و باید ببینید که فرآیند با نمایش URL سرویس به شما تکمیل می‌شود.

یک نمونه اجرا در زیر نشان داده شده است:

87ba8dbf88e8cfa4.png

اپلیکیشن را تست کنید

اکنون که برنامه را در Cloud Run مستقر کرده‌ایم، می‌توانید به صورت زیر به برنامه API دسترسی پیدا کنید:

  1. به آدرس اینترنتی سرویس (Service URL) که در مرحله قبل به آن اشاره کردیم توجه کنید. برای مثال، در تنظیمات من، این آدرس به صورت https://my-inventory-api-bt2r5243dq-uw.a.run.app نمایش داده می‌شود. بیایید آن را <SERVICE_URL> بنامیم.
  2. یک مرورگر باز کنید و به ۳ آدرس اینترنتی زیر برای نقاط پایانی API دسترسی پیدا کنید:
  3. <SERVICE_URL>/inventory
  4. <SERVICE_URL>/inventory/I-1
  5. <SERVICE_URL>/inventory/I-100

باید مطابق با مشخصاتی باشد که در بخش قبلی با نمونه درخواست و پاسخ API ارائه داده بودیم.

جزئیات خدمات را از Cloud Run دریافت کنید

ما سرویس API خود را در Cloud Run، یک محیط محاسباتی بدون سرور، مستقر کردیم. می‌توانیم در هر زمانی از طریق کنسول Google Cloud به سرویس Cloud Run دسترسی داشته باشیم.

از منوی اصلی، به Cloud Run بروید. این کار لیست سرویس‌هایی را که در Cloud Run اجرا کرده‌اید نمایش می‌دهد. باید سرویسی را که اخیراً مستقر کرده‌اید، ببینید. بسته به نامی که انتخاب کرده‌اید، باید چیزی شبیه به این را ببینید:

2633965c4bc957cc.png

برای مشاهده جزئیات، روی نام سرویس کلیک کنید. نمونه جزئیات در زیر نشان داده شده است:

۳۳۰۴۲ae۶۴۳۲۲ce۰۷.png

به URL توجه کنید، که چیزی جز URL سرویس نیست که می‌توانید آن را در مرورگر تایپ کنید و به API موجودی که ما مستقر کرده‌ایم دسترسی پیدا کنید. به Metrics و سایر جزئیات توجه کنید.

بیایید همین حالا با Google Cloud Operations Suite شروع کنیم.

۴. یک موضوع عمومی/زیرموضوعی برای دریافت اعلان هشدار ایجاد کنید

برای ایجاد یک موضوع Pub/Sub، می‌توانید این مراحل را در کنسول Google Cloud دنبال کنید:

  1. در کادر جستجو، عبارت Pub/Sub را جستجو کنید و به Pub/Sub بروید. ۹۳۵۰۲۸bd8f6328ef.png
  2. اگر هنوز به تب موضوعات (Topics) نرسیده‌اید، روی آن کلیک کنید. 7fd8bf91386a88fd.png
  3. روی دکمه ایجاد موضوع کلیک کنید. cd9d197f9023c41b.png
  4. یک نام قابل تشخیص برای موضوع خود وارد کنید.

۱۷۳f۳۱۳b۴a۳c۴۹۳۴.png

  1. روی دکمه‌ی ایجاد کلیک کنید. ca9a02477da21a44.png
  2. با استفاده از دکمه‌ی کپی، نام موضوع را کپی کنید. برای بخش بعدی به آن نیاز خواهید داشت.

20848252ee83df93.png

۵. یک سیاست هشدار برای خطاها ایجاد کنید

بررسی گزارش‌های خطا

برای مشاهده گزارش خطاهای برنامه:

روی برگه ثبت وقایع کلیک کنید.

این یک رابط گزارش نمایش می‌دهد که در آن می‌توانید منابع مختلف (پروژه، منبع ابری گوگل، نام سرویس‌ها و غیره) را به همراه سطوح گزارش انتخاب/لغو کنید تا پیام‌های گزارش را در صورت نیاز فیلتر کنید.

۶۶۰۵b۶۸۳۹۵۱۸۵b۸۹.png

با ارائه شناسه‌های محصولی که جزو I-1، I-2 و I-3 نیستند، چند درخواست نامعتبر به سرویس موجودی را شبیه‌سازی کنید. برای مثال، یک درخواست نادرست عبارت است از:

https://<SERVICE_URL>/inventory/I-999

اکنون تمام هشدارهایی را که توسط API ما ایجاد شده‌اند، هنگامی که شناسه محصول نادرستی در پرس‌وجو ارائه شده است، جستجو خواهیم کرد.

ایجاد یک سیاست هشدار سفارشی مبتنی بر گزارش برای خطاها

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

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

منبع.نوع="cloud_run_revision"

textPayload =~ "هشدار در برنامه: درخواست موجودی برای شناسه محصول نادرست دریافت شد"

باید چیزی شبیه به این باشد:

f672154cfebf0051.png

  1. روی اجرای پرس‌وجو کلیک کنید. سپس تمام درخواست‌هایی که دریافت شده‌اند و این مشکل را دارند، به شما نشان داده می‌شود.

77c190e3a2fab6bf.png

  1. برای تبدیل مورد بالا به یک هشدار، روی دکمه‌ی «ایجاد هشدار» که در Logs Explorer درست زیر فیلد پرس‌وجو، در سمت راست می‌بینید، کلیک کنید:

4cd3fcf142189376.png

  1. این کار فرم ایجاد یک سیاست هشدار مبتنی بر گزارش را نمایش می‌دهد.

b82446854bad87fc.png

  1. از کوئری اولیه برای لاگ‌ها جهت درج در هشدار استفاده کنید:

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: request inventory for شناسه محصول incorrect Received productid"

764227db73ec3de6.png

  1. تعداد دفعات اعلان و مدت زمان حادثه را تنظیم کنید. برای مثال، می‌توانید از حداقل مقادیر برای هر کدام استفاده کنید:

bb3d96448ec998a1.png

  1. در نهایت، برای «چه کسی باید مطلع شود؟» کانال اعلان Pub/Sub را که قبلاً ایجاد کرده‌اید، انتخاب کنید:

3593c48c29d4b76c.png

  1. روی ذخیره کلیک کنید. برای مشاهده و مدیریت خط‌مشی هشدار، به صفحه هشدار مراجعه کنید و موارد زیر را در قسمت خط‌مشی‌ها بررسی کنید: ca08ea380fb37c91.png

۶. تبریک

تبریک می‌گویم، شما با موفقیت Uptime Check خود را برای ارسال هشدار به Pub/Sub پیکربندی کردید!