laravel项目通过中间件推送接口调用信息到TransferStatistics项目

16 篇文章 0 订阅

laravel项目通过中间件推送接口调用信息到TransferStatistics项目

TransferStatistics项目介绍(传送门

TransferStatistics 使用webman开发的一个应用监控系统,用于查看应用调用记录、请求量、调用耗时、调用分析等。

系统使用 HTTP 接收上报数据;使用 Redis 进行数据汇总统计;使用 MySql 存储统计数据和上报信息。

费话不多少,直接上代码

.env配置

#上报请求信息地址
TRANSFER_REPORT_URL='http://127.0.0.1:8788/report/statistic/transfer'
ip地址:端口或域名根据项目实际情况调整。

config目录下新建文件:report_request_info.php

```
<?php

return [
    'app_name' => env('APP_NAME', 'fin-api'),
    'app_env' => env('APP_ENV', 'local'),
    'report_url' => env('TRANSFER_REPORT_URL'),
];
```

App\Http\Middleware目录下创建中间件文件:AfterReportRequestInfoMiddleware.php (后置中间件)

```
<?php

namespace App\Http\Middleware;

use Closure;

class AfterReportRequestInfoMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        $startTime  = microtime(true);  // 开始时间
        $project    = config('report_request_info.app_name');            // 应用名
        $ip         = $request->ip();      // 请求IP
        $transfer   = config('report_request_info.app_env');           // 调用入口
        $finishTime = microtime(true);           // 结束时间
        $costTime   = $finishTime - $startTime;  // 运行时长

        //$code       = mt_rand(2, 5) * 100;  // 状态码
        $code       = response($response)->getStatusCode();  // 状态码
        //$success    = $code < 400;          // 是否成功
        $success    = ($response->original['code'] ?? -1) ? 0 : 1;          // 是否成功
        // 详细信息,自定义设置
        $details = [
            // 请求时间(包含毫秒时间)
            'time'     => date('Y-m-d H:i:s.', (int)$startTime) . substr((string)$startTime, 11),
            // 运行时长
            'run_time' => $costTime,
            // .....
        ];

        // 执行上报
        try {
            // 数据打包 多条 换行 隔开
            $data = json_encode([
                    'time'     => date('Y-m-d H:i:s.', (int)$startTime) . substr((string)$startTime, 11),
                    'project'  => $project,
                    'ip'       => $ip,
                    'transfer' => $transfer,
                    'costTime' => $costTime,
                    'success'  => $success ? 1 : 0,
                    'code'     => $code,
                    'details'  => json_encode($details, 320),
                ], 320) . "\n";

            $client = new \GuzzleHttp\Client(['verify' => false]);
            $reportUrl = config('report_request_info.report_url');
            if ($reportUrl) {
                $res = $client->post(
                    // 上报地址
                    $reportUrl,
                    [
                        'headers' => [
                            // 上报认证,不设置默认为当前年份的md5值
                            'authorization' => md5(date('Y'))
                        ],
                        'form_params' => [
                            // 上报数据
                            'transfer' => $data
                        ],
                    ]
                );
            }
        //} catch (\Throwable $th) {
        } catch (\Exception $e) {
            //throw $th;
            //throw new \Exception($e->getMessage(), 200);
        }

        return $response;
    }
}
```

app/Http/Kernel.php 文件新增全局中间件

```
protected $middleware = [
    //原有中间件......
    //上报请求信息后置中间件
    \App\Http\Middleware\AfterReportRequestInfoMiddleware::class,
];
```

至此,上报接口调用信息的中间件开发完成,每次调用接口后都会触发该中间件调用TransferStatistics项目的接口,将数据推送入库,从而形成调用统计信息,TransferStatistics项目的安装使用可以参考其GitHub的readme指导。

效果如下:
在这里插入图片描述

****************************** 只要思想不滑坡,办法总比困难多******************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值