Aller au contenu
Agent Docker

Agent Docker

Voir en Markdown

L'agent Docker de Status200 est un conteneur que vous exécutez sur un hôte Docker. Il lit les statistiques et les fichiers de journaux de chaque conteneur de l'hôte et les envoie à Status200, où l'hôte apparaît avec ses conteneurs, ses métriques et ses journaux. Un deuxième conteneur, l'agent IA Docker, permet à Status200 AI d'enquêter sur l'hôte. Les moniteurs Docker déclenchent des alertes à partir de ce qu'envoie l'agent.

Fonctionnement

L'agent est un OpenTelemetry Collector avec la configuration de Status200 intégrée. Via le socket Docker, il lit les statistiques de chaque conteneur toutes les 30 secondes et liste chaque conteneur, image, réseau et volume toutes les 5 minutes. Il suit les fichiers de journaux des conteneurs et envoie le tout à votre URL Status200 via OTLP, avec la clé d'ingestion que vous lui donnez.

flowchart TB containers["Vos conteneurs"] -->|"statistiques, fichiers de journaux,<br/>inventaire"| agent["Agent Docker"] agent -->|"OTLP sur HTTPS"| oneuptime["Status200"] oneuptime -->|"enquête sur un incident<br/>ou une alerte"| ai["Agent IA Docker"] ai -->|"commandes docker<br/>en lecture seule"| containers

Deux conteneurs sur votre hôte Docker

L'hôte s'enregistre avec ses premières données, sous le nom que vous lui donnez dans DOCKER_HOST_NAME. L'agent IA est optionnel : sans lui, le collecteur fonctionne de la même façon.

Avant de commencer

  • Docker Engine 20.10 ou ultérieur, et un accès root sur l'hôte : l'agent lit /var/run/docker.sock.
  • Docker Compose v2 (la commande docker compose), si vous installez avec Docker Compose.
  • Une clé d'ingestion. Créez-en une sous Paramètres du projet → Télémétrie & APM → Clés d'ingestion et copiez sa valeur.
  • Du HTTPS sortant de l'hôte vers votre URL Status200.
  • Pour les journaux de conteneurs, des conteneurs qui utilisent le pilote de journalisation json-file de Docker, qui est celui de Docker par défaut. Voir Les journaux de conteneurs nécessitent le pilote json-file.

Installer l'agent

  1. Démarrer l'agent

    Remplacez YOUR_STATUS200_URL par votre URL Status200, YOUR_TELEMETRY_INGESTION_TOKEN par la clé d'ingestion, et my-docker-host par un nom pour cet hôte, comme prod-docker-01. C'est sous ce nom que l'hôte apparaît dans Status200 : gardez-le donc stable, car un nouveau nom enregistre un nouvel hôte.

    Docker CLI

    Bash
    docker run -d \
      --name status200-docker-agent \
      --user 0:0 \
      --restart unless-stopped \
      -v /var/run/docker.sock:/var/run/docker.sock:ro \
      -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
      -e STATUS200_URL="YOUR_STATUS200_URL" \
      -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \
      -e DOCKER_HOST_NAME="my-docker-host" \
      status200/docker-agent:release

    Démarrez ensuite l'agent IA à côté, avec les mêmes valeurs. Les enquêtes IA sont activées par défaut : pendant que Status200 AI enquête sur un incident ou une alerte sur cet hôte, elle exécute des commandes docker en lecture seule via l'agent IA, et ne modifie rien tant que vous n'autorisez pas de corrections. Pour installer sans enquêtes IA, ignorez cette commande.

    Bash
    docker run -d \
      --name status200-docker-ai-agent \
      --user 0:0 \
      --restart unless-stopped \
      --read-only --tmpfs /tmp \
      -v /var/run/docker.sock:/var/run/docker.sock:ro \
      -e STATUS200_URL="YOUR_STATUS200_URL" \
      -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \
      -e STATUS200_AI_AGENT_RESOURCE_TYPE=docker \
      -e DOCKER_HOST_NAME="my-docker-host" \
      status200/resource-ai-agent:release

    Docker Compose

    Enregistrez ceci sous le nom docker-compose.yml dans un dossier de l'hôte. Le second service est l'agent IA : retirez-le pour exécuter le collecteur sans enquêtes IA.

    docker-compose.ymlYAML
    services:
      status200-docker-agent:
        image: status200/docker-agent:release
        container_name: status200-docker-agent
        user: "0:0"
        restart: unless-stopped
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /var/lib/docker/containers:/var/lib/docker/containers:ro
        environment:
          - STATUS200_URL=YOUR_STATUS200_URL
          - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN
          - DOCKER_HOST_NAME=my-docker-host
        logging:
          driver: json-file
          options:
            max-size: "10m"
            max-file: "3"
      status200-docker-ai-agent:
        image: status200/resource-ai-agent:release
        container_name: status200-docker-ai-agent
        user: "0:0"
        restart: unless-stopped
        read_only: true
        tmpfs:
          - /tmp
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
        environment:
          - STATUS200_URL=YOUR_STATUS200_URL
          - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN
          - STATUS200_AI_AGENT_RESOURCE_TYPE=docker
          - DOCKER_HOST_NAME=my-docker-host

    Démarrez-le dans ce dossier :

    Bash
    docker compose up -d
  2. Vérifier que l'agent s'exécute

    Bash
    docker ps --filter name=status200-docker-agent
    docker logs -f status200-docker-agent

    Les journaux doivent afficher cette ligne une fois le collecteur démarré :

    Everything is ready. Begin running and processing data.
  3. Trouver l'hôte dans Status200

    Ouvrez Produits → Infrastructure → Docker → Tous les hôtes. L'hôte apparaît sous son DOCKER_HOST_NAME en une minute environ, avec ses conteneurs, ses métriques et ses journaux. L'agent IA apparaît comme connecté sur la page Agent IA de l'hôte, et en bas de sa Vue d'ensemble. La page Topologie de l'hôte dessine ses projets Compose, conteneurs, images, réseaux et volumes sur une seule carte : voir Topologie.

Variables d'environnement

VariableObligatoireDescription
STATUS200_URLOuiVotre URL Status200, comme https://status200.ru ou votre instance auto-hébergée. Utilisez http:// et son port si l'instance ne parle que HTTP.
STATUS200_SERVICE_TOKENOuiLa clé d'ingestion de Paramètres du projet → Télémétrie & APM → Clés d'ingestion.
DOCKER_HOST_NAMENonLe nom de l'hôte dans Status200. Par défaut docker-host : donnez donc le sien à chaque hôte.
DOCKER_API_VERSIONNonLa version de l'API Docker Engine que parle l'agent. Par défaut 1.44. Baissez-la pour un daemon plus ancien, ou définissez une valeur vide pour la négocier avec le daemon (voir Dépannage).

Pour modifier une valeur, supprimez l'agent et exécutez de nouveau sa commande (Docker CLI), ou modifiez docker-compose.yml et exécutez docker compose up -d (Docker Compose).

Ce que collecte l'agent

DonnéesContenu
Métriques des conteneursCPU (utilisation, pourcentage, bridage), mémoire (utilisation, limite, pourcentage), E/S réseau et bloc, durée de fonctionnement, redémarrages et nombre de processus, par conteneur, toutes les 30 secondes.
Journaux des conteneursstdout et stderr de chaque conteneur, depuis son fichier de journal json-file.
InventaireChaque conteneur, quel que soit son état, ainsi que chaque image, réseau et volume, toutes les 5 minutes.

Les métriques et les journaux de chaque conteneur sont classés sous un service portant le nom du conteneur. Chaque ligne de journal reçoit une gravité d'après le niveau qu'elle mentionne, comme [ERROR], level=warn ou {"level":"info"} ; une ligne qui n'en mentionne aucun prend celle de son flux : stderr vaut ERROR, stdout vaut INFO. Les lignes qui commencent par un espace ou un crochet fermant sont rattachées à la ligne précédente : une stack trace arrive donc en un seul enregistrement. Les journaux de l'agent lui-même sont ignorés.

Surveillance Docker liste chaque métrique et sa signification.

Les journaux de conteneurs nécessitent le pilote json-file

L'agent suit /var/lib/docker/containers/*/*-json.log, les fichiers qu'écrit le pilote de journalisation json-file de Docker. Un conteneur qui utilise un autre pilote ne laisse aucun fichier à lire : local écrit des fichiers binaires, et journald, syslog, fluentd et gelf envoient les journaux ailleurs. Ses métriques arrivent toujours ; ses journaux, non.

Vérifiez le pilote de journalisation d'un conteneur, et celui du daemon par défaut :

Bash
docker inspect <container> --format '{{.HostConfig.LogConfig.Type}}'
docker info --format '{{.LoggingDriver}}'

Passez un service Compose à json-file, avec rotation :

YAML
services:
  my-app:
    image: my-app:latest
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"

Ou faites-en la valeur par défaut pour chaque conteneur créé ensuite, dans /etc/docker/daemon.json :

/etc/docker/daemon.jsonJSON
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

Redémarrez ensuite Docker et recréez les conteneurs. Un conteneur garde le pilote de journalisation avec lequel il a été créé : le redémarrer ne suffit donc pas.

Mettre à jour l'agent

Lorsque l'agent est plus ancien que votre Status200, un signe d'avertissement apparaît à côté de Version de l'agent dans la Vue d'ensemble de l'hôte. Sélectionnez-le pour voir ces commandes.

Docker CLI

Bash
docker pull status200/docker-agent:release
docker pull status200/resource-ai-agent:release
docker rm -f status200-docker-agent status200-docker-ai-agent

Exécutez ensuite de nouveau les deux commandes docker run de Démarrer l'agent.

Docker Compose

Bash
docker compose pull
docker compose up -d

Le tag release pointe toujours vers la version la plus récente. Pour épingler une version, utilisez status200/docker-agent:<version>, comme status200/docker-agent:10.0.31. La même image se trouve sur GitHub Container Registry sous ghcr.io/status200/docker-agent:release.

Désinstaller l'agent

Docker CLI

Bash
docker rm -f status200-docker-agent
docker rm -f status200-docker-ai-agent

Docker Compose

Bash
docker compose down

L'hôte reste dans Status200 avec les données qu'il a envoyées. Si vous n'en avez plus besoin, supprimez-le avec Supprimer l'hôte dans son menu.

Agent IA

Les commandes et le fichier Compose ci-dessus, l'install.sh de l'agent Docker et le docker-compose.yml de son [répertoire DockerAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerAgent) exécutent tous l'Agent IA Docker : un deuxième conteneur, status200-docker-ai-agent (image status200/resource-ai-agent:release), qui exécute les commandes docker en lecture seule que demande Status200 AI pendant qu'elle enquête sur un incident ou une alerte sur cet hôte — docker ps -a, docker logs --tail 200 web, docker container inspect web, docker stats --no-stream — et, uniquement si vous l'autorisez, applique des corrections comme le redémarrage d'un conteneur donné. Il lit les mêmes STATUS200_URL, STATUS200_SERVICE_TOKEN et DOCKER_HOST_NAME que le collecteur : il sert donc exactement cet hôte, et apparaît sur la page Agent IA de l'hôte dans Status200.

  • Les enquêtes IA sont activées par défaut. Dès que l'agent se connecte, Status200 AI enquête avec lui sur les incidents et les alertes de cet hôte, et la Vue d'ensemble de l'hôte affiche l'état de l'agent. Pour arrêter, définissez STATUS200_AI_INVESTIGATION=false là où l'agent s'exécute (Modifier, sous Ce que l'IA peut faire sur la page de l'agent IA, montre comment), ou ne lancez pas l'agent.
  • Il est en lecture seule, sauf si vous le démarrez avec STATUS200_AI_ALLOW_WRITES=true ; STATUS200_AI_WRITE_TARGETS (par exemple web-*,api-*) limite les conteneurs qu'une correction peut toucher. Démarrez-le aussi avec STATUS200_AI_FIXES pour indiquer comment les corrections s'exécutent — ask-for-approval (une personne approuve chacune), automatic ou bypass-approval — et la page de l'agent IA l'affiche en lecture seule (Ce que l'IA peut faire, défini par l'agent).
  • Il s'exécute en tant que root avec le socket Docker monté, car le socket appartient à root — et quiconque peut utiliser le socket est root sur cet hôte, :ro ou non. La limite est la politique de commandes de l'agent : il n'exécute jamais exec, run, rm ni prune, et ne modifie jamais lui-même, le collecteur ni quoi que ce soit dans STATUS200_AI_PROTECTED_TARGETS (des globs de noms de conteneurs). Les valeurs d'environnement de la sortie de docker inspect sont masquées avant que quoi que ce soit ne quitte l'hôte.
  • install.sh --no-ai-agent l'omet ; docker rm -f status200-docker-ai-agent le supprime. Mettez-le à jour comme le collecteur : docker pull status200/resource-ai-agent:release, supprimez-le, puis redémarrez-le.

Ce qu'il peut exécuter, comment fonctionnent les corrections et comment le dépanner : Infrastructure AI Agents.

Dépannage

L'agent redémarre avec "client version is too new"

Les journaux de l'agent affichent :

Error: cannot start pipelines: failed to start "docker_stats" receiver:
Error response from daemon: client version 1.44 is too new.
Maximum supported API version is 1.41

Un daemon refuse un client plus récent que son propre maximum : le receiver ne démarre donc jamais, et le collecteur s'arrête avec lui. Trouvez le maximum du daemon :

Bash
docker version --format '{{ .Server.APIVersion }}'

Ajoutez ensuite -e DOCKER_API_VERSION=1.41 (ou la valeur obtenue) à docker run, ou définissez DOCKER_API_VERSION dans Compose. Les daemons plus récents servent toujours les anciennes versions de l'API : le réglage reste donc valable après une mise à jour.

Vous préférez ne pas chercher le numéro ? Définissez DOCKER_API_VERSION sur la chaîne vide. L'agent négocie alors la version avec le daemon (un HEAD /_ping, puis le maximum propre au daemon), ce qui fonctionne avec les anciens comme avec les nouveaux daemons :

Bash
docker run -d ... -e DOCKER_API_VERSION= ...
Accès refusé au socket Docker

L'agent doit s'exécuter en tant que root pour lire /var/run/docker.sock. Vérifiez que --user 0:0 figure dans votre commande docker run, ou user: "0:0" dans Compose.

L'hôte apparaît comme déconnecté
  1. Vérifiez que l'agent s'exécute : docker ps --filter name=status200-docker-agent
  2. Recherchez des erreurs dans ses journaux : docker logs status200-docker-agent 2>&1 | grep -i error
  3. Vérifiez STATUS200_URL et STATUS200_SERVICE_TOKEN : la clé doit être une clé d'ingestion valide qui n'a pas été désactivée.
  4. Vérifiez que l'hôte peut joindre votre URL Status200 sur le réseau.
Aucune métrique n'apparaît
  1. Vérifiez que le socket Docker est monté dans l'agent. Son image n'a pas de shell : regardez donc depuis un conteneur jetable qui partage ses montages : docker run --rm --volumes-from status200-docker-agent alpine:3.19 ls -la /var/run/docker.sock
  2. Recherchez des erreurs d'export dans ses journaux : docker logs status200-docker-agent 2>&1 | tail -100
  3. Vérifiez que la clé d'ingestion est valide et n'a pas expiré.
Le CPU des conteneurs est une ligne plate

Un agent plus ancien envoie le chiffre de CPU calculé par le récepteur docker_stats lui-même. Depuis le collecteur 0.150.0, le récepteur le calcule à partir d'une seule lecture des statistiques : tout le CPU qu'un conteneur a utilisé depuis son démarrage, divisé par tout le CPU que l'hôte a utilisé depuis son amorçage. La ligne bouge à peine et ne suit pas la charge, contrairement à container.cpu.usage.total. Mettez à jour l'agent : à partir de sa deuxième lecture, il envoie le CPU que chaque conteneur a utilisé sur chaque intervalle de 30 secondes. Les lectures déjà enregistrées restent telles quelles.

Les métriques arrivent, mais pas les journaux des conteneurs

Vos conteneurs utilisent très probablement un autre pilote de journalisation que json-file. Vérifiez quels fichiers l'agent surveille, et quel pilote utilise un conteneur :

Bash
docker logs status200-docker-agent 2>&1 | grep -E "Started watching file|no files match"
docker inspect <container> --format '{{.HostConfig.LogConfig.Type}}'

Si l'agent signale no files match the configured criteria, passez les conteneurs à json-file et recréez-les, comme le montre Les journaux de conteneurs nécessitent le pilote json-file.

Les journaux sont sur un autre hôte, ou l'hôte s'appelle docker-host

Le nom de l'hôte vient de DOCKER_HOST_NAME. Un agent démarré sans lui signale docker-host : tous les hôtes configurés ainsi semblent donc être le même. Changez le nom plus tard, et Status200 enregistre un second hôte, qui reçoit alors les nouvelles données. Définissez DOCKER_HOST_NAME sur un nom propre à chaque hôte, et recréez l'agent. Pour vérifier le nom que signale l'agent :

Bash
docker inspect status200-docker-agent --format '{{range .Config.Env}}{{println .}}{{end}}' | grep DOCKER_HOST_NAME

Étapes suivantes