From a5ff57ddc3a94645201e9b2a93f5a7f89b5041f2 Mon Sep 17 00:00:00 2001 From: OG T Date: Fri, 27 Mar 2026 23:14:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E4=BF=AE=E5=BE=A9=20Sentry=20Appro?= =?UTF-8?q?val=20=E6=AC=84=E4=BD=8D=E5=B0=8D=E9=BD=8A=20ApprovalRequestBas?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ApprovalRequestCreate 使用正確欄位 (action, description, blast_radius...) - BlastRadius 改用 Model 實例而非不存在的 enum - 移除未使用的 DryRunCheck import - 原始欄位移至 metadata Co-Authored-By: Claude Opus 4.5 --- apps/api/src/api/v1/sentry_webhook.py | 28 +++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) 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, }, )