Send metrics to InfluxDB and query for any data.
This project support InfluxDB API >= 0.9
- For InfluxDB v0.8 checkout branch 0.3 (no longer supported)
Supported adapters:
Just use composer
$ composer require corley/influxdb-sdk:~1
Or add to your composer.json
file
{
"require": {
"corley/influxdb-sdk": "~1"
}
}
Add new points:
$client->mark("app-search", [
"key" => "this is my search"
]);
Or use InfluxDB direct messages
$client->mark([
"tags" => [
"dc" => "eu-west-1",
],
"points" => [
[
"measurement" => "instance",
"fields" => [
"cpu" => 18.12,
"free" => 712423,
],
],
]
]);
Retrieve existing points:
$results = $client->query('select * from "app-search"');
Actually we supports two network adapters
In order to use the UDP/IP adapter your must have PHP compiled with the sockets
extension.
Usage
$reader = ...
$options = new UdpOptions();
$writer = new UdpWriter($options);
$client = new Client($reader, $writer);
UDP/IP option set have only host
and port
properties you configure
database and retention policies directly in your InfluxDB configuration
Actually Guzzle is used as HTTP client library
<?php
$http = new GuzzleHttpClient();
$writer = ...
$options = new HttpOptions();
$reader = new HttpReader($http, $options);
$client = new Client($reader, $writer);
Of course you can mix UdpIp and Http adapters in order to write data points with UDP/IP protocol but read information using HTTP.
$reader = new HttpReader($http, $httpOptions);
$writer = new UdpWriter($udpOptions);
$client = new Client($reader, $writer);
$client->mark(...); // Use UDP/IP support
$client->query("SELECT * FROM my_serie"); // Use HTTP support
Or use only the HTTP
$reader = new HttpReader($http, $options);
$writer = new HttpWriter($http, $options);
$client = new Client($reader, $writer);
$client->mark(...); // Use HTTP support
$client->query("SELECT * FROM my_serie"); // Use HTTP support
You can query the time series database using the query method.
$client->query('select * from "mine"');
The adapter returns the json decoded body of the InfluxDB response, something like:
array(1) {
'results' =>
array(1) {
[0] =>
array(1) {
'series' =>
array(1) {
...
}
}
}
}
If you prefere a more simple response than the original one, you can use
corley/influxdb-http-handlers
that convert, the original InfluxDB response, in a more simple response, something like:
array(1) {
'serie_name' => array(2) {
[0] => array(4) {
'time' => string(30) "2015-09-09T20:42:07.927267636Z"
'value1' => int(1)
'value2' => int(2)
'valueS' => string(6) "string"
}
[1] => array(4) {
'time' => string(30) "2015-09-09T20:42:51.332853369Z"
'value1' => int(2)
'value2' => int(4)
'valueS' => string(11) "another-one"
}
}
}
You can set a set of default tags, that the SDK will add to your metrics:
$options = new HttpOptions();
$options->setTags([
"env" => "prod",
"region" => "eu-west-1",
]);
The SDK mark all point adding those tags.
You can set a default retentionPolicy using
$options->setRetentionPolicy("myPolicy");
In that way the SDK use that policy instead of default
policy.
If you proxy your InfluxDB typically you have a prefix in your endpoints.
$option->setHost("proxy.influxdb.tld");
$option->setPort(80);
$option->setPrefix("/influxdb"); // your prefix is: /influxdb
// final url will be: http://proxy.influxdb.tld:80/influxdb/write
$client->mark("serie", ["data" => "my-data"]);
From InfluxDB version >=0.9.3
integer types are marked with a trailing i
.
This library supports data types, in particular PHP types are mapped to influxdb
in this way by defaults:
And the resulting mapping will be:
PHP | InfluxDB |
---|---|
int | int64 |
double | float64 |
boolean | boolean |
string | string |
$client->mark("serie", [
"value" => 12, // Marked as int64
"elem" => 12.4, // Marked as float64
]);
If you want to ensure that a type is effectively parsed correctly you can force it directly during the send operation
$client->mark("serie", [
"value" => new IntType(12), // Marked as int64
"elem" => new FloatType(12.4), // Marked as float64
"status" => new BoolType(true), // Marked as boolean
"line" => new StringType("12w"), // Marked as string
]);
Interested in a Query Builder?
https://github.com/corley/dbal-influxdb
Thanks to Doctrine DBAL (Abstract Layer) you can use the query builder
$qb = $conn->createQueryBuilder();
$qb->select("*")
->from("cpu_load_short")
->where("time = ?")
->setParameter(0, 1434055562000000000);
$data = $qb->execute();
foreach ($data->fetchAll() as $element) {
// Use your element
}
$config = new DoctrineDBALConfiguration();
//..
$connectionParams = array(
'dbname' => 'mydb',
'user' => 'root',
'password' => 'root',
'host' => 'localhost',
'port' => 8086,
"driverClass" => "Corley\DBAL\Driver\InfluxDB",
);
$conn = DoctrineDBALDriverManager::getConnection($connectionParams, $config);
The class InfluxDBClient
does not support any database operation by itself.
That means that you don't have any helper function for create new databases, or
list actual databases and so on.
Thanks to InfluxDBManager
you can use a preset of queries and create your own
personal queries that will run against the Influxdb instance.
The Manager
instance is very simple, you have to create it with a client
instance.
$manager = new Manager($client); // InfluxDBClient instance
The manager allows to attach new queries via an helper method addQuery
.
$manager->addQuery("getExceptionsInMinutes", function($minutes) {
return "SELECT * FROM app_exceptions WHERE time > now() - {$minutes}m";
});
$manager->getExceptionsInMinutes(10); // The callable name
As you can see you have to label your anonymous function and reuse it via the manager.
In order to collect and reuse custom queries you can define query objects:
class GetExceptionsInMinutes
{
public function __invoke($minutes)
{
return "SELECT * FROM app_exceptions WHERE time > now() - {$minutes}m";
}
public function __toString()
{
return "getExceptionsInMinutes";
}
}
$manager->addQuery(new GetExceptionsInMinutes());
$manager->getExceptionsInMinutes(10); //Use the query
As you can see valid query command should be callable
via the __invoke
method and should be also serializable as strings via __toString
method
This project comes out with a preset of valid queries:
InfluxDBQueryCreateDatabase
InfluxDBQueryDeleteDatabase
InfluxDBQueryGetDatabases
$manager->addQuery(new CreateDatabase());
$manager->addQuery(new DeleteDatabase());
$manager->addQuery(new GetDatabases());
To verify if you have the sockets
extension just issue a:
php -m | grep sockets
If you don't have the sockets
extension, you can proceed in two ways:
--enable-sockets
flagsockets
extension extracting it from the PHP source.ext/sockets
directoryphpize && ./configure && make -j && sudo make install
extension=sockets.so
to your php.iniWe drop the Guzzle 4 support, but we tested it as working HTTP adapter in up to PHP 7.0 and is stable with this project with version 0.9.3.
If you need Guzzle 4 as HTTP adapter require for 0.9.3 version
compose require corley/influxdb-sdk:0.9.*