feat(api): Phase 15.3 Deep Linking 三系統互連
實現 Sentry ↔ SignOz ↔ Langfuse 零斷鏈觀測: 新增 deep_linking.py: - SignOz Trace URL 生成器 - Langfuse Trace URL 生成器 - Sentry Issue URL 生成器 - get_all_links() 統一取得所有連結 整合點: - main.py: Sentry before_send 注入 otel_trace_id + signoz_trace_url - langfuse_client.py: 自動注入 OTEL trace_id 到 metadata - openclaw.py: SignOz span 記錄 langfuse.trace_id 反向連結 架構圖: ┌─────────┐ trace_id ┌─────────┐ trace_id ┌──────────┐ │ Sentry │◄────────►│ SignOz │◄────────►│ Langfuse │ │ Errors │ │ Traces │ │ LLMOps │ └─────────┘ └─────────┘ └──────────┘ Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -832,7 +832,7 @@ class OpenClawService:
|
||||
logger.info("mock_mode_enabled", using="mock_llm")
|
||||
return self._generate_mock_response(alert_context or {}, signoz_metrics), "mock", True
|
||||
|
||||
# Phase 15.1: Langfuse 追蹤整合
|
||||
# Phase 15.1 + 15.3: Langfuse 追蹤整合 + SignOz Deep Linking
|
||||
with langfuse_trace(
|
||||
"openclaw_fallback_chain",
|
||||
metadata={
|
||||
@@ -841,6 +841,21 @@ class OpenClawService:
|
||||
"alert_fingerprint": (alert_context or {}).get("fingerprint", "unknown"),
|
||||
},
|
||||
) as trace:
|
||||
# Phase 15.3: SignOz → Langfuse 反向連結
|
||||
# 在當前 OTEL span 中記錄 Langfuse trace_id
|
||||
if trace.langfuse_trace_id:
|
||||
from opentelemetry import trace as otel_trace
|
||||
|
||||
from src.core.deep_linking import DeepLinking
|
||||
|
||||
current_span = otel_trace.get_current_span()
|
||||
if current_span:
|
||||
current_span.set_attribute("langfuse.trace_id", trace.langfuse_trace_id)
|
||||
current_span.set_attribute(
|
||||
"langfuse.trace_url",
|
||||
DeepLinking.langfuse_trace_url(trace.langfuse_trace_id),
|
||||
)
|
||||
|
||||
for provider in settings.AI_FALLBACK_ORDER:
|
||||
logger.info("ai_provider_attempt", provider=provider)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user