Docker Daemon

Supported OS Linux Mac OS

Remarque : le check Docker Daemon est toujours tenu à jour, mais fonctionne uniquement avec la version 5 de l’Agent.

Pour utiliser l'intégration Docker avec la version 6 de l'Agent, consultez la section sur l'Agent v6 ci-dessous.

Dashboard par défaut Docker

Présentation

Configurez ce check d’Agent pour obtenir des métriques du service Docker_daemon en temps réel pour :

  • Visualiser et surveiller les états de Docker_daemon
  • Être informé des failovers et des événements de Docker_daemon

Configuration

Installation

Pour recueillir des métriques Docker sur tous vos conteneurs, exécutez un Agent Datadog sur chaque host. Il existe deux façons d’exécuter l’Agent : directement sur chaque host, ou au sein d’un conteneur docker-dd-agent (conseillé).

Dans les deux cas, pour que le check Docker n’échoue pas, vos hosts requièrent l’activation de la gestion de mémoire cgroup. Consultez le référentiel docker-dd-agent pour savoir comment l’activer.

Installation sur un host

  1. Vérifiez que Docker est en cours d’exécution sur le host.
  2. Installez l’Agent comme décrit dans les instructions d’installation de l’Agent pour le système d’exploitation de votre host.
  3. Activez le carré d’intégration Docker dans l’application.
  4. Ajoutez l’utilisateur de l’Agent au groupe Docker : usermod -a -G docker dd-agent.
  5. Créez un fichier docker_daemon.yaml en copiant le fichier d’exemple dans le répertoire conf.d de l’Agent. Si vous avez effectué l’installation standard de Docker sur votre host, vous n’avez rien à changer pour faire fonctionner l’intégration.
  6. Pour activer d’autres intégrations, utilisez docker ps afin d’identifier les ports utilisés par les applications correspondantes. Commande Docker ps

Installation sur un conteneur

  1. Vérifiez que Docker est en cours d’exécution sur le host.

  2. Conformément aux instructions d’installation du conteneur Docker, exécutez ce qui suit :

     docker run -d --name dd-agent \
       -v /var/run/docker.sock:/var/run/docker.sock:ro \
       -v /proc/:/host/proc/:ro \
       -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
       -e API_KEY={VOTRE_CLÉ_API_DD} \
       datadog/docker-dd-agent:latest
    

Dans la commande ci-dessus, vous pouvez transmettre votre clé d’API à l’Agent Datadog à l’aide du flag de variable d’environnement -e de Docker. Le tableau ci-dessous répertorie d’autres variables disponibles :

VariableDescription
API_KEYConfigure votre clé d’API Datadog.
DD_HOSTNAMEDéfinit le hostname dans le fichier datadog.conf du conteneur de l’Agent. Si cette variable n’est pas définie, le conteneur de l’Agent utilise par défaut le champ Name (tel qu’indiqué par la commande docker info) en tant que hostname du conteneur de l’Agent.
DD_URLDéfinit l’URL du serveur entrant de Datadog où l’Agent envoie les données. Cette variable s’avère utile lorsque vous utilisez l’Agent en tant que proxy.
LOG_LEVELDéfinit le niveau de détail de la journalisation (CRITICAL, ERROR, WARNING, INFO, DEBUG). Par exemple, -e LOG_LEVEL=DEBUG définit la journalisation sur le mode de debugging.
TAGSDéfinit des tags de host en tant que chaîne délimitée par des virgules. Vous pouvez ajouter des tags simples et des tags clé/valeur sont disponibles. Par exemple : -e TAGS="tag-simple, clé-tag:valeur-tag".
EC2_TAGSCette fonctionnalité permet à l’Agent d’envoyer des requêtes et d’enregistrer des tags personnalisés à l’aide de l’API EC2 lors du démarrage. Pour l’activer, utilisez la commande -e EC2_TAGS=yes. Remarque : vous devez avoir associé un rôle IAM à l’instance pour bénéficier de cette fonctionnalité.
NON_LOCAL_TRAFFICCette fonctionnalité permet de transmettre des données StatsD à partir de n’importe quelle adresse IP externe. Pour l’activer, utilisez la commande -e NON_LOCAL_TRAFFIC=yes. Elle est utilisée pour transmettre les métriques depuis d’autres conteneurs ou systèmes. Consultez la configuration réseau pour en savoir plus.
PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASSWORDDéfinit les informations de configuration du proxy. Remarque : PROXY_PASSWORD est obligatoire pour la transmission d’un mot de passe d’authentification. Il ne peut pas être renommé. Pour en savoir plus, consultez la documentation relative au proxy de l’Agent.
SD_BACKEND, SD_CONFIG_BACKEND, SD_BACKEND_HOST, SD_BACKEND_PORT, SD_TEMPLATE_DIR, SD_CONSUL_TOKENActive et configure Autodiscovery. Pour en savoir plus, consultez le guide sur Autodiscovery.

Remarque : ajoutez --restart=unless-stopped si vous souhaitez limiter les redémarrages de votre Agent.

Exécuter le conteneur de l’Agent sur Amazon Linux

Pour exécuter le conteneur de l’Agent Datadog sur Amazon Linux, apportez les modifications suivantes au niveau du montage du volume cgroup :

docker run -d --name dd-agent \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -v /proc/:/host/proc/:ro \
  -v /cgroup/:/host/sys/fs/cgroup:ro \
  -e API_KEY={VOTRE CLÉ D'API} \
  datadog/docker-dd-agent:latest

Conteneur basé sur Alpine Linux

L’image Docker standard repose sur Debian Linux, mais depuis la version 5.7 de l’Agent Datadog, il existe une image basée sur Alpine Linux. L’image Alpine Linux est beaucoup plus petite que l’image traditionnelle Debian. Elle hérite également des conceptions axées sur la sécurité d’Alpine.

Pour utiliser l’image Alpine Linux, ajoutez -alpine au tag de version. Par exemple :

docker run -d --name dd-agent \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -v /proc/:/host/proc/:ro \
  -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
  -e API_KEY={VOTRE CLÉ D'API} \
  datadog/docker-dd-agent:latest-alpine

Contrôle de version de l’image

Depuis la version 5.5.0 de l’Agent Datadog, l’image Docker suit un nouveau modèle de contrôle de version. Il permet de valider les modifications apportées à l’image Docker de l’Agent Datadog tout en conservant la même version de l’Agent.

La version de l’image Docker est exprimée de la façon suivante : X.Y.Z. X correspond à la version majeure de l’image Docker, Y à la version mineure et Z à la version de l’Agent.

Par exemple, la première version de l’image Docker qui est fournie avec l’Agent 5.5.0 de Datadog est 10.0.550.

Conteneurs personnalisés et informations supplémentaires

Pour en savoir plus sur l’élaboration de conteneurs Docker personnalisés avec l’Agent Datadog, l’image Alpine Linux, le contrôle de version et plus encore, consultez le projet docker-dd-agent sur Github.

Validation

Lancez la sous-commande status de l’Agent et cherchez docker_daemon dans la section Checks.

Agent v6

Le dernier check Docker s’intitule docker. Il est rédigé en Go pour tirer pleinement parti de la nouvelle architecture interne. Depuis la v6.0, l’Agent ne charge plus le check docker_daemon, même s’il est toujours disponible et maintenu à jour pour l’Agent v5. Toutes les fonctionnalités ont été incluses dans les versions >6.0, à l’exception de ce qui suit :

  • Les options url, api_version et tags* sont obsolètes. Nous vous conseillons d’utiliser directement les variables d’environnement Docker standard.
  • Les options ecs_tags, performance_tags et container_tags sont obsolètes. Tous les tags pertinents sont recueillis par défaut.
  • L’option collect_container_count permettant d’activer la métrique docker.container.count n’est plus prise en charge. Vous devez utiliser docker.containers.running et .stopped.

Certaines options ont été déplacées du fichier docker_daemon.yaml vers le fichier datadog.yaml principal :

  • collect_labels_as_tags a été renommé docker_labels_as_tags et prend désormais en charge les tags dotés d’une cardinalité élevée. Consultez les informations détaillées dans datadog.yaml.example.
  • Les listes exclude et include ont été renommées ac_include et ac_exclude. Afin d’obtenir un filtrage cohérent entre tous les composants de l’Agent, le filtrage des tags arbitraires a été abandonné. Les seuls tags de filtrage pris en charge sont image (nom de l’image) et name (nom du conteneur). Le filtrage à l’aide d’expressions régulières est toujours disponible. Consultez datadog.yaml.example pour obtenir des exemples.
  • L’option docker_root a été divisée en deux options : container_cgroup_root et container_proc_root.
  • exclude_pause_container a été ajouté afin d’exclure les conteneurs en pause sur Kubernetes et Openshift (valeur par défaut : true). Cela évite de les supprimer de la liste d’exclusion par erreur.

Autres modifications :

La commande import effectue la conversion de l’ancien docker_daemon.yaml vers le nouveau docker.yaml. Elle déplace également les paramètres requis de docker_daemon.yaml vers datadog.yaml.

Données collectées

Métriques

docker.container.open_fds
(gauge)
The number of open file descriptors
Shown as file
docker.container.size_rootfs
(gauge)
Total size of all the files in the container
Shown as byte
docker.container.size_rootfs.95percentile
(gauge)
95th percentile of docker.container.size_rootfs
Shown as byte
docker.container.size_rootfs.avg
(gauge)
Average value of docker.container.size_rootfs
Shown as byte
docker.container.size_rootfs.count
(rate)
The rate that the value of docker.container.size_rw was sampled
Shown as sample
docker.container.size_rootfs.max
(gauge)
Max value of docker.container.size_rootfs
Shown as byte
docker.container.size_rootfs.median
(gauge)
Median value of docker.container.size_rootfs
Shown as byte
docker.container.size_rw
(gauge)
Total size of all the files in the container which have been created or changed by processes running in the container
Shown as byte
docker.container.size_rw.95percentile
(gauge)
95th percentile of docker.container.size_rw
Shown as byte
docker.container.size_rw.avg
(gauge)
Average value of docker.container.size_rw
Shown as byte
docker.container.size_rw.count
(rate)
The rate that the value of docker.container.size_rw was sampled
Shown as sample
docker.container.size_rw.max
(gauge)
Max value of docker.container.size_rw
Shown as byte
docker.container.size_rw.median
(gauge)
Median value of docker.container.size_rw
Shown as byte
docker.containers.running
(gauge)
The number of containers running on this host tagged by image
docker.containers.running.total
(gauge)
The total number of containers running on this host
docker.containers.stopped
(gauge)
The number of containers stopped on this host tagged by image
docker.containers.stopped.total
(gauge)
The total number of containers stopped on this host
docker.cpu.limit
(gauge)
Limit on CPU available to the container, expressed as percentage of a core
Shown as percent
docker.cpu.shares
(gauge)
Shares of CPU usage allocated to the container
docker.cpu.system
(gauge)
The percent of time the CPU is executing system calls on behalf of processes of this container, unnormalized
Shown as percent
docker.cpu.system.95percentile
(gauge)
95th percentile of docker.cpu.system [deprecated in agent 6.0]
Shown as percent
docker.cpu.system.avg
(gauge)
Average value of docker.cpu.system [deprecated in agent 6.0]
Shown as percent
docker.cpu.system.count
(rate)
The rate that the value of docker.cpu.system was sampled [deprecated in agent 6.0]
Shown as sample
docker.cpu.system.max
(gauge)
Max value of docker.cpu.system
Shown as percent
docker.cpu.system.median
(gauge)
Median value of docker.cpu.system [deprecated in agent 6.0]
Shown as percent
docker.cpu.throttled
(gauge)
Number of times the cgroup has been throttled
docker.cpu.usage
(gauge)
The percent of CPU time obtained by this container
Shown as percent
docker.cpu.user
(gauge)
The percent of time the CPU is under direct control of processes of this container, unnormalized
Shown as percent
docker.cpu.user.95percentile
(gauge)
95th percentile of docker.cpu.user [deprecated in agent 6.0]
Shown as percent
docker.cpu.user.avg
(gauge)
Average value of docker.cpu.user [deprecated in agent 6.0]
Shown as percent
docker.cpu.user.count
(rate)
The rate that the value of docker.cpu.user was sampled [deprecated in agent 6.0]
Shown as sample
docker.cpu.user.max
(gauge)
Max value of docker.cpu.user [deprecated in agent 6.0]
Shown as percent
docker.cpu.user.median
(gauge)
Median value of docker.cpu.user [deprecated in agent 6.0]
Shown as percent
docker.data.free
(gauge)
Storage pool disk space free
Shown as byte
docker.data.percent
(gauge)
The percent of storage pool used
Shown as percent
docker.data.total
(gauge)
Storage pool disk space total
Shown as byte
docker.data.used
(gauge)
Storage pool disk space used
Shown as byte
docker.image.size
(gauge)
Size of all layers of the image on disk
Shown as byte
docker.image.virtual_size
(gauge)
Size of all layers of the image on disk
Shown as byte
docker.images.available
(gauge)
The number of top-level images
docker.images.intermediate
(gauge)
The number of intermediate images, which are intermediate layers that make up other images
docker.io.read_bytes
(gauge)
Bytes read per second from disk by the processes of the container
Shown as byte
docker.io.read_bytes.95percentile
(gauge)
95th percentile of docker.io.read_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.read_bytes.avg
(gauge)
Average value of docker.io.read_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.read_bytes.count
(rate)
The rate that the value of docker.io.read_bytes was sampled [deprecated in agent 6.0]
Shown as sample
docker.io.read_bytes.max
(gauge)
Max value of docker.container.io.read_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.read_bytes.median
(gauge)
Median value of docker.container.io.read_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.write_bytes
(gauge)
Bytes written per second to disk by the processes of the container
Shown as byte
docker.io.write_bytes.95percentile
(gauge)
95th percentile of docker.io.write_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.write_bytes.avg
(gauge)
Average value of docker.io.write_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.write_bytes.count
(rate)
The rate that the value of docker.io.write_bytes was sampled [deprecated in agent 6.0]
Shown as sample
docker.io.write_bytes.max
(gauge)
Max value of docker.container.io.write_bytes [deprecated in agent 6.0]
Shown as byte
docker.io.write_bytes.median
(gauge)
Median value of docker.container.io.write_bytes [deprecated in agent 6.0]
Shown as byte
docker.kmem.usage
(gauge)
The amount of kernel memory that belongs to the container's processes.
Shown as byte
docker.mem.cache
(gauge)
The amount of memory that is being used to cache data from disk (e.g. memory contents that can be associated precisely with a block on a block device)
Shown as byte
docker.mem.cache.95percentile
(gauge)
95th percentile value of docker.mem.cache [deprecated in agent 6.0]
Shown as byte
docker.mem.cache.avg
(gauge)
Average value of docker.mem.cache [deprecated in agent 6.0]
Shown as byte
docker.mem.cache.count
(rate)
The rate that the value of docker.mem.cache was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.cache.max
(gauge)
Max value of docker.mem.cache [deprecated in agent 6.0]
Shown as byte
docker.mem.cache.median
(gauge)
Median value of docker.mem.cache [deprecated in agent 6.0]
Shown as byte
docker.mem.in_use
(gauge)
The fraction of used memory to available memory, IF THE LIMIT IS SET
Shown as fraction
docker.mem.in_use.95percentile
(gauge)
95th percentile of docker.mem.in_use [deprecated in agent 6.0]
Shown as fraction
docker.mem.in_use.avg
(gauge)
Average value of docker.mem.in_use [deprecated in agent 6.0]
Shown as fraction
docker.mem.in_use.count
(rate)
The rate that the value of docker.mem.in_use was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.in_use.max
(gauge)
Max value of docker.container.mem.in_use [deprecated in agent 6.0]
Shown as fraction
docker.mem.in_use.median
(gauge)
Median value of docker.container.mem.in_use [deprecated in agent 6.0]
Shown as fraction
docker.mem.limit
(gauge)
The memory limit for the container, if set
Shown as byte
docker.mem.limit.95percentile
(gauge)
95th percentile of docker.mem.limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.limit.avg
(gauge)
Average value of docker.mem.limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.limit.count
(rate)
The rate that the value of docker.mem.limit was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.limit.max
(gauge)
Max value of docker.mem.limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.limit.median
(gauge)
Median value of docker.mem.limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.rss
(gauge)
The amount of non-cache memory that belongs to the container's processes. Used for stacks, heaps, etc.
Shown as byte
docker.mem.rss.95percentile
(gauge)
95th percentile value of docker.mem.rss [deprecated in agent 6.0]
Shown as byte
docker.mem.rss.avg
(gauge)
Average value of docker.mem.rss [deprecated in agent 6.0]
Shown as byte
docker.mem.rss.count
(rate)
The rate that the value of docker.mem.rss was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.rss.max
(gauge)
Max value of docker.mem.rss [deprecated in agent 6.0]
Shown as byte
docker.mem.rss.median
(gauge)
Median value of docker.mem.rss [deprecated in agent 6.0]
Shown as byte
docker.mem.soft_limit
(gauge)
The memory reservation limit for the container, if set
Shown as byte
docker.mem.soft_limit.95percentile
(gauge)
95th percentile of docker.mem.soft_limit. Ordinarily this value will not change
Shown as byte
docker.mem.soft_limit.avg
(gauge)
Average value of docker.mem.soft_limit. Ordinarily this value will not change
Shown as byte
docker.mem.soft_limit.count
(rate)
The rate that the value of docker.mem.soft_limit was sampled
Shown as sample
docker.mem.soft_limit.max
(gauge)
Max value of docker.mem.soft_limit. Ordinarily this value will not change
Shown as byte
docker.mem.soft_limit.median
(gauge)
Median value of docker.mem.soft_limit. Ordinarily this value will not change
Shown as byte
docker.mem.sw_in_use
(gauge)
The fraction of used swap + memory to available swap + memory, if the limit is set
Shown as fraction
docker.mem.sw_in_use.95percentile
(gauge)
95th percentile of docker.mem.swinuse [deprecated in agent 6.0]
Shown as fraction
docker.mem.sw_in_use.avg
(gauge)
Average value of docker.mem.swinuse [deprecated in agent 6.0]
Shown as fraction
docker.mem.sw_in_use.count
(rate)
The rate that the value of docker.mem.swinuse was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.sw_in_use.max
(gauge)
Max value of docker.container.mem.swinuse [deprecated in agent 6.0]
Shown as fraction
docker.mem.sw_in_use.median
(gauge)
Median value of docker.container.mem.swinuse [deprecated in agent 6.0]
Shown as fraction
docker.mem.sw_limit
(gauge)
The swap + memory limit for the container, if set
Shown as byte
docker.mem.sw_limit.95percentile
(gauge)
95th percentile of docker.mem.sw_limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.sw_limit.avg
(gauge)
Average value of docker.mem.sw_limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.sw_limit.count
(rate)
The rate that the value of docker.mem.sw_limit was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.sw_limit.max
(gauge)
Max value of docker.mem.sw_limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.sw_limit.median
(gauge)
Median value of docker.mem.sw_limit. Ordinarily this value will not change [deprecated in agent 6.0]
Shown as byte
docker.mem.swap
(gauge)
The amount of swap currently used by the container
Shown as byte
docker.mem.swap.95percentile
(gauge)
95th percentile value of docker.mem.swap [deprecated in agent 6.0]
Shown as byte
docker.mem.swap.avg
(gauge)
Average value of docker.mem.swap [deprecated in agent 6.0]
Shown as byte
docker.mem.swap.count
(rate)
The rate that the value of docker.mem.swap was sampled [deprecated in agent 6.0]
Shown as sample
docker.mem.swap.max
(gauge)
Max value of docker.mem.swap [deprecated in agent 6.0]
Shown as byte
docker.mem.swap.median
(gauge)
Median value of docker.mem.swap [deprecated in agent 6.0]
Shown as byte
docker.metadata.free
(gauge)
Storage pool metadata space free
Shown as byte
docker.metadata.percent
(gauge)
The percent of storage pool metadata used
Shown as percent
docker.metadata.total
(gauge)
Storage pool metadata space total
Shown as byte
docker.metadata.used
(gauge)
Storage pool metadata space used
Shown as byte
docker.net.bytes_rcvd
(gauge)
Bytes received per second from the network
Shown as byte
docker.net.bytes_rcvd.95percentile
(gauge)
95th percentile of docker.net.bytes_rcvd [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_rcvd.avg
(gauge)
Average value of docker.net.bytes_rcvd [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_rcvd.count
(rate)
The rate that the value of docker.net.bytes_rcvd was sampled [deprecated in agent 6.0]
Shown as sample
docker.net.bytes_rcvd.max
(gauge)
Max value of docker.container.net.bytes_rcvd [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_rcvd.median
(gauge)
Median value of docker.container.net.bytes_rcvd [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_sent
(gauge)
Bytes sent per second to the network
Shown as byte
docker.net.bytes_sent_bytes.95percentile
(gauge)
95th percentile of docker.net.bytessentbytes [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_sent_bytes.avg
(gauge)
Average value of docker.net.bytessentbytes [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_sent_bytes.count
(rate)
The rate that the value of docker.net.bytessentbytes was sampled [deprecated in agent 6.0]
Shown as sample
docker.net.bytes_sent_bytes.max
(gauge)
Max value of docker.container.net.bytessentbytes [deprecated in agent 6.0]
Shown as byte
docker.net.bytes_sent_bytes.median
(gauge)
Median value of docker.container.net.bytessentbytes [deprecated in agent 6.0]
Shown as byte
docker.thread.count
(gauge)
Current thread count for the container
Shown as thread
docker.thread.limit
(gauge)
Thread count limit for the container, if set
Shown as thread
docker.uptime
(gauge)
Time since the container was started
Shown as second

Événements

L’intégration Docker génère les événements suivants :

  • Delete Image
  • Die
  • Erreur
  • Fail
  • Kill
  • Out of memory (oom)
  • Pause
  • Restart container
  • Restart Daemon
  • Update

Checks de service

docker.service_up
Renvoie CRITICAL si l’Agent n’est pas capable de recueillir la liste des conteneurs du daemon Docker. Si ce n’est pas le cas, renvoie OK.
Statuses: ok, critical

docker.container_health
Renvoie CRITICAL si un conteneur n’est pas sain, renvoie OK si ce n’est pas le cas ou renvoie UNKNOWN si l’état de santé est inconnu.
Statuses: ok, critical, unknown

docker.exit
Renvoie CRITICAL si un conteneur est fermé avec un code de sortie différent de zéro. Si ce n’est pas le cas, renvoie OK.
Statuses: ok, critical

Remarque : pour utiliser docker.exit, ajoutez collect_exit_code: true dans votre fichier YAML Docker et redémarrez l’Agent.

Dépannage

Besoin d’aide ? Contactez l’assistance Datadog.

Pour aller plus loin

PREVIEWING: may/unit-testing