安装组件 composer require easyswoole/tracker
onRequest事件(请求开始)
public static function onRequest(Request $request, Response $response): bool
{
//链路追踪
$point = PointContext::getInstance()->createStart('onRequest');
$point->setStartArg([
'uri' => $request->getUri()->__toString(),//获取请求的url
'get' => $request->getQueryParams(),//get参数(注意:若POST与GET存在同键名参数,则以GET为准)
'post'=> $request->getRequestParam()//post参数
]);
return true;
}
CREATE TABLE `api_tracker_point_list` (
`point_id` varchar(50) NOT NULL,
`parent_id` varchar(50) DEFAULT NULL,
`point_name` varchar(255) DEFAULT NULL COMMENT '请求名称',
`is_next` int(11) NOT NULL DEFAULT '0',
`depth` int(11) NOT NULL DEFAULT '0',
`status` varchar(10) NOT NULL DEFAULT '' COMMENT '状态',
`ip` varchar(50) NOT NULL DEFAULT '' COMMENT '请求ip',
`url` varchar(1000) NOT NULL DEFAULT '' COMMENT '请求地址',
`result` text COMMENT '请求结果',
`data` text COMMENT '请求参数',
`add_time` varchar(15) NOT NULL DEFAULT '0' COMMENT '访问时间',
`start_time` varchar(15) NOT NULL DEFAULT '0' COMMENT '请求开始时间',
`end_time` varchar(15) NOT NULL DEFAULT '0' COMMENT '请求结束时间',
`spend_time` decimal(15,3) DEFAULT '0.000' COMMENT '调用耗时',
PRIMARY KEY (`point_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
public static function afterRequest(Request $request, Response $response): void
{
//获取当前ip
$serv = ServerManager::getInstance()->getSwooleServer();
$client = $serv->getClientInfo($request->getSwooleRequest()->fd);
$clientAddress = $client['remote_ip'];
$xri = $request->getHeader('x-real-ip');
$xff = $request->getHeader('x-forwarded-for');
if ($clientAddress === '127.0.0.1'){
if (!empty($xri)) { // 如果有xri 则判定为前端有NGINX等代理
$clientAddress = $xri[0];
} elseif (!empty($xff)) { // 如果不存在xri 则继续判断xff
$list = explode(',', $xff[0]);
if (isset($list[0])) $clientAddress = $list[0];
}
}
$point = PointContext::getInstance()->startPoint();
$point->end();
$array = Point::toArray($point);
$data = [];
foreach ($array as $v)
{
$data['point_id'] = $v['pointId'];
$data['point_name'] = $v['pointName'];
$data['parent_id'] = $v['parentId'];
$data['depth'] = $v['depth'];
$data['is_next'] = $v['isNext'] ? 1 : 0;
$data['start_time'] = $v['startTime'];
$data['end_time'] = $v['endTime'];
$data['spend_time'] = $v['endTime']-$v['startTime'];
$data['status'] = $v['status'];
$arg = $v['startArg'];
$data['url'] = explode(':9503',$arg['uri'])[1];
unset($arg['uri']);
$data['result'] = $response->getBody()->__toString();
$data['data'] = json_encode($arg);
$data['add_time'] = time();
$data['ip'] = $clientAddress;
//此处应做个白名单来处理那些api接口调用需要记录到表
if(strpos(strtolower($data['url']),'api/admin') === false )
{
ApiTrackerModel::create($data)->save();
}
}
}
本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.amdzz.cn
最新评论