asamir / laravel-in-db-performance-monitor

通过在数据库中记录请求来监控您的Laravel应用程序性能,然后进行分析。日志包括请求参数、操作、SQL查询和错误,除此之外,您还可以通过原始SQL查询了解请求。

V2.0.3 2019-12-08 20:53 UTC

This package is not auto-updated.

Last update: 2024-09-23 19:45:41 UTC


README

通过在数据库中记录请求来监控您的Laravel应用程序性能,然后进行分析。日志包括请求参数、操作、SQL查询和错误,除此之外,您还可以通过原始SQL查询了解请求。 演示

目录

要求

Laravel >=5.1

安装

1- 运行 composer require asamir/laravel-in-db-performance-monitor

2- 对于 laravel < 5.5config/app.php 中添加此提供程序

'providers' => [
	\\...
	ASamir\InDbPerformanceMonitor\InDbPerformanceMonitorProvider::class,
]

3- 运行 php artisan in-db-performance-monitor:init

4- 在 config/database.php 文件中添加并配置 inDbMonitorConn 连接 => 提示:上一个命令为您创建了 .env 变量

'connections' => [
    //...
    'inDbMonitorConn' => [
        'driver' => 'mysql',
        'host' => env('IN_DB_MONITOR_DB_HOST', ''),
        'port' => env('IN_DB_MONITOR_DB_PORT', '3306'),
        'database' => env('IN_DB_MONITOR_DB_DB', ''),
        'username' => env('IN_DB_MONITOR_DB_USERNAME', ''),
        'password' => env('IN_DB_MONITOR_DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => 'asamir_',
        'strict' => false,
        'engine' => null,
    ],
]

5- 在 app/Http/Kernel.php 文件中添加此中间件

protected $middleware = [
    //...
    \ASamir\InDbPerformanceMonitor\InDbPerformanceMonitorMiddleware::class
];

6- 在 app/Exceptions/Handler.php 中添加此行 => public function report(Exception $exception)

public function report(Exception $exception) {
    //...
    \ASamir\InDbPerformanceMonitor\LogErrors::inDbLogError($exception);
    
    parent::report($exception);
}
//..Hint For laravel < 5.3 => instead of $exception it will be $e

7- 运行 php artisan migrate

现在您可以在 /admin-monitor 中发出请求并监控它

请记住打开 config/inDbPerformanceMonitor.php 以设置自定义配置

文档

配置

  • inDbMonitorConn 连接是请求日志将被设置的地方,因此它可以单独在另一个数据库中隔离,远离应用程序数据库,或者您也可以将其设置在同一数据库中,没有问题。

  • 该包在您的配置文件夹中创建了 inDbPerformanceMonitor.php 文件,其中包含选项

    • IN_DB_MONITOR_WORK => 如果为 true,则包将工作并记录传入的请求(默认 = true)

    • IN_DB_MONITOR_PANEL => 如果为 false,则管理面板将不可访问,并且指向 '/admin-monitor/*' 的任何链接将引发 404(默认 = true)

    • IN_DB_MONITOR_TOKEN => 存储admin-monitor密码令牌(默认密码 = monitor)

    • IN_DB_MONITOR_NEGLICT_START_WITH => 要忽略的数组路由,例如 /test,因此以 /test 开头的任何请求将不会在数据库中记录

    • IN_DB_MONITOR_NEGLICT_REQUEST_DATA => 如果为 true,则不会记录请求数据,并将替换为 ['%__ALL_HIDDEN__%'](默认 = false)

    • IN_DB_MONITOR_NEGLICT_PARAMS_CONTAIN => 包含以下名称之一的请求字段将不会记录,并将替换为 %_HIDDEN_%

    • IN_DB_MONITOR_NEGLICT_SESSION_DATA => 如果为 true,则不会记录会话数据,并将替换为 ['%__ALL_HIDDEN__%'],并仅记录会话 ID(默认 = false)

    • IN_DB_MONITOR_LOG_PACKAGE_QUERIES => 如果为 true,则在 Laravel 日志中记录包执行的查询(默认 = false)

    • IN_DB_MONITOR_GET_IP_INFO => 如果为 true,则获取 IP 位置数据(默认 = true)

    • IN_DB_MONITOR_GET_IP_CLASS => 您可以更改它,并使用自己的类与新的第三方Web服务获取IP位置。

  • 提示:您将在您的.env文件中找到创建的包环境变量

路由

  • /admin-monitor => 登录页面(默认密码 = monitor)。
  • /admin-monitor/dashboard => 包含请求数量的仪表板。
  • /admin-monitor/requests => 列出所有请求,并提供带有搜索面板以过滤结果。
  • /admin-monitor/request/{id} => 显示请求详细信息。
  • /admin-monitor/run-query/{id} => 显示查询详细信息并重新运行它。
  • /admin-monitor/statistics-report => 根据请求路由URI和类型分组请求性能的统计报告。
  • /admin-monitor/errors-report => 根据页面URI、类型和错误消息分组的请求错误统计报告。
  • /admin-monitor/archives-report => 请求存档的统计报告。
  • /admin-monitor/ips-report => 请求IP信息的统计报告。您还有重新计算未完成的IP信息的能力。
  • /admin-monitor/change-password => 更改管理员监控面板的密码。
  • /admin-monitor/logout => 从管理员监控面板注销。

演示截图

提示:在搜索框中,您可以使用如%%这样的通配符。

/admin-monitor

登录页面(默认密码 = monitor) alt 01-Login.png

/admin-monitor/dashboard

按类型和存档标记分组请求计数的仪表板。 alt 12-Dashboard.png

/admin-monitor/requests

列出所有已记录的请求

  • 搜索框:在(操作、路由、URL、会话ID、类型[POST、GET等]、存档标记)中搜索,在选中 有错误 复选框的情况下在(错误消息、错误文件)中搜索

  • 非Elequent:我的意思是像 \DB::select(\DB::raw('select * from applicants where id = 10')); 这样的自由查询。这些查询容易受到SQL注入攻击。红色数字表示请求中的自由查询数量。

  • 存档按钮:给标记 &=gt; date('YmdHis') 给存档标记 = 0 的请求

  • 在表中,您将找到查询数量、查询总时间和请求执行时间。

  • 您可以按创建日期从 > 到 进行筛选

  • 如果您悬停在错误标签上,它将显示错误消息、文件和行号。

  • 以下图像中请求的场景

    • 创建申请人
    • 编辑申请人
    • 搜索申请人
    • 删除申请人 alt 03-Requests-edited.png
  • 以下图像中请求的场景

    • 存档旧请求,使其带有标记 20180729010530,其他带有标记 0 => 因此我们可以过滤它们
    • /add/{a}/{b} 发送请求,它添加两个整数。我向它传递了4和5+,因此它抛出了异常,因为5+ 不是整数。
    • /api/applicants 发送请求,它返回JSON响应。提示:我使用了一个自由查询 \DB::select(\DB::raw('select * from applicants')); 来检索申请人,注意请求会话ID已更改,因为它不在Web中间件下。 alt 08-Requests-JSON-ERROR.png

/admin-monitor/request/{id}

显示请求详细信息、查询和错误,并且它允许您重新运行查询。

Hint => You can quickly get your last request by Latest By Session ID Or IP

By Session ID => Get last request made by your session id

By IP => Get last request made by your ip (requests made by api or routes
which don't use the web middleware will generate different session id at
every request, so you can get them by your IP).
  • 创建申请人的请求 alt 04-Request-POST.png ... alt 05-Request-POST-Run.png

  • 搜索申请人的请求 alt 06-Request-GET.png ... alt 07-Request-GET-Run.png

  • 错误添加/4/5+的请求 alt 09-Error-v2.png

/admin-monitor/statistics-report

按请求路由URI和类型分组统计报告。 alt 10-Statistics_Report.png

/admin-monitor/errors-report

按页面URI、类型和错误信息分组的请求错误统计报告。 alt 13-Errors_Report.png

/admin-monitor/archives-report

请求存档的统计报告。 alt 14-Archives_Report.png

/admin-monitor/ips-report

请求IP的统计报告。您还有能力重新计算未完成的IP信息。 alt 15-IPs_Report.png

/admin-monitor/change-password

更改管理员监控面板密码。 alt 11-Change_Password.png

最佳实践

我正在做一个项目,我的任务是测试应用程序性能并列出具有性能问题的请求。问题是,在迁移数据后,数据库大小变得更大,应用程序性能下降,有时会崩溃。与其在所有应用程序代码上循环并检查每一行,我构建了一个监听器来记录应用程序运行请求数据(查询),然后我分析了这些数据,并快速找到了有弱点的请求。因此,我构建了laravel-in-db-performance-monitor包并发布它供任何人使用。

以下是一些最佳实践的提示

  • 将日志表放在单独的数据库中,因为它的大小会迅速增加。
  • 开启记录器
    • 在开发和测试阶段分析请求性能和检查查询。
    • 在生产环境中短期(例如,第一周)监控应用程序性能和理解用户行为。之后关闭它(设置IN_DB_MONITOR_WORK=false)。
    • 如有任何问题,调试请求查询和错误。
    • 记得在您的应用程序上线时设置(IN_DB_MONITOR_PANEL=false),这样/admin-monitor链接将不可访问,并在您想调试某些内容或审查报告时设置为true。
  • config/inDbPerformanceMonitor.php文件中设置您的自定义配置,特别是IN_DB_MONITOR_NEGLICT_START_WITHIN_DB_MONITOR_NEGLICT_PARAMS_CONTAIN参数。
  • 使用"通过会话ID或IP最新查询"快速获取您的最后请求,无需搜索。
  • 将密码改为复杂密码。
  • 使用"统计报告"通过最大查询数、最大查询时间、最大执行时间、非连续查询数等来检测性能问题的请求。
  • 使用"错误报告"检测系统中发生频率最高的异常。
  • 检查您使用的第三方包生成的查询。
  • 检查预览列表请求(例如客户列表)并确保您使用了分页并通过使用Laravel的"with()"函数正确加载了关系。
    • 例如,如果客户模型与订单模型和产品模型相关联,我们将显示10个客户=>(没有使用"with()",Laravel将生成21个查询 - 但使用"with()"后只需4个查询)。
  • 检查您的仪表板和报告的请求,并确保您正确地使用了SQL聚合函数。

新功能和升级

  • 获取请求国家及位置信息。
  • 将数据存储为序列化字符串而不是编码的JSON。
  • 添加更多报告和统计信息。
  • 增强UI和修复问题。

提示:如果您使用的是旧版本(

php artisan in-db-performance-monitor:init --ips=true --serialize=true

并在config/inDbPerformanceMonitor.php中添加以下行

'IN_DB_MONITOR_GET_IP_INFO' => env('IN_DB_MONITOR_GET_IP_INFO', true),
'IN_DB_MONITOR_GET_IP_CLASS' => '\\ASamir\\InDbPerformanceMonitor\\IPInfo',

示例数据=> 演示(密码=monitor)

作者

阿赫迈德·萨米尔

联系方式: eng.ahmed.samir.fci@gmail.com | 领英