يؤدي حل مشكلة انقطاع اختبار CAPTCHA عند الساعة 3 صباحًا إلى تكلفة ساعات من فقدان البيانات. يضمن تكامل PagerDuty إخطار الشخص المناسب على الفور - مع سياق كافٍ لتشخيص المشكلة وإصلاحها دون البحث في السجلات.
استراتيجية التنبيه
الشدة
الحالة
عمل PagerDuty
حرجة
الرصيد < 2 دولار
مهندس الصفحة تحت الطلب
حرجة
جميع العمال إلى أسفل
مهندس الصفحة تحت الطلب
عالية
معدل الخطأ > 20% لمدة 5 دقائق
إنشاء حادث عاجل
تحذير
الرصيد أقل من 10 دولارات
إنشاء حادثة منخفضة الاستعجال
تحذير
عمق قائمة الانتظار> 100 لمدة 10 دقائق
إنشاء حادثة منخفضة الاستعجال
معلومات
حل الكمون p95 > 120s
أضف إلى الحادث أو السجل الموجود
بايثون - PagerDuty Events API v2
import os
import time
import hashlib
import requests
from datetime import datetime
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
PAGERDUTY_ROUTING_KEY = os.environ["PAGERDUTY_ROUTING_KEY"]
session = requests.Session()
class CaptchaPagerDuty:
EVENTS_URL = "https://events.pagerduty.com/v2/enqueue"
def __init__(self, routing_key):
self.routing_key = routing_key
def trigger(self, summary, severity="error", source="captcha-pipeline",
details=None, dedup_key=None):
"""Trigger a new PagerDuty incident."""
payload = {
"routing_key": self.routing_key,
"event_action": "trigger",
"payload": {
"summary": summary,
"severity": severity, # critical, error, warning, info
"source": source,
"timestamp": datetime.utcnow().isoformat() + "Z",
"custom_details": details or {}
}
}
if dedup_key:
payload["dedup_key"] = dedup_key
resp = requests.post(self.EVENTS_URL, json=payload, timeout=10)
resp.raise_for_status()
return resp.json()
def resolve(self, dedup_key):
"""Resolve an existing incident."""
payload = {
"routing_key": self.routing_key,
"event_action": "resolve",
"dedup_key": dedup_key
}
resp = requests.post(self.EVENTS_URL, json=payload, timeout=10)
resp.raise_for_status()
return resp.json()
def acknowledge(self, dedup_key):
"""Acknowledge an existing incident."""
payload = {
"routing_key": self.routing_key,
"event_action": "acknowledge",
"dedup_key": dedup_key
}
resp = requests.post(self.EVENTS_URL, json=payload, timeout=10)
resp.raise_for_status()
return resp.json()
pagerduty = CaptchaPagerDuty(PAGERDUTY_ROUTING_KEY)
class CaptchaMonitor:
def __init__(self):
self.error_window = [] # (timestamp, is_error)
self.window_size = 300 # 5 minutes in seconds
def record_solve(self, success):
now = time.time()
self.error_window.append((now, not success))
# Prune old entries
self.error_window = [
(t, e) for t, e in self.error_window
if now - t < self.window_size
]
@property
def error_rate(self):
if not self.error_window:
return 0.0
errors = sum(1 for _, e in self.error_window if e)
return errors / len(self.error_window)
def check_balance(self):
resp = session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance", "json": 1
})
data = resp.json()
if data.get("status") != 1:
return None
return float(data["request"])
def run_checks(self):
"""Run all monitoring checks and trigger alerts."""
# Check balance
balance = self.check_balance()
if balance is not None:
if balance < 2:
pagerduty.trigger(
summary=f"CaptchaAI balance critically low: ${balance:.2f}",
severity="critical",
dedup_key="captcha-balance-critical",
details={"balance": balance, "threshold": 2}
)
elif balance < 10:
pagerduty.trigger(
summary=f"CaptchaAI balance low: ${balance:.2f}",
severity="warning",
dedup_key="captcha-balance-warning",
details={"balance": balance, "threshold": 10}
)
else:
# Resolve if balance recovered
try:
pagerduty.resolve("captcha-balance-critical")
pagerduty.resolve("captcha-balance-warning")
except Exception:
pass # No incident to resolve
# Check error rate
rate = self.error_rate
if rate > 0.20:
total = len(self.error_window)
errors = sum(1 for _, e in self.error_window if e)
pagerduty.trigger(
summary=f"CaptchaAI error rate {rate:.0%} "
f"({errors}/{total} in 5 min)",
severity="error",
dedup_key="captcha-error-rate-high",
details={
"error_rate": round(rate, 3),
"total_tasks": total,
"failed_tasks": errors,
"window_seconds": self.window_size
}
)
elif rate < 0.05 and len(self.error_window) > 10:
try:
pagerduty.resolve("captcha-error-rate-high")
except Exception:
pass
monitor = CaptchaMonitor()
# After each solve:
# monitor.record_solve(success=True)
# Run checks every 60 seconds:
# while True:
# monitor.run_checks()
# time.sleep(60)
دليل تشغيلي لـ مراقبة Captcha AI باستخدام Datadog: المقاييس والتنبيهات يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في...
دليل تشغيلي لـ مراقبة Captcha AI باستخدام Datadog: المقاييس والتنبيهات يغطّي قرارات البنية، والاعتمادية، والمر...
May 12, 2026
DevOps والتوسع
دليل تشغيلي لـ مراقبة Captcha AI مع الآثار الجديدة: تكامل APM يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في بيئات ال...
دليل تشغيلي لـ مراقبة Captcha AI مع الآثار الجديدة: تكامل APM يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأن...
May 13, 2026
DevOps والتوسع
دليل تشغيلي لـ التوسع التلقائي لعمّال حل CAPTCHA يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في بيئات الإنتاج.
دليل تشغيلي لـ التوسع التلقائي لعمّال حل CAPTCHA يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة ا...
Apr 19, 2026
DevOps والتوسع
دليل تشغيلي لـ معالجة نتائج CAPTCHA بنمط حدثي باستخدام AWS SNS وCaptcha AI يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha A...
دليل تشغيلي لـ معالجة نتائج CAPTCHA بنمط حدثي باستخدام AWS SNS وCaptcha AI يغطّي قرارات البنية، والاعتمادية، و...
Apr 20, 2026
الدروس التطبيقية
شرح خطوة بخطوة لـ إنشاء قائمة انتظار حل اختبار CAPTCHA في Python باستخدام Captcha AI مع أمثلة مباشرة قابلة لإعادة الاستخدام ومسار واضح لتطبيقه باستخدام Captcha...
شرح خطوة بخطوة لـ إنشاء قائمة انتظار حل اختبار CAPTCHA في Python باستخدام Captcha AI مع أمثلة مباشرة قابلة لإع...
Apr 29, 2026
DevOps والتوسع
دليل تشغيلي لـ نشر عمّال Captcha AI باستخدام Ansible يغطّي قرارات البنية، والاعتمادية، والمراقبة، وأنماط الأتمتة المناسبة لتشغيل Captcha AI في بيئات الإنتاج.