只需要把下边的方法放在 bootstrap/app.php 文件即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
|--------------------------------------------------------------------------
| 记录执行时间, 如果大于 3s 则把信息更新到 sentry
|--------------------------------------------------------------------------
*/

app()->terminating(function () {
    $handleCliInfo = function () {
        // 哪些命令不进行记录
        $except = [
            'queue:work'
        ];

        $info = with(new \Symfony\Component\Console\Input\ArgvInput())->getFirstArgument();

        return in_array($info, $except) ? '' : $info;
    };
    $start = request()->server('REQUEST_TIME_FLOAT'); // 脚本开始时间
    $end = microtime(true); // 当前方法执行时间,可以认为是结束时间
    $diff = $end - $start;
    if (env('MAX_EXECUTE_TIME', 3) <= $diff) { // 如果执行时间超过三秒则执行下边代码
        $info = app()->runningInConsole() ? $handleCliInfo() : app('request')->getPathInfo(); // 如果是
        if (!empty($info)) {
            app('sentry')->captureMessage(
                'Execute current is %ss (path: %s)',
                [
                    intval($diff),
                    $info
                ],
                [
                    'fingerprint' => [$info] // !!! 这里使用 fingerprint 参数解决所有 sentry message 都被集合在一条记录的问题
                ]
            );
        }
    }
});