tiime/ newrelic-bundle
将New Relic集成到Symfony中
Requires
- php: ^8.2
- symfony/config: ^5.4|^6.4|^7.0
- symfony/console: ^5.4|^6.4|^7.0
- symfony/dependency-injection: ^5.4|^6.4|^7.0
- symfony/event-dispatcher: ^5.4|^6.4|^7.0
- symfony/http-kernel: ^5.4|^6.4|^7.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^5.1
- monolog/monolog: ^3.0
- phpunit/phpunit: ^9.6
- symfony/framework-bundle: ^5.4|^6.4|^7.0
- symfony/phpunit-bridge: ^7.1
- twig/twig: ^3.10
README
重要
此捆绑包最初由Ekino创建,可以在此处找到。由于缺乏维护,我们决定进行分支并在此展示结果。
tiime NewRelic Bundle
此捆绑包将NewRelic PHP API集成到Symfony中。有关NewRelic的更多信息,请访问http://newrelic.com。内置的New Relic代理并没有像其宣称的那样提供足够的Symfony集成。此捆绑包添加了许多更基本的特性。以下是一个快速列表:
-
更好的事务命名策略:您的交易跟踪可以通过路由名称、控制器名称进行准确命名,或者您可以通过一个无缝的界面选择自定义命名策略,该界面使用您认为合适的任何命名约定。当运行控制台命令时,它还将事务名称设置为命令名称。
-
控制台命令增强:在运行控制台命令时,它将通过CLI传递的选项和参数设置为自定义参数,以便更容易进行调试。
-
异常监听:它还捕获Web请求和控制台命令中的所有Symfony异常并将它们发送到New Relic(这是New Relic本身也不太擅长的事情,因为symfony积极地捕获所有异常/错误)。它还确保所有HTTP异常(4xx代码)在New Relic中以通知的形式记录,而不是异常,以减少New Relic中的噪音。
-
Interactor服务:它通过Service类
NewRelicInteractorInterface::class
提供您New Relic PHP Agent API,因此在我的代码中,我可以将其注入到任何类、控制器、服务中并执行类似以下操作:// Bundle $this->newRelic->addCustomParameter('name', 'john'); // Extension if (extension_loaded('newrelic')) { \newrelic_add_custom_parameter('name', 'john'); }
-
日志支持:在开发过程中,您不太可能已设置New Relic。存在一个配置项,可以启用日志记录,将所有New Relic操作输出到您的Symfony日志中,从而模拟其在生产环境中的实际操作。
-
忽略路由、路径、命令:您可以配置一个要忽略的路由名称、URL路径和控制台命令列表,从New Relic跟踪中排除。
-
杂项:还有其他有用的配置,例如您的New Relic API密钥、显式定义您的应用程序名称而不是php.ini、通过capifony通知New Relic关于新部署等。
安装
请确保已全局安装Composer,如Composer文档中的安装章节所述。
使用Symfony Flex的应用程序
打开命令控制台,进入您的项目目录,然后执行
composer require tiime/newrelic-bundle
不使用Symfony Flex的应用程序
步骤1:下载捆绑包
打开命令控制台,进入您的项目目录,并执行以下命令以下载此捆绑包的最新稳定版本
composer require tiime/newrelic-bundle
步骤2:启用捆绑包
然后,通过将其添加到项目config/bundles.php
文件中注册的捆绑包列表中启用捆绑包
// config/bundles.php return [ // ... Tiime\NewRelicBundle\TiimeNewRelicBundle::class => ['all' => true], ];
配置捆绑包
在New Relic的Web界面中,确保获取有效的(REST)API密钥,不要将其与您的许可证密钥混淆:New Relic仪表板 > 账户设置 > 集成 > API密钥
# app/config/config.yml tiime_new_relic: enabled: true # Defaults to true application_name: Awesome Application # default value in newrelic is "PHP Application", or whatever is set # as php ini-value deployment_names: ~ # default value is 'application_name', supports string array or semi-colon separated string api_key: # New Relic API api_host: ~ # New Relic API Host (default value is api.newrelic.com, for EU should be set to api.eu.newrelic.com ) license_key: # New Relic license key (optional, default value is read from php.ini) xmit: false # if you want to record the metric data up to the point newrelic_set_appname is called, set this to true (default: false) logging: false # If true, logs all New Relic interactions to the Symfony log (default: false) interactor: ~ # The interactor service that is used. Setting enabled=false will override this value twig: true # Allows you to disable twig integration (falls back to class_exists(\Twig_Environment::class)) exceptions: true # If true, sends exceptions to New Relic (default: true) deprecations: true # If true, reports deprecations to New Relic (default: true) instrument: false # If true, uses enhanced New Relic RUM instrumentation (see below) (default: false) http: enabled: true using_symfony_cache: false # Symfony HTTP cache (see below) (default: false) transaction_naming: route # route, controller or service (see below) transaction_naming_service: ~ # Transaction naming service (see below) ignored_routes: [] # No transaction recorded for this routes ignored_paths: [] # No transaction recorded for this paths monolog: enabled: false # When enabled, send application's logs to New Relic (default: disabled) channels: [app] # Channels to listen (default: null). [See Symfony's documentation](https://symfony.ac.cn/doc/current/logging/channels_handlers.html#yaml-specification) level: error # Report only logs higher than this level (see \Psr\Log\LogLevel) (default: error) service: app.my_custom_handler # Define a custom log handler (default: tiime.new_relic.monolog_handler) commands: enabled: true # If true, logs CLI commands to New Relic as Background jobs (>2.3 only) (default: true) ignored_commands: [] # No transaction recorded for this commands (background tasks)
增强型RUM仪表
该套餐提供增强型真实用户监控选项。通常,New Relic 扩展(除非配置禁用)会自动将 RUM 仪表化的跟踪代码添加到所有 HTML 响应中。使用增强型 RUM 仪表化,该套餐允许您有选择地禁用某些请求的仪表化。
例如,如果您返回 HTML 素材用于 HTML 编辑器,这将非常有用。
如果启用增强型 RUM 仪表化,您可以通过传递带有 _instrument
请求参数并设置为 false
来禁用特定请求的仪表化。这可以通过路由配置来实现,例如。
事务命名策略
该套餐内置了两种事务命名策略:route
和 controller
,分别根据路由或控制器命名 New Relic 事务。然而,该套餐支持通过 service
配置选项使用自定义事务命名策略。如果您已选择 service
配置选项,则必须将您自己的事务命名服务名称作为 transaction_naming_service
配置选项传递。
事务命名服务类必须实现 Tiime\NewRelicBundle\TransactionNamingStrategy\TransactionNamingStrategyInterface
接口。有关创建自定义服务的更多信息,请参阅 Symfony 文档中的 创建/配置容器中的服务。
Symfony HTTP 缓存
当您使用 Symfony 的 HTTP 缓存时,您的 app/AppCache.php
会构建一个包含您的边缘包含(ESI)的响应。这看起来像是 New Relic 中的一个事务。当您设置 using_symfony_cache: true
时,这些 ESI 请求将是单独的事务,从而提高了统计信息。如果您使用其他反向代理缓存或根本不使用缓存,请将其保留为 false。
如果需要设置 application_name
,则为 true。
部署通知
您可以使用 newrelic:notify-deployment
命令将部署通知发送到 New Relic。这需要设置 api_key
配置。
该命令有许多选项,如帮助数据所示。
$ app/console newrelic:notify-deployment --help
Usage:
newrelic:notify-deployment [--user[="..."]] [--revision[="..."]] [--changelog[="..."]] [--description[="..."]]
Options:
--user The name of the user/process that triggered this deployment
--revision A revision number (e.g., git commit SHA)
--changelog A list of changes for this deployment
--description Text annotation for the deployment — notes for you
交互式服务
配置键 tiime_new_relic.interactor
将接受实现 NewRelicInteractorInterface
的服务的服务 ID。该套餐附带一些可能适合您的服务。
请注意,如果您设置 tiime_new_relic.enabled: false
,则无论 tiime_new_relic.interactor
的值是什么,您都将始终使用 BlackholeInteractor
。
请求流程
- 一个请求进来,我们首先执行
setApplicationName
,以便使用正确的许可证密钥和名称。 RouterListener
可能会抛出 404 或向请求添加路由值。- 如果没有抛出 404,我们将
setIgnoreTransaction
,这意味着如果我们已配置忽略该路由,我们将调用NewRelicInteractorInterface::ignoreTransaction()
。 - 防火墙是接下来会发生的事情之一。它可能会更改控制器或抛出 403。
- 开发者可能已配置了许多其他请求监听器,现在将执行并可能向请求添加内容。
- 我们将执行
setTransactionName
以使用我们的TransactionNamingStrategyInterface
来设置一个好听的名字。
对于正常请求,将执行所有6个步骤。例外情况是404和403响应,分别在第二步和第四步创建。如果发生这些步骤的例外情况(我不是在谈论\Exception
),那么您的交易将被记录下来,并且拥有正确的许可密钥,但您没有正确的交易名称。《setTransactionName》可能依赖于由其他监听器设置的数据,这就是为什么它的优先级如此之低。