77 lines
1.9 KiB
PHP
77 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace app\middleware;
|
|
|
|
use app\controller\MetricsController;
|
|
use support\Request;
|
|
use Webman\Http\Response;
|
|
|
|
/**
|
|
* 指标收集中间件
|
|
* 自动记录HTTP请求指标
|
|
*/
|
|
class MetricsMiddleware
|
|
{
|
|
/**
|
|
* 请求开始时间
|
|
*/
|
|
protected $startTime;
|
|
|
|
/**
|
|
* 处理请求
|
|
*
|
|
* @param Request $request
|
|
* @param callable $handler
|
|
* @return Response
|
|
*/
|
|
public function process(Request $request, callable $handler): Response
|
|
{
|
|
// 记录请求开始时间
|
|
$this->startTime = microtime(true);
|
|
|
|
// 处理请求
|
|
$response = $handler($request);
|
|
|
|
// 计算请求处理时间
|
|
$duration = microtime(true) - $this->startTime;
|
|
|
|
// 记录指标
|
|
$this->recordMetrics($request, $response, $duration);
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* 记录指标
|
|
*
|
|
* @param Request $request
|
|
* @param Response $response
|
|
* @param float $duration
|
|
*/
|
|
protected function recordMetrics(Request $request, Response $response, float $duration): void
|
|
{
|
|
try {
|
|
$method = $request->method();
|
|
$path = $request->path();
|
|
$status = $response->getStatusCode();
|
|
|
|
// 获取响应大小
|
|
$responseSize = strlen($response->rawBody());
|
|
|
|
// 记录HTTP请求指标
|
|
MetricsController::recordHttpRequest($method, $path, $status, $duration, $responseSize);
|
|
|
|
// 记录请求处理时间
|
|
MetricsController::setGauge('webman_http_request_duration_seconds', $duration, [
|
|
'method' => $method,
|
|
'path' => $path,
|
|
'status' => (string)$status
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
// 记录指标失败不应影响正常请求
|
|
error_log('Metrics recording failed: ' . $e->getMessage());
|
|
}
|
|
}
|
|
}
|