feat(admin): add full-chain trace and performance monitoring
- Backend: trace.Logger ring-buffer for request chain events - Backend: perf.Monitor with runtime.MemStats sampling every 10s - Backend: /api/v1/admin/trace and /api/v1/admin/perf endpoints - Frontend: TracePage — timeline with hop icons and status dots - Frontend: PerformancePage — memory/GC bar charts + live stats - Admin nav expanded to 11 items
This commit is contained in:
1 parent
8420691438
commit
e8b5679cf4
8 files changed
+442
No files matched your search
@@ -33,6 +33,8 @@ import (
|
||||
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/llm"
|
||||
llmlog "git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/llm"
|
||||
tracepkg "git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/trace"
|
||||
perfpkg "git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/perf"
|
||||
aiCoreCtx "git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/context"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/orchestrator"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/services/ai-core/persona"
|
||||
@@ -233,10 +235,16 @@ func main() {
|
||||
|
||||
// Build dependencies for gateway handlers
|
||||
llmLogger := llmlog.NewLogger(200)
|
||||
traceLogger := tracepkg.NewLogger(500)
|
||||
perfMon := perfpkg.NewMonitor(120, 10*time.Second)
|
||||
perfMon.Start()
|
||||
|
||||
gwDeps := api.Dependencies{
|
||||
AuthMgr: authMgr,
|
||||
Orchestrator: orch,
|
||||
LLMLogger: &llmLoggerAdapter{Logger: llmLogger},
|
||||
TraceLog: &traceAdapter{Logger: traceLogger},
|
||||
PerfMon: &perfAdapter{Monitor: perfMon},
|
||||
ModelConfig: api.NewModelConfigStore(),
|
||||
PluginList: pluginNamesToMap(reg.ListNames()),
|
||||
}
|
||||
@@ -294,3 +302,41 @@ func pluginNamesToMap(names []string) []map[string]string {
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// traceAdapter adapts trace.Logger to api.TraceLogger interface.
|
||||
type traceAdapter struct{ *tracepkg.Logger }
|
||||
func (a *traceAdapter) Recent(n int) []map[string]any {
|
||||
events := a.Logger.Recent(n)
|
||||
result := make([]map[string]any, len(events))
|
||||
for i, e := range events {
|
||||
result[i] = map[string]any{
|
||||
"id": e.ID, "timestamp": e.Timestamp.Format(time.RFC3339),
|
||||
"hop": e.Hop, "label": e.Label, "status": e.Status,
|
||||
"duration_ms": e.DurationMs, "detail": e.Detail, "data": e.Data,
|
||||
}
|
||||
if result[i]["data"] == nil { result[i]["data"] = map[string]any{} }
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// perfAdapter adapts perf.Monitor to api.PerfMonitor interface.
|
||||
type perfAdapter struct{ *perfpkg.Monitor }
|
||||
func (a *perfAdapter) Latest() map[string]any {
|
||||
s := a.Monitor.Latest()
|
||||
return map[string]any{
|
||||
"alloc_mb": s.AllocMB, "sys_mb": s.SysMB,
|
||||
"num_gc": s.NumGC, "goroutines": s.Goroutines, "heap_objects": s.HeapObj,
|
||||
}
|
||||
}
|
||||
func (a *perfAdapter) History() []map[string]any {
|
||||
snapshots := a.Monitor.History()
|
||||
result := make([]map[string]any, len(snapshots))
|
||||
for i, s := range snapshots {
|
||||
result[i] = map[string]any{
|
||||
"timestamp": s.Timestamp.Format(time.RFC3339),
|
||||
"alloc_mb": s.AllocMB, "sys_mb": s.SysMB,
|
||||
"num_gc": s.NumGC, "goroutines": s.Goroutines,
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
Reference in new issue
Block a user