请求故障定位
保留时间、公开模型、HTTP 状态和 x-litellm-call-id。先找到对应请求日志,再修改配置。
诊断请求
此请求会调用模型,可能产生供应商费用。
curl -i "$XHUB_BASE_URL/v1/chat/completions" -H "Authorization: Bearer $XHUB_API_KEY" -H "Content-Type: application/json" -d '{"model":"company-chat","messages":[{"role":"user","content":"Reply with ready."}]}'| 现象 | 检查 |
|---|---|
| 401 | XHub 密钥是否有效,不能发送供应商 Key |
| 403 / 隐藏存在性的 404 | 当前成员关系、所有权、模型范围;403 budget_exceeded 表示预算耗尽 |
| 429 | RPM/TPM、供应商响应 |
| 无可用部署 | 启用状态、transport、端点能力 |
| 流中断 | 事件和最终日志;HTTP 状态可能已发送 |
| 缺少费用 | 实测用量、价格快照、PostgreSQL、Redis 积压 |
分享证据前移除凭据、个人信息及签名媒体 URL。不要删除生产数据来修复测试。
源码与验证
go test ./internal/gateway/usage -count=1独立磁盘用量队列
Compose 为每个网关挂载 xhub-usage-spool:/var/lib/xhub/usage-spool,并通过
XHUB_USAGE_SPOOL_DIR 启用独立磁盘账单快照。收到最终用量后,网关先保存完整
UsageRecord(含预占 ID、冻结费率和原有日志设置允许保存的正文),执行文件
fsync、原子改名和目录 fsync,然后同步提交 PostgreSQL。只有数据库确认成功
才删除文件。PG 完全断连、无 Redis 时,重启仍可恢复;恢复只结算账单,不重试上游。
原有 usage_pending 和旧 Redis 队列继续恢复,新请求启用磁盘队列后不再重复入 Redis。
这是同步持久化路径:每次调用增加磁盘同步和数据库提交延迟,以减少最终账单仅留在 内存中的窗口。吞吐量取决于持久盘与数据库;不要把该目录放在容器可写层、临时目录或 多个实例共享的卷上。单目录持有进程排他锁,各副本必须各有持久卷。停机或迁移时保留 整个目录,不能仅迁移数据库;确认队列清空后再删除旧卷。
容量可用以下启动环境变量调整(正整数):
| 变量 | 默认 | 含义 |
|---|---|---|
XHUB_USAGE_SPOOL_MAX_BYTES |
1073741824 |
待结算、隔离文件及在途预留总字节上限 |
XHUB_USAGE_SPOOL_RECORD_BYTES |
16777216 |
单条完整快照上限,也是每个在途调用保守预留值 |
XHUB_USAGE_SPOOL_MAX_ENTRIES |
8192 |
待结算文件及在途调用总数上限 |
默认字节配置最多容纳 64 个同时在途预留,有待结算文件时更少。准入在调用上游前验证
目录写入和同步,目录/文件权限分别为 0700/0600。容量满、不可写或隔离证据存在时,
新调用返回 503 billing_storage_unavailable,响应头
X-XHub-Usage-Persistence: unavailable。已有未落库费用时搜索软预算调用返回
503 billing_storage_pending,防止用旧余额继续放行;硬额度原有预占继续保留。
恢复成功前用量页只包含已入账部分,不能把显示值当作全部已产生费用。
文件含版本和 SHA-256 内容校验,损坏/版本不符/同调用不同快照进入 quarantine/,
不自动删除。运维应保留目录并核对证据、恢复备份或核销,不能清空队列“解决”故障。
重复恢复依靠数据库调用 ID、完整快照 SHA-256 指纹和预占核销规则去重;
数据库同 ID 存在不同待结算载荷或已提交指纹时拒绝确认,保留磁盘证据。启动幂等补齐
usage_fingerprint 字段;旧账单不回填伪造指纹,无指纹历史不能被严格恢复自动确认,
需核对后通过预占核销处理。结算冲突保留原载荷、记录错误,单条
失败至少间隔 30 秒重试且不阻塞其他有效记录。日志只记录请求 ID/摘要文件名与错误,
不要把账单文件或用户正文贴到工单。更改配置后需重启。
边界:未设置目录的非 Compose 部署仍使用原持久化路径;需显式配置持久目录才能获得
此保证。容量预留是本队列的逻辑预留,不能防止外部进程在准入后耗尽磁盘、硬件损坏或
进程在最终用量尚未持久化前退出。单条快照超出上限不会截断,写失败仍尝试 PG/Redis;
所有介质均不可写时仅能告警并保留既有硬额度占用,不能宣称已保存实际账单。官方异步
任务的可变生命周期仍由 RecordTaskUsage 管理,不属于本次最终用量快照覆盖范围。