Files
SeMonitoring/libs/vendor/influxdata/influxdb-client-php/tests/WriteApiTest.php
T

385 lines
13 KiB
PHP

<?php
namespace InfluxDB2Test;
use Exception;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Psr7\Response;
use InfluxDB2\ApiException;
use InfluxDB2\Client;
use InfluxDB2\Model\WritePrecision;
use InfluxDB2\Point;
use InfluxDB2\WriteRetry;
require_once('BasicTest.php');
/**
* Class WriteApiTest
* @package InfluxDB2Test
*/
class WriteApiTest extends BasicTest
{
private const ID_TAG = "132-987-655";
private const CUSTOMER_TAG = "California Miner";
public function setUp($url = "http://localhost:8086", $logFile = "php://output"): void
{
parent::setUp($url, $logFile);
putenv("data_center=LA");
}
public function testWriteLineProtocol()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->write('h2o,location=west value=33i 15');
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals('h2o,location=west value=33i 15', $request->getBody());
}
public function testWritePoint()
{
$this->mockHandler->append(new Response(204));
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$this->writeApi->write($point);
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals('h2o,location=europe level=2i', $request->getBody());
}
public function testWriteArray()
{
$this->mockHandler->append(new Response(204));
$array = array('name' => 'h2o',
'tags' => array('host' => 'aws', 'region' => 'us'),
'fields' => array('level' => 5, 'saturation' => '99%'),
'time' => 123);
$this->writeApi->write($array);
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals('h2o,host=aws,region=us level=5i,saturation="99%" 123', $request->getBody());
}
public function testWriteCollection()
{
$this->mockHandler->append(new Response(204));
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$array = array('name' => 'h2o',
'tags' => array('host' => 'aws', 'region' => 'us'),
'fields' => array('level' => 5, 'saturation' => '99%'),
'time' => 123);
$this->writeApi->write(array('h2o,location=west value=33i 15', null, $point, $array));
$request = $this->mockHandler->getLastRequest();
$expected = "h2o,location=west value=33i 15\n"
. "h2o,location=europe level=2i\n"
. "h2o,host=aws,region=us level=5i,saturation=\"99%\" 123";
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals($expected, strval($request->getBody()));
}
public function testAuthorizationHeader()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->write('h2o,location=west value=33i 15');
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals('Token my-token', implode(' ', $request->getHeaders()['Authorization']));
}
public function testWithoutData()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->write('');
$request = $this->mockHandler->getLastRequest();
$this->assertNull($request);
}
public function testInfluxException()
{
$errorBody = '{"code":"invalid","message":"unable to parse \'h2o_feet, location=coyote_creek water_level=1.0 1\': missing tag key"}';
$this->mockHandler->append(new Response(400, array('X-Platform-Error-Code' => 'invalid'), $errorBody));
try {
$this->writeApi->write('h2o,location=west value=33i 15');
$this->fail();
} catch (ApiException $e) {
$this->assertEquals(400, $e->getCode());
$this->assertEquals('invalid', implode($e->getResponseHeaders()['X-Platform-Error-Code']));
$this->assertEquals($errorBody, strval($e->getResponseBody()));
} catch (Exception $e) {
$this->fail();
}
}
public function testWritePointWithDefaultTags()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->pointSettings->addDefaultTag('id', WriteApiTest::ID_TAG);
$this->writeApi->pointSettings->addDefaultTag('customer', WriteApiTest::CUSTOMER_TAG);
$this->writeApi->pointSettings->addDefaultTag('data_center', '${env.data_center}');
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$this->writeApi->write($point);
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals(
'h2o,customer=California\ Miner,data_center=LA,id=132-987-655,location=europe level=2i',
strval($request->getBody())
);
}
public function testWriteArrayWithDefaultTags()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->pointSettings->addDefaultTag('id', WriteApiTest::ID_TAG);
$this->writeApi->pointSettings->addDefaultTag('customer', WriteApiTest::CUSTOMER_TAG);
$this->writeApi->pointSettings->addDefaultTag('data_center', '${env.data_center}');
$array = array('name' => 'h2o',
'tags' => array('host' => 'aws', 'region' => 'us'),
'fields' => array('level' => 5, 'saturation' => '99%'),
'time' => 123);
$this->writeApi->write($array);
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals(
'h2o,customer=California\ Miner,data_center=LA,host=aws,id=132-987-655,region=us level=5i,saturation="99%" 123',
strval($request->getBody())
);
}
public function testWriteCollectionWithDefaultTags()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->pointSettings->addDefaultTag('id', WriteApiTest::ID_TAG);
$this->writeApi->pointSettings->addDefaultTag('customer', WriteApiTest::CUSTOMER_TAG);
$this->writeApi->pointSettings->addDefaultTag('data_center', '${env.data_center}');
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$array = array('name' => 'h2o',
'tags' => array('host' => 'aws', 'region' => 'us'),
'fields' => array('level' => 5, 'saturation' => '99%'),
'time' => 123);
$this->writeApi->write(array('h2o,location=west value=33i 15', null, $point, $array));
$request = $this->mockHandler->getLastRequest();
$expected = "h2o,location=west value=33i 15\n"
. "h2o,customer=California\ Miner,data_center=LA,id=132-987-655,location=europe level=2i\n"
. "h2o,customer=California\ Miner,data_center=LA,host=aws,id=132-987-655,region=us level=5i,saturation=\"99%\" 123";
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals($expected, strval($request->getBody()));
}
public function testWriteArrayWithoutTagsWithDefaultTags()
{
$this->mockHandler->append(new Response(204));
$this->writeApi->pointSettings->addDefaultTag('id', WriteApiTest::ID_TAG);
$this->writeApi->pointSettings->addDefaultTag('customer', WriteApiTest::CUSTOMER_TAG);
$this->writeApi->pointSettings->addDefaultTag('data_center', '${env.data_center}');
$array = array('name' => 'h2o',
'fields' => array('level' => 5, 'saturation' => '99%'),
'time' => 123);
$this->writeApi->write($array);
$request = $this->mockHandler->getLastRequest();
$this->assertEquals(
'http://localhost:8086/api/v2/write?org=my-org&bucket=my-bucket&precision=ns',
strval($request->getUri())
);
$this->assertEquals(
'h2o,customer=California\ Miner,data_center=LA,id=132-987-655 level=5i,saturation="99%" 123',
strval($request->getBody())
);
}
public function testRetryCount()
{
$this->mockHandler->append(
// regular call
new Response(429),
// retry
new Response(429),
// retry
new Response(429),
// retry
new Response(429),
// not called
new Response(429)
);
$this->writeApi->writeOptions->retryInterval = 1000;
$this->writeApi->writeOptions->maxRetries = 3;
$this->writeApi->writeOptions->maxRetryDelay = 15000;
$this->writeApi->writeOptions->exponentialBase = 2;
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$this->expectExceptionCode(429);
$this->expectException(ApiException::class);
$this->writeApi->write($point);
$this->assertCount(4, $this->requests);
$this->assertCount(1, $this->mockHandler);
}
public function testRetryMaxTime()
{
$this->mockHandler->append(
// regular call
new Response(429),
// retry
new Response(429),
// retry
new Response(200)
);
$this->writeApi->writeOptions->retryInterval = 1000;
$this->writeApi->writeOptions->maxRetries = 3;
$this->writeApi->writeOptions->maxRetryDelay = 15000;
$this->writeApi->writeOptions->exponentialBase = 2;
$this->writeApi->writeOptions->maxRetryTime = 300;
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$this->expectException(ApiException::class);
$this->expectExceptionCode(429);
$this->writeApi->write($point);
$this->assertCount(2, $this->requests);
$this->assertCount(1, $this->mockHandler);
}
public function testRetryBackoffTime()
{
$retry = new WriteRetry();
$backoff = $retry->getBackoffTime(1);
$this->assertGreaterThanOrEqual(5000, $backoff);
$this->assertLessThanOrEqual(10000, $backoff);
$backoff = $retry->getBackoffTime(2);
$this->assertGreaterThanOrEqual(10000, $backoff);
$this->assertLessThanOrEqual(20000, $backoff);
$backoff = $retry->getBackoffTime(3);
$this->assertGreaterThanOrEqual(20000, $backoff);
$this->assertLessThanOrEqual(40000, $backoff);
$backoff = $retry->getBackoffTime(4);
$this->assertGreaterThanOrEqual(40000, $backoff);
$this->assertLessThanOrEqual(80000, $backoff);
$backoff = $retry->getBackoffTime(5);
$this->assertGreaterThanOrEqual(80000, $backoff);
$this->assertLessThanOrEqual(125000, $backoff);
$backoff = $retry->getBackoffTime(6);
$this->assertGreaterThanOrEqual(80000, $backoff);
$this->assertLessThanOrEqual(125000, $backoff);
}
public function testConnectExceptionRetry()
{
$client = new Client([
"url" => "http://nonexistenthost:8086/",
"token" => "my-token",
"bucket" => "my-bucket",
"precision" => WritePrecision::NS,
"org" => "my-org",
"logFile" => "php://output"
]);
$writeApi = $client->createWriteApi(["retryInterval" => 100]);
$point = Point::measurement('h2o')
->addTag('location', 'europe')
->addField('level', 2);
$this->expectException(ApiException::class);
$this->expectExceptionMessage("Could not resolve host: nonexistenthost");
try {
$writeApi->write($point);
} catch (ApiException $e) {
$this->assertEquals(ConnectException::class, get_class($e->getPrevious()));
throw $e;
}
}
}