PHP 中的 Prometheus 指标:应用程序性能监控
Prometheus 是一个强大的开源监控和告警系统,已成为云原生领域的事实标准。要将 Prometheus 与 PHP 应用程序集成,有多个成熟的库可供选择。在本文中,我们将介绍两个主要的库:promphp/prometheus_client_php 和 artisanphpex/prometheus,并展示如何将指标添加到您的 PHP 项目中。
为什么 PHP 需要指标?
监控 PHP 应用程序可以跟踪以下内容:
- 请求数量及其执行时间
- 错误和异常
- 内存和 CPU 使用情况
- 队列和外部服务的状态
- 业务指标(订单数量、注册数量等)
收集这些数据有助于快速发现问题、规划扩展并改善用户体验。
promphp/prometheus_client_php 库
这是最流行且积极维护的库。它实现了 Prometheus 的官方 PHP 客户端,并支持所有指标类型:
- Counter — 只增不减的计数器(例如,请求数量)
- Gauge — 可增可减的值(当前内存、活跃用户数)
- Histogram — 用于测量值分布的直方图(响应时间、请求大小)
- Summary — 分位数分布(类似于 Histogram,但在客户端计算分位数)
安装
composer require promphp/prometheus_client_php使用示例
<?phprequire 'vendor/autoload.php';
use Prometheus\\CollectorRegistry;use Prometheus\\Storage\\InMemory;use Prometheus\\RenderTextFormat;
// 创建存储(可以是 Redis、APC、InMemory)$adapter = new InMemory();$registry = new CollectorRegistry($adapter);
// 创建计数器$counter = $registry->registerCounter( 'app', 'requests_total', 'Total number of HTTP requests', ['method', 'endpoint']);
// 每次请求时递增$counter->incBy(1, ['GET', '/api/users']);
// 为响应时间创建直方图$histogram = $registry->registerHistogram( 'app', 'response_time_seconds', 'Response time in seconds', ['method', 'endpoint'], [0.1, 0.5, 1, 2, 5] // buckets);
// 观察请求执行时间$histogram->observe(0.234, ['GET', '/api/users']);
// 以 Prometheus 格式输出指标$renderer = new RenderTextFormat();$result = $renderer->render($registry->getMetricFamilySamples());
header('Content-Type: ' . RenderTextFormat::MIME_TYPE);echo $result;artisanphpex/prometheus 库
这是一个更轻量级的替代方案,专注于易用性。它也支持 Counter、Gauge、Histogram 和 Summary。
安装
composer require artisanphpex/prometheus使用示例
<?phprequire 'vendor/autoload.php';
use ArtisanPhp\\Prometheus\\CollectorRegistry;use ArtisanPhp\\Prometheus\\Storage\\InMemory;use ArtisanPhp\\Prometheus\\RenderTextFormat;
$adapter = new InMemory();$registry = new CollectorRegistry($adapter);
// 创建 Gauge$gauge = $registry->registerGauge( 'app', 'memory_usage_bytes', 'Current memory usage in bytes', ['process']);
$gauge->set(memory_get_usage(true), ['main']);
// 创建 Summary$summary = $registry->registerSummary( 'app', 'request_duration_milliseconds', 'Request duration in ms', ['method'], 0.95, // quantile 0.01 // error);
$summary->observe(150, ['GET']);
// 输出指