frnkly/laravel-keen

为Laravel提供高效的Keen.io集成

v0.5.1 2017-11-09 01:24 UTC

This package is not auto-updated.

Last update: 2024-09-28 03:07:17 UTC


README

在请求完成后将事件数据发送到 Keen.io - 自动且透明。

Latest Stable Version Build Status Total Downloads License

本包围绕Keen PHP客户端提供了一个轻量级包装器,并配置了一个中间件,在每次请求完成后才发送事件数据到Keen。这意味着随着跟踪事件的增加,对请求时间的影响几乎可以忽略不计。为了方便,中间件也可以自动跟踪每个请求。

特性

  • 延迟事件跟踪 🙌
  • 可选自动跟踪每个请求
  • 支持开箱即用的数据增强
  • 可扩展中间件
  • 可忽略特定HTTP状态码的选项(例如 100302 等)
    • 或基于自定义逻辑的任何请求
  • 更多即将到来!

安装

使用 Composer 安装Laravel + Keen包

$ composer require frnkly/laravel-keen

这将还会安装Keen PHP客户端作为依赖项。

配置

您的Keen项目ID和密钥应在 config/services.php 配置文件中定义,但通常来自 环境配置

return [
    // Other 3rd-party Services
    // ...
    
    // Add your Keen information here
    'keen' => [
        'id'     => env('KEEN_PROJECT_ID'),
        'master' => env('KEEN_MASTER_KEY'),
        'write'  => env('KEEN_WRITE_KEY'),
    ],
];

在您的 .env 文件中,您可能需要添加类似以下内容

KEEN_PROJECT_ID=your-project-id
KEEN_MASTER_KEY=your-master-key
KEEN_WRITE_KEY=your-write-key

入门

app/Http/Kernel.php 中全局注册中间件

protected $middleware = [
    // Other Middleware
    // ...
    
    \Frnkly\LaravelKeen\Middleware::class,
];

或在中间件组内

protected $middlewareGroups = [
    'web' => [
        // Other "Web" Middleware
        // ...
        
        \Frnkly\LaravelKeen\Middleware::class,
    ],

    'api' => [
        // Other "API" Middleware
        // ...
        
        \Frnkly\LaravelKeen\Middleware::class,
    ],
];

感谢Laravel 5.5中的 包发现,服务提供者应该已经可用。也可以通过 config/app.php 配置文件手动注册

'providers' => [
    // Other Service Providers
    // ...

    Frnkly\LaravelKeen\ServiceProvider::class,
]

自动跟踪每个请求

默认情况下启用了自动跟踪。您可以通过配置文件禁用此行为

'keen' => [
    // Other Keen options
    // ...
    
    'track_requests' => false,
],

数据增强

要为每个请求自动添加 数据增强,请使用以下配置选项

'keen' => [
    // Other Keen settings
    // ...
    
    'addons' => [
        'ip_to_geo'       => true,  // IP to Geo parser
        'ua_parser'       => true,  // User Agent parser
        'referrer_parser' => true,  // Referrer parser
    ],
],

每个数据增强对象将出现在您的Keen流中,名称与上面相同(即 ip_to_geoua_parser)。

使用自己的中间件

包含的中间件使扩展和获取更精细的数据控制变得简单。您可以使用 Artisan 创建自己的中间件,然后让它扩展 \Frnkly\LaravelKeen\Middleware

$ php artisan make:middleware TracksRequests

在新的中间件中,覆盖受保护的 buildRequestEventData 方法

<?php

namespace App\Http\Middleware;

class TracksRequests extends \Frnkly\LaravelKeen\Middleware
{
    /**
     * Data for "request" event.
     *
     * @param \Illuminate\Http\Request  $request
     * @param \Illuminate\Http\Response $response
     */
    protected function buildRequestEventData($request, $response)
    {
        parent::buildRequestEventData($request, $response);
        
        // Add or overwrite values.
        $host      = 'staging';
        $overwrite = true;
        $this->client->addRequestEventData('host', $host, $overwrite)
        
        // Add parameters to array values.
        ->addRequestEventParams([
            'user' => $request->user()->id
        ])
        ->addRequestEventParams([
            'mime' => $request->getMimeType('html')
        ], 'response')
        
        // Add data enrichment.
        ->addRequestEventData('target_url', 'https://example.com')
        ->enrichRequestEvent([
            'name'  => 'url_parser',
            'output'=> 'url_parser',
            'input' => ['url' => 'target_url']
        ]);
    }
}

请记得更新您的 app/Http/Kernel.php 文件,使用您自己的中间件类而不是预配置的中间件类。

跳过请求

某些响应代码不需要跟踪,例如重定向。您可以在中间件中配置要忽略的响应代码列表

/**
 * @var array
 */
protected $skipResponseCodes = [
    100,
    101,
    301,
    302,
    307,
    308,
];

您还可以在中间件中覆盖 shouldRun 方法

/**
 * Determines if the middleware should run or not.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Http\Response $response
 * @return bool
 */
protected function shouldRun($request, $response) : bool
{
    if (! parent::shouldRun($request, $response)) {
        return false;
    }
    
    // Define your own custom logic here.
    // ...

    return true;
}

类型提示

LaravelKeen客户端可以在任何由容器解析的类的构造函数中进行 类型提示

namespace App\Events;

use App\Events\OrderShipped;
use Frnkly\LaravelKeen\Client;

class OrderShipped
{
    private $client;
    
    public function __construct(Client $client)
    {
        // The client can now be accessed by all methods in this class.
        $this->client = $client;
    }
    
    public function handle(OrderShipped $event)
    {
        // By adding a deferred event, we can continue working on the request
        // without waiting on a reply back from Keen.io. The event will be
        // processed once the request is done–automatically and transparently.
        $this->client->addDeferredEvent('order-shipped', [
            // Event data...
        ]);
    }
}

控制器也可以利用方法注入。

use Frnkly\LaravelKeen\Client;

class UserController extends Controller
{
    public function store(Client $client)
    {
        $client->addDeferredEvent('new-user', [
            // Event data...
        ]);
    }
}

本项目采用MIT许可证授权。

我很乐意听取您对本项目的评论或问题。如果您有改进此项目的想法,请创建一个问题与我联系