Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
serveurs:installation:web-srv:docker-grafana [2023/05/28 09:50] – [Configurer Grafana] jpmilcent | serveurs:installation:web-srv:docker-grafana [2024/08/02 13:36] (Version actuelle) – [InfluxDB v2 : connection au shell et requête de config] jpmilcent |
---|
* Dans Influxdb v2, la politique de rétention est remplacée par les "buckets". La politique de rétention de "telegraf" est donc défini lors du setup d'Influxdb via des variables d'environnement : | * Dans Influxdb v2, la politique de rétention est remplacée par les "buckets". La politique de rétention de "telegraf" est donc défini lors du setup d'Influxdb via des variables d'environnement : |
* ''INFLUXDB2_INIT_BUCKET=telegraf'' | * ''INFLUXDB2_INIT_BUCKET=telegraf'' |
* ''INFLUXDB2_INIT_RETENTION=365d'' : 1 an. | * ''INFLUXDB2_INIT_RETENTION=90d'' : 3 mois. |
| |
| |
* Pour définir la période de rétention du bucket telegraf : | * Pour définir la période de rétention du bucket telegraf : |
* lister les buckets pour récupérer l'id du bucket "telegraf" : <code bash>influx bucket list</code> | * lister les buckets pour récupérer l'id du bucket "telegraf" : <code bash>influx bucket list</code> |
* définir la période de rétention à 1 an : <code bash>influx bucket update -i <telgraf-bucket-id> -r 365d</code> | * définir la période de rétention à 7 jours : <code bash>influx bucket update -i <telgraf-bucket-id> -r 7d</code> |
* Créer un mapping entre le bucket "telegraf" (v2) et la database/retention policy "telegragf" (v1) pour y accéder avec InfluxQL depuis Grafana : <code bash>influx v1 dbrp create --db telegraf --rp telegraf --bucket-id <telgraf-bucket-id> --default</code> | * Créer un mapping entre le bucket "telegraf" (v2) et la database/retention policy "telegraf" (v1) pour y accéder avec InfluxQL depuis Grafana : <code bash>influx v1 dbrp create --db telegraf --rp telegraf --bucket-id <telgraf-bucket-id> --default</code> |
| |
| |
==== Monitorer InfluxDB v2 ==== | |
* Pour monitorer InfluxDB, il est nécessaire de modifier le fichier de configuration du Telegraf présent sur le serveur hébergeant la base InfluxDB : <code properties> | |
[[outputs.influxdb_v2]] | |
urls = ["http://monitor-influxdb:8086"] | |
## Token for authentication. | |
token = "${INFLUXDB2_TELEGRAF_TOKEN}" | |
## Organization is the name of the organization you wish to write to. | |
organization = "${INFLUXDB2_INIT_ORG}" | |
## Destination bucket to write into. | |
bucket = "${INFLUXDB2_INIT_BUCKET}" | |
</code> | |
* Il est aussi recommander de désactiver le monitoring dans la base //_internal// d'InfluxDB en modifiant comme suit le paramètre du fichier de configuration d'InfluxDB : <code properties> | |
[monitor] | |
store-enabled = false | |
</code> | |
| |
===== Notes sur Telegraf ===== | |
* Pour tester son fonctionnement : ''<nowiki> docker exec -it monitor-telegraf telegraf --test </nowiki>'' | |
* Tester le plugin //Nginx// : ''<nowiki> docker exec -it monitor-telegraf telegraf --input-filter nginx --test </nowiki>'' | |
===== Configurer Grafana ===== | ===== Configurer Grafana ===== |
* Se connecter à //Grafana// sur <nowiki>https://monitor.<domaine-sinp></nowiki> | * Se connecter à //Grafana// sur <nowiki>https://monitor.<domaine-sinp></nowiki> |
* Compléter le formulaire en laissant tout par défaut sauf : | * Compléter le formulaire en laissant tout par défaut sauf : |
* //Name// : InfluxDB (Flux) - Telegraf | * //Name// : InfluxDB (Flux) - Telegraf |
| * //Query Language// : Flux |
| * //HTTP// : |
| * //URL// : http://monitor-influxdb:8086 |
| * //InfluxDB Details// : |
| * //Organization// : silene |
| * //Token// : créer un nouveau Token intitulé "Grafana's token" avec l'interface d'InfluxDb (//Load Data// > //API Token//) en lecture seulement sur le bucket "telegraf" puis le saisir ici. |
| * //Default Bucket// : telegraf |
| * //Min time interval// : 10s |
| * Cliquer sur "Save and test" |
| * Répéter l'opération mais avec les infos suivante : |
| * //Name// : InfluxDB (InfluxQL) - Telegraf |
| * //Query Language// : InfluxQL |
* //HTTP// : | * //HTTP// : |
* //URL// : http://monitor-influxdb:8086 | * //URL// : http://monitor-influxdb:8086 |
* //Custom HTTP Headers// : | * //Custom HTTP Headers// : |
* Cliquer sur //Add header// pour InfluxDb v2 et ajouter un entête ''Authorisation'' avec pour valeur ''Token <grafana-api-tocken>''. | * Cliquer sur //Add header// pour InfluxDb v2 et ajouter un entête ''Authorisation'' avec pour valeur ''Token <grafana-api-tocken>''. |
* Pour obtenir la valeur de ''<grafana-api-tocken>'', connecter vous à l'interface d'InfluxDB v2 et générer un nouveau token (Data > Api Tockens > Generate API Token) en lecture seulement sur le bucket "telegraf". | * Pour obtenir la valeur de ''<grafana-api-tocken>'', connecter vous à l'interface d'InfluxDB v2 et générer un nouveau token si ce n'est pas déjà fait (Load Data > Api Tockens > Generate API Token) en lecture seulement sur le bucket "telegraf". |
* //InfluxDB Details// : | * //InfluxDB Details// : |
* //Database (ou bucket pour Influxdb2)// : telegraf | * //Database (= le bucket pour Influxdb2)// : telegraf |
* //User// : telegraf (pour Influxdb2, voir ci-dessus comment créer l'utilisateur telegraf via la ligne de commande) | * //User// : telegraf (pour Influxdb2, voir ci-dessus comment créer l'utilisateur telegraf via la ligne de commande) |
* //Password// : <mot-de-passe-de-telegraf> | * //Password// : <mot-de-passe-de-telegraf> |
* //Min time interval// : 10s | * //Min time interval// : 10s |
* Cliquer sur "Save and test" | * Cliquer sur "Save and test" |
* Répéter l'opération mais avec les infos différentes suivantes dans le formulaire : | * 🗑️Répéter l'opération mais avec les infos différentes suivantes dans le formulaire : |
* //Name// : InfluxDB - Internal | * //Name// : InfluxDB - Internal |
* //InfluxDB Details// : | * //InfluxDB Details// : |
* Sortir du container : ''exit'' | * Sortir du container : ''exit'' |
* Se placer dans le dossier contenant le fichier docker-compose.yml contenant le service de Grafana : '' cd ~/docker/monitor/ '' | * Se placer dans le dossier contenant le fichier docker-compose.yml contenant le service de Grafana : '' cd ~/docker/monitor/ '' |
* Relancer le de service : ''docker-compose restart monitor-grafana '' | * Relancer le de service : ''docker compose restart monitor-grafana '' |
* Vérifier sur l'interface de Grafana la présence du plugin. | * Vérifier sur l'interface de Grafana la présence du plugin. |
===== Notes sur la sauvegarde/restauration de la configuration de Grafana ===== | ===== Notes sur la sauvegarde/restauration de la configuration de Grafana ===== |
* **Notes** : afin de sauvegarder et restaurer la configuration de //Grafana// (dashboards, datasources, alert channels, folders), un script Python spécifique est disponible sous forme de Container Docker présent dans la stack "monitor.silene.eu". Le service a pour nom "//monitor-grafana-backup//" et se base sur l'image [[https://hub.docker.com/r/ysde/docker-grafana-backup-tool|ysde/docker-grafana-backup-tool]]. | * **Notes** : afin de sauvegarder et restaurer la configuration de //Grafana// (dashboards, datasources, alert channels, folders), un script Python spécifique est disponible sous forme de Container Docker présent dans la stack "monitor.silene.eu". Le service a pour nom "//monitor-grafana-backup//" et se base sur l'image [[https://hub.docker.com/r/ysde/docker-grafana-backup-tool|ysde/docker-grafana-backup-tool]]. |
* Par défaut, ce container n'est pas lancé. Il doit donc être lancer manuellement. | * Par défaut, ce container n'est pas lancé. Il doit donc être lancer manuellement. |
* Pour sauvegarder la configuration de //Grafana//, utiliser la commande : ''docker-compose run monitor-grafana-backup'' | * Il est nécessaire de définiri un ID utilisateur à 1337 pour le dossier qui stockera les sauvegardes : '' sudo chown 1337:root /home/admin/docker/monitor/grafana/backup '' |
* Les sauvegardes sont présentes sous forme de fichier //.tar.gz// dans le dossier ''/home/admin/docker/monitor.<domaine-sinp>/grafana/backup'' | * Pour sauvegarder la configuration de //Grafana//, utiliser la commande : ''docker compose run monitor-grafana-backup'' |
* Pour restaurer une sauvegarde, utiliser la commande : ''docker-compose run monitor-grafana-backup restore _OUTPUT_/<date>.tar.gz'' | * Les sauvegardes sont présentes sous forme de fichier //.tar.gz// dans le dossier ''/home/admin/docker/monitor/grafana/backup'' |
| * Pour restaurer une sauvegarde, utiliser la commande : ''docker compose run monitor-grafana-backup restore _OUTPUT_/<date>.tar.gz'' |
* Pour automatiser les sauvegardes, ajouter le fichier //cron// [[https://github.com/cbn-alpin/sinp-paca-srv/blob/master/web-srv/etc/cron.d/grafana|grafana]] dans le dossier ''/etc/cron.d'' | * Pour automatiser les sauvegardes, ajouter le fichier //cron// [[https://github.com/cbn-alpin/sinp-paca-srv/blob/master/web-srv/etc/cron.d/grafana|grafana]] dans le dossier ''/etc/cron.d'' |
* Pour réaliser une sauvegarde distante de la configuration de //Grafana//, installer le script //bkp2dbx// et s'assurer que le fichier ///etc/cron.d/bkp2dbx// contient bien une ligne réalisant la sauvegarde du dossier //backup// de //Grafana//. | * Pour réaliser une sauvegarde distante de la configuration de //Grafana//, assurer vous que le dossier ''/home/admin/'' est bien sauvegarder par Borg. |
* Pour fonctionner, il est nécessaire de générer un jeton d'API dans Grafana via le menu : "Configuration" > "API Keys" | * Pour fonctionner, il est nécessaire de générer un jeton d'API dans Grafana via le menu : "Configuration" > "API Keys" |
* Nom du jeton : "grafana-backup-tool" | * Nom du jeton : "grafana-backup-tool" |
* Rôle : "Admin" | * Rôle : "Admin" |
* Time to live : "5y" | * Time to live : "5y" |
* Copier ensuite, le jeton obtenu dans le fichier ///home/admin/docker/monitor.<domaine-sinp>/.env// en tant que valeur du paramètre //GRAFANA_TOKEN// | * Copier ensuite, le jeton obtenu dans le fichier ///home/admin/docker/monitor/.env// en tant que valeur du paramètre //GRAFANA_TOKEN// |
| |
===== Configuration des alertes de Grafana ===== | ===== Configuration des alertes de Grafana ===== |
* Les requêtes a utiliser pour les alertes ne peuvent pas utiliser de variables utilisateurs, il est donc nécessaire de mettre des valeurs en dur... | * Les requêtes a utiliser pour les alertes ne peuvent pas utiliser de variables utilisateurs, il est donc nécessaire de mettre des valeurs en dur... |
* Pour tester les requêtes, se connecter au shell d'InfluxDB comme indiqué ci-dessous. | * Remplacer ''<nowiki>$__interval</nowiki>'' par ''10s'' |
* Exemple de requête dans Grafana qui peut être testé au préalable dans le shell d'InfluxDB: <code sql> | |
SELECT mean(usage_user) as "user", mean(usage_system) as "system", mean(usage_softirq) as "softirq", mean(usage_steal) as "steal", mean(usage_nice) as "nice", mean(usage_irq) as "irq", mean(usage_iowait) as "iowait", mean(usage_guest) as "guest", mean(usage_guest_nice) as "guest_nice" FROM "cpu" WHERE "host" =~ /^sinp-paca-(db|web)$/ AND "cpu" = 'cpu-total' AND time > now() - 5m GROUP BY time($__interval), * | |
</code> | |
* Pour tester la requête précédente dans //InfluxDB//, remplacer ''<nowiki>$__interval</nowiki>'' par ''10s'' | |
* A priori, il est conseillé de ne pas mettre la valeur ''NoData'' pour le champ "**If no data or all values are null**" qnd on utilise une règle d'alerte utilisant **For**. Vous pouvez utiliser la valeur ''Keep Last State''. | * A priori, il est conseillé de ne pas mettre la valeur ''NoData'' pour le champ "**If no data or all values are null**" qnd on utilise une règle d'alerte utilisant **For**. Vous pouvez utiliser la valeur ''Keep Last State''. |
* Sur l'interface de //Grafana//, vous pouvez tester l'alerte en cliquant sur le bouton "Test rule" en bas de l'onglet "Alert" | * Sur l'interface de //Grafana//, vous pouvez construire les requêtes et tester l'alerte en cliquant sur le bouton "Preview". |
* Si tout se passe correctement, vous devez obtenir un objet pour chaque entrée de la clause SELECT qui contient par exemple : <code json>{"message": "Condition[0]: Eval: false, Metric: Alert, Value: 4.287"}</code> | * Exemples de requêtes d'alertes : |
* La valeur contient ''Eval: false'' qui indique que les condition ne sont pas réuni pour ce paramètre pour lancer l'alerte | * **cpu** : <code sql> |
* Ici '' Value: 4.287" '' correspond à la moyenne de la propriété ''usage_user'' | A : SELECT mean("usage_user") FROM "autogen"."cpu" WHERE $timeFilter GROUP BY time(10s), "host"::tag fill(null) |
* Autres exemples de requêtes d'alertes : | B : MEAN ; A ; DROP NON NUMERIC VALUE |
* **cpu** : <code sql>SELECT mean(usage_user) as "user", mean(usage_system) as "system", mean(usage_softirq) as "softirq", mean(usage_steal) as "steal", mean(usage_nice) as "nice", mean(usage_irq) as "irq", mean(usage_iowait) as "iowait", mean(usage_guest) as "guest", mean(usage_guest_nice) as "guest_nice" FROM "cpu" WHERE "host" =~ /^sinp-paca-(db|web)$/ AND "cpu" = 'cpu-total' AND time > now() - 5m GROUP BY time($__interval), *</code> | C : B IS ABOVE 50 |
* **Load** : <code sql>SELECT mean(load1) AS short, mean(load5) AS medium, mean(load15) AS long FROM "system" WHERE host =~ /^sinp-paca-(web|db)$/ AND time > now() - 5m GROUP BY time($__interval), * ORDER BY asc | </code> |
| * **Load** : <code sql> |
| A query : SELECT mean("load5") FROM "autogen"."system" WHERE $timeFilter GROUP BY time(10s) fill(null) |
| B reduce : MEAN ; A ; DROP NON NUMERIC VALUE |
| C threshold : B IS ABOVE 2,5 |
</code> | </code> |
* **Memory** pour //sinp-paca-web// : <code sql>SELECT mean(used) AS used FROM "mem" WHERE "host" = 'sinp-paca-web' AND time > now() - 5m GROUP BY time($__interval), host ORDER BY asc</code> | * **Memory** : <code sql> |
* **Memory** pour //sinp-paca-web// : <code sql>SELECT mean(used) AS used FROM "mem" WHERE "host" = 'sinp-paca-db' AND time > now() - 5m GROUP BY time($__interval), host ORDER BY asc</code> | A query : SELECT mean("available_percent") AS "mean_available_percent" FROM "autogen"."mem" WHERE $timeFilter GROUP BY time(10s), "host"::tag fill(null) |
* **Disk usage** pour //sinp-paca-web// : <code sql> | B reduce : MEAN ; A ; DROP NON NUMERIC VALUE |
SELECT mean(used) AS "used" FROM "disk" WHERE "host" = 'sinp-paca-web' AND path = '/' AND time > now() - 5m GROUP BY time($__interval), "host", "path" | C threshold : B IS BELOW 25 |
</code> | </code> |
* **Disk usage** pour //sinp-paca-db// : <code sql> | * **Disk usage** : <code sql> |
SELECT mean(used) AS "used" FROM "disk" WHERE "host" = 'sinp-paca-db' AND path = '/' AND time > now() - 5m GROUP BY time($__interval), "host", "path" | A query: SELECT mean("used_percent") FROM "autogen"."disk" WHERE $timeFilter GROUP BY time(1m), "host"::tag, "device"::tag fill(null) |
| B reduce : MAX ; A ; DROP NON NUMERIC VALUE |
| C threshold : B IS ABOVE 80 |
</code> | </code> |
| |