پرش به مطلب اصلی

مانیتورینگ کران

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

مفاهیم​

اصطلاحمعنی
مانیتورجابی که انتظار خبرش را دارید، با یک اسلاگ شناخته می‌شود (nightly-backup)
زمان‌بندییک عبارت crontab پنج‌بخشی، یا یک بازه (هر ۳۰ دقیقه)
چک‌اینیک پیام از جاب: in_progress، ok یا error
محیطهر محیط وضعیت خودش را نگه می‌دارد تا staging نتواند خرابی production را پنهان کند
مهلتcheckin_margin دقیقه ارفاق بعد از زمان مورد انتظار، پیش از آنکه نرسیده حساب شود
بیشینهٔ اجراmax_runtime دقیقه پس از چک‌این in_progress، پیش از آنکه تایم‌اوت حساب شود

راه‌اندازی — گزینهٔ ۱: ساخت مانیتور از دل جاب​

SDKهای Sentry می‌توانند مانیتور را با اولین چک‌این بسازند یا به‌روزرسانی کنند، پس زمان‌بندی کنار خود کد می‌ماند:

from sentry_sdk.crons import monitor

@monitor(monitor_slug="nightly-invoices")
def nightly_invoices():
...
const checkInId = Sentry.captureCheckIn(
{ monitorSlug: "nightly-invoices", status: "in_progress" },
{
schedule: { type: "crontab", value: "0 3 * * *" },
checkinMargin: 5,
maxRuntime: 30,
timezone: "Asia/Tehran",
},
);

try {
await run();
Sentry.captureCheckIn({ checkInId, monitorSlug: "nightly-invoices", status: "ok" });
} catch (e) {
Sentry.captureCheckIn({ checkInId, monitorSlug: "nightly-invoices", status: "error" });
throw e;
}

لاراول:

$schedule->command('invoices:generate')->dailyAt('03:00')->sentryMonitor('nightly-invoices');

راه‌اندازی — گزینهٔ ۲: HTTP ساده (بدون SDK)​

هر جابی که بتواند curl اجرا کند می‌تواند چک‌این بفرستد. کلید عمومی DSN در مسیر، آن را احراز می‌کند:

# ساده: یک فراخوانی وقتی جاب تمام شد
curl -X POST "$ERRORA/api/$PROJECT_ID/cron/nightly-backup/$PUBLIC_KEY/?status=ok"

# بهتر: اجرا را در دو سر ببندید تا مدت و تایم‌اوت هم رصد شود
CHECK_IN=$(curl -s -X POST "$ERRORA/api/$PROJECT_ID/cron/nightly-backup/$PUBLIC_KEY/?status=in_progress" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')

if /usr/local/bin/backup.sh; then
curl -X PUT "$ERRORA/api/$PROJECT_ID/cron/nightly-backup/$PUBLIC_KEY/$CHECK_IN/?status=ok"
else
curl -X PUT "$ERRORA/api/$PROJECT_ID/cron/nightly-backup/$PUBLIC_KEY/$CHECK_IN/?status=error"
fi

در یک خط crontab، معمولاً همان شکل تک‌مرحله‌ای کافی است:

0 3 * * * /usr/local/bin/backup.sh && curl -fsS -X POST "https://errora.example.com/api/$PROJECT_ID/cron/nightly-backup/$KEY/?status=ok"

پارامترهای environment= و duration= (بر حسب میلی‌ثانیه) را هم می‌توانید بفرستید.

راه‌اندازی — گزینهٔ ۳: ساخت مانیتور در پنل​

کران‌ها ← مانیتور جدید. همان فیلدهایی که API می‌گیرد:

{
"slug": "nightly-invoices",
"name": "فاکتورهای شبانه",
"config": {
"schedule_type": "crontab",
"schedule": "0 3 * * *",
"checkin_margin": 5,
"max_runtime": 30,
"timezone": "Asia/Tehran",
"failure_issue_threshold": 1,
"recovery_threshold": 1
}
}

زمان‌بندی بازه‌ای با "schedule_type": "interval" و "schedule": [30, "minute"] نوشته می‌شود. واحدها: minute، hour، day، week، month، year.

ماکروهای crontab هم کار می‌کنند: @hourly، @daily، @midnight، @weekly، @monthly، @yearly. همه‌چیز در منطقهٔ زمانی خود مانیتور ارزیابی می‌شود؛ پس مانیتور 0 3 * * * در Asia/Tehran حتی با تغییر ساعت، سر ۰۳:۰۰ محلی می‌ماند.

آستانه‌ها — با یک تک‌لغزش کسی را بیدار نکنید​

  • failure_issue_threshold — چند شکست پشت‌سرهم (خطا / نرسیده / تایم‌اوت) پیش از باز شدن خطا و فعال شدن هشدارها. پیش‌فرض 1.
  • recovery_threshold — چند موفقیت پشت‌سرهم تا دوباره سالم به‌حساب بیاید. پیش‌فرض 1.

برای جاب‌هایی که گاهی می‌لرزند، آستانهٔ شکست را روی 2 یا 3 بگذارید.

در پنل​

صفحهٔ کران‌ها مانیتورها را با زمان‌بندی، چک‌این بعدی مورد انتظار، وضعیت فعلی به تفکیک محیط و تاریخچهٔ چک‌این نشان می‌دهد. با باز کردن یکی، چک‌این‌های اخیر (وضعیت، مدت، نسخه، شناسهٔ ترِیس) و آمارش را می‌بینید.

وضعیت‌ها: ok، error، missed، timeout، in_progress و pending تا پیش از رسیدن اولین چک‌این.

هشدارها​

تغییر وضعیت کران رویدادهای monitor.failed و monitor.recovered را فعال می‌کند. در تنظیمات ← وب‌هوک‌ها آن‌ها را به یک کانال و قاعدهٔ هشدار وصل کنید — نگاه کنید به هشدارها.

API​

GET /api/v1/projects/{project_id}/monitors
POST /api/v1/projects/{project_id}/monitors
GET /api/v1/projects/{project_id}/monitors/overview
GET /api/v1/projects/{project_id}/monitors/{slug}
PATCH /api/v1/projects/{project_id}/monitors/{slug}
DELETE /api/v1/projects/{project_id}/monitors/{slug}
GET /api/v1/projects/{project_id}/monitors/{slug}/checkins
GET /api/v1/projects/{project_id}/monitors/{slug}/stats

مانیتورها علاوه بر شناسه، با اسلاگ هم آدرس‌پذیرند، چون کد جاب اسلاگ را می‌شناسد.

عیب‌یابی​

نشانهعلت / راه‌حل
مانیتور در وضعیت pending ماندههیچ چک‌اینی نرسیده — اسلاگ، شناسهٔ پروژه و کلید داخل آدرس را بررسی کنید
missed بی‌موردجاب دیر اجرا می‌شود؛ checkin_margin را بالا ببرید یا منطقهٔ زمانی زمان‌بندی را درست کنید
timeout بی‌موردmax_runtime از زمان واقعی اجرای جاب کمتر است
جاب اجرا می‌شود ولی مانیتور خطا می‌دهدلفافهٔ اسکریپت به‌خاطر خروج ناموفق بخش دیگری از خط لوله error می‌فرستد — خط شل را بررسی کنید
مانیتورهای تکراریدو املای متفاوت از اسلاگ؛ اسلاگ‌ها یکدست می‌شوند ولی nightly_backup و nightly-backup دو مانیتور جدا هستند