harout-itology/laravel-aws-timestream

通过API与AWS Timestream服务交互的库

0.2.2 2022-09-15 20:33 UTC

This package is auto-updated.

Last update: 2024-09-16 01:00:07 UTC


README

PHPUnit Tests PHPStan

AWS Timestream是一个快速、可扩展的无服务器时间序列数据库服务。此包是为查询timestream并将数据导入timestream提供的一种有意见的实现。

它提供了一个具有常见时间序列SQL函数的查询构建器类。这受到了Laravel Eloquent ORM的启发。请参阅支持的查询函数 HaroutItology\AwsTimestream\Contract\QueryBuilderContract

它还提供了一个有效载荷构建器类,用于正确格式化您的数据以导入timestream。请参阅 HaroutItology\AwsTimestream\Contract\PayloadBuilderContract

安装

composer require harout-itology/laravel-aws-timestream

配置

  • 发布配置
php artisan vendor:publish --provider="HaroutItology\AwsTimestream\TimestreamServiceProvider" --tag="timestream-config"
  • 打开 timestream.php 配置文件,设置您的数据库名称和表
  • 使用以下环境变量设置您的AWS Timestream密钥和权限
AWS_TIMESTREAM_KEY=
AWS_TIMESTREAM_SECRET=
AWS_TIMESTREAM_PROFILE=
AWS_TIMESTREAM_REGION=

基本用法

查询Timestream

使用 TimestreamBuilder::query() 将提供所有可用函数的自动完成

  1. 使用 TimestreamBuilder 构建要传递给 TimestreamReaderDto 的查询,它生成一个可以被 TimestreamService 查询函数消费的对象
<?php

use HaroutItology\AwsTimestream\TimestreamService;
use HaroutItology\AwsTimestream\TimestreamBuilder;
use HaroutItology\AwsTimestream\Dto\TimestreamReaderDto;

public function overview(TimestreamService $timestreamService)
{
    $queryBuilder = TimestreamBuilder::query()
        ->select('*')
        ->from("database-name", 'table-name')
        ->whereAgo('time', '24h', '>=')
        ->whereNotIn('measure_value::varchar', ['reviewer', 'open', 'closed'])
        ->orderBy('time', 'desc');
    
    TimestreamReaderDto::make($queryBuilder);

    // response from Aws timestream
    return $timestreamService->query($timestreamReader)
}
  1. 使用 TimestreamReaderDto 向查询注入 from,默认 database 名称和按需 table 名称。 注意。不需要在查询构建器上添加 ->from() 查询。
<?php

use HaroutItology\AwsTimestream\TimestreamService;
use HaroutItology\AwsTimestream\TimestreamBuilder;
use HaroutItology\AwsTimestream\Dto\TimestreamReaderDto;

public function overview(TimestreamService $timestreamService)
{
   $queryBuilder = TimestreamBuilder::query()
       ->select('*')
       ->whereAgo('time', '24h', '>=')
       ->whereNotIn('measure_value::varchar', ['reviewer', 'open', 'closed'])
       ->orderBy('time', 'desc');
   
   TimestreamReaderDto::make($queryBuilder, 'table-name');

   // response from Aws timestream
   return $timestreamService->query($timestreamReader)
}

Timestream导入

我们需要构建Timestream可以接受的用于导入的有效载荷。

  1. 使用 TimestreamBuilder 构建导入有效载荷
<?php

use HaroutItology\AwsTimestream\TimestreamService;
use HaroutItology\AwsTimestream\Dto\TimestreamWriterDto;
use HaroutItology\AwsTimestream\TimestreamBuilder;

public function ingest(TimestreamService $timestreamService)
{
    $metrics = [
        'measure_name' => 'cpu_usage',
        'measure_value' => 80,
        'time' => Carbon::now(),
        'dimensions' => [
            'mac_address' => 'randomstring',
            'ref' => 'refs',
        ],
    ];

    $payload = TimestreamBuilder::payload(
        $metrics['measure_name'],
        $metrics['measure_value'],
        $metrics['time'],
        'VARCHAR',
        $metrics['dimensions'],
    )->toArray();

    $timestreamWriter = TimestreamWriterDto::make($payload)->forTable('table-name');
    return $timestreamService->write($timestreamWriter);
}
  1. 使用通用属性批量导入数据以降低Timestream的导入成本
<?php

use HaroutItology\AwsTimestream\TimestreamService;
use HaroutItology\AwsTimestream\Dto\TimestreamWriterDto;
use HaroutItology\AwsTimestream\Support\TimestreamPayloadBuilder;

public function ingest(TimestreamService $timestreamService)
{
    $metrics = [
        [
            'measure_name' => 'cpu_usage',
            'measure_value' => 80,
            'time' => Carbon::now(),
            'dimensions' => [
                'ref' => 'ref_1',
            ],
        ],
        [
            'measure_name' => 'memory_usage',
            'measure_value' => 20,
            'time' => Carbon::now(),
            'dimensions' => [
                'ref' => 'ref_2',
            ],
        ]
    ];

    $commonAttributes['device_name'] = 'device_1';
    $commonAttributes['mac_address'] = 'randomstring';

    $payload = TimestreamBuilder::batchPayload($metrics);

    $common = TimestreamBuilder::commonAttributes($commonAttributes);

    $timestreamWriter = TimestreamWriterDto::make($payload, $common, 'table-name');
    return $timestreamService->write($timestreamWriter);
}

在线资源