ekino/newrelic-bundle

将 New Relic 集成到 Symfony2

安装次数: 9,804,796

依赖项: 10

建议者: 1

安全性: 0

星标: 279

关注者: 26

分支: 104

开放问题: 19

类型:symfony-bundle

2.4.0 2022-03-25 09:15 UTC

README

Build Status Latest Version Code Coverage Quality Score Total Downloads

这个包将 NewRelic PHP API 集成到 Symfony。有关 NewRelic 的更多信息,请访问 http://newrelic.com。内置的 New Relic 代理并没有像它声称的那样提供很多 Symfony 集成。这个包添加了很多基本功能。以下是一个快速列表:

  1. 更好的事务命名策略:您可以通过路由名称、控制器名称或通过使用任何您认为合适的命名约定的无缝界面来准确命名事务跟踪。在运行控制台命令时,它还将事务名称设置为命令名称。

  2. 控制台命令增强:在运行控制台命令时,它将 CLI 传递的选项和参数设置为事务跟踪的自定义参数,以简化调试。

  3. 异常监听:它还捕获网络请求和控制台命令中的所有 Symfony 异常并将它们发送到 New Relic(这是 New Relic 本身没有做得很好的事情,因为 symfony 会积极捕获所有异常/错误)。它还确保所有 HTTP 异常(4xx 代码)都记录为 New Relic 中的通知,而不是异常,以减少 New Relic 中的噪音。

  4. 交互式服务:它通过 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 新部署等。

Ekino NewRelicBundle

安装

第 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.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: 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 来禁用给定请求的仪表。这可以通过路由配置来完成。

事务命名策略

此包包含两个内置的事务命名策略:routecontroller,分别根据路由或控制器命名 New Relic 事务。然而,通过 service 配置选项,此包支持自定义事务命名策略。如果您已选择 service 配置选项,则必须将您的自定义事务命名服务名称作为 transaction_naming_service 配置选项传递。

事务命名服务类必须实现 Ekino\NewRelicBundle\TransactionNamingStrategy\TransactionNamingStrategyInterface 接口。有关创建自定义服务的更多信息,请参阅 Symfony 文档中关于 在容器中创建/配置服务 的内容。

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 接受一个服务 ID,该服务实现 NewRelicInteractorInterface。此包包含一些可能适合您的服务。

请注意,如果您设置了 ekino_new_relic.enabled: false,则无论 ekino_new_relic.interactor 的值为何,您都将始终使用 BlackholeInteractor

请求流程

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

对于正常请求,将执行所有 6 个步骤。对此例外的是在步骤 2 和步骤 4 中创建的 404 和 403 响应。如果发生这些步骤的例外(我说的不是 \Exception),则事务将使用正确的许可证密钥进行记录,但您没有正确的交易名称。《setTransactionName》可能依赖于其他监听器设置的数据,因此它具有如此低的优先级。