TP2 ready

This commit is contained in:
nemunaire 2016-09-15 04:27:59 +02:00 committed by Pierre-Olivier Mercier
parent f0a7e085fe
commit 5fa883f6ae
8 changed files with 184 additions and 108 deletions

View file

@ -1,13 +1,16 @@
SOURCES = tutorial.md installation.md what.md first.md supervisor.md goodpractices.md compose.md project.md SOURCES = tutorial.md installation.md what.md first.md supervisor.md goodpractices.md compose.md project.md
TEMPLATE = ../../template.tex
PANDOCOPTS = --latex-engine=xelatex \ PANDOCOPTS = --latex-engine=xelatex \
--standalone \ --standalone \
--normalize \ --normalize \
--number-sections \ --number-sections \
-M lang=frenchb \ --smart \
-M lang=french \
-M fontsize=12pt \ -M fontsize=12pt \
-M papersize=a4paper \ -M papersize=a4paper \
--template=${TEMPLATE} -M mainfont="Linux Libertine O" \
-M monofont="Inconsolata" \
-M sansfont="Linux Biolinum O" \
--include-in-header=../header.tex
all: tutorial.pdf all: tutorial.pdf

View file

@ -3,15 +3,14 @@
# Compose # Compose
Avec notre conteneur utilisant `supervisor`, nous ne respectons pas Avec notre conteneur utilisant `supervisor`, nous ne respectons pas
bien cette dernière bonne pratique d'un seul processus par conteneur cette dernière bonne pratique d'un seul processus par conteneur :-(
:-(
L'intérêt est de permettre à chaque conteneur d'effectuer une tâche L'intérêt est de permettre à chaque conteneur d'effectuer une tâche
générique, de manière à pouvoir être réutilisé pour d'autres projets simple et générique, de manière à pouvoir être réutilisé pour d'autres
dans le futur. Par exemple, notre conteneur InfluxDB pourra être projets dans le futur. Par exemple, notre conteneur InfluxDB pourra
utilisé pour stocker des relevés de métriques systèmes ou des logs. être utilisé pour stocker des relevés de métriques d'autres systèmes
Chronograf peut être connecté à d'autres serveurs afin de corréler les ou des logs. Chronograf peut être connecté à d'autres serveurs afin
métriques, ... de corréler les métriques, ...
## Séparer le `Dockerfile` ## Séparer le `Dockerfile`
@ -23,22 +22,19 @@ Il va vous falloir créer deux dossiers distincts, il en faut un par
`Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le `Dockerfile` : réutilisez l'image `influxdb` créée précédemment et créez le
dossier pour l'image `chronograf`. dossier pour l'image `chronograf`.
Profitez en pour rajouter les Data Volume Container, si vous ne l'avez
pas fait dans la partie précédente !
\vspace{1em} \vspace{1em}
Pour tester la bonne marche de vos conteneurs, vous pouvez le lancer votre Pour tester la bonne marche de vos conteneurs, vous pouvez le lancer votre
conteneur chronograf avec la commande suivante (en considérant que votre conteneur chronograf avec la commande suivante (en considérant que votre
conteneur influxdb de la première partie est toujours lancé). conteneur influxdb de la première partie est toujours lancé).
``` ```shell
docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf docker run --rm --link YOUR_INFLUX_CNTR_NAME:influxdb chronograf
``` ```
Remplacez `YOUR_INFLUX_CNTR_NAME` par le nom du conteneur qui fait tourner Remplacez `YOUR_INFLUX_CNTR_NAME` par le nom du conteneur qui fait tourner
votre influxdb. En créant ce lien, `chronograf` sera capable de contacter une votre influxdb. En créant ce lien, `chronograf` sera capable de contacter une
machine `influxdb` (la partie après les `:`). machine nommée `influxdb` (indiqué par la partie du lien après les `:`).
### Visualiser les données dans `chronograf` ### Visualiser les données dans `chronograf`
@ -51,7 +47,7 @@ Après avoir ajouté le serveur (en remplaçant `localhost` proposé par défaut
`influxdb` issue du *link*), ajouter deux visualisations avec les requêtes `influxdb` issue du *link*), ajouter deux visualisations avec les requêtes
suivantes : suivantes :
``` ```sql
SELECT used, available, cached FROM mem WHERE tmpltime() SELECT used, available, cached FROM mem WHERE tmpltime()
SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu SELECT mean(usage_idle) FROM cpu WHERE tmpltime() GROUP BY time(20s), cpu
``` ```
@ -67,7 +63,7 @@ conteneurs, définissez à la racine de votre projet un fichier
`docker-compose.yml` qui contiendra les méthodes de construction et `docker-compose.yml` qui contiendra les méthodes de construction et
les paramètres d'exécution. les paramètres d'exécution.
``` ```yaml
version: '2' version: '2'
services: services:
influxdb: influxdb:
@ -86,9 +82,7 @@ services:
Ce fichier est un condensé des options que vous passez habituellement Ce fichier est un condensé des options que vous passez habituellement
au `docker run`. au `docker run`.
L'exemple ci-dessus est à adapter largement, consultez ### `version`
<http://docs.docker.com/compose/compose-file/> pour une liste exhaustive des
options que vous pouvez utiliser.
Notez toutefois la présence d'une ligne `version` ; il ne s'agit pas de la Notez toutefois la présence d'une ligne `version` ; il ne s'agit pas de la
version de vos conteneurs, mais de la version du format de fichier version de vos conteneurs, mais de la version du format de fichier
@ -96,14 +90,108 @@ docker-compose qui sera utilisé. Sans indication de version, la version
originale sera utilisée. originale sera utilisée.
Une fois que votre `docker-compose.yml` sera prêt, lancez tout d'abord ### `services`
`docker-compose build` pour commencer la phase de build de tous les
conteneurs listés dans le fichier. Cette section énumère la liste des services (ou conteneurs) qui seront gérés
par `docker-compose`.
Il peuvent dépendre d'une image à construire localement, dans ce cas ils auront
un fils `build`. Ou ils peuvent utiliser une image déjà existante, dans ce cas
ils auront un fils `image`.
Les autres fils sont les paramètres classiques que l'on va passer à `docker
run`.
### `volumes`
Cette section est le pendant de la commandes `docker volume`.
L'idée est d'éviter de créer des *Data Volume Container* qui ont une partie de
système de fichiers inutile, et de ne garder que l'idée d'emplacement servant
pour du stockage persistant.
On les déclare simplement en leur donnant un nom et un driver comme suit :
```yaml
volumes:
mysql-data:
driver: local
```
Leur utilisation est identique à un *Data Volume Container* : on référence le
nom ainsi que l'emplacement à partager :
```yaml
[...]
mysql:
[...]
volumes:
- mysql-data:/var/lib/mysql
```
### `network`
Cette section est le pendant de la commandes `docker network`.
Par défaut, Docker relie tous les conteneurs sur un bridge et fait du NAT pour
que les conteneur puisse accéder à l'Internet. Mais ce n'est pas le seul mode
possible !
De la même manière que pour les `volumes`, cette section déclare les réseaux
qui pourront être utilisés par les `services`. On pourrait donc avoir :
```yaml
networks:
knotdns-slave-net:
driver: bridge
```
#### Driver `host`
Le driver `host` réutilise la pile réseau de la machine hôte. Le conteneur
pourra donc directement accéder au réseau, sans NAT et sans redirection de
port. Les ports alloués par le conteneur ne devront pas entrer en conflits avec
les ports ouverts par la machine hôte.
#### Driver `null`
Avec le driver `null`, la pile réseau est recréée et aucune interface (autre
que l'interface de loopback) n'est présente. Le conteneur ne peut donc pas
accéder à Internet, ni aux autres conteneur, ...
Lorsque l'on exécute un conteneur qui n'a pas besoin d'accéder au réseau, c'est
le driver à utiliser. Par exemple pour un conteneur dont le but est de vérifier
un backup de base de données.
#### Driver `bridge`
Le driver `bridge` crée un nouveau bridge qui sera partagée entre tous les
conteneurs qui la référencent.
Avec cette configuration, les conteneurs ont accès à une résolution DNS des
noms de conteneurs qui partagent leur bridge. Ainsi, sans avoir à utiliser la
fonctionnalité de `link` au moment du `run`, il est possible de se retrouvé
lié, même après que l'on ait démarré. La résolution se fera dynamiquement.
### Utiliser le `docker-compose.yml`
Consultez <http://docs.docker.com/compose/compose-file/> pour une liste
exhaustive des options que vous pouvez utiliser.
Une fois que votre `docker-compose.yml` est prêt, lancez tout d'abord
`docker-compose build` pour commencer la phase de build de tous les conteneurs
listés dans le fichier.
Une fois le build terminé, vous pouvez lancer la commande suivante et admirer Une fois le build terminé, vous pouvez lancer la commande suivante et admirer
le résultat : le résultat :
``` ```shell
docker-compose up docker-compose up
``` ```

View file

@ -4,23 +4,25 @@ Premières étapes
================ ================
Dans un premier temps, nous allons créer une image Docker comme si l'on Dans un premier temps, nous allons créer une image Docker comme si l'on
réalisait une installation sur une machine classique : en suivant une réalisait une installation sur une machine classique : en suivant une recette,
recette. La machine (notre première image Docker) contiendra tout le nécessaire sans trop se préoccuper des fonctionnalitées que propose Docker.
pour faire fonctionner notre service.
La machine (notre première image Docker) contiendra tout le nécessaire pour
faire fonctionner notre service de monitoring.
## Les caches ## Les caches
Nous avons vu que chaque instruction de notre `Dockerfile` génère une Nous avons vu que chaque instruction de notre `Dockerfile` génère une
couche. Chaque couche sert de cache d'une construction de conteneur à couche. Chaque couche sert de cache d'une construction d'image à
l'autre. Ainsi, lorsque vous modifiez une instruction dans votre `Dockerfile`, l'autre. Ainsi, lorsque vous modifiez une instruction dans votre `Dockerfile`,
les instructions précédentes ne sont pas réexécutées mais sont ressorties du les instructions précédentes ne sont pas réexécutées mais sont ressorties du
cache. cache.
Le cache se base principalement sur le contenu de chaque instruction dans le Le cache se base principalement sur le contenu de chaque instruction du
`Dockerfile` (pour les `COPY` et `ADD`, il va aussi regarder la date de `Dockerfile` (pour les `COPY` et `ADD`, il va aussi regarder la date de
dernière modification de fichier copié ou ajouté). Donc tant qu'une instruction dernière modification de fichier à copier ou à ajouter). Donc tant qu'une
n'est pas modifiée dans le `Dockerfile`, le cache sera utilisé. instruction n'est pas modifiée dans le `Dockerfile`, le cache sera utilisé.
Il est possible de ne pas utiliser le cache et de relancer toutes les étapes du Il est possible de ne pas utiliser le cache et de relancer toutes les étapes du
`Dockerfile` en ajoutant l'option `--no-cache` au moment du `docker build`. `Dockerfile` en ajoutant l'option `--no-cache` au moment du `docker build`.
@ -29,27 +31,25 @@ Les couches du cache peuvent être partagées entre plusieurs conteneur,
c'est ainsi que vous pouvez partager facilement une plus grosse partie c'est ainsi que vous pouvez partager facilement une plus grosse partie
du système de fichiers. du système de fichiers.
\vspace{1.5em} Pour profiter du cache, on va placer de préférences les étapes les plus
génériques (qui seraient les plus susceptibles d'apparaître dans d'autres
images), en haut du `Dockerfile`.
Pour profiter du cache, il faut donc placer les étapes les plus génériques (qui Commençons donc notre `Dockerfile` : choisissez une image de base pour remplir
seraient susceptibles d'apparaître dans plusieurs conteneur), en haut du votre `FROM`, et indiquez votre nom avec l'instruction `MAINTAINER` (pour
`Dockerfile`. indiquez que c'est vous qui maintenez ce conteneur, si des utilisateurs ont besoin
de vous avertir pour le mettre à jour par exemple).
Commençons donc notre `Dockerfile` : choisissez une image de base pour
votre `FROM`, et indiquez votre nom avec l'instruction `MAINTAINER`,
pour indiquez que c'est vous qui maintenez ce conteneur (si d'autres
gens ont besoin de vous avertir pour le mettre à jour par exemple).
## `RUN` ou script ? ## `RUN` ou script ?
### InfluxDB ### InfluxDB
Ensuite vient l'installation d'InfluxDB. Le paquet n'est pas disponible dans Ensuite vient la suite d'instructions pour installer d'InfluxDB. Le paquet
les dépôts. La n'est pas disponible dans les dépôts. La
[https://docs.influxdata.com/influxdb/v1.0/introduction/installation/#ubuntu-debian](procédure [procédure décrite du site](https://docs.influxdata.com/influxdb/v1.0/introduction/installation/#ubuntu-debian)
décrite sur le site) incite à télécharger le paquet mis à disposition puis à incite à télécharger le paquet mis à disposition puis à l'installer via `dpkg
l'installer via `dpkg -i`. -i`.
Deux solutions s'offrent à nous : Deux solutions s'offrent à nous :
@ -59,33 +59,34 @@ Deux solutions s'offrent à nous :
La copie étant définitive (supprimer le fichier ne le supprimera pas des La copie étant définitive (supprimer le fichier ne le supprimera pas des
couches où il a pu exister), on préférera la seconde méthode, malgré que `wget` couches où il a pu exister), on préférera la seconde méthode, malgré que `wget`
restera en déchet. La première méthode aura plus sa place dans un dépôt où les restera en déchet. La première méthode aura plus sa place dans un dépôt de
binaires auront été préalablement compilés, il ne restera plus qu'à les copier projet où les binaires auront été préalablement compilés, il ne restera plus
dans le conteneur au bon emplacement. qu'à les copier dans le conteneur au bon emplacement.
Écrivons une commande `RUN` qui va télécharger la dernière version Écrivons une commande `RUN` qui va télécharger la dernière version
d'InfluxDB, qui va l'installer et supprimer le fichier. d'InfluxDB, qui va l'installer et supprimer le fichier.
\vspace{1em} \vspace{1em}
À ce stade, nous pouvons déjà terminer le conteneur et tester qu'InfluxDB est À ce stade, nous pouvons déjà terminer le conteneur (`EXPOSE`, `CMD`, ...) et
bien utilisable : `EXPOSE`, `CMD`, ... [tester](http://localhost:8083) qu'InfluxDB est bien utilisable.
Il est possible que vous ayez à écraser le fichier de configuration via un Il est possible que vous ayez à écraser le fichier de configuration via un
`COPY` (ou de manière plus maligne en utilisant `--volume` au moment du `docker `COPY` (ou de manière plus maligne en utilisant `--volume` au moment du `docker
run`, cela fonctionne pas qu'avec les dossiers). Ou peut-être ferez-vous un run`, cela ne fonctionne pas qu'avec les dossiers !). Ou peut-être ferez-vous
`ENTRYPOINT` ? un `ENTRYPOINT` ?
### Telegraf ### `telegraf`
Telegraf est un programme qui permet de collecter des métriques systèmes. Il `telegraf` est un programme qui permet de collecter des métriques systèmes. Il
travaille de paire avec InfluxDB pour stocker les valeurs. travaille de paire avec InfluxDB, qu'il utilise pour stocker les valeurs
relevées.
Vous pouvez monitorer les métriques de n'importe quelle machine, simplement en Vous pouvez monitorer les métriques de n'importe quelle machine, simplement en
installant *Telegraf* et en lui indiquant l'emplacement de son serveur installant `telegraf` et en lui indiquant l'emplacement de son serveur
InfluxDB. Nous allons installer *telegraf* sur notre machine à l'aide de la InfluxDB. Nous allons installer `telegraf` sur notre machine à l'aide de la
[https://docs.influxdata.com/telegraf/v1.0/introduction/installation/](documentation). [documentation](https://docs.influxdata.com/telegraf/v1.0/introduction/installation/).
Ces quelques lignes devraient suffir à lancer la collecte, à condition que Ces quelques lignes devraient suffir à lancer la collecte, à condition que
votre InfluxDB écoute sur le port 8086 local : votre InfluxDB écoute sur le port 8086 local :
@ -97,10 +98,10 @@ tar xf telegraf-${TELEGRAF_VERSION}_linux_amd64.tar.gz
TELEGRAF_CONFIG_PATH=./telegraf/etc/telegraf/telegraf.conf ./telegraf/usr/bin/telegraf TELEGRAF_CONFIG_PATH=./telegraf/etc/telegraf/telegraf.conf ./telegraf/usr/bin/telegraf
``` ```
Rendez-vous ensuite dans [http://localhost:8083/](l'interface d'InfluxDB) pour Rendez-vous ensuite dans [l'interface d'InfluxDB](http://localhost:8083/) pour
voir si la collecte se passe bien. voir si la collecte se passe bien.
Dans l'interface sélectionnez la base *telegraf* puis explorez les valeurs : Dans l'interface sélectionnez la base `telegraf` puis explorez les valeurs :
```sql ```sql
SHOW MEASUREMENTS SHOW MEASUREMENTS
@ -113,5 +114,15 @@ Laissons tourner `telegraf` afin de constituer un petit historique de valeurs.
## Rendu ## Rendu
Avant de passer à la suite, placez votre `Dockerfile` dans un dossier ### Questions
`influxdb` (pour le moment il ne contient rien d'autre !).
1. Dans quel langage est écrit `telegraf` ?
1. Quelle(s) particularité(s) de ce langage permet de se passer de la variable
`LD_LIBRARY_PATH` au lancement de `telegraf`, alors qu'on ne l'a pas
installé ?
### Éléments à rendre
Avant de passer à la suite, placez votre `Dockerfile` et les éventuels fichiers
annexes dans un dossier `influxdb`.

View file

@ -3,12 +3,12 @@
Retour sur les bonnes pratiques Retour sur les bonnes pratiques
=============================== ===============================
Pour chacune des bonnes pratiques ci-dessous, vérifiez que vous les respectez Pour chaque bonne pratique ci-dessous, vérifiez que vous la respectez
bien, faites les modifications nécessaires. bien, faites les modifications nécessaires.
## Utilisez le fichier `.dockerignore` ## Utilisez le fichier `.dockerignore`
Dans la plupart des cas, vos Dockerfile seront dans des dossiers contenant Dans la plupart des cas, vos `Dockerfile` seront dans des dossiers contenant
beaucoup de fichiers qui ne sont pas nécessaire à la construction de votre beaucoup de fichiers qui ne sont pas nécessaire à la construction de votre
conteneur (par exemple, vous pouvez avoir un `Dockerfile` placé à la racine conteneur (par exemple, vous pouvez avoir un `Dockerfile` placé à la racine
d'un dépôt git : il va avoir besoin des binaires compilés, mais pas des d'un dépôt git : il va avoir besoin des binaires compilés, mais pas des
@ -159,7 +159,7 @@ CMD ["-g daemon off;"]
(rappelez-vous, il doit être éphémère !). Par exemple, le `Dockerfile` pour (rappelez-vous, il doit être éphémère !). Par exemple, le `Dockerfile` pour
l'image de PostgreSQL possède cet entrypoint : l'image de PostgreSQL possède cet entrypoint :
``` ```shell
#!/bin/bash #!/bin/bash
set -e set -e

View file

@ -1,38 +1,11 @@
\newpage \newpage
# Installation Installation
============
## Docker
Ce TP requiert la dernière version de Docker (1.12). Commencez par vérifier que
vous avez bien cette version :
```
42sh$ docker version
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.7
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.7
Git commit: 23cf638
Built:
OS/Arch: linux/amd64
```
Si vous n'avez pas une version assez récente, consultez le premier TP pour
savoir comment installer Docker.
## `docker-compose` ## `docker-compose`
Nous allons également avoir besoin de `docker-compose`. Pour ce TP, nous allons avoir besoin de `docker-compose`.
Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit Ce projet ne bénéficie pas d'une intégration au sein du projet Docker et doit
être téléchargé séparément, car originellement, le projet était développé par être téléchargé séparément, car originellement, le projet était développé par
@ -50,7 +23,7 @@ fonctionnera avec la version de Docker qu'ils fournissent.
L'équipe en charge de Docker compose met à disposition un exécutable contenant L'équipe en charge de Docker compose met à disposition un exécutable contenant
tous les scripts. Nous pouvons l'installer en suivant la procédure suivante : tous les scripts. Nous pouvons l'installer en suivant la procédure suivante :
``` ```shell
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-Linux-x86_64 \ curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-Linux-x86_64 \
> /usr/bin/docker-compose > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose chmod +x /usr/bin/docker-compose

View file

@ -9,7 +9,7 @@ Amusez-vous à la piscine, il n'y a pas de projet en plus des exercices fait en
TP ! TP !
En complément de ce TP, vous pouvez jetez un œil à En complément de ce TP, vous pouvez jetez un œil à
[https://docs.docker.com/engine/swarm](Docker Swarm) ! [Docker Swarm](https://docs.docker.com/engine/swarm) !
## Modalité de rendu ## Modalité de rendu

View file

@ -7,7 +7,7 @@ Notre système de monitoring commence enfin à ressembler à quelque chose. Mais
ce serait tellement plus pratique de voir tous ces tableaux de nombres sous ce serait tellement plus pratique de voir tous ces tableaux de nombres sous
forme de graphiques ! forme de graphiques !
Nous allons pour cela ajouter `chronograf` dans notre conteneur. Nous allons pour cela ajouter `chronograf` dans notre image.
Avant de modifier votre `Dockerfile`, créez un nouveau dossier de rendu : Avant de modifier votre `Dockerfile`, créez un nouveau dossier de rendu :
`mymonitoring`, dans lequel vous recopierez l'état actuel de notre image `mymonitoring`, dans lequel vous recopierez l'état actuel de notre image
@ -20,14 +20,13 @@ Commençons par compléter la commande d'installation existante pour `influxdb`,
afin d'installer simultanément `chronograf`. afin d'installer simultanément `chronograf`.
La documentation de la procédure est disponible La documentation de la procédure est disponible
[https://docs.influxdata.com/chronograf/v1.0/introduction/installation/](à [à cette adresse](https://docs.influxdata.com/chronograf/v1.0/introduction/installation/).
cette adresse).
## Script d'init ## Script d'init
Lors du dernier TP, nous avons vu que les conteneurs étaient détruits dès que Lors du dernier TP, nous avons vu que les conteneurs s'arrêtaient dès que le
le premier processus du conteneur (celui qui a le PID 1, à la place d'`init`) premier processus du conteneur (celui qui a le PID 1, à la place d'`init`)
terminait son exécution, quelque soit le statut de ses éventuels fils. terminait son exécution, quelque soit le statut de ses éventuels fils.
Pour lancer tous nos daemons, nous avons donc besoin d'écrire un script qui Pour lancer tous nos daemons, nous avons donc besoin d'écrire un script qui
@ -40,7 +39,7 @@ lance puis attend que les deux deamons aient terminés de s'exécuter.
Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le Pour vérifier que votre conteneur fonctionne correctement, vous pouvez le
lancer : lancer :
``` ```shell
docker run --rm -p 10000:10000 mymonitoring docker run --rm -p 10000:10000 mymonitoring
``` ```
@ -61,7 +60,7 @@ conteneur qui délivre des pages web), il va être possible de redémarrer le
conteneur automatiquement grâce à la *restart policy* que l'on peut définir au conteneur automatiquement grâce à la *restart policy* que l'on peut définir au
moment du `docker run` : moment du `docker run` :
``` ```shell
docker run -d -p 80:80 --restart=on-failure nginx docker run -d -p 80:80 --restart=on-failure nginx
``` ```

View file

@ -1,3 +1,5 @@
\newpage
But du TP But du TP
========= =========
@ -7,10 +9,10 @@ Le résultat attendu d'ici la fin du TP, est un groupe de conteneurs
indépendants les uns des autres, réutilisables en fonction des besoins. indépendants les uns des autres, réutilisables en fonction des besoins.
Nous collecterons les données d'utilisation de votre machine avec Nous collecterons les données d'utilisation de votre machine avec
[https://www.influxdata.com/time-series-platform/telegraf/](Telegraf). Ces [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/). Ces
données seront envoyés vers données seront envoyés vers
[https://www.influxdata.com/time-series-platform/influxdb/](InfluxDB), puis [InfluxDB](https://www.influxdata.com/time-series-platform/influxdb/), puis
elles seront affichées sous forme de graphique dans elles seront affichées sous forme de graphique grâce à
[https://www.influxdata.com/time-series-platform/chronograf/](Chronograf). [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/).
![Dashboard de l'utilisation CPU et mémoire sur Chronograf](chronograf.png) ![Dashboard de l'utilisation CPU et mémoire sur Chronograf](chronograf.png)