fix(deps+startup): drain3/statsmodels 補入 pyproject + warmup skip 舊資料
All checks were successful
CD Pipeline / build-and-deploy (push) Successful in 17m23s

- 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 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-15 22:08:13 +08:00
parent c05bac6112
commit 256a24e843
2 changed files with 27 additions and 19 deletions

View File

@@ -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]

View File

@@ -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: