13
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace app\middleware;
|
||||
|
||||
use app\controller\MetricsController;
|
||||
use support\Request;
|
||||
use support\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());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user