Prometheus 指标集成到 PHP:库与示例

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

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

开始课程

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']);

// 输出指

推荐