jackwh/laravel-new-relic

使用 New Relic 监控 Laravel 应用程序性能

v1.1.0 2024-05-10 10:38 UTC

This package is auto-updated.

Last update: 2024-09-08 15:28:56 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

此软件包使您能够轻松设置和监控使用 Laravel 的应用程序,并通过 New Relic APM 进行监控。

New Relic 提供了一些关于应用程序的详细信息。特别是,New Relic PHP 代理 在生产环境中非常有用,因为它在比其他监控服务更低级别上挂钩,并且对性能的影响很小。

New Relic 提供了一个功能齐全的 免费计划,非常适合正在增长中的 Laravel 应用程序。此软件包与它们没有关联——我只是因为我在扩展应用程序时发现了这项服务非常有帮助,所以想为 Laravel 提供一个更定制的解决方案。

虽然 New Relic 可以直接监控 Laravel 应用程序,但此软件包报告的是针对 Laravel 优化的交易,并以更一致的方式进行报告。

安装

要监控生产中的应用程序,您需要一个 New Relic API 账户,并应 安装 PHP 监控代理。您不需要在开发环境中安装 New Relic(除非您真的想这么做)。如果未检测到扩展,则软件包将模拟对 New 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 类,并将 NewRelicTransactionHandlerNewRelicTransaction 类绑定为服务容器中的 作用域单例

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 类对于大多数用例来说应该足够好,但如果需要,您可以扩展它以使用自己的实现。

对于没有定义名称的路由(通常像 Livewire 这样的公共资源包会暴露这种情况),rewrite 键很有用。您可以在一致性方面在此处重写它们的名称。

我们默认设置了一些合理的 ignore 规则,您可以根据需要调整。

队列处理

'queue'        => [
    'ignore' => [
        'connections' => ['sync'],
        'queues'      => [],
        'jobs'        => [],
    ],
],

默认情况下,将忽略 sync 连接。这意味着在此队列上启动的新作业不会中断请求开始时启动的现有事务。您还可以过滤特定的队列和作业。

部署

在每次新的部署后,您应该通知 New Relic,以便他们可以报告多个版本之间的指标差异。该包包括一个执行此操作的命令

php artisan new-relic:deploy [description] [revision]

如果您没有提供 git 修订哈希,该包可以尝试通过调用 git log --pretty="%H" -n1 HEAD 来自动检测它

待办事项

  1. 改进可记录的事务,使其更清楚地表明 HTTP 事务将自动结束
  2. 添加一些测试
  3. 希望有人可以确认它是否与 Octane 兼容?

贡献

欢迎所有贡献!如果您觉得这个有用,我将很高兴知道。

鸣谢

许可协议

MIT 许可协议(MIT)。有关更多信息,请参阅 许可文件