Ceci est une ancienne révision du document !
Tout simplement (si on se trouve sur le serveur qui héberge la base de données et en supposant que le client influx est dans le PATH)
influx -precision rfc3339 -database 'influxdb'
Contexte :
J'ai des erreurs de mesures1) remontées par une de mes sondes de température, que je souhaite corriger à la méthode du garagiste Islandais2) ( Private Joke) :
influxdb
Temperature_temper
5 min / 300 sec
Après correction :
On commence par se connecter à la base de données qui va bien…
On affiche la structure de la MEASUREMENT
> SHOW SERIES FROM Temperature_temper key --- Temperature_temper,host=drouard.eu > SHOW TAG KEYS FROM Temperature_temper name: Temperature_temper tagKey ------ host > SHOW FIELD KEYS FROM Temperature_temper name: Temperature_temper fieldKey fieldType -------- --------- value float
☛ Structure toute simple, contenant 1 SERIE avec :
host
value
de type FloatCommençons par évaluer l'ampleur de la tâche à réaliser (et voir si il ne serait pas plus efficace de créer un script…)
> SELECT COUNT("value") FROM Temperature_temper WHERE value > 100; name: Temperature_temper time count ---- ----- 1970-01-01T00:00:00Z 1
Bon ok, 1 point de mesure à corriger, c'est pas si pire…
Pour appliquer la 2ème méthode, qui implique d'utiliser le timestamp au format epoch (précision à la nanoseconde), je ne saurais que conseiller aussi de lister les points à corriger avec le format de précision ns
Liste des points de température à corriger
> PRECISION rfc3339 > SELECT * FROM Temperature_temper WHERE value > 100 LIMIT 10; name: Temperature_temper time host value ---- ---- ----- 2017-12-07T11:00:04Z drouard.eu 568.5 > PRECISION ns > SELECT * FROM Temperature_temper WHERE value > 100 LIMIT 10; name: Temperature_temper time host value ---- ---- ----- 1512644404000000000 drouard.eu 568.5
Passons à la correction !
En fonction de la nature, criticité de la métrique, 2 possibilités pour corriger l'erreur :
GROUP BY fill(0/null/none/etc.)
… c'est fourbe, mais esthétique… inconvénient, ça masquerait les erreurs de collectes trop récurrentes On commence par identifier le laps de temps incriminé via une petite requête (±1 période de collecte) :
> PRECISION rfc3339 > SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z' name: Temperature_temper time host value ---- ---- ----- 2017-12-07T10:55:01Z drouard.eu 19.29 2017-12-07T11:00:04Z drouard.eu 568.5 2017-12-07T11:05:01Z drouard.eu 19.31
On supprime la valeur erronée
DELETE FROM Temperature_temper WHERE "host" = 'drouard.eu' AND time = '2017-12-07T11:00:04Z'
On vérifie que la mesure à bien été supprimée
> SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z' name: Temperature_temper time host value ---- ---- ----- 2017-12-07T10:55:01Z drouard.eu 19.29 2017-12-07T11:05:01Z drouard.eu 19.31
La méthode 1 consiste à en rester là et éventuellement maquiller légèrement la courbe dans Grafana…
Maintenant, on va aller un peu plus loin avec la méthode 2.
Note : il faut savoir que si l'on insert une valeur avec un timestamp existant, alors l'INSERT
agira comme un UPDATE
(qui d'ailleurs, n'existe pas en tant que tel dans influxDB). Ce qui implique que pour la méthode 2, il n'est pas nécessaire de supprimer la valeur précédente
On va devoir injecter une nouvelle valeur avec comme paramètres :
value
= Moyenne des valeurs encadrant(19.29 + 19.31) / 2
= 19.30timestamp
= Timestamp au format epoch, précision à la nanosecondetimestamp
= 1512644404000000000
A noter qu'il est possible de convertir une date au format RFC-3339 vers le format epoch avec une précision à la nanoseconde avec la commande date
:
date -d 2017-12-07T11:00:04Z +%s%N
Syntaxe générique d'insertion de donnée dans InfluxDB (Docs de référence sur https://docs.influxdata.com : Writing and exploring data et Line Protocol) :
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
Ensuite, on peut forger la requête d'insertion soit :
influx
INSERT Temperature_temper,host=drouard.eu value=19.30 1512644404000000000
curl
curl -i -XPOST -u USERNAME:PASSWORD "http://localhost:8086/write?db=db_drouard&precision=ns" --data-binary 'Temperature_temper,host=drouard.eu value=19.30 1512644404000000000'
Enfin, on vérifie la correction
> SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z' name: Temperature_temper time host value ---- ---- ----- 1512644101000000000 drouard.eu 19.29 1512644404000000000 drouard.eu 19.3 1512644701000000000 drouard.eu 19.31