c24-toys / newrelic-bundle
将 New Relic 集成到 Symfony2
Requires
- php: ^8.0
- symfony/config: ^6.0|^7.0
- symfony/console: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/event-dispatcher: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^3.1|^4.0
- symfony/debug: >3.4.21
- symfony/framework-bundle: ^6.0|^7.0
- symfony/monolog-bundle: ^3.2
- symfony/phpunit-bridge: ^5.3
- twig/twig: ^1.32|^2.4
Suggests
- symfony/monolog-bundle: ^3.2
Conflicts
- twig/twig: <1.32
This package is not auto-updated.
Last update: 2024-09-24 08:48:08 UTC
README
此包将 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 中的噪音。
-
交互服务:它通过 Service 类
NewRelicInteractorInterface::class
提供您 New Relic PHP 代理 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 关于新的部署等。
安装
步骤 0:安装 NewRelic
查看 http://newrelic.com ...
步骤 1:添加依赖项
$ composer require ekino/newrelic-bundle
步骤 2:注册包
然后使用您的内核注册包
<?php // in AppKernel::registerBundles() $bundles = array( // ... new Ekino\NewRelicBundle\EkinoNewRelicBundle(), // ... );
步骤 3:配置包
在 New Relic 的 Web 界面中,确保获取一个有效的(REST)API 密钥,不要与您的许可证密钥混淆:New Relic 仪表板 > 账户设置 > 集成 > API 密钥
# app/config/config.yml ekino_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.com.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: ekino.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 扩展会自动将跟踪代码添加到所有 HTML 响应中,以进行 RUM 仪器。使用增强型 RUM 仪器,该包允许您有选择地禁用某些请求的仪器。
如果,例如,您正在返回 HTML 原文供 HTML 编辑器使用,这可能会很有用。
如果启用增强型 RUM 仪器,您可以通过传递请求参数 _instrument
并将其设置为 false
来禁用给定请求的仪器。例如,可以通过路由配置来实现这一点。
事务命名策略
该组件包含两个内置的事务命名策略。分别是 route
和 controller
,分别根据路由或控制器命名 New Relic 的事务。然而,组件通过 service
配置选项支持自定义事务命名策略。如果您选择了 service
配置选项,则必须将您自己的事务命名服务名称作为 transaction_naming_service
配置选项传递。
事务命名服务类必须实现 Ekino\NewRelicBundle\TransactionNamingStrategy\TransactionNamingStrategyInterface
接口。有关创建您自己的服务的更多信息,请参阅 Symfony 关于在容器中创建/配置服务的文档 Creating/Configuring Services in the Container。
Symfony HTTP 缓存
当您使用 Symfony 的 HTTP 缓存时,您的 app/AppCache.php
将构建包含您的边缘包含 (ESI) 的响应。这看起来就像在 New Relic 中的一个事务。当您设置 using_symfony_cache: true
时,这些 ESI 请求将成为单独的事务,从而提高了统计信息。如果您使用其他反向代理缓存或根本不使用缓存,请将其保留为 false。
如果需要设置 application_name
。
部署通知
您可以使用 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
该组件提供了一个 Capifony 食谱来自动化部署通知(请参阅 Resources/recipes/newrelic.rb
)。
它针对每个 app_name
发起一个请求,因为 Data REST API 不支持汇总名称。
交互式服务
配置键 ekino_new_relic.interactor
将接受一个实现 NewRelicInteractorInterface
的服务的服务 ID。该组件提供了一些可能适合您的服务。
请注意,如果您设置了 ekino_new_relic.enabled: false
,则无论 ekino_new_relic.interactor
使用的值是什么,您都将始终使用 BlackholeInteractor
。
请求流程
- 一个请求进来,我们首先执行的是
setApplicationName
,以便我们使用正确的许可证密钥和名称。 RouterListener
可能会抛出 404 或向请求添加路由值。- 如果没有抛出 404,我们执行
setIgnoreTransaction
,这意味着如果已配置忽略路由,我们将调用NewRelicInteractorInterface::ignoreTransaction()
。 - 防火墙是接下来会发生的事情。它可能会更改控制器或抛出 403。
- 开发人员可能已配置许多其他请求监听器,现在将执行,并可能向请求添加一些内容。
- 我们将执行
setTransactionName
来使用我们的TransactionNamingStrategyInterface
设置一个好听的名字。
对于正常请求,将执行所有 6 个步骤。404 和 403 响应的例外是在步骤 2 和步骤 4 中创建的。如果发生这些步骤的异常(我说的不是 \Exception
),则事务将以正确的许可证密钥记录,但没有正确的交易名称。《setTransactionName》可能依赖于其他监听器设置的数据,这就是为什么它的优先级如此之低。