napp/xray-laravel

AWS X-Ray for Laravel 应用程序。

1.5.2 2024-07-03 10:46 UTC

This package is auto-updated.

Last update: 2024-09-03 11:27:46 UTC


README

Latest Version on Packagist

该包自动追踪您的 Laravel 应用程序,并将其发送到 AWS X-Ray

什么是 X-Ray?

X-Ray 是一个用于生产应用的分布式追踪系统。AWS X-Ray 会追踪用户请求如何在您的整个应用程序中传播。它聚合了构成您的应用程序的各个服务和资源的生成数据,为您提供应用程序性能的端到端视图。

Laravel 的 X-Ray

此包可以自动追踪应用程序的重要部分,如 HTTP 请求、数据库查询、视图和队列作业。这些部分将被追踪并发送到 AWS X-Ray,以便您改进性能。

以下是一个包含数据库查询的简单 HTTP 请求示例。此查询非常慢,可能需要优化或缓存。

timeline

每个元素都有额外的信息,例如数据库查询堆栈跟踪。

db-stack

安装

  1. 通过 composer 安装包
composer require napp/xray-laravel
  1. App\Http\Kernel.php 中将中间件添加到全局中间件顶部。
protected $middleware = [
    \Napp\Xray\Middleware\RequestTracing::class, // here

    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    // ...
];
  1. config/app.php 中将 XrayServiceProvider 添加到提供者顶部。
'providers' => [
    /*
     * Laravel Framework Service Providers...
     */
    Napp\Xray\XrayServiceProvider::class, // here

    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    // ...
];

可选地,您可以在 config/app.php 中添加外观。

'aliases' => [
    // ...
    'Xray' => \Napp\Xray\Facades\Xray::class,
],
  1. 编辑 AWS 执行角色以包含 X-Ray 权限。

您可以从 AWS AWSXrayWriteOnlyAccess 添加现有的策略,或者创建自己的

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords",
                "xray:GetSamplingRules",
                "xray:GetSamplingTargets",
                "xray:GetSamplingStatisticSummaries"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
  1. 前往 AWS 控制台,转到 Lambda 并找到您的函数。激活 X-Ray 追踪。

Activate

手动使用追踪器

假设您想追踪代码的特定部分以深入了解其对性能的影响。

Xray::addSegment('MyCustomLogic');

// run your code

Xray::endSegment('MyCustomLogic');

另一个用例是检查一些繁重的 PHP 数据解析。

use Napp\Xray\Facades\Xray;

class XMLParser
{
    public function handle($file)
    {
        // adding some metadata to the segment
        Xray::addSegment('XMLParser', null, [
            'file' => $file->name()
        ]);
        $this->parse($file);
        Xray::endSegment('XMLParser');
    }
    
    private function parse($xml): array 
    {
        Xray::addSegment('XMLParser parse');
        $output = $this->getAttributeList();
        // some more code
        Xray::endSegment('XMLParser parse');

        return $output;
    }
    
    private function getAttributeList(): array 
    {
        Xray::addSegment('XMLParser getAttributeList');
        // your code
        Xray::endSegment('XMLParser getAttributeList');

        return [];
    }
}

上述操作会产生以下结果

XML-example

请求过滤

可能有一些您希望在 Amazon X-Ray 中不追踪的请求。为了过滤掉这些请求,您可以在 Xray 外观上调用 addRequestFilterCallback 函数。此函数接受一个回调作为参数。该回调接受一个 Symfony\Component\HttpFoundation\Request 作为参数,并期望返回一个布尔值。

请注意,此函数调用需要在您的 AppServiceProviderregister 函数中完成。您还应该保持检查相对简单,因为大多数应用程序服务提供者在调用过滤回调时不会启动。

当 LaravelXray 启动时,请求将与每个已注册的回调进行核对。如果没有返回 false,则请求将被捕获。否则,它不会被捕获。

use Symfony\Component\HttpFoundation\Request;
use Napp\Xray\Facades\Xray;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Xray::addRequestFilterCallback(function(Request $request) {
            /* some conditions */
            return true;
        });
    }
}

守护进程支持

在 Lambda 环境中自动运行 X-Ray 守护进程。使用此功能代替默认的 Napp\Xray\Submission\APISegmentSubmitter 以将请求中继到 Amazon X-Ray。

首先发布 X-Ray 配置,然后更新 config/xray.php 中的提交者到 \Napp\Xray\Submission\DaemonSegmentSubmitter::class

php artisan vendor:publish --tag=xray-config
# config/xray.php
...
 'submitter' => \Napp\Xray\Submission\DaemonSegmentSubmitter::class,
...

守护进程提交者将获取 _AWS_XRAY_DAEMON_ADDRESS_AWS_XRAY_DAEMON_PORT。如果您使用像 Laravel Vapor 这样的服务,这些环境变量将为您注入。

禁用追踪器

如果您想禁用追踪器,只需将其添加到 .env 文件中。

XRAY_ENABLED=false

支持哪些追踪器

  • Composer 自动加载
  • 框架启动
  • 路由匹配
  • HTTP请求
  • 数据库查询
  • 队列任务
  • Blade视图渲染
  • 缓存请求
  • 命令

许可协议

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