PHP 应用监控:高级指标与告警

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:从基础健康检查到深度可观测性

\n

PHP 应用的基础监控,包括可用性检查(healthcheck)和 CPU 负载,是首先需要配置的最低要求。然而,对于高负载和复杂业务逻辑的生产系统来说,这远远不够。高级监控将焦点从“存活/死亡”转移到 可观测性,并能够回答以下问题:“为什么转化率下降了?”,“是哪个端点拖慢了速度?”,“有多少用户未能完成支付?”。

\n

在本文中,我们将探讨 PHP 应用高级监控的架构,学习如何采集自定义指标(包括业务指标),配置基于异常的告警,并将所有内容集成到统一的 Grafana 面板中。所有代码示例均使用 PHP 编写,可直接用于部署。

\n\n

1. 指标采集架构:Prometheus 与自定义导出器

\n

现代指标采集的事实标准是 Prometheus 及其拉取模型。PHP 应用不必直接在 /metrics 端口上提供指标。相反,我们使用 自定义导出器——一个独立的脚本,它通过 Redis、数据库或文件轮询应用,并以 Prometheus 格式生成响应。

\n\n

1.1. 为 PHP 安装 Prometheus 客户端

\n

推荐的库是 promphp/prometheus_client_php。通过 Composer 安装:

\n
composer require promphp/prometheus_client_php
\n\n

1.2. 指标导出器示例 (metrics.php)

\n

创建一个脚本,以 Prometheus 格式返回指标。使用 Redis 进行存储(生产环境使用 PERSISTENT 标志)。

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Prometheus\\CollectorRegistry;\nuse Prometheus\\Storage\\Redis;\nuse Prometheus\\RenderTextFormat;\n\n// 连接到 Redis\nRedis::setDefaultOptions(['host' => '127.0.0.1', 'port' => 6379]);\n$registry = new CollectorRegistry(new Redis());\n\n// 注册响应时间直方图\n$histogram = $registry->getOrRegisterHistogram(\n    'app_http_request_duration_seconds',\n    'HTTP request duration in seconds',\n    ['method', 'endpoint', 'status']\n);\n\n// 注册业务指标计数器\n$counter = $registry->getOrRegisterCounter(\n    'app_orders_total',\n    'Total number of orders processed',\n    ['status'] // success, failed\n);\n\n// 模拟数据(实际中从数据库或日志读取)\n$histogram->observe(0.12, ['GET', '/api/orders', '200']);\n$counter->incBy(1, ['success']);\n\n// 输出指标\n$renderer = new RenderTextFormat();\nheader('Content-Type: text/plain');\necho $renderer->render($registry->getMetricFamilySamples());\n
\n

然后配置 Nginx 或 Apache,使此脚本可通过 /metrics 路径访问,并将目标添加到 Prometheus。

\n\n

2. 业务指标:监控真正重要的内容

\n

技术指标(延迟、错误率)是基础,但业务指标能让你了解产品的健康状况。此类指标的示例包括:

\n
    \n
  • 每分钟成功订单数——下降表明支付网关存在问题。
  • \n
  • 购物车平均处理时间——增长可能表明代码出现回归。
  • \n
  • 注册放弃率——如果急剧上升,可能是表单出了问题。
  • \n
\n\n

2.1. 在应用代码中集成业务指标

\n

使用相同的 prometheus_client_php,但将调用封装在中间件或服务层中。Laravel 示例:

\n
<?php\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Prometheus\\CollectorRegistry;\n\nclass MetricsMiddleware\n{\n    protected $registry;\n\n    public function __construct(CollectorRegistry $registry)\n    {\n        $this->registry = $registry;\n    }\n\n    publi                

博客

书籍推荐