最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
TP5.1 项目接入 Grafana 展示 QPS 与负载:仪表盘
时间:2026-07-12 09:20:52 编辑:袖梨 来源:一聚教程网
必须通过PSR-15中间件集成prometheus/client_php实现全路径打点,禁用控制器埋点;需单例初始化collectorregistry、规范命名指标、预设直方图buckets、清洗label非法字符,并通过独立路由暴露/metrics端点且禁用所有中间件与opcache。
要在 ThinkPHP 5.1 项目中真实呈现每秒请求数(QPS)和服务器负载,必须让 TP5.1 主动暴露 Prometheus 可采集的指标,而非仅依赖 Nginx 或系统层数据——因为中间件拦截、路由解析、数据库连接池等 TP 层瓶颈无法被外部指标覆盖。
在 TP5.1 中注入 Prometheus 指标采集逻辑
第一步:安装 prometheus_client_php 库
执行 composer require prometheus/client_php,确保 vendor/autoload.php 已加载。
第二步:创建中间件用于统计请求耗时与状态
运行 php think make:middleware RequestMetrics,在 app/middleware/RequestMetrics.php 中写入:
```php
use PrometheusCollectorRegistry;
use PrometheusStorageAdapterAPC;
use thinkRequest;
class RequestMetrics
{
protected $registry;
public function __construct()
{
// 必须使用 APCu 存储,file 方式在 FPM 下会失效
$this->registry = new CollectorRegistry(new APC());
}
public function handle(Request $request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
$duration = microtime(true) - $start;
// QPS 计数器:按 status_code 分组
$counter = $this->registry->getOrRegisterCounter(
'tp5', 'http_requests_total', 'HTTP 请求总数', ['status']
);
$counter->inc(['status' => $response->getCode()]);
// 响应时间直方图:桶区间必须覆盖 TP 典型延迟(毫秒转秒)
$histogram = $this->registry->getOrRegisterHistogram(
'tp5', 'http_request_duration_seconds', 'HTTP 请求耗时(秒)', ['controller', 'action'], [0.01, 0.05, 0.1, 0.3, 1.0, 3.0]
);
$route = $request->routeInfo();
$histogram->observe($duration, [
$route['controller'] ?? 'unknown',
$route['action'] ?? 'unknown'
]);
return $response;
}
}
第三步:注册中间件到全局(app/middleware.php)
在数组开头添加 appmiddlewareRequestMetrics::class,确保它在所有业务中间件之前执行。
第四步:暴露指标端点
新建控制器 app/controller/Metrics.php:
```php
use PrometheusCollectorRegistry;
use PrometheusStorageAdapterAPC;
use thinkController;
class Metrics extends Controller
{
public function index()
{
$registry = new CollectorRegistry(new APC());
$renderer = new PrometheusRenderTextFormat();
$result = $renderer->render($registry->getMetricFamilySamples());
header('Content-Type: text/plain; version=0.0.4');
return $result;
}
}
第五步:配置路由(route/route.php)
添加 Route::get('metrics', 'Metrics/index');,访问 /metrics 应返回纯文本指标,含 tp5_http_requests_total 和 tp5_http_request_duration_seconds 等行。
配置 Prometheus 抓取 TP5.1 指标
方法一:直接抓取 TP 应用自身端点(推荐)
编辑 prometheus.yml,在 scrape_configs 下新增 job:
```yaml
- job_name: 'tp5-app'
static_configs:
- targets: ['your-tp-server-ip:80'] # 注意:不是 localhost,是容器或宿主机可访问地址
metrics_path: /metrics
params:
format: [prometheus]
# 关键:TP5.1 无认证,但需防止外网暴露
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: tp5-prod-v1
```
方法二:通过 nginx-proxy 转发并加 Basic Auth(生产必需)
在 nginx 配置中为 /metrics 路径添加 auth_basic,并在 Prometheus job 中配置 basic_auth 用户名密码。否则 【任何人可直接访问 /metrics 获取全部内部监控数据】。
在 Grafana 中创建 QPS 与负载仪表盘
步骤一:登录 Grafana → 左侧菜单点击 “+” → “Dashboard” → “Add new panel”
步骤二:配置 QPS 面板(单值 + 趋势图)
Query 输入:sum(rate(tp5_http_requests_total[1m]))
标题设为 “当前 QPS”;显示为 “None” 格式;开启 “Show all value” 显示趋势线。
步骤三:配置分层响应时间面板
添加新面板 → Query 输入:histogram_quantile(0.95, sum(rate(tp5_http_request_duration_seconds_bucket[5m])) by (le, controller, action))
Legend 设置为 {{controller}}/{{action}} —— 这样能一眼看出哪个控制器动作拖慢了整体响应。
步骤四:配置服务器负载辅助指标(需额外采集)
TP5.1 不提供 CPU/内存数据,必须搭配 node_exporter:
在另一面板中输入:100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
标题设为 “服务器 CPU 使用率”,单位选 “percent (0.0-100.0)”。
步骤五:保存仪表盘
右上角点击 “Save dashboard”,命名 “TP5.1 QPS & Latency”,设置 Folder 为 “PHP Services”。
相关文章
- 企业AI知识库赛道深度观察:私有化部署缘何成为新战场? 07-12
- 企业知识库选型 六大维度评测 AI知识管理 07-12
- RAG技术视角下的企业AI知识库架构解析:以佑桥六大特性为样本 07-12
- 企业AI知识库架构设计深度剖析:基于佑桥平台六大核心技术实现 07-12
- 《背包英雄》背包原理分享 07-12
- 企业AI知识库落地实操:IT运维视角下的六大能力部署与调优指引 07-12