tiime/newrelic-bundle

将New Relic集成到Symfony中

v1.0.0 2024-06-12 08:52 UTC

This package is auto-updated.

Last update: 2024-09-12 10:07:20 UTC


README

重要

此捆绑包最初由Ekino创建,可以在此处找到。由于缺乏维护,我们决定进行分支并在此展示结果。

tiime NewRelic Bundle

此捆绑包将NewRelic PHP API集成到Symfony中。有关NewRelic的更多信息,请访问http://newrelic.com。内置的New Relic代理并没有像其宣称的那样提供足够的Symfony集成。此捆绑包添加了许多更基本的特性。以下是一个快速列表:

  1. 更好的事务命名策略:您的交易跟踪可以通过路由名称、控制器名称进行准确命名,或者您可以通过一个无缝的界面选择自定义命名策略,该界面使用您认为合适的任何命名约定。当运行控制台命令时,它还将事务名称设置为命令名称。

  2. 控制台命令增强:在运行控制台命令时,它将通过CLI传递的选项和参数设置为自定义参数,以便更容易进行调试。

  3. 异常监听:它还捕获Web请求和控制台命令中的所有Symfony异常并将它们发送到New Relic(这是New Relic本身也不太擅长的事情,因为symfony积极地捕获所有异常/错误)。它还确保所有HTTP异常(4xx代码)在New Relic中以通知的形式记录,而不是异常,以减少New Relic中的噪音。

  4. 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');
    }
  5. 日志支持:在开发过程中,您不太可能已设置New Relic。存在一个配置项,可以启用日志记录,将所有New Relic操作输出到您的Symfony日志中,从而模拟其在生产环境中的实际操作。

  6. 忽略路由、路径、命令:您可以配置一个要忽略的路由名称、URL路径和控制台命令列表,从New Relic跟踪中排除。

    image

  7. 杂项:还有其他有用的配置,例如您的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 来禁用特定请求的仪表化。这可以通过路由配置来实现,例如。

事务命名策略

该套餐内置了两种事务命名策略:routecontroller,分别根据路由或控制器命名 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

请求流程

  1. 一个请求进来,我们首先执行 setApplicationName,以便使用正确的许可证密钥和名称。
  2. RouterListener 可能会抛出 404 或向请求添加路由值。
  3. 如果没有抛出 404,我们将 setIgnoreTransaction,这意味着如果我们已配置忽略该路由,我们将调用 NewRelicInteractorInterface::ignoreTransaction()
  4. 防火墙是接下来会发生的事情之一。它可能会更改控制器或抛出 403。
  5. 开发者可能已配置了许多其他请求监听器,现在将执行并可能向请求添加内容。
  6. 我们将执行 setTransactionName 以使用我们的 TransactionNamingStrategyInterface 来设置一个好听的名字。

对于正常请求,将执行所有6个步骤。例外情况是404和403响应,分别在第二步和第四步创建。如果发生这些步骤的例外情况(我不是在谈论\Exception),那么您的交易将被记录下来,并且拥有正确的许可密钥,但您没有正确的交易名称。《setTransactionName》可能依赖于由其他监听器设置的数据,这就是为什么它的优先级如此之低。