Envoyez des métriques à InfluxDB et interrogez toutes les données.
Ce projet prend en charge l'API InfluxDB >= 0.9
- Pour la branche de paiement InfluxDB v0.8 0.3 (n'est plus prise en charge)
Adaptateurs pris en charge :
Utilisez simplement le compositeur
$ composer require corley/influxdb-sdk: ~ 1
Ou ajoutez à votre fichier composer.json
{
"require" : {
"corley/influxdb-sdk" : " ~1 "
}
}
Ajouter de nouveaux points :
$ client -> mark ( " app-search " , [
" key " => " this is my search "
]);
Ou utilisez les messages directs InfluxDB
$ client -> mark ([
" tags " => [
" dc " => " eu-west-1 " ,
],
" points " => [
[
" measurement " => " instance " ,
" fields " => [
" cpu " => 18.12 ,
" free " => 712423 ,
],
],
]
]);
Récupérer les points existants :
$ results = $ client -> query ( ' select * from "app-search" ' );
En fait, nous prenons en charge deux cartes réseau
Pour utiliser l'adaptateur UDP/IP, vous devez avoir PHP compilé avec l'extension sockets
.
Usage
$ reader = . . .
$ options = new Udp Options ();
$ writer = new Udp Writer ( $ options );
$ client = new Client ( $ reader , $ writer );
Le jeu d'options UDP/IP n'a que les propriétés host
et port
Vous configurez les politiques de base de données et de rétention directement dans votre configuration InfluxDB.
En fait, Guzzle est utilisé comme bibliothèque client HTTP
<?php
$ http = new GuzzleHttp Client ();
$ writer = . . .
$ options = new Http Options ();
$ reader = new Http Reader ( $ http , $ options );
$ client = new Client ( $ reader , $ writer );
Bien sûr vous pouvez mélanger les adaptateurs UdpIp et Http afin d'écrire des points de données avec le protocole UDP/IP mais lire les informations en utilisant HTTP.
$ reader = new Http Reader ( $ http , $ httpOptions );
$ writer = new Udp Writer ( $ udpOptions );
$ client = new Client ( $ reader , $ writer );
$ client -> mark (...); // Use UDP/IP support
$ client -> query ( " SELECT * FROM my_serie " ); // Use HTTP support
Ou utilisez uniquement le HTTP
$ reader = new Http Reader ( $ http , $ options );
$ writer = new Http Writer ( $ http , $ options );
$ client = new Client ( $ reader , $ writer );
$ client -> mark (...); // Use HTTP support
$ client -> query ( " SELECT * FROM my_serie " ); // Use HTTP support
Vous pouvez interroger la base de données de séries chronologiques à l'aide de la méthode de requête.
$ client -> query ( ' select * from "mine" ' );
L'adaptateur renvoie le corps décodé en json de la réponse InfluxDB, quelque chose comme :
array(1) {
'results' =>
array(1) {
[0] =>
array(1) {
'series' =>
array(1) {
...
}
}
}
}
Si vous préférez une réponse plus simple que celle d'origine, vous pouvez utiliser corley/influxdb-http-handlers
qui convertissent la réponse InfluxDB d'origine en une réponse plus simple, quelque chose comme :
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 "
}
}
}
Vous pouvez définir un ensemble de balises par défaut, que le SDK ajoutera à vos métriques :
$ options = new Http Options ();
$ options -> setTags ([
" env " => " prod " ,
" region " => " eu-west-1 " ,
]);
Le SDK marque tous les points en ajoutant ces balises.
Vous pouvez définir une rétentionPolicy par défaut en utilisant
$options->setRetentionPolicy("myPolicy");
De cette façon, le SDK utilise cette stratégie au lieu de la stratégie default
.
Si vous proxy votre InfluxDB, vous avez généralement un préfixe dans vos points de terminaison.
$ 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 " ]);
À partir de la version InfluxDB >=0.9.3
les types entiers sont marqués d'un i
final. Cette bibliothèque prend en charge les types de données, en particulier les types PHP sont mappés à influxdb de cette manière par défaut :
Et le mappage résultant sera :
PHP | InfluxDB |
---|---|
int | int64 |
double | flotteur64 |
booléen | booléen |
chaîne | chaîne |
$ client -> mark ( " serie " , [
" value " => 12 , // Marked as int64
" elem " => 12.4 , // Marked as float64
]);
Si vous voulez vous assurer qu'un type est effectivement analysé correctement, vous pouvez le forcer directement pendant l'opération d'envoi
$ 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
]);
Intéressé par un générateur de requêtes ?
https://github.com/corley/dbal-influxdb
Grâce à Doctrine DBAL (Abstract Layer) vous pouvez utiliser le générateur de requêtes
$ 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 Doctrine DBAL Configuration ();
//..
$ connectionParams = array (
' dbname ' => ' mydb ' ,
' user ' => ' root ' ,
' password ' => ' root ' ,
' host ' => ' localhost ' ,
' port ' => 8086 ,
" driverClass " => " Corley \ DBAL \ Driver \ InfluxDB " ,
);
$ conn = Doctrine DBAL DriverManager:: getConnection ( $ connectionParams , $ config );
La classe InfluxDBClient
ne prend en charge aucune opération de base de données en elle-même. Cela signifie que vous ne disposez d'aucune fonction d'assistance pour créer de nouvelles bases de données, ou répertorier les bases de données réelles, etc. Grâce à InfluxDBManager
vous pouvez utiliser un préréglage de requêtes et créer vos propres requêtes personnelles qui s'exécuteront sur l'instance Influxdb.
L'instance Manager
est très simple, il faut la créer avec une instance client.
$ manager = new Manager ( $ client ); // InfluxDBClient instance
Le gestionnaire permet d'attacher de nouvelles requêtes via une méthode d'assistance addQuery
.
$ manager -> addQuery ( " getExceptionsInMinutes " , function ( $ minutes ) {
return " SELECT * FROM app_exceptions WHERE time > now() - { $ minutes } m " ;
});
$ manager -> getExceptionsInMinutes ( 10 ); // The callable name
Comme vous pouvez le constater, vous devez étiqueter votre fonction anonyme et la réutiliser via le gestionnaire.
Afin de collecter et de réutiliser des requêtes personnalisées, vous pouvez définir des objets de requête :
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
Comme vous pouvez le constater, une commande de requête valide doit être callable
via la méthode __invoke
et doit également être sérialisable sous forme de chaînes via la méthode __toString
.
Ce projet sort avec un préréglage de requêtes valides :
InfluxDBQueryCreateDatabase
InfluxDBQueryDeleteDatabase
InfluxDBQueryGetDatabases
$ manager -> addQuery ( new CreateDatabase ());
$ manager -> addQuery ( new DeleteDatabase ());
$ manager -> addQuery ( new GetDatabases ());
Pour vérifier si vous avez l'extension sockets
exécutez simplement un :
php -m | grep sockets
Si vous ne disposez pas de l'extension sockets
, vous pouvez procéder de deux manières :
--enable-sockets
sockets
en l’extrayant de la source PHP.ext/sockets
phpize && ./configure && make -j && sudo make install
extension=sockets.so
à votre php.iniNous abandonnons le support de Guzzle 4, mais nous l'avons testé en tant qu'adaptateur HTTP fonctionnel jusqu'à PHP 7.0 et il est stable avec ce projet avec la version 0.9.3.
Si vous avez besoin de Guzzle 4 comme adaptateur HTTP, nécessitez la version 0.9.3
compose require corley/influxdb-sdk:0.9. *