diff --git a/apps/api/src/api/v1/sentry_webhook.py b/apps/api/src/api/v1/sentry_webhook.py index cc1bfac47..0d30477b4 100644 --- a/apps/api/src/api/v1/sentry_webhook.py +++ b/apps/api/src/api/v1/sentry_webhook.py @@ -25,7 +25,6 @@ from src.models.approval import ( ApprovalRequestCreate, BlastRadius, DataImpact, - DryRunCheck, RiskLevel, ) from src.services.approval_db import get_approval_service @@ -382,25 +381,30 @@ async def create_sentry_approval( project = error_context.get("project", "unknown") issue_id = error_context.get("issue_id", "unknown") + # 組裝 Approval 請求 (符合 ApprovalRequestBase schema) approval_request = ApprovalRequestCreate( - source="sentry", - alert_type=f"sentry_{level}", - target_resource=culprit, - namespace=project, + action=f"Sentry {level.upper()} Alert: {culprit}", + description=f"{title}\n\nRoot Cause: {analysis.root_cause if analysis else '待分析'}\nSuggestion: {analysis.fix_suggestion if analysis else '待 AI 分析'}", risk_level=risk_level, - root_cause=analysis.root_cause if analysis else title, - suggestion=analysis.fix_suggestion if analysis else "待 AI 分析", - blast_radius=BlastRadius.SERVICE, # Sentry 錯誤通常影響單一服務 - data_impact=DataImpact.READ_ONLY, - dry_run_check=DryRunCheck.PASSED, - llm_provider=analysis.analyzed_by if analysis else "pending", - llm_confidence=analysis.confidence if analysis else 0.0, + blast_radius=BlastRadius( + affected_pods=1, + estimated_downtime="0", + related_services=[project], + data_impact=DataImpact.READ_ONLY, + ), + dry_run_checks=[], # Sentry 告警無 dry-run + requested_by="sentry-webhook", metadata={ + "source": "sentry", + "alert_type": f"sentry_{level}", "sentry_issue_id": issue_id, "sentry_project": project, + "culprit": culprit, "error_count": error_context.get("count", 1), "first_seen": error_context.get("first_seen"), "stacktrace": error_context.get("stacktrace", []), + "llm_provider": analysis.analyzed_by if analysis else "pending", + "llm_confidence": analysis.confidence if analysis else 0.0, }, )