feat(admin): 服务状态面板(基建/服务探活 + MCP 工具注册)+ mcp-go 工具注册表
管理端新增「运维 › 服务状态」:总览横幅 + 摘要数字 + 请求链路拓扑 (客户端→网关→NATS→调度→MCP,按健康三态着色)+ 应用服务卡(含探针 延迟)+ 基建磁贴 + MCP 工具按能力域分组(中文名/作用)。 探活机制(全走 NATS,无 HTTP): - mcp-go/mcp-py 新增 list_tools 自省工具,能应答=在线 + 上报工具清单 - dispatcher 无端点 → 新增 NATS 心跳主题 sundynix.health.dispatcher (ServeHealth 应答 model/ready/uptime),网关用 bus.Ping 探 - 网关 GET /api/v1/admin/status 并发聚合四探针 + 各项延迟 mcp-go 重构:switch → map 注册表(buildRegistry),dispatch 与 list_tools 共用单一事实源,杜绝漂移;每个工具带中文名 + 作用描述。mcp-py 同样补元信息。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -214,6 +214,29 @@ func respond(m *nats.Msg, res *contract.ToolResult) {
|
||||
_ = m.Respond(data)
|
||||
}
|
||||
|
||||
// ---- 服务探活(core NATS request-reply 心跳)----
|
||||
|
||||
// ServeHealth 在 subject 上应答健康探测,provide 返回本节点状态 JSON(可为空)。
|
||||
// 用于无 HTTP/工具端点的节点(如 dispatcher)向控制面暴露存活。
|
||||
func (b *Bus) ServeHealth(subject string, provide func() []byte) (unsub func() error, err error) {
|
||||
sub, err := b.nc.Subscribe(subject, func(m *nats.Msg) {
|
||||
_ = m.Respond(provide())
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("serve health %s: %w", subject, err)
|
||||
}
|
||||
return sub.Unsubscribe, nil
|
||||
}
|
||||
|
||||
// Ping 同步探测某节点健康:发到 subject 等应答。无人应答 / 超时即返回错误(视为下线)。
|
||||
func (b *Bus) Ping(ctx context.Context, subject string) ([]byte, error) {
|
||||
msg, err := b.nc.RequestWithContext(ctx, subject, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return msg.Data, nil
|
||||
}
|
||||
|
||||
// ---- 配置控制面(core NATS request-reply + broadcast)----
|
||||
|
||||
// RequestConfig 向控制面(Gateway)请求某 kind 当前激活配置(chat/embedding)。
|
||||
|
||||
@@ -25,6 +25,10 @@ const (
|
||||
QueueToolsGo = "mcp-go-workers" // mcp-go 队列组(多副本负载均衡)
|
||||
QueueToolsPy = "mcp-py-workers" // mcp-py 队列组
|
||||
|
||||
// 服务探活:dispatcher 既无 HTTP 端点也不挂工具,单独用一个 core NATS
|
||||
// request-reply 心跳主题让控制面(管理端「服务状态」)能判定它在不在线。
|
||||
SubjectHealthDispatcher = "sundynix.health.dispatcher"
|
||||
|
||||
// MetaUserID 是 Task.Meta 中承载已登录用户标识的键(用于偏好记忆召回)。
|
||||
MetaUserID = "user_id"
|
||||
// MetaSessionID 是 Task.Meta 中承载会话标识的键(用于短期多轮历史)。
|
||||
|
||||
Reference in New Issue
Block a user