Vai al contenuto
Agent Docker

Agent Docker

L'agent Docker di Status200 è un container che esegui su un host Docker. Legge le statistiche e i file di log di ogni container dell'host e li invia a Status200, dove l'host compare con i suoi container, le metriche e i log. Un secondo container, l'agente IA Docker, permette a Status200 AI di indagare sull'host. I monitor Docker generano avvisi in base a ciò che l'agent invia.

Come funziona

L'agent è un OpenTelemetry Collector con la configurazione di Status200 integrata. Tramite il socket di Docker legge le statistiche di ogni container ogni 30 secondi ed elenca ogni container, immagine, rete e volume ogni 5 minuti. Segue i file di log dei container e invia tutto al tuo URL di Status200 tramite OTLP, con la chiave di acquisizione che gli fornisci.

flowchart TB containers["I tuoi container"] -->|"statistiche, file di log,<br/>inventario"| agent["Agent Docker"] agent -->|"OTLP su HTTPS"| oneuptime["Status200"] oneuptime -->|"indaga su un incidente<br/>o un avviso"| ai["Agente IA Docker"] ai -->|"comandi docker<br/>in sola lettura"| containers

Due container sul tuo host Docker

L'host si registra con i suoi primi dati, con il nome che gli dai in DOCKER_HOST_NAME. L'agente IA è opzionale: se lo ometti, il collector funziona allo stesso modo.

Prima di iniziare

  • Docker Engine 20.10 o successivo, e accesso root sull'host: l'agent legge /var/run/docker.sock.
  • Docker Compose v2 (il comando docker compose), se installi con Docker Compose.
  • Una chiave di acquisizione. Creane una in Impostazioni del progetto → Telemetria e APM → Chiavi di acquisizione e copiane il valore.
  • HTTPS in uscita dall'host verso il tuo URL di Status200.
  • Per i log dei container, container che usano il driver di log json-file di Docker, che è quello predefinito di Docker. Vedi I log dei container richiedono il driver json-file.

Installa l'agent

  1. Avvia l'agent

    Sostituisci YOUR_STATUS200_URL con il tuo URL di Status200, YOUR_TELEMETRY_INGESTION_TOKEN con la chiave di acquisizione e my-docker-host con un nome per questo host, come prod-docker-01. Il nome è quello con cui l'host compare in Status200, quindi mantienilo stabile: un nome nuovo registra un nuovo host.

    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

    Poi avvia accanto l'agente IA, con gli stessi valori. Le indagini IA sono attive per impostazione predefinita: mentre Status200 AI indaga su un incidente o un avviso su questo host, esegue comandi docker in sola lettura tramite l'agente IA, e non modifica nulla a meno che tu non consenta le correzioni. Per installare senza indagini IA, salta questo comando.

    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

    Salva questo file come docker-compose.yml in una cartella sull'host. Il secondo servizio è l'agente IA: omettilo per eseguire il collector senza indagini 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

    Avvialo in quella cartella:

    Bash
    docker compose up -d
  2. Verifica che l'agent sia in esecuzione

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

    I log dovrebbero mostrare questa riga una volta avviato il collector:

    Everything is ready. Begin running and processing data.
  3. Trova l'host in Status200

    Apri Prodotti → Infrastruttura → Docker → Tutti gli host. L'host compare con il suo DOCKER_HOST_NAME entro un minuto circa, con i suoi container, le metriche e i log. L'agente IA risulta connesso nella pagina Agente IA dell'host e in fondo alla sua Panoramica. La pagina Topologia dell'host disegna i suoi progetti Compose, container, immagini, reti e volumi su un'unica mappa: vedi Topologia.

Variabili d'ambiente

VariabileObbligatoriaDescrizione
STATUS200_URLSìIl tuo URL di Status200, come https://status200.ru o la tua istanza self-hosted. Usa http:// e la sua porta se l'istanza usa solo HTTP.
STATUS200_SERVICE_TOKENSìLa chiave di acquisizione da Impostazioni del progetto → Telemetria e APM → Chiavi di acquisizione.
DOCKER_HOST_NAMENoIl nome dell'host in Status200. Il valore predefinito è docker-host, quindi dai a ogni host il suo.
DOCKER_API_VERSIONNoLa versione dell'API di Docker Engine che l'agent usa. Il valore predefinito è 1.44. Abbassala con un daemon più vecchio, oppure impostala su un valore vuoto per negoziarla con il daemon (vedi Risoluzione dei problemi).

Per cambiare un valore, rimuovi l'agent ed esegui di nuovo il suo comando (Docker CLI), oppure modifica docker-compose.yml ed esegui docker compose up -d (Docker Compose).

Cosa raccoglie l'agent

DatiCosa sono
Metriche dei containerCPU (utilizzo, percentuale, limitazione), memoria (utilizzo, limite, percentuale), I/O di rete e di blocco, uptime, riavvii e numero di processi, per container, ogni 30 secondi.
Log dei containerstdout e stderr di ogni container, dal suo file di log json-file.
InventarioOgni container in qualsiasi stato, e ogni immagine, rete e volume, ogni 5 minuti.

Le metriche e i log di ogni container vengono archiviati sotto un servizio con il nome del container. Ogni riga di log riceve una severità in base al livello che indica, come [ERROR], level=warn o {"level":"info"}; una riga che non ne indica nessuno prende quella del suo flusso: stderr è ERROR, stdout è INFO. Le righe che iniziano con uno spazio o una parentesi di chiusura vengono unite alla riga precedente, quindi uno stack trace arriva come un unico record. I log dell'agent stesso vengono esclusi.

Monitor Docker elenca ogni metrica e il suo significato.

I log dei container richiedono il driver json-file

L'agent segue /var/lib/docker/containers/*/*-json.log, i file che scrive il driver di log json-file di Docker. Un container che usa un altro driver non lascia alcun file da leggere: local scrive file binari, e journald, syslog, fluentd e gelf inviano i log altrove. Le sue metriche arrivano comunque; i suoi log no.

Controlla il driver di log di un container e quello predefinito del daemon:

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

Passa un servizio Compose a json-file, con rotazione:

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

Oppure rendilo il predefinito per ogni container creato in seguito, in /etc/docker/daemon.json:

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

Poi riavvia Docker e ricrea i container. Un container mantiene il driver di log con cui è stato creato, quindi riavviarlo non basta.

Aggiornare l'agent

Quando l'agent è più vecchio del tuo Status200, compare un segnale di avviso accanto a Versione dell'agente nella Panoramica dell'host. Selezionalo per vedere questi comandi.

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

Poi esegui di nuovo entrambi i comandi docker run di Avvia l'agent.

Docker Compose

Bash
docker compose pull
docker compose up -d

Il tag release punta sempre alla release più recente. Per fissare una versione, usa status200/docker-agent:<version>, come status200/docker-agent:10.0.31. La stessa immagine si trova nel GitHub Container Registry come ghcr.io/status200/docker-agent:release.

Disinstallare 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'host resta in Status200 con i dati che ha inviato. Se non ti serve più, eliminalo con Elimina host nel suo menu.

Agente IA

I comandi e il file Compose qui sopra, l'install.sh dell'agent Docker e il docker-compose.yml nella sua [directory DockerAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerAgent) eseguono tutti l'Agente IA Docker: un secondo container, status200-docker-ai-agent (immagine status200/resource-ai-agent:release), che esegue i comandi docker in sola lettura richiesti da Status200 AI mentre indaga su un incidente o un avviso su questo host — docker ps -a, docker logs --tail 200 web, docker container inspect web, docker stats --no-stream — e, solo se lo consenti, applica correzioni come il riavvio di un container specifico. Legge gli stessi STATUS200_URL, STATUS200_SERVICE_TOKEN e DOCKER_HOST_NAME del collector, quindi serve esattamente questo host, e compare nella pagina Agente IA dell'host in Status200.

  • Le indagini IA sono attive per impostazione predefinita. Appena l'agent si connette, Status200 AI lo usa per indagare sugli incidenti e sugli avvisi di questo host, e la Panoramica dell'host mostra lo stato dell'agent. Per fermarlo, imposta STATUS200_AI_INVESTIGATION=false dove viene eseguito l'agent (Cambia sotto Cosa può fare l'IA, nella pagina dell'agente IA, mostra come), oppure ometti l'agent.
  • È in sola lettura a meno che tu non lo avvii con STATUS200_AI_ALLOW_WRITES=true; STATUS200_AI_WRITE_TARGETS (per esempio web-*,api-*) limita i container che una correzione può toccare. Avvialo anche con STATUS200_AI_FIXES per indicare come vengono eseguite le correzioni — ask-for-approval (una persona approva ciascuna), automatic o bypass-approval — e la pagina dell'agente IA lo mostra in sola lettura (Cosa può fare l'IA, impostato dall'agent).
  • Viene eseguito come root con il socket di Docker montato, perché il socket appartiene a root — e chi può usare il socket è root su questo host, :ro o no. Il limite è la policy dei comandi dell'agent: non esegue mai exec, run, rm o prune, e non modifica mai sé stesso, il collector o qualsiasi cosa in STATUS200_AI_PROTECTED_TARGETS (glob di nomi di container). I valori d'ambiente nell'output di docker inspect vengono mascherati prima che qualcosa lasci l'host.
  • install.sh --no-ai-agent lo omette; docker rm -f status200-docker-ai-agent lo rimuove. Aggiornalo come il collector: docker pull status200/resource-ai-agent:release, rimuovilo e avvialo di nuovo.

Cosa può eseguire, come funzionano le correzioni e come risolverne i problemi: Infrastructure AI Agents.

Risoluzione dei problemi

L'agent si riavvia con "client version is too new"

I log dell'agent mostrano:

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 rifiuta un client più recente del proprio massimo, quindi il receiver non parte mai e il collector termina con esso. Trova il massimo del daemon:

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

Poi aggiungi -e DOCKER_API_VERSION=1.41 (o il valore che hai ottenuto) a docker run, oppure imposta DOCKER_API_VERSION in Compose. I daemon più recenti servono ancora le versioni più vecchie dell'API, quindi l'impostazione resta valida dopo un aggiornamento.

Preferisci non cercare il numero? Imposta DOCKER_API_VERSION sulla stringa vuota. L'agent negozia allora la versione con il daemon (un HEAD /_ping, poi il massimo del daemon stesso), il che funziona sia con daemon vecchi sia con daemon nuovi:

Bash
docker run -d ... -e DOCKER_API_VERSION= ...
Permesso negato sul socket di Docker

L'agent deve essere eseguito come root per leggere /var/run/docker.sock. Verifica che --user 0:0 sia nel tuo comando docker run, oppure user: "0:0" in Compose.

L'host risulta disconnesso
  1. Verifica che l'agent sia in esecuzione: docker ps --filter name=status200-docker-agent
  2. Cerca errori nei suoi log: docker logs status200-docker-agent 2>&1 | grep -i error
  3. Controlla STATUS200_URL e STATUS200_SERVICE_TOKEN: la chiave deve essere una chiave di acquisizione valida che non è stata disattivata.
  4. Verifica che l'host raggiunga il tuo URL di Status200 in rete.
Non compare nessuna metrica
  1. Verifica che il socket di Docker sia montato nell'agent. La sua immagine non ha una shell, quindi guarda da un container usa e getta che ne condivide i mount: docker run --rm --volumes-from status200-docker-agent alpine:3.19 ls -la /var/run/docker.sock
  2. Cerca errori di esportazione nei suoi log: docker logs status200-docker-agent 2>&1 | tail -100
  3. Verifica che la chiave di acquisizione sia valida e non sia scaduta.
La CPU dei container è una linea piatta

Un agent più vecchio invia il valore di CPU calcolato dal receiver docker_stats stesso. Dal collector 0.150.0 il receiver lo ricava da una sola lettura delle statistiche: tutta la CPU usata da un container dal suo avvio, divisa per tutta la CPU usata dall'host dal suo boot. La linea si muove appena e non segue il carico, mentre container.cpu.usage.total sì. Aggiorna l'agent: dalla sua seconda lettura in poi invia la CPU usata da ogni container in ogni intervallo di 30 secondi. Le letture già salvate restano com'erano.

Le metriche arrivano, ma i log dei container no

Molto probabilmente i tuoi container usano un driver di log diverso da json-file. Controlla quali file osserva l'agent e quale driver usa un container:

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

Se l'agent segnala no files match the configured criteria, passa i container a json-file e ricreali, come mostra I log dei container richiedono il driver json-file.

I log finiscono su un altro host, oppure l'host si chiama docker-host

Il nome dell'host viene da DOCKER_HOST_NAME. Un agent avviato senza di esso riporta docker-host, quindi ogni host configurato così sembra lo stesso; se cambi il nome in seguito, Status200 registra un secondo host, che riceve i nuovi dati. Imposta DOCKER_HOST_NAME su un nome proprio per ogni host e ricrea l'agent. Per verificare il nome che riporta l'agent:

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

Passaggi successivi