【免费下载链接】Choruz
Choruz 是一个本地优先的人机协作平台,人、AI Agent 在类似 Slack 的空间里通过消息、任务与文件协同工作。本文是一份面向新手的 Choruz 生产运维指南,带你从零开始:接入 Prometheus 监控 Choruz 的/metrics端点、配置 3 条核心告警规则、按 Runbook 流程完成健康巡检、故障排查与版本回滚。
一、Choruz 生产架构速览:4 个核心组件与端口
Choruz 的 host-native 部署(non_docker模式)由以下几部分构成,先记住它们的端口,后面所有监控和排查都围绕它们展开:
| 组件 | 作用 | 默认端口 |
|---|---|---|
choruz-api-gateway | REST API、认证、Webhook 投递 | 3000 |
choruz-pipeline | 实时管线(WebSocket / 事件投递) | 3020 |
| Web 应用(Next.js) | 用户界面、文档站 | 3100 |
| PostgreSQL / Caddy(Nginx) | 数据库 / 反向代理 | 5432 / — |
用户看到的一切——群聊、私聊、附件、终端会话——都跑在这套后端之上:
服务单元模板可直接参考 infra/ops/systemd/choruz-api-gateway.service(Linux systemd)与 infra/ops/launchd/(macOS launchd),反向代理配置见 infra/ops/caddy/Caddyfile。
二、5 分钟接入 Prometheus:抓取 /metrics 端点
Choruz 每个二进制都内置了一个 Prometheus 文本格式的/metrics端点(指标注册实现见 crates/choruz-common/src/metrics.rs)。先手动验证:
curl -fsS http://127.0.0.1:3000/metrics看到# HELP/# TYPE开头的输出即说明采集就绪。在 Prometheus 中为两个后端各配置一个 job:
scrape_configs: - job_name: choruz-api-gateway static_configs: - targets: ["127.0.0.1:3000"] metrics_path: /metrics - job_name: choruz-pipeline static_configs: - targets: ["127.0.0.1:3020"] metrics_path: /metrics💡 注意:网关(3000)与管线(3020)必须分开抓取——"缺少采集点或就绪探测失败"本身就是主机可用性事故,因为进程没起来时连错误计数都不存在。
Choruz 核心指标速查表(来自 docs/operations/slo.md):
| 指标名 | 含义 | 稳态参考 |
|---|---|---|
choruz_event_backlog_total | 事件积压量 | 生产稳态应低于 500 |
choruz_audit_logs_total | 审计日志写入 | 特权写操作 100% 有审计行 |
choruz_http_responses_total{class="5xx"} | 服务端 5xx 响应数 | 用于错误率告警 |
choruz_activity_batches_total{outcome="failed"} | 认证数据摄入失败批次数 | 进程计数器,重试会重复累加 |
choruz_realtime_gateway_up/choruz_agent_gateway_up | 网关存活状态 | 持续为 1 |
choruz_wal_recovery_success | 管线 WAL 恢复成功与否 | 必须为 1 |
choruz_principals_total/choruz_conversations_total/choruz_messages_total | 业务规模基数 | 出现即代表/metrics可达 |
三、配置 Choruz 告警规则:3 条必须有的核心告警
仓库自带现成的告警规则文件 infra/ops/alerts/choruz-alerts.yaml,直接加载到你的 Alertmanager 即可:
| 告警 | 触发条件 | 持续时间 | 级别 |
|---|---|---|---|
ChoruzApiGatewayDown | absent(choruz_principals_total) | 2 分钟 | critical |
ChoruzEventBacklogGrowing | choruz_event_backlog_total > 500 | 5 分钟 | warning |
ChoruzAuditLogsMissing | increase(choruz_audit_logs_total[15m]) == 0 | 15 分钟 | warning |
配合 SLO 中的值班规则(docs/operations/slo.md):
- 🚨 网关宕机超过 2 分钟 → 立即呼叫值班(page)
- 🚨
/readyz连续失败超 2 分钟(即使/healthz还正常)→ 立即 page - 🚨 消息写入 P95 延迟超过 500ms 持续 10 分钟 → 立即 page
- 📋 积压超阈值超 5 分钟 → 开工单
SLO 基线建议:API 可用率 99.9%/月(约每月 43 分钟错误预算)、SendMessageP95 < 150ms、断线重连恢复 < 3s。
四、日常巡检:健康检查与冒烟测试命令清单
把下面 6 步当作每日巡检(源自 docs/operations/runbook.md 的 Standard Checks):
pnpm host:status # 1. 主机与服务状态 pnpm api:smoke # 2. API 冒烟测试 curl -fsS http://127.0.0.1:3000/healthz # 3. 网关存活 curl -fsS http://127.0.0.1:3000/readyz # 4. 网关就绪 curl -fsS http://127.0.0.1:3020/readyz # 5. 管线就绪 curl -fsS http://127.0.0.1:3000/metrics # 6. 指标可抓取最后再检查一遍 infra/host/.env 是否有配置漂移。/healthz只证明进程活着,/readyz才是可接流的权威信号——两者要分开看。冒烟脚本细节可参考 infra/host/smoke.sh 与 infra/host/status.sh。
五、故障排查 Runbook:4 类常见事故处置步骤
事故 1:API 网关挂了
systemctl status choruz-api-gateway(macOS 用launchctl print system/com.choruz.api-gateway)- 查日志:
/var/log/choruz/api-gateway.log - 二进制缺失或过期 → 按 docs/operations/deploy.md 的 managed device upgrades 流程启用已验证包
- 最新发布有问题 → 用同一流程的 verified rollback 回滚,并带就绪 URL 复检
事故 2:事件积压持续增长
- 查
/metrics中的choruz_event_backlog_total - 确认 Webhook 目标返回
2xx - 调用
POST /v1/webhooks/flush重试待投递事件 - 积压仍在涨 → 重启
choruz-api-gateway,验证客户端能从 cursor 断点续传
事故 3:WAL 恢复报错
对choruz_wal_recovery_success == 0告警(进程存活监控要单独配置;健康的/readyz不能证明 WAL 恢复成功):
- 找启动时的
WAL crash recovery incomplete摘要与WAL recovery operation failed记录,用stage/path/error字段区分权限、库损坏、持久化失败 - 先保留沙箱
_wal目录与 SQLite sidecar 文件,再修复有证据的存储/权限问题 - 受控重启管线重新扫描,复核新摘要与恢复指标,再单独核对受影响命令的重试/死信记录
⚠️ 不要为了消除告警而删库或把未完成的工作标记成功。
事故 4:无头主机启动失败
choruz-server会内嵌 PostgreSQL 并监管网关与管线。以 stderr 中第一个失败(而非最后的关闭消息)为准:
| 日志特征 | 含义与下一步 |
|---|---|
no migrations dir found | 找不到发布包的migrations/目录;恢复完整匹配版本,而不是只补 server 二进制 |
embedded postgres failed to start | 按error字段定位阶段;检查磁盘、权限、端口 5433,不要删除pgdata |
backend spawn failed | 从同一发布版补齐缺失的兄弟二进制;3000/3020 端口须空闲或被预期服务占用 |
backend child failed; terminating choruz-server | 这是结果不是根因;向上找 child-exit 记录再修 |
事故 5:密钥轮换失败
- 确认审计中有
agent.secret_rotated - 核对无 token 泄漏到日志
- 由签入的人类身份重新轮换
- 客户端卡死时:禁用该 principal 并创建替换 agent
六、追踪一次用户交互:从告警定位到根因
定位"某用户某时刻操作异常"类问题时,推荐这条链路:
- 设置
CHORUZ_LOG_FORMAT=json,让服务 stderr 输出结构化日志,配合进程监管器做日志轮转 - 用
trace_id/request_id串联请求日志,再按 trace、turn、command 标识关联已提交消息 - 用 activity CLI 导出受影响时间窗的观测数据(用法见 docs/operations/cli.md)
注意两点边界:客户端观测不是服务端审计证据;"终端完成缺失"可能只是进程断开,不等于用户做了某个决定。持久化记录才是行为分析的权威来源。
七、发布与回滚:让每次变更可验证、可退回
发布门禁清单(docs/operations/runbook.md Release Checklist):
cargo test --workspacepnpm web:check与pnpm web:buildpnpm host:smoke与pnpm api:smokeinfra/ops/check.sh- 使用已验证的 CI 产物激活部署(不要部署 PR/fork 产物)
激活与回滚用仓库自带 helper(要求 Python 3.12+):
python3 infra/ops/verify-archive.py /path/to/choruz.tar.gz COMMIT_SHA python3 infra/ops/release.py deploy /path/to/extracted-release \ --releases /srv/choruz/releases \ --health-url http://127.0.0.1:3000/readyz \ --health-url http://127.0.0.1:3020/readyz \ --health-url http://127.0.0.1:3100/docshelper 会先校验哈希、可执行权限与平台基线,再原子替换current并等待就绪;失败时自动恢复已验证的previous版本。回滚后务必重跑pnpm api:smoke并确认/metrics与告警面板恢复绿色。
⚠️ 关键认知:二进制回滚不会撤销数据库迁移。回滚前先备份并核对 schema 兼容性(详见 docs/operations/deploy.md)。
八、运维文档与脚本导航 📚
| 资料 | 路径 |
|---|---|
| 主机运维 Runbook(本文事故章节的来源) | docs/operations/runbook.md |
| SLO / 错误预算 / 值班规则 | docs/operations/slo.md |
| 部署、发布与回滚 | docs/operations/deploy.md |
| CLI 与 activity 数据追踪 | docs/operations/cli.md |
| Prometheus 告警规则 | infra/ops/alerts/choruz-alerts.yaml |
| 服务单元模板 | infra/ops/systemd/、infra/ops/launchd/ |
| 冒烟 / 状态 / 启停脚本 | infra/host/smoke.sh、infra/host/status.sh |
| 指标注册实现 | crates/choruz-common/src/metrics.rs |
按这套流程走一遍:/metrics可抓取 → 3 条告警在线 → 巡检清单每日跑 → 4 类事故有章法 → 发布回滚可验证。你的 Choruz 生产环境就具备了从"能跑"到"敢跑"的运维底座。
【免费下载链接】Choruz
相关推荐
Workbox Streams流式处理实战:如何拼接多个资源生成新Response
Workbox Streams流式处理实战:如何拼接多个资源生成新Response 如果你正在开发 PWA(渐进式网页应用),一定会遇到这样的场景:想把缓存的页
前端开发工具如何快速实现AI驱动的3D建模:BlenderMCP智能工作流完整指南
如何快速实现AI驱动的3D建模:BlenderMCP智能工作流完整指南 你是否曾经为复杂的3D建模操作感到头疼?是否希望AI助手能直接帮你操作Blender,让
MCP 服务AI 应用人工智能工具调用CANN/asc-devkit核间同步等待API
CrossCoreWaitFlag\ ISASI\ <a name="ZH CN_TOPIC_0000001787470374" </a 产品支持情况<a na
人工智能深度学习算子库CANNAscend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考