Vim Online ;)

Car les fichiers textes éparpillés de partout, ça devient usant ô_Ô

Outils pour utilisateurs

Outils du site


pub_zone:linux:stack_tig

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
pub_zone:linux:stack_tig [13:40 07/12/2017] – [Correction d'une SERIE] nimbuspub_zone:linux:stack_tig [15:05 27/06/2019] (Version actuelle) – [Correction d'un MEASUREMENT] nimbus
Ligne 4: Ligne 4:
 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) 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)
 <code bash> <code bash>
-influx -precision rfc3339 -database 'influxdb'+influx -precision rfc3339 -database 'influxdb' -username '<USER>' -password 
 +influx -precision ns -database 'influxdb' -username '<USER>' -password
 </code> </code>
  
-==== Correction d'une SERIE ==== +==== Correction d'un MEASUREMENT ==== 
-<WRAP center round todo 60%> +=== Méthode subtile ===
-Work in Progress 8-o +
-</WRAP> +
 <WRAP center round info> <WRAP center round info>
 **Contexte : **\\ **Contexte : **\\
 J'ai des erreurs de mesures((Problème corrigé depuis... causé par une concurrence d'accès à la sonde entre Nagios et Telegraf.)) remontées par une de mes sondes de température, que je souhaite corriger à la méthode du garagiste Islandais((Fix It or Remove It :p)) (:-x Private Joke) : J'ai des erreurs de mesures((Problème corrigé depuis... causé par une concurrence d'accès à la sonde entre Nagios et Telegraf.)) remontées par une de mes sondes de température, que je souhaite corriger à la méthode du garagiste Islandais((Fix It or Remove It :p)) (:-x Private Joke) :
   * Nom de la base InfluxDB : ''influxdb''   * Nom de la base InfluxDB : ''influxdb''
-  * La SERIE est stockée dans la MEASUREMENT ''Temperature_temperhum''+  * La SERIE est stockée dans la MEASUREMENT **''Temperature_temper''**
   * Fréquence de collecte : ''5 min / 300 sec''   * Fréquence de collecte : ''5 min / 300 sec''
-  * Valeurs à corriger :+  * Valeur à corriger :
     * Points de **température > 100°C** (la pièce à vivre n'est pas censée être un four ;-))     * Points de **température > 100°C** (la pièce à vivre n'est pas censée être un four ;-))
-    * Points d'**humidité > 100%** (100% étant l'humidité de l'eau, je ne vois pas bien ce que pourrait être une humidité  de 110% ^_^) 
 </WRAP> </WRAP>
  
Ligne 27: Ligne 24:
  
 __Après__ correction : __Après__ correction :
-{{ :pub_zone:linux:grafana_graph_avant_correction01.png?600 |Après correction...}}+{{ :pub_zone:linux:grafana_graph_apres_correction01.png?600 |Après correction...}}
 On commence par [[#connexion_a_la_bdd|se connecter à la base de données]] qui va bien... On commence par [[#connexion_a_la_bdd|se connecter à la base de données]] qui va bien...
  
 On affiche la structure de la **MEASUREMENT** On affiche la structure de la **MEASUREMENT**
 <code bash> <code bash>
-> SHOW SERIES FROM Temperature_temperhum+> SHOW SERIES FROM Temperature_temper
 key key
 --- ---
-Temperature_temperhum,host=drouard.eu+Temperature_temper,host=drouard.eu
  
-> SHOW TAG KEYS FROM Temperature_temperhum +> SHOW TAG KEYS FROM Temperature_temper 
-name: Temperature_temperhum+name: Temperature_temper
 tagKey tagKey
 ------ ------
 host host
  
-> SHOW FIELD KEYS FROM Temperature_temperhum +> SHOW FIELD KEYS FROM Temperature_temper 
-name: Temperature_temperhum+name: Temperature_temper
 fieldKey fieldType fieldKey fieldType
 -------- --------- -------- ---------
Ligne 55: Ligne 52:
 Commenç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...) Commenç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...)
 <code bash> <code bash>
-> SELECT COUNT("value") FROM Temperature_temperhum WHERE value > 100; +> SELECT COUNT("value") FROM Temperature_temper WHERE value > 100; 
-name: Temperature_temperhum+name: Temperature_temper
 time                 count time                 count
 ----                 ----- ----                 -----
-1970-01-01T00:00:00Z 10 +1970-01-01T00:00:00Z 1
- +
-> SELECT COUNT("value") FROM Humidity_temperhum WHERE value > 100; +
-name: Humidity_temperhum +
-time                 count +
-----                 ----- +
-1970-01-01T00:00:00Z 10+
 </code> </code>
  
-Bon ok, une vingtaine de points de mesure à corriger, //c'est pas si pire//...+Bon ok, 1 point de mesure à corriger, //c'est pas si pire//...
  
 <WRAP center round tip> <WRAP center round tip>
Ligne 77: Ligne 68:
 <code bash> <code bash>
 > PRECISION rfc3339 > PRECISION rfc3339
-> SELECT * FROM Temperature_temperhum WHERE value > 100 LIMIT 20+> SELECT * FROM Temperature_temper WHERE value > 100 LIMIT 10
-name: Temperature_temperhum+name: Temperature_temper
 time                 host       value time                 host       value
 ----                 ----       ----- ----                 ----       -----
-2017-12-04T14:50:01Z drouard.eu 568.5 +2017-12-07T11:00:04Z drouard.eu 568.5
-2017-12-04T19:25:03Z drouard.eu 568.5 +
-2017-12-04T20:05:01Z drouard.eu 568.5 +
-2017-12-04T22:15:05Z drouard.eu 568.5 +
-2017-12-04T23:40:01Z drouard.eu 568.5 +
-2017-12-04T23:50:02Z drouard.eu 568.5 +
-2017-12-05T22:10:01Z drouard.eu 568.5 +
-2017-12-06T00:00:05Z drouard.eu 568.5 +
-2017-12-06T00:10:02Z drouard.eu 568.5 +
-2017-12-06T10:45:04Z drouard.eu 568.5+
  
 > PRECISION ns > PRECISION ns
-> SELECT * FROM Temperature_temperhum WHERE value > 100 LIMIT 20+> SELECT * FROM Temperature_temper WHERE value > 100 LIMIT 10
-name: Temperature_temperhum+name: Temperature_temper
 time                host       value time                host       value
 ----                ----       ----- ----                ----       -----
-1512399001000000000 drouard.eu 568.5 +1512644404000000000 drouard.eu 568.5
-1512415503000000000 drouard.eu 568.5 +
-1512417901000000000 drouard.eu 568.5 +
-1512425705000000000 drouard.eu 568.5 +
-1512430801000000000 drouard.eu 568.5 +
-1512431402000000000 drouard.eu 568.5 +
-1512511801000000000 drouard.eu 568.5 +
-1512518405000000000 drouard.eu 568.5 +
-1512519002000000000 drouard.eu 568.5 +
-1512557104000000000 drouard.eu 568.5 +
-</code> +
- +
-Liste des points d'**humidité** à corriger +
-<code bash> +
-> PRECISION rfc3339 +
-> SELECT * FROM Humidity_temperhum WHERE value > 100 LIMIT 20; +
-name: Humidity_temperhum +
-time                 host       value +
-----                 ----       ----- +
-2017-12-04T14:50:01Z drouard.eu 2517 +
-2017-12-04T19:25:03Z drouard.eu 2517 +
-2017-12-04T20:05:01Z drouard.eu 2517 +
-2017-12-04T22:15:05Z drouard.eu 2517 +
-2017-12-04T23:40:01Z drouard.eu 2517 +
-2017-12-04T23:50:02Z drouard.eu 2517 +
-2017-12-05T22:10:01Z drouard.eu 2517 +
-2017-12-06T00:00:05Z drouard.eu 2517 +
-2017-12-06T00:10:02Z drouard.eu 2517 +
-2017-12-06T10:45:04Z drouard.eu 2517 +
- +
-> PRECISION ns +
-> SELECT * FROM Humidity_temperhum WHERE value > 100 LIMIT 20; +
-name: Humidity_temperhum +
-time                host       value +
-----                ----       ----- +
-1512399001000000000 drouard.eu 2517 +
-1512415503000000000 drouard.eu 2517 +
-1512417901000000000 drouard.eu 2517 +
-1512425705000000000 drouard.eu 2517 +
-1512430801000000000 drouard.eu 2517 +
-1512431402000000000 drouard.eu 2517 +
-1512511801000000000 drouard.eu 2517 +
-1512518405000000000 drouard.eu 2517 +
-1512519002000000000 drouard.eu 2517 +
-1512557104000000000 drouard.eu 2517+
 </code> </code>
  
Ligne 147: Ligne 85:
 En fonction de la nature, criticité de la métrique, 2 possibilités pour corriger l'erreur : En fonction de la nature, criticité de la métrique, 2 possibilités pour corriger l'erreur :
   * Méthode 1 ☛ **Supprimer la valeur** erronée :   * Méthode 1 ☛ **Supprimer la valeur** erronée :
-    * Il est possible de corriger l'apparence de la courbe à la volée dans Grafana avec la clause GROUP BY  fill (0/null/none/etc.)... c'est fourbe, mais esthétique... __inconvénient__, ça masquerait les erreurs de collectes trop récurrentes :-/+    * Il est possible de corriger l'apparence de la courbe à la volée dans Grafana avec la clause ''GROUP BY fill(0/null/none/etc.)''... c'est fourbe, mais esthétique... __inconvénient__, ça masquerait les erreurs de collectes trop récurrentes :-/
   * Méthode 2 ☛ **Maquiller la valeur** erronée (Ce n'est qu'une extension de la méthode 1) :   * Méthode 2 ☛ **Maquiller la valeur** erronée (Ce n'est qu'une extension de la méthode 1) :
     * Cette stratégie consiste sournoisement à faire une moyenne (par ex.) entre les 2 valeurs entourant le pic puis à inscrire cette valeur à la place de la valeur du pic     * Cette stratégie consiste sournoisement à faire une moyenne (par ex.) entre les 2 valeurs entourant le pic puis à inscrire cette valeur à la place de la valeur du pic
  
-Prenons l'exemple de l'erreur du **4 décembre 2017 15h50 UTC+1** (''2017-12-04T14:50:01Z''). On commence par identifier le laps de temps incriminé via une petite requête :+On commence par identifier le laps de temps incriminé via une petite requête (±1 période de collecte) :
 <code bash> <code bash>
-> SELECT * FROM Temperature_temperhum WHERE time >= '2017-12-04T14:44:01Z' AND time <= '2017-12-04T14:56:01Z+> PRECISION rfc3339 
-name: Temperature_temperhum+> SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z
 +name: Temperature_temper
 time                 host       value time                 host       value
 ----                 ----       ----- ----                 ----       -----
-2017-12-04T14:45:03Z drouard.eu 20.78 +2017-12-07T10:55:01Z drouard.eu 19.29 
-2017-12-04T14:50:01Z drouard.eu 568.5 +2017-12-07T11:00:04Z drouard.eu 568.5 
-2017-12-04T14:55:04Z drouard.eu 20.72+2017-12-07T11:05:01Z drouard.eu 19.31
 </code> </code>
  
 On supprime la valeur erronée On supprime la valeur erronée
 <code bash> <code bash>
-DELETE FROM Temperature_temperhum WHERE "host" = 'drouard.eu' AND time = '2017-12-04T14:50:01Z'+DELETE FROM Temperature_temper WHERE "host" = 'drouard.eu' AND time = '2017-12-07T11:00:04Z'
 </code> </code>
  
 On vérifie que la mesure à bien été supprimée On vérifie que la mesure à bien été supprimée
 <code bash> <code bash>
-> SELECT * FROM Temperature_temperhum WHERE time >= '2017-12-04T14:44:01Z' AND time <= '2017-12-04T14:56:01Z+> SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z
-name: Temperature_temperhum+name: Temperature_temper
 time                 host       value time                 host       value
 ----                 ----       ----- ----                 ----       -----
-2017-12-04T14:45:03Z drouard.eu 20.78 +2017-12-07T10:55:01Z drouard.eu 19.29 
-2017-12-04T14:55:04Z drouard.eu 20.72+2017-12-07T11:05:01Z drouard.eu 19.31
 </code> </code>
  
Ligne 186: Ligne 125:
 On va devoir injecter une nouvelle valeur avec comme paramètres : On va devoir injecter une nouvelle valeur avec comme paramètres :
   * **''value''** = Moyenne des valeurs encadrant   * **''value''** = Moyenne des valeurs encadrant
-    * Dans cet ex : ''(20.78 20.72) / 2'' = **20.75**+    * Dans cet ex : ''(19.29 19.31) / 2'' = **19.30**
   * **''timestamp''** = Timestamp au format epoch, précision à la nanoseconde   * **''timestamp''** = Timestamp au format epoch, précision à la nanoseconde
-    * Dans cet ex : ''date -d 2017-12-04T14:50:01Z +%s%N'' = **1512399001000000000**+    * Dans cet ex : ''timestamp'' = **1512644404000000000**
  
-Syntaxe générique d'insertion de donnée dans InfluxDB (Docs de référence sur [[https://docs.influxdata.com]] : [[https://docs.influxdata.com/influxdb/v1.3/introduction/getting_started/#writing-and-exploring-data|Writing and exploring data]] et [[https://docs.influxdata.com/influxdb/v1.3/write_protocols/line_protocol_reference/|Line Protocol]]) :+<WRAP center round tip> 
 +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''
 +<code bash> 
 +date -d 2017-12-07T11:00:04Z +%s%N 
 +</code> 
 +</WRAP> 
 + 
 + 
 +Syntaxe générique d'insertion de donnée dans InfluxDB (Docs de référence sur [[https://docs.influxdata.com]] : [[https://docs.influxdata.com/influxdb/v1.6/introduction/getting_started/#writing-and-exploring-data|Writing and exploring data]] et [[https://docs.influxdata.com/influxdb/v1.6/write_protocols/line_protocol_reference/|Line Protocol]]) :
  
 <code bash> <code bash>
Ligne 199: Ligne 146:
   * En mode **CLI** via le client ''influx''   * En mode **CLI** via le client ''influx''
 <code bash> <code bash>
-INSERT Temperature_temperhum,host=drouard.eu value=20.75 1512399001000000000+INSERT Temperature_temper,host=drouard.eu value=19.30 1512644404000000000
 </code> </code>
   * En mode **HTTP API** (C'est à la mode... et et c'est pratique aussi) via ''curl''   * En mode **HTTP API** (C'est à la mode... et et c'est pratique aussi) via ''curl''
 <code bash> <code bash>
-curl -i -XPOST -u USERNAME:PASSWORD "http://localhost:8086/write?db=db_drouard&precision=ns" --data-binary 'Temperature_temperhum,host=drouard.eu value=20.75 1512399001000000000'+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'
 </code> </code>
  
 Enfin, on vérifie la correction Enfin, on vérifie la correction
 <code bash> <code bash>
-> SELECT * FROM Temperature_temperhum WHERE time >= '2017-12-04T14:44:01Z' AND time <= '2017-12-04T14:56:01Z+> SELECT * FROM Temperature_temper WHERE time >= '2017-12-07T10:54:04Z' AND time <= '2017-12-07T11:06:04Z
-name: Temperature_temperhum +name: Temperature_temper 
-time                 host       value +time                host       value 
-----                 ----       ----- +----                ----       ----- 
-2017-12-04T14:45:03Z drouard.eu 20.78 +1512644101000000000 drouard.eu 19.29 
-2017-12-04T14:50:01Z drouard.eu 20.75 +1512644404000000000 drouard.eu 19.3 
-2017-12-04T14:55:04Z drouard.eu 20.72+1512644701000000000 drouard.eu 19.31
 </code> </code>
 +
 +
 +=== Méthode (moins) subtile ===
 +<WRAP center round info>
 +**Contexte : **\\
 +J'ai un ''MEASUREMENT'' que je dois renommer dans les lesquels, j'ai eu des ''TAG'' ou des 
 +''FIELD'' crée à tord, avec certains ''TAG'' que je vais devoir fusionner :
 +  * Nom de la base InfluxDB : ''influxdb''
 +  * La ''SERIE'' est stockée dans la ''MEASUREMENT'' **''Temperature_temper''**
 +  * Éléments à corriger  :
 +    * Le nom du ''MEASUREMENT'' **''Temperature_temper''** devient **''nagios_temper''**
 +    * Le ''TAG'' **''perfdata''** doit être supprimé
 +    * Les ''TAG'' **''host''** et **''host_1''** doivent fusionner pour devenir **''host''**
 +
 +La structure du ''MEASUREMENT'' étant :
 +<code>
 +name: Temperature_temper
 +time                host       host_1     perfdata    value
 +----                ----       ------     --------    -----
 +1512659404000000000 drouard.eu                        20.06
 +1512659702000000000 drouard.eu                        20.06
 +1512660004000000000 drouard.eu                        20.06
 +...
 +1541081404000000000            drouard.eu Temperature 20.12
 +1541081703000000000            drouard.eu Temperature 20.12
 +1541082004000000000            drouard.eu Temperature 20.12
 +...
 +</code>
 +</WRAP>
 +
 +On commence par exporter les données
 +<code bash>
 +influx -database 'influxdb' -username '<USER>' -password '' -execute "SELECT * FROM Temperature_temper" > /tmp/export_Temperature_temper.txt
 +</code>
 +
 +Ensuite je supprime les entêtes (les 3 premières lignes)
 +<code bash>
 +sed -i '1,3d' /tmp/export_Temperature_temper.txt
 +</code>
 +
 +Je supprime les données contenu dans le ''TAG'' **''perfdata''** (cela reviendra à supprimer la colonne par la suite)
 +<code>
 +sed -i 's/ Temperature//g' /tmp/export_Temperature_temper.txt
 +</code>
 +
 +Ensuite, je formate avec ''awk'' le fichier à injecter dans la base InfluxDB, pour rappel, la syntaxe générique d'insertion de donnée dans InfluxDB (Docs de référence sur [[https://docs.influxdata.com]] : [[https://docs.influxdata.com/influxdb/v1.6/introduction/getting_started/#writing-and-exploring-data|Writing and exploring data]] et [[https://docs.influxdata.com/influxdb/v1.6/write_protocols/line_protocol_reference/|Line Protocol]]) :
 +
 +<code bash>
 +<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
 +</code>
 +
 +<code bash>
 +awk '{print "nagios_temper,host="$2" value="$3" "$1}' /tmp/export_Temperature_temper.txt | head -5
 +</code>
 +
 +Si le format est correct, je génère le fichier d'import (c'est ici que l'on définit le nouveau ''MEASUREMENT'')
 +<code bash>
 +awk '{print "nagios_temper,host="$2" value="$3" "$1}' /tmp/export_Temperature_temper.txt > /tmp/import_Temperature_temper.txt
 +</code>
 +
 +<WRAP center round tip>
 +On aurait pu tout à fait manipuler les données manuellement dans un éditeur de texte (vim, notepad++, etc.) ou dans un tableur tel que LibreOffice au format CSV... Mais ce n'est pas forcément toujours plus simple et dépend du nombre et du type de modification ;-)
 +</WRAP>
 +
 +
 +Et je l'importe avec ''curl'' dans la base de données InfluxDB
 +<code bash>
 +curl -i -XPOST -u USERNAME:PASSWORD "http://localhost:8086/write?db=db_drouard&precision=ns" --data-binary @/tmp/import_Temperature_temper.txt
 +</code>
 +
 +L'import est complet si curl nous retourne le **code HTTP 204**
 +<code>
 +HTTP/1.1 100 Continue
 +
 +HTTP/1.1 204 No Content
 +Content-Type: application/json
 +Request-Id: 7099242b-dde8-11e8-9845-000000000000
 +X-Influxdb-Build: OSS
 +X-Influxdb-Version: 1.x.x
 +X-Request-Id: 7099242b-dde8-11e8-9845-000000000000
 +Date: Thu, 01 Nov 2018 15:11:45 GMT
 +</code>
 +
 +
 +==== Copier un MEASUREMENT ====
 +On utilise la commande ''SELECT * INTO ...'' (La subtilité étant le paramètre **''GROUP BY *''** qui permet de garder les ''TAG'' du ''MEASUREMENT'')
 +<code bash>
 +SELECT * INTO openweathermapNEW FROM openweathermap GROUP BY *
 +</code>
 +
 +
 +==== Supprimer un TAG / FIELD d'un MEASUREMENT ====
 +On reprend la copie d'un MEASUREMENT mais on définit les ''FIELD'' a copier dans le ''SELECT'' et les ''TAG'' dans le ''GROUP BY''.
 +<code bash>
 +SELECT time,main_humidity,main_temp INTO openweathermapNEW FROM openweathermap GROUP BY host
 +</code>
 +
 +On surprime l'ancien ''MEASUREMENT''
 +<code bash>
 +DROP MEASUREMENT openweathermap
 +</code>
 +
 +Et on recopie intégralement le nouveau MEASUREMENT avec l'ancien nom
 +<code bash>
 +SELECT * INTO openweathermap FROM openweathermapNEW GROUP BY *
 +</code>
 +
 +
 +
pub_zone/linux/stack_tig.1512654020.txt.gz · Dernière modification : 13:40 07/12/2017 de nimbus