fix: 静默吞错横扫 —— 数据落库/配置广播/审计失败不再无声
把检索链路那次的做法推到同类位置。判据是"丢了这个 error 的代价",只改代价
高的,不动刻意的 fire-and-forget。
改(丢了就是数据永久丢失或行为不可解释):
- task_handler: 任务**输出**与**执行轨迹**的收尾落库。这是唯一的持久副本
(Redis 流 10min TTL),失败则永远无法复盘,界面上只显示"这次运行没有
轨迹"。轨迹的 json.Marshal 失败分支同样是静默跳过,一并补上。
- admin.broadcastActive: 模型配置热更新广播。失败 = dispatcher/mcp-go 仍用
旧配置,症状是"控制台改了模型却不生效",而操作者这边一切正常——正是今天
排查半天的那类问题。
- middleware/audit: 审计留痕写入。不阻断主流程是对的(业务已完成),但静默
失败意味着敏感操作没有记录,且没人知道记录缺了,这是合规缺口。
不改(确认过是合理的):
- dispatcher 的 PublishToken/PublishExec:往前端推流,丢一帧是 UI 瑕疵,
且按 token 打日志会刷屏;
- 计量回写 PublishUsage:本来就检查 error 并打日志,钱的路径是干净的。
另修一处误导文案:任务下钻的轨迹空态原本把原因说死为"早于该功能上线",
现在"落库失败"也是已知原因,文案改为并列并指向日志里的 [task] 告警。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -382,7 +383,6 @@ func (h *Handler) AdminSetTenantStatus(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"status": "ok"})
|
||||
}
|
||||
|
||||
|
||||
// AdminMembers: GET /api/v1/admin/tenants/:id/members —— 某租户成员列表。
|
||||
func (h *Handler) AdminMembers(c *gin.Context) {
|
||||
rows, err := h.db.ListMembers(c.Request.Context(), c.Param("id"))
|
||||
@@ -564,7 +564,11 @@ func (h *Handler) TestModel(c *gin.Context) {
|
||||
func (h *Handler) broadcastActive(ctx context.Context) {
|
||||
for _, kind := range []string{contract.ConfigKindChat, contract.ConfigKindEmbedding} {
|
||||
if cfg := h.db.ActiveConfig(ctx, kind); cfg != nil {
|
||||
_ = h.bus.PublishConfigUpdated(kind, cfg)
|
||||
// 广播失败 = dispatcher/mcp-go 拿不到新配置,症状是"控制台改了模型却不生效",
|
||||
// 而改配置的人这边一切正常。必须留痕,否则只能靠猜。
|
||||
if err := h.bus.PublishConfigUpdated(kind, cfg); err != nil {
|
||||
log.Printf("[admin] ⚠️ %s 配置广播失败: %v(dispatcher/mcp-go 仍在用旧配置,需重启或重试保存)", kind, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user