仅靠“能访问”完全不够。“能访问”只说明 Web 服务器响应了 HTTP 请求,不反映业务逻辑正确性、性能瓶颈、数据一致性或系统韧性。
要证明 Laravel 应用“真的稳定”,需构建可观测性(Observability)体系,覆盖请求、业务、资源、依赖四大维度。
一、基础健康指标(必须监控)
1.HTTP 5xx 错误率
- 监控点:
500/502/503/504响应比例 - 阈值:> 0.1% 持续 5 分钟 → 告警
- 工具:
- Laravel Telescope(开发/预发)
- Prometheus + Blackbox Exporter(生产)
- New Relic / Datadog(SaaS)
📌为什么:5xx 表示服务器内部错误,直接破坏用户体验
2.HTTP 延迟(P95 / P99)
- 监控点:
- API 延迟:
/api/usersP95 < 500ms - 页面渲染延迟:
/dashboardP95 < 2s
- API 延迟:
- 工具:
- Laravel Horizon(队列任务延迟)
- APM 工具(如 Elastic APM)
📌为什么:高延迟 = 资源瓶颈或慢查询,用户流失主因
3.队列积压(Laravel Horizon)
- 监控点:
queue:work失败任务数- 队列长度(
default队列 > 1000 → 告警)
- 命令:
php artisan queue:failed redis-cli llen queues:default
📌为什么:队列积压 = 异步任务失败,订单/邮件/日志丢失
二、业务健康指标(核心价值)
1.关键业务流程成功率
- 示例:
- 注册流程:
POST /register→ 邮件发送成功 → 账号激活 - 支付流程:
POST /checkout→ 支付回调 → 库存扣减
- 注册流程:
- 实现:
- 在关键步骤埋点:
// 注册成功Log::info('user.registered',['user_id'=>$user->id]);// 邮件发送Log::info('email.sent',['to'=>$user->email,'type'=>'welcome']); - 用ELK(Elasticsearch+Logstash+Kibana) 或Sentry聚合分析
- 在关键步骤埋点:
📌为什么:“能访问” ≠ “业务跑通”,只有端到端流程成功才叫稳定
2.数据一致性校验
- 示例:
- 订单状态 =
paid,但支付记录不存在 - 用户余额 < 0
- 订单状态 =
- 实现:
- 定时任务校验:
// app/Console/Commands/CheckDataConsistency.phppublicfunctionhandle(){$invalidOrders=Order::where('status','paid')->whereDoesntHave('payment')->count();if($invalidOrders>0){Alert::send("Data inconsistency:$invalidOrdersorders");}}
- 定时任务校验:
📌为什么:数据不一致 =静默故障,比 500 错误更危险
三、资源健康指标(系统层)
1.PHP-FPM 指标
- 监控点:
max children达到上限(pm.max_children)- 请求队列长度 > 0(
listen queue)
- 命令:
# 启用 FPM statuscurlhttp://127.0.0.1/fpm-statuspool: www process manager: dynamic idle processes: 2 active processes: 8 total processes: 10 max active processes: 10 # 若 = pm.max_children → 需扩容
2.MySQL 指标
- 监控点:
- 慢查询数(
slow_queries) - 连接数(
Threads_connected> 80% max_connections) - InnoDB 缓冲池命中率 < 99%
- 慢查询数(
- 工具:
SHOW GLOBAL STATUS- Percona Monitoring Plugins
3.Redis 指标
- 监控点:
- 内存使用率 > 80%
evicted_keys> 0(键被驱逐)
- 命令:
redis-cli info memory redis-cli info stats
四、依赖健康指标(外部服务)
1.第三方 API 成功率
- 监控点:
- 支付网关(Stripe/Alipay)失败率
- 短信/邮件服务商(Twilio/SendGrid)失败率
- 实现:
- 在 Guzzle 中间件记录:
// app/Http/Middleware/LogExternalApi.phppublicfunctionhandle($request,Closure$next){$response=$next($request);if($response->getStatusCode()>=400){Log::error('External API failed',['url'=>$request->url(),'status'=>$response->getStatusCode()]);}return$response;}
- 在 Guzzle 中间件记录:
2.CDN/对象存储可用性
- 监控点:
- 静态资源(JS/CSS)加载失败率
- 上传到 S3/OSS 失败率
五、合成监控(Synthetic Monitoring)
1.端到端业务探针
- 工具:
- Checkly/Pingdom/Grafana Synthetic Monitoring
- 示例脚本:
// 模拟用户注册awaitpage.goto('https://your-app.com/register');awaitpage.fill('input[name=email]','test@example.com');awaitpage.click('button[type=submit]');awaitexpect(page).toHaveText('Welcome!');// 验证成功
📌为什么:真实用户行为可能触发隐藏 bug
六、Laravel 专属监控
1.Schedule 任务健康
- 监控点:
php artisan schedule:run是否按时执行- 任务执行时长是否超限
- 工具:
- Laravel Pulse(Laravel 11+)
- Oh Dear(专为 Laravel 设计的监控)
2.配置一致性
- 监控点:
.env与生产配置是否匹配config:cache是否生成
- 实现:
- 在健康检查接口中返回关键配置哈希:
// routes/web.phpRoute::get('/health',function(){return['config_hash'=>md5_file(base_path('bootstrap/cache/config.php')),'queue'=>Queue::connection()->readyNow(),];});
- 在健康检查接口中返回关键配置哈希:
七、告警策略(避免告警疲劳)
| 指标 | 告警条件 | 通知方式 |
|---|---|---|
| 5xx 错误率 | > 1% 持续 2 分钟 | Slack + 短信 |
| P99 延迟 | > 2s 持续 5 分钟 | Slack |
| 队列积压 | > 1000 任务 | Slack |
| 数据不一致 | 任意发现 | 邮件 + 企业微信 |
✅原则:
告警必须可操作(Actionable),
避免 “CPU > 80%” 这类无上下文告警。
总结:稳定 = 可观测 + 可操作
| 层级 | 监控目标 | 工具示例 |
|---|---|---|
| 请求层 | HTTP 5xx、延迟 | Prometheus, APM |
| 业务层 | 端到端流程成功率 | ELK, Sentry |
| 资源层 | FPM/MySQL/Redis | FPM status, Percona |
| 依赖层 | 第三方 API | Guzzle 中间件 |
| 合成层 | 真实用户行为 | Checkly, Pingdom |
“能访问”只是起点,“业务流畅、数据一致、故障自愈”才是稳定。
用指标驱动运维,
而非“用户没投诉就没事”的侥幸心理。