From 256a24e843cf04f5504cad26c4123ddb8dfae3d6 Mon Sep 17 00:00:00 2001 From: OG T Date: Wed, 15 Apr 2026 22:08:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(deps+startup):=20drain3/statsmodels=20?= =?UTF-8?q?=E8=A3=9C=E5=85=A5=20pyproject=20+=20warmup=20skip=20=E8=88=8A?= =?UTF-8?q?=E8=B3=87=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pyproject.toml: 補 drain3>=0.9.11, statsmodels>=0.14.0, sse-starlette → Docker build 從 pyproject 裝,requirements.txt 的套件之前沒裝進 image → P4 LogAnomalyDetector 400次 drain3_not_available 告警排除 - main.py: working_memory warmup per-record try/except → 舊 incident 含非法 source (node-exporter) → 跳過,不 crash 整個 warmup 2026-04-15 ogt + Claude Sonnet 4.6(亞太) Co-Authored-By: Claude Sonnet 4.6 --- apps/api/pyproject.toml | 4 ++++ apps/api/src/main.py | 42 ++++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/apps/api/pyproject.toml b/apps/api/pyproject.toml index 11ea5dc7..2c6c4d00 100644 --- a/apps/api/pyproject.toml +++ b/apps/api/pyproject.toml @@ -39,6 +39,10 @@ dependencies = [ "claude-agent-sdk>=0.1.50", # Sprint 5.1 2026-04-08 Claude Sonnet 4.6: Service Registry YAML 讀取 "pyyaml>=6.0.0", + # Phase 4 ADR-084: 動態異常偵測 (2026-04-15 ogt: 補齊缺失依賴) + "statsmodels>=0.14.0", + "drain3>=0.9.11", + "sse-starlette>=1.8.0", ] # [tool.uv.sources] diff --git a/apps/api/src/main.py b/apps/api/src/main.py index 4325fd9e..5a86089a 100644 --- a/apps/api/src/main.py +++ b/apps/api/src/main.py @@ -259,25 +259,29 @@ async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]: restored = 0 for record in records: - from src.models.incident import Incident - incident = Incident( - incident_id=record.incident_id, - status=record.status, - severity=record.severity, - signals=record.signals or [], - affected_services=record.affected_services or [], - decision_chain=record.decision_chain, - proposal_ids=record.proposal_ids or [], - outcome=record.outcome, - created_at=record.created_at, - updated_at=record.updated_at, - resolved_at=record.resolved_at, - closed_at=record.closed_at, - ttl_days=record.ttl_days, - vectorized=record.vectorized, - ) - if await incident_service.save_to_working_memory(incident): - restored += 1 + try: + from src.models.incident import Incident + incident = Incident( + incident_id=record.incident_id, + status=record.status, + severity=record.severity, + signals=record.signals or [], + affected_services=record.affected_services or [], + decision_chain=record.decision_chain, + proposal_ids=record.proposal_ids or [], + outcome=record.outcome, + created_at=record.created_at, + updated_at=record.updated_at, + resolved_at=record.resolved_at, + closed_at=record.closed_at, + ttl_days=record.ttl_days, + vectorized=record.vectorized, + ) + if await incident_service.save_to_working_memory(incident): + restored += 1 + except Exception: + # 舊資料 source 值不合法(node-exporter 等)→ 跳過 + pass logger.info("working_memory_warmed_up", restored=restored, total=len(records)) except Exception as e: