fix(knowledge): I2+I3 首席架構師 Important 修復 — 依賴注入 + exception 細分
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
I2: KnowledgeService 移至 DecisionManager.__init__ 注入
_query_kb_context_inner 使用 self._knowledge_svc,移除函數內 import 耦合
I3: _query_kb_context exception 細分
- asyncio.TimeoutError → warning (預期降級)
- ConnectionError/OSError → warning (Ollama 連線問題,預期降級)
- Exception → error (非預期,提升監控可見性)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -374,6 +374,10 @@ class DecisionManager:
|
||||
|
||||
def __init__(self):
|
||||
self._openclaw = get_openclaw()
|
||||
# I2 修復 (首席架構師 Review): 注入 KnowledgeService 避免函數內 import 耦合
|
||||
# 2026-04-04 Claude Code
|
||||
from src.services.knowledge_service import get_knowledge_service
|
||||
self._knowledge_svc = get_knowledge_service()
|
||||
|
||||
async def get_or_create_decision(
|
||||
self,
|
||||
@@ -550,14 +554,12 @@ class DecisionManager:
|
||||
|
||||
async def _query_kb_context_inner(self, incident: Incident) -> str:
|
||||
"""KB RAG 實際查詢邏輯,由 _query_kb_context 包裝 timeout 後呼叫"""
|
||||
from src.services.knowledge_service import get_knowledge_service
|
||||
query_parts = list(incident.affected_services)
|
||||
if incident.signals:
|
||||
query_parts.insert(0, getattr(incident.signals[0], "alert_name", ""))
|
||||
query = " ".join(filter(None, query_parts))
|
||||
|
||||
svc = get_knowledge_service()
|
||||
results = await svc.semantic_search(query, limit=3, threshold=0.4)
|
||||
results = await self._knowledge_svc.semantic_search(query, limit=3, threshold=0.4)
|
||||
if not results:
|
||||
return ""
|
||||
|
||||
@@ -593,8 +595,13 @@ class DecisionManager:
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning("kb_rag_timeout", incident_id=incident.incident_id)
|
||||
return ""
|
||||
except (ConnectionError, OSError) as e:
|
||||
# Ollama 連線問題,預期可降級
|
||||
logger.warning("kb_rag_connection_error", incident_id=incident.incident_id, error=str(e))
|
||||
return ""
|
||||
except Exception as e:
|
||||
logger.warning("kb_rag_failed", incident_id=incident.incident_id, error=str(e))
|
||||
# 非預期錯誤,用 error 級別方便監控
|
||||
logger.error("kb_rag_unexpected_error", incident_id=incident.incident_id, error=str(e))
|
||||
return ""
|
||||
|
||||
async def _dual_engine_analyze(
|
||||
|
||||
Reference in New Issue
Block a user