iskander-g / laravel-new-relic
使用 New Relic 监控您的 Laravel 应用性能
Requires
- php: ^8.1
- illuminate/contracts: ^9.0
- illuminate/support: ^9.0
Requires (Dev)
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- roave/security-advisories: dev-latest
- spatie/laravel-ray: ^1.26
README
此包使您能够轻松设置和监控使用 Laravel 应用与 New Relic APM。
New Relic 为您的应用提供了出色的低级洞察。特别是 New Relic PHP 代理,它在生产环境中非常有用,因为它在比其他监控服务更低的级别上挂钩,并且对性能的影响很小。
New Relic 提供了功能齐全的 免费计划,非常适合成长中的 Laravel 应用。此包与它们无关——我只是因为我发现这项服务在扩展我的应用时非常有帮助,所以想为 Laravel 建立一个更定制的解决方案。
New Relic 可以直接监控 Laravel 应用,但此包报告的是针对 Laravel 优化的交易,并以更一致的方式进行报告。
安装
要监控生产环境中的应用,您需要一个 New Relic API 账户,并且您应该 安装 PHP 监控代理。您不需要在开发环境中安装 New Relic(除非您真的想这么做)。如果未检测到扩展,则包将模拟对新 Relic PHP 代理的调用,并记录每一项以供您在部署前进行测试。
如果您正在安装的服务器已经被 New Relic 监控,请注意此包报告的交易命名约定与 New Relic 通常自动检测的不同。如果您现有的 New Relic 数据非常重要,请不要安装此包。
要安装包,请使用 Composer 将其添加到 Laravel 项目中
composer require jackwh/laravel-new-relic
然后发布配置文件
php artisan vendor:publish --provider="JackWH\LaravelNewRelic\LaravelNewRelicServiceProvider"
这就完成了!包已就绪,并自动配置。
它是如何工作的
服务提供者
Laravel 将自动发现 LaravelNewRelicServiceProvider
类,该类将 NewRelicTransactionHandler
和 NewRelicTransaction
类绑定为 作用域单例 到服务容器中。
New Relic 的交易 API 只允许一次只有一个活动交易。这就是为什么这些类作为单例加载的原因。一般来说,不要在请求生命周期中途尝试启动新的交易。
可记录的环境
包会检查 New Relic 是否已安装。如果未找到,您可以记录模拟的交易。
在可记录的环境中,包将模拟它通常会调用 New Relic 的方法(例如,newrelic_start_transaction()
)。这些方法来自 LoggableNewRelicFunctions.php
辅助文件。您可以通过检查日志来查看底层的操作。
如果您的日志中没有显示“交易结束”项,请不要担心,因为 New Relic 会自动在请求结束时结束它们。这对于长时间运行的过程(如队列处理程序)来说尤为重要。
一旦您确认日志记录功能按预期工作,您可以在
config/new-relic.php
文件中取消注释local
。这只是为了帮助您在初始部署之前检查包是否工作正常,或者在会影响 New Relic 事务的更改时使用。
生产环境
假设已加载 New Relic 扩展,该包将设置钩子到 Laravel 中,以监控生命周期的不同阶段的请求。
- HTTP 事务 在每个请求上使用全局的
NewRelicMiddleware
处理。 - CLI 请求 被过滤掉以减少噪音(因此长时间运行的调用,如
php artisan horizon
不会扭曲您的统计数据)。 - 队列作业 在每个作业开始和结束时自动记录事务。
- Artisan 命令 被记录为单独的事务。
- 计划任务 在每个任务执行时被监控。
该包还注册了一个 php artisan new-relic:deploy
命令,以便在您的部署过程中通知 New Relic。
配置
配置文件 已详细说明 - 逐条阅读注释以了解它将如何影响事务报告。以下是一些值得注意的设置:
HTTP 请求
'http' => [ 'middleware' => \JackWH\LaravelNewRelic\Middleware\NewRelicMiddleware::class, // ... 'rewrite' => [ '/livewire/livewire.js' => 'livewire.js', '/livewire/livewire.js.map' => 'livewire.js.map', ], // ... 'ignore' => [ 'debugbar.**', 'horizon.**', 'telescope.**', ], ],
内置的 NewRelicMiddleware
类对于大多数用例来说应该足够好,但如果需要,您可以扩展它以使用自己的实现。
rewrite
键对于没有定义名称的路由很有用(通常在公开资源的包中使用,如 Livewire)。您可以在这里重写它们的名称以保持一致性。
我们默认设置了一些合理的 ignore
规则,您可以按需调整。
队列处理
'queue' => [ 'ignore' => [ 'connections' => ['sync'], 'queues' => [], 'jobs' => [], ], ],
默认情况下,将忽略 sync
连接。这意味着在请求开始时启动的新作业不会中断现有的事务。您也可以过滤特定的队列和作业。
部署
每次新的部署后,您都应该通知 New Relic,以便他们可以报告多个版本之间的度量值差异。该包包含一个执行此操作的命令
php artisan new-relic:deploy [description] [revision]
如果您没有提供 git 修订哈希,该包将尝试通过调用 git log --pretty="%H" -n1 HEAD
来自动检测它
待办事项
- 改进可记录的事务,使其更明确 HTTP 事务将自动结束
- 添加一些测试
- 希望有人可以确认这与 Octane 是否兼容?
贡献
欢迎所有贡献!如果您觉得这很有用,我很乐意知道。
致谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。