michaelesmith/metric-data

抽象的指标数据存储系统

0.1 2014-08-29 02:45 UTC

This package is auto-updated.

Last update: 2024-09-24 18:32:42 UTC


README

Build Status

这是什么?

这是一个库,允许轻松地对指标数据进行抽象收集和存储,可以本地存储或通过外部API存储。

安装

composer require "michaelesmith/metric-data"

所有关于指标的内容

对于这个库,所有数据点都称为指标,并通过MetricData\Metric\MetricInterface使用,该接口定义了3个必需的方法:getDateTime()getType()getData()。您可以通过实现该接口来定义自己的指标,基于您特定的业务逻辑,但提供了一些基本的实现

  • MetricData\Metric\Metric:数据可以是任何类型
  • MetricData\Metric\IntegerMetric:数据被类型化为整数
  • MetricData\Metric\FloatMetric:数据被类型化为浮点数
  • MetricData\Metric\ArrayMetric:数据是一个数组

基本存储示例

本节将介绍每种存储类型的示例。在这些示例中,当需要子存储时,通常使用NullStorage进行说明。

闭包

这种存储允许您通过闭包快速集成几乎任何后端。一旦您将系统原型化并准备投入生产,通常建议创建一个完整的扩展类。

use MetricData\Metric\Metric;
use MetricData\Storage\ClosureStorage;

$storage = new ClosureStorage(
    function (MetricInterface $metric) use ($someAPI){
        $someAPI->send($metric->getType(), $metric->getData());
    }
);

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

延迟

这种存储允许您在请求期间排队指标数据,并将其刷新到另一个存储,这样可以延迟可能的长处理时间,直到向用户发送响应后。

use MetricData\Metric\Metric;
use MetricData\Storage\DelayedStorage;
use MetricData\Storage\NullStorage;

$storage = new DelayedStorage(new NullStorage());

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);
$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        5
    )
);
$storage->store(
    new Metric(
        new \DateTime(),
        'another_collection_type',
        1
    )
);

$storage->flush();

文件

这种存储将指标存储在JSON编码的文件中。这对于测试或如果您想在不干扰用户请求/响应周期的情况下使用其他工具批量处理事件非常有用。

use MetricData\Metric\Metric;
use MetricData\Storage\FileStorage;

$storage = new FileStorage('var/metrics.json');

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

KeenIO

这种存储允许您将指标数据发送到KeenIO API

use KeenIO\Client\KeenIOClient;
use MetricData\Metric\Metric;
use MetricData\Storage\KeenIOStorage;

$client = KeenIOClient::factory([
    'projectId' => $projectId,
    'writeKey'  => $writeKey,
]);

$storage = new KeenIOStorage($client);

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

日志记录

这种存储在将指标传递给子存储之前将日志记录到PSR-3日志记录器。

use MetricData\Metric\Metric;
use MetricData\Storage\LoggingStorage;
use MetricData\Storage\NullStorage;

$logger = // Some PSR-3 compatible logger sucha as [monolog](https://github.com/Seldaek/monolog)

$storage = new LoggingStorage($logger, 'info', new NullStorage());

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

内存

在生产环境中,这种存储不是特别有用,但在测试环境中使用时非常快,同时允许存储要测试的事件。

use MetricData\Metric\Metric;
use MetricData\Storage\MemoryStorage;

$storage = new MemoryStorage();

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

$storage->getMetrics(); // retrieves all metrics stored
$storage->count(); // gets the number of metrics stored in this request
$storage->first(); // gets only the first metric stored
$storage->last(); // gets only the last metrics stored

多个

这种存储允许将指标发送到多个子存储。

use MetricData\Metric\Metric;
use MetricData\Storage\MulitpleStorage;
use MetricData\Storage\NullStorage;

$storage = new MulitpleStorage([
    new NullStorage(),
    new NullStorage(),
    new NullStorage(),
]);

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

这种存储相当于/dev/null,任何存储在这里的指标都将简单地消失。对于生产环境没有用,但可以用于不需要存储指标的场景,如单元测试。

use MetricData\Metric\Metric;
use MetricData\Storage\NullStorage;

$storage = new NullStorage();

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

高级存储示例

虽然可以使用这些存储,但它们的强大之处在于可以组合它们来构建针对不同应用程序环境的需求的强大功能,这些功能可以轻松互换,使应用程序不知道特定的配置。

开发

use MetricData\Metric\Metric;
use MetricData\Storage\FileStorage;
use MetricData\Storage\LoggingStorage;
use MetricData\Storage\MemoryStorage;
use MetricData\Storage\MultipleStorage;

$storage = new LoggingStorage($logger, 'info', // will log all metrics to the application log
    new MultipleStorage([
       new FileStorage('var/metrics.json'), // provides a record of each metric stored
       $memoryStorage = new MemoryStorage(), // can be retrieved by profiling tools like the Symfony toolbar
   ])
);

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

测试

use MetricData\Metric\Metric;
use MetricData\Storage\NullStorage;

$storage = new NullStorage();

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

生产

use KeenIO\Client\KeenIOClient;
use MetricData\Metric\Metric;
use MetricData\Storage\KeenIOStorage;
use MetricData\Storage\LoggingStorage;

$client = KeenIOClient::factory([
    'projectId' => $projectId,
    'writeKey'  => $writeKey,
]);

$storage = new LoggingStorage($logger, 'info', // will log all metrics to the application log
    $delayedStorage = new DelayedStorage( // allow the user response to be sent before performing the expensive API calls
        new KeenIOStorage($client) // production metrics will be sent to an external api
    )
);

$storage->store(
    new Metric(
        new \DateTime(),
        'metric_collection_type',
        7
    )
);

// send user response

if (isset($delayedStorage)) {
    $delayedStorage->flush();
}

贡献

有什么想法可以让事情变得更好?提交一个pull request。需要集成其他后端服务?构建它。我很乐意在这里添加链接。PR使开源世界运转。🌎 🌏 🌍 :octocat: 快乐编码!