一、开场:一次”无声的崩溃”让我警醒
大家好,我是老金。
今天这篇是 OpenClaw 系列的最后一篇。
讲一个让我至今心有余悸的故事。
上个月 18 号凌晨,我的手机静音了,睡得正香。
第二天早上 7 点,打开手机,看到群里炸了锅:
“OpenClaw 是不是挂了?”
“我的任务全部超时!”
“从凌晨 2 点开始就没响应了!”
“客户投诉电话打爆了!”
我冲到电脑前,打开监控系统,看到的是:
- 所有实例 CPU 100%,负载 5.0+
- 内存使用率 98%,Swap 已耗尽
- 任务队列积压 50,000+
- 日志显示:某个 Task 内存泄漏
最可怕的是——没有任何人在凌晨收到告警。
我们的监控系统,当晚也”睡著了”。
这件事给了我血的教训:
OpenClaw 运维不是”装上去就行了”,而是一个系统工程。
今天这篇文章,我把 OpenClaw 监控与运维的全部经验,整理成一份”运维手册”。
内容包括:
- 如何设计生产级监控方案?
- 关键指标有哪些?
- 告警策略怎么配置?
- 日志收集与分析最佳实践
- 故障排查手册(从现象到根因)
- 备份与灾难恢复
- 版本管理与灰度发布
如果你正在用 OpenClaw 跑生产环境,这篇文章能救你的命。
二、监控方案设计:要能看到”一切”
OpenClaw 监控,我建议分 4 层:
| 层次 | 监控对象 | 工具 | 频率 |
|---|---|---|---|
| L1 基础设施 | CPU、内存、磁盘、网络 | Prometheus Node Exporter | 15s |
| L2 服务健康 | QPS、响应时间、错误率 | OpenClaw / Prometheus | 15s |
| L3 任务执行 | 任务队列、Agent 状态、LLM 延迟 | OpenClaw API | 30s |
| L4 业务逻辑 | 任务成功率、业务异常、用户满意度 | 自定义指标 + 业务埋点 | 1m |
2.1 指标体系设计
总共 20+ 个核心指标,按优先级排序:
P0(实时告警级别)
- service_up – OpenClaw 服务是否在线
- qps – 每秒请求数(突增或骤降都是问题)
- response_time_p95 – 95% 分位响应时间
- error_rate – 错误率
- queue_size – 任务队列积压
- llm_latency_p95 – LLM 调用延迟
P1(小时级关注)
- agent_execution_time_avg – Agent 平均执行时间
- browser_instances – 浏览器实例数
- cache_hit_rate – 缓存命中率
- memory_usage – 内存使用率
- cpu_usage – CPU 使用率
P2(日报)
- task_success_rate – 任务成功率
- daily_active_users – 日活用户
- cost_per_day – 每日成本
- storage_growth – 存储增长
2.2 Prometheus + Grafana 监控方案
这是最成熟的开源监控方案。
Prometheus 配置:
# prometheus.yml
scrape_configs:
-
job_name: 'openclaw'
static_configs:
- targets: ['localhost:18789']
metrics_path: '/metrics'
scrape_interval: 15s
-
job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # node exporter
OpenClaw 暴露 metrics:
# config.yaml
metrics:
enabled: true
endpoint: "/metrics"
port: 9090
自定义业务指标
custom:
-
name: "tasks_processed_total"
type: "counter"
description: "Total number of tasks processed"
-
name: "task_duration_seconds"
type: "histogram"
buckets: [0.1, 0.5, 1, 2, 5, 10]
Grafana 仪表盘:
- 系统概览(CPU、内存、网络、磁盘)
- OpenClaw 服务健康(QPS、响应时间、错误率)
- 任务队列状态(积压数、处理速率)
- LLM 性能(调用延迟、成功率、成本)
- Agent 状态(哪些 Agent 在线,执行时间分布)
三、告警策略:关键时刻要有人响应
告警的目的是:在问题变大之前,通知到人。
告警设计原则:
- 分级告警 – 不是所有问题都打电话
- 避免噪音 – 同一事件不要重复告警
- 有动作 – 每个告警都要有对应的处理流程
- 可追溯 – 每个告警都要记录操作
3.1 告警级别定义
| 级别 | 响应时间 | 通知方式 | 示例 |
|---|---|---|---|
| P0-Critical | 5 分钟内 | 电话 + 短信 + 即时通讯 | 服务完全不可用 |
| P1-High | 15 分钟内 | 即时通讯 + 邮件 | 性能严重下降,部分功能异常 |
| P2-Medium | 1 小时内 | 邮件 | 单一功能异常,不影响整体 |
| P3-Low | 4 小时内 | 日报 | 低风险,可延后处理 |
3.2 告警规则配置(Prometheus Alertmanager)
# alert.rules.yml
groups:
-
name: critical
rules:
-
alert: OpenClawDown
expr: up{job="openclaw"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "OpenClaw 服务宕机"
description: "OpenClaw 实例 {{ $labels.instance }} 已下线超过 2 分钟"
-
alert: QueueBacklogHigh
expr: openclaw_queue_size > 10000
for: 5m
labels:
severity: critical
annotations:
summary: "任务队列积压严重"
description: "当前积压 {{ $value }} 个任务"
-
name: high
rules:
-
alert: ResponseTimeHigh
expr: openclaw_response_time_p95 > 10
for: 10m
labels:
severity: high
annotations:
summary: "响应时间过高"
description: "P95 响应时间 {{ $value }} 秒"
-
alert: MemoryUsageHigh
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) > 0.9
for: 15m
labels:
severity: high
3.3 告警通知渠道
# alertmanager.yml
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
routes:
-
match:
severity: critical
receiver: 'critical-pager'
continue: false
-
match:
severity: high
receiver: 'slack-teams'
receivers:
-
name: 'critical-pager'
email_configs:
- to: 'ops@example.com'
send_resolved: true
pagerduty_configs:
- routing_key: 'xxx'
-
name: 'slack-teams'
slack_configs:
- api_url: 'https://hooks.slack.com/...'
channel: '#alerts'
四、日志收集与分析:问题定位的基石
没有日志,出问题就是”盲人摸象”。
4.1 日志分类
- 审计日志:谁在什么时候做了什么(安全追溯)
- 系统日志:服务启动/停止、配置变更
- 业务日志:任务执行、Skill 调用、Agent 行为
- 错误日志:所有 Error / Exception
- 性能日志:任务耗时、资源使用
4.2 日志输出配置
# config/logging.yaml
logging:
level: "INFO"
多输出配置
outputs:
-
type: "file"
path: "/var/log/openclaw/app.log"
max_size: "100M"
max_files: 10
-
type: "stdout" # Docker 环境
format: "json"
结构化日志
structured: true
审计日志单独文件
audit_log: "/var/log/openclaw/audit.log"
错误日志单独(方便快速查看)
error_log: "/var/log/openclaw/error.log"
4.3 ELK / Loki 集中日志
对于集群部署,需要把日志收集到中心:
# docker-compose.yml 中配置 Filebeat
filebeat:
image: elastic/filebeat:latest
volumes:
- ./config/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/log/openclaw:/var/log/openclaw:ro
depends_on:
- elasticsearch
- kibana
Kibana 日志查询:
# 查找某个任务的执行过程
service="openclaw" task_id="abc123"
查找某个 Agent 的错误
service="openclaw" agent="support-agent" level=ERROR
查找某个用户的审计日志
service="openclaw" user="admin001" audit=true
4.4 日志最佳实践
- 总是记录上下文:task_id、user_id、session_id
- 结构化日志:用 JSON 格式,方便搜索
- 日志级别要准确:DEBUG、INFO、WARN、ERROR 别乱用
- 敏感信息脱敏:密码、Token、身份证号等不要记录
- 日志轮转:定期压缩归档,防止磁盘爆满
好的日志示例:
{
"timestamp": "2026-03-22T10:30:00Z",
"level": "INFO",
"service": "openclaw",
"component": "task-scheduler",
"task_id": "task_789",
"user_id": "user_123",
"action": "task_started",
"agent": "email-sender",
"payload_size": 2048,
"context": {
"priority": 1,
"queue": "business"
}
}
五、故障排查手册:从现象到根因
本节提供快速排障指南。
5.1 症状:服务无法访问
检查清单:
- 进程是否在运行?
ps aux | grep openclaw - 端口监听状态?
netstat -tlnp | grep 18789 - 防火墙是否放行?
iptables -L - 容器是否健康?
docker ps - 磁盘空间是否充足?
df -h
常见原因:
- 进程崩溃(查看日志)
- 端口被占用
- 防火墙未开放
- 磁盘满了无法写入
5.2 症状:响应时间慢
检查清单:
- CPU 使用率?
top/htop - 内存是否不足?
free -h - LLM 调用延迟?查看 metrics 中的 llm_latency
- 任务队列积压?
openclaw metrics看 queue_size - 数据库慢查询?查看数据库慢日志
- 网络延迟?
ping/traceroute
常见原因:
- LLM API 限流或变慢
- 浏览器实例太多,内存泄漏
- 数据库未优化,慢查询
- 网络带宽不足
5.3 症状:任务失败率高
检查清单:
- 查看错误日志:
tail -f /var/log/openclaw/error.log - Task ID 追踪:查看该 task 的完整执行日志
- Skill 是否正常加载?
openclaw skill list - 外部依赖是否可达?(数据库、API 等)
- 配置是否正确?(参数、权限)
常见原因:
- Skill Bug
- 权限不足
- 外部 API 变更(break change)
- 配置错误
- 资源不足(内存、超时)
5.4 症状:内存泄漏
现象:内存随时间持续增长,重启后恢复,很快又满。
检查清单:
- 浏览器实例是否过多?限制 max_instances
- 上下文是否未清理?设置自动清理
- 缓存是否无限增长?设置 TTL 和 LRU
- 是否有循环引用?用 Python 内存分析工具
工具:
# Docker 内存分析
docker stats
docker exec -it openclaw bash
cat /proc/meminfo
Python 内存分析(如使用)
python -m memory_profiler script.py
5.5 症状:成本突增
检查清单:
- API 调用次数是否异常?查看各 LLM 的用量统计
- 是否有恶意请求?检查 IP 黑名单
- 是否有无限循环任务?查看任务日志
- 是否有 Skill BUG 导致重复调用?
预防:
- 设置每日 API 调用上限
- 每个用户设置配额
- 启用缓存
- 监控 Cost 指标并告警
六、备份与灾难恢复:万一挂了怎么办?
再好的系统也可能挂,必须有恢复方案。
6.1 备份什么?
- 配置文件:config/ 目录
- Skill 代码:skills/ 目录(如果是自定义的)
- 任务数据:数据库、Redis、任务记录
- 日志文件:(可选,用于审计和排查)
6.2 备份策略
# 每日全量备份
0 2 * * * /opt/backup/full_backup.sh
每小时增量备份(任务数据)
0 /opt/backup/incremental_backup.sh
backup.sh 示例:
#!/bin/bash
BACKUP_DIR="/backup/$(date +%Y-%m-%d)"
mkdir -p $BACKUP_DIR
1. 配置文件
tar -czf $BACKUP_DIR/config.tar.gz /opt/openclaw/config
2. Skills
tar -czf $BACKUP_DIR/skills.tar.gz /opt/openclaw/skills
3. 数据库
pg_dump -h localhost -U openclaw openclaw_db > $BACKUP_DIR/db.sql
4. Redis
redis-cli save
cp /var/lib/redis/dump.rdb $BACKUP_DIR/
5. 上传到 S3(异地备份)
aws s3 cp $BACKUP_DIR s3://my-openclaw-backups/ --recursive
6. 清理 30 天前的旧备份
find /backup -type d -mtime +30 -exec rm -rf {} ;
6.3 恢复流程
步骤:
- 停服务:
openclaw stop - 还原配置文件
- 还原 Skill 代码
- 还原数据库:
psql -f db.sql - 还原 Redis:
cp dump.rdb /var/lib/redis/ - 重启服务:
openclaw start - 验证功能是否正常
恢复演练:
每季度进行一次恢复演练,确保备份有效。
6.4 多云/多AZ部署
对于关键业务,建议:
- 主备机房(异地容灾)
- 数据库主从复制
- Redis 哨兵模式
- 负载均衡器健康检查 + 故障转移
七、版本管理与灰度发布
OpenClaw 本身需要升级,你的 Skill 也需要更新。
直接在生产环境升级=赌博。
7.1 版本管理策略
- OpenClaw 版本:遵循 SemVer,升级前测试
- Skill 版本:每个 Skill 有自己的版本号,记录变更
- 配置版本:config/ 目录纳入 Git 管理
Git 分支策略:
main # 生产环境
staging # 预发布环境
dev # 开发环境
7.2 灰度发布流程
- 开发环境测试:在 dev 分支完成开发,单元测试
- 预发布验证:Staging 环境演练,业务验收
- 小流量灰度:先对 10% 用户发布,观察 24 小时
- 全量发布:灰度无异常后,全量上线
- 回滚准备:随时准备回滚到上一个版本
OpenClaw 升级示例:
# 1. 预发布环境测试
docker-compose -f docker-compose.staging.yml up -d openclaw
2. 运行测试套件
./tests/integration_test.sh
3. 小流量灰度(通过 Nginx 分流)
upstream openclaw_backend {
server openclaw-v1:18789 weight=90;
server openclaw-v2:18790 weight=10; # 灰度版本
}
4. 监控新版本指标
如果 24 小时无异常,逐步增加权重到 100%
配置热更新:
OpenClaw 支持配置热更新,Skill 也支持热加载:
openclaw config reload # 重载配置
openclaw skill reload # 重载 Skill
八、写在最后:运维是一门”长期主义”的手艺
这篇文章,是 OpenClaw 系列的终章。
从 1 月的”入门科普”,到今天的”运维手册”,我写了快 3 万字。
如果总结 OpenClaw 的完整生命周期,我想说:
- 部署 – 10 分钟跑起来
- 配置 – 几小时搞定基本功能
- 优化 – 几天甚至几周打磨性能
- 安全 – 持续加固,永无止境
- 运维 – 7×24 小时守护
OpenClaw 不是”装上去就完事了”的产品,而是需要持续投入的系统。
如果你只是想”玩一玩”,部署完就撤,那没关系。
但如果你想把它用在生产环境、支撑真实业务,运维能力是决定成败的关键。
最后,送给大家一句话:
好的系统,不是不出问题,而是问题发生时你能快速定位和恢复。
希望这篇”运维手册”,能在关键时刻帮到你。
完。