magium/request-firehose

一个简单的库,可以将请求元数据从多个来源推送到收集服务(如Redis)

1.0.0 2019-01-03 23:00 UTC

This package is auto-updated.

Last update: 2024-09-05 04:01:33 UTC


README

此库会附加到PHP请求,并在请求关闭时将请求元数据或日志条目发送到适配器,目前为Redis或Mongo,以便存储、处理或跟踪。它适用于集群系统,其中多台机器提供HTTP请求,并且通常用于devops希望有一个集中式位置用于监控或存储请求,以便与其他日志工具一起使用。

例如,如果您想 tailgrep 特定IP地址的日志,您可以部署Redis发布代码(见下文)并运行以下命令

stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion' | grep '127.0.0.1'

安装

composer install magium/request-firehose

使用

简介

在脚本中最早方便的时候调用 \Magium\RequestFirehose\RequestFirehose::getInstance()。这通常是在 require_once 'vendor/autoload.php'; 之后立即执行。

一旦您有了firehose的实例,您将需要为它配置一个适配器。最简单的例子是使用 Filesystem 适配器。

\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\Filesystem\Filesystem('/tmp/logfile')
);

就这样!它将注册自身为关闭函数,并在请求完成后写入适当的适配器。

如果您不使用Composer,或者使用与PSR-4不兼容的其他自动加载器,您可以包含 src/include.php 文件,它将加载所有源文件。

如果您使用Redis、MongoDB或其他不属于PHP核心的适配器,您可能需要安装它们的客户端库。请检查composer建议以获取支持的客户端。

查看 examples 目录中的一些示例。以下示例大多来自那里。

Redis

推送 (BLPOP)

/**
 * To watch this in action execute `redis-cli` and call `blpop ingestion`.  Then run this file (`php push.php`).  Use this method if you want to "persist" the data (ensure that you
 * don't miss any, or if you want to round-robin data processing.
 */
\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\Redis\PushAdapter(
        new \Predis\Client('tcp://127.0.0.1:6379'),
        'ingestion'
    )
);

发布/订阅 (SUBSCRIBE)

/**
 * To watch this in action execute `redis-cli` and call `subscribe ingestion`.  Then run this file (`php publish.php`).  Use this example if you do not want persistent data and/or
 * want multiple subscribers to watch the data.
 */
\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter(
        new \Predis\Client('tcp://127.0.0.1:6379'),
        'ingestion'
    )
);

发布/订阅 /w 日志输出

如果您正在寻找可以简单地使用 tailgrep 的内容,这可能是一个不错的选择。

/**
 * To watch this in action execute `redis-cli` and call `subscribe ingestion`.  Then run 
 * `php -S 0.0.0.0:7777 publish_log_file.php`).  Use this example if you do not want persistent data and/or
 * want multiple subscribers to watch the data, or if you want to tail the log file for your entire cluster you can
 * execute:
 *
 *  stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion'
 */
\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter(
        new \Predis\Client('tcp://127.0.0.1:6379'),
        'ingestion',
        0,
        new \Magium\RequestFirehose\Filter\LogfileFilter()
    )
);

MongoDB

/**
 * To watch this in action log in to your MongoDB instance and execute this file.  Once you have executed this file
 * check your mongo DB.  You should see the results there.
 */
$client = new \MongoDB\Client();
$collection = $client->selectCollection('analysis', 'requests');
\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\MongoDb\MongoDb(
        $collection
    )
);

文件系统

/**
 * Run this file (`php filesystem.php`).  Run `tail -f /tmp/testfile` to watch the output.
 */

\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter(
    new \Magium\RequestFirehose\Adapter\Filesystem\Filesystem('/tmp/testfile')
);

聚合

也许有时您希望将数据推送到Redis以便跟踪日志,同时也将数据存储在Mongo中进行处理。您可以使用Aggregate适配器来完成此操作。

/**
 * To watch this in action execute `redis-cli` and call `subscribe ingestion`.  Then run
 * `php -S 0.0.0.0:7777 publish_log_file.php`.  Use this example if you want to watch your system by grepping
 * the Redis subscription output, but also want to store the requests in MongoDB for later analysis.
 *
 * stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion'
 *
 */
 
$aggregate = new \Magium\RequestFirehose\Adapter\Aggregate\AggregateAdapter();
$aggregate[] = new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter(
    new \Predis\Client('tcp://127.0.0.1:6379'),
    'ingestion',
    0,
    new \Magium\RequestFirehose\Filter\LogfileFilter()
);

$client = new \MongoDB\Client();
$collection = $client->selectCollection('analysis', 'requests');
$aggregate[] = new \Magium\RequestFirehose\Adapter\MongoDb\MongoDb(
    $collection
);

\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter($aggregate);