Agente Podman
O agente Podman do Status200 é um contêiner que você executa em um host Podman. Ele lê as estatísticas e os arquivos de log de cada contêiner do host e os envia ao Status200, onde o host aparece com os contêineres, as métricas e os logs dele. Um segundo contêiner, o agente de IA do Podman, permite que a Status200 AI investigue o host. Os monitores de Podman alertam com base no que o agente envia.
podman run ou Podman Compose.O que o agente coletaMétricas, logs e um inventário de cada contêiner.Logs de contêineres precisam de k8s-fileO Podman grava os logs no journald, a menos que você mude.Solução de problemasLoops de reinício, métricas faltando, logs faltando.Como funciona
O agente é um OpenTelemetry Collector com a configuração do Status200 embutida. Pelo socket de API compatível com Docker do Podman, ele lê as estatísticas de cada contêiner a cada 30 segundos e lista cada contêiner, imagem, rede e volume a cada 5 minutos. Ele acompanha os arquivos de log dos contêineres e envia tudo para a sua URL do Status200 via OTLP, com a chave de ingestão que você fornece.
Dois contêineres no seu host Podman
O host se registra com os primeiros dados, com o nome que você define em PODMAN_HOST_NAME. O agente de IA é opcional: deixe-o de fora e o coletor funciona do mesmo jeito.
Antes de começar
- Podman 4.0 ou posterior e acesso root no host.
- O socket de API do Podman em
/run/podman/podman.sock. Ative-o comsudo systemctl enable --now podman.socket. - Uma chave de ingestão. Crie uma em Configurações do projeto → Telemetria e APM → Chaves de ingestão e copie o valor.
- HTTPS de saída do host para a sua URL do Status200.
- Para logs de contêineres, contêineres que usam o driver de log
k8s-file. O Podman rootful grava os logs por padrão nojournald, que o agente não consegue ler. Veja Logs de contêineres precisam do driver de log k8s-file.
Instale o agente
Inicie o agente
Substitua
YOUR_STATUS200_URLpela sua URL do Status200,YOUR_TELEMETRY_INGESTION_TOKENpela chave de ingestão emy-podman-hostpor um nome para este host, comoprod-podman-01. O nome é como o host aparece no Status200, então mantenha-o estável: um nome novo registra um host novo.Podman CLI
podman run -d \ --name status200-podman-agent \ --user 0:0 \ --restart unless-stopped \ -v /run/podman/podman.sock:/run/podman/podman.sock:ro \ -v /var/lib/containers/storage:/var/lib/containers/storage:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e PODMAN_HOST_NAME="my-podman-host" \ status200/podman-agent:releaseDepois inicie o agente de IA ao lado dele, com os mesmos valores. As investigações de IA vêm ativadas por padrão: enquanto a Status200 AI investiga um incidente ou alerta neste host, ela executa comandos
dockersomente leitura pelo agente de IA, contra a API compatível com Docker do Podman, e não altera nada a menos que você permita correções. Para instalar sem investigações de IA, pule este comando.podman run -d \ --name status200-podman-ai-agent \ --user 0:0 \ --restart unless-stopped \ --read-only --tmpfs /tmp \ -v /run/podman/podman.sock:/run/podman/podman.sock:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e STATUS200_AI_AGENT_RESOURCE_TYPE=podman \ -e PODMAN_HOST_NAME="my-podman-host" \ status200/resource-ai-agent:releasePodman Compose
Salve isto como
docker-compose.ymlem uma pasta no host. O segundo serviço é o agente de IA: deixe-o de fora para executar o coletor sem investigações de IA.services: status200-podman-agent: image: status200/podman-agent:release container_name: status200-podman-agent user: "0:0" restart: unless-stopped volumes: - /run/podman/podman.sock:/run/podman/podman.sock:ro - /var/lib/containers/storage:/var/lib/containers/storage:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - PODMAN_HOST_NAME=my-podman-host logging: driver: json-file options: max-size: "10m" max-file: "3" status200-podman-ai-agent: image: status200/resource-ai-agent:release container_name: status200-podman-ai-agent user: "0:0" restart: unless-stopped read_only: true tmpfs: - /tmp volumes: - /run/podman/podman.sock:/run/podman/podman.sock:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - STATUS200_AI_AGENT_RESOURCE_TYPE=podman - PODMAN_HOST_NAME=my-podman-hostInicie-o nessa pasta:
podman compose up -dVerifique se o agente está em execução
podman ps --filter name=status200-podman-agent podman logs -f status200-podman-agentOs logs devem mostrar esta linha assim que o coletor iniciar:
Everything is ready. Begin running and processing data.Encontre o host no Status200
Abra Produtos → Infraestrutura → Podman → Todos os hosts. O host aparece com o
PODMAN_HOST_NAMEdele em cerca de um minuto, com os contêineres, as métricas e os logs dele. O agente de IA aparece como conectado na página Agente de IA do host e no fim da Visão geral dele. A página Topologia do host desenha os seus projetos do Compose, contêineres, imagens, redes e volumes em um único mapa: veja Topologia.
Variáveis de ambiente
| Variável | Obrigatória | Descrição |
|---|---|---|
STATUS200_URL | Sim | A sua URL do Status200, como https://status200.ru ou a sua instância auto-hospedada. Use http:// e a porta dela se a instância for só HTTP. |
STATUS200_SERVICE_TOKEN | Sim | A chave de ingestão de Configurações do projeto → Telemetria e APM → Chaves de ingestão. |
PODMAN_HOST_NAME | Não | O nome do host no Status200. O padrão é podman-host, então dê um nome próprio a cada host. |
DOCKER_API_VERSION | Não | A versão da API do Docker que o agente usa com o socket do Podman. O padrão é 1.44. Reduza-a se o socket informar um máximo mais antigo, ou defina um valor vazio para negociá-la (veja Solução de problemas). |
Para mudar um valor, remova o agente e execute o comando dele de novo (Podman CLI), ou edite docker-compose.yml e execute podman compose up -d (Podman Compose).
O que o agente coleta
| Dados | O que é |
|---|---|
| Métricas de contêineres | CPU (uso, porcentagem, throttling), memória (uso, limite, porcentagem), E/S de rede e de bloco, tempo de atividade, reinícios e número de processos, por contêiner, a cada 30 segundos. |
| Logs de contêineres | stdout e stderr de cada contêiner, a partir do arquivo ctr.log que o driver de log k8s-file grava. |
| Inventário | Todo contêiner em qualquer estado, e toda imagem, rede e volume, a cada 5 minutos. |
As métricas e os logs de cada contêiner são arquivados em um serviço com o nome do contêiner. Cada linha de log recebe uma severidade a partir do nível que ela cita, como [ERROR], level=warn ou {"level":"info"}; uma linha que não cita nenhum fica com a do fluxo dela: stderr é ERROR, stdout é INFO. Linhas que começam com espaço em branco ou com um colchete de fechamento se juntam à linha anterior, então um stack trace chega como um único registro. Os logs do próprio agente ficam de fora.
Monitor de Podman lista cada métrica e o que ela significa.
Logs de contêineres precisam do driver de log k8s-file
O agente acompanha /var/lib/containers/storage/overlay-containers/*/userdata/ctr.log, os arquivos que o driver de log k8s-file do Podman grava (json-file é o mesmo driver no Podman). O driver padrão do Podman rootful é journald, que não deixa arquivo para ler, e o mesmo vale para um driver remoto como syslog. As métricas de um contêiner assim continuam chegando; os logs, não.
Verifique o driver de log de um contêiner e o padrão do Podman:
podman inspect <container> --format '{{.HostConfig.LogConfig.Type}}'
podman info --format '{{.Host.LogDriver}}'Execute um contêiner com k8s-file, ou mude um serviço do Compose para ele:
podman run --log-driver k8s-file --log-opt max-size=100m ... <image>services:
my-app:
image: my-app:latest
logging:
driver: "k8s-file"
options:
max-size: "100m"Ou torne-o o padrão para todo contêiner criado depois, em containers.conf (/etc/containers/containers.conf no modo rootful, ~/.config/containers/containers.conf no modo rootless):
[containers]
log_driver = "k8s-file"
log_size_max = 104857600Depois recrie os contêineres. Um contêiner mantém o driver de log com que foi criado, então reiniciá-lo não basta.
Atualizando o agente
Quando o agente é mais antigo que o seu Status200, um sinal de aviso aparece ao lado de Versão do agente na Visão geral do host. Selecione-o para ver estes comandos.
Podman CLI
podman pull status200/podman-agent:release
podman pull status200/resource-ai-agent:release
podman rm -f status200-podman-agent status200-podman-ai-agentDepois execute de novo os dois comandos podman run de Inicie o agente.
Podman Compose
podman compose pull
podman compose up -dA tag release sempre aponta para a versão mais recente. Para fixar uma versão, use status200/podman-agent:<version>, como status200/podman-agent:10.0.31. A mesma imagem está no GitHub Container Registry como ghcr.io/status200/podman-agent:release.
Desinstalando o agente
Podman CLI
podman rm -f status200-podman-agent
podman rm -f status200-podman-ai-agentPodman Compose
podman compose downO host continua no Status200 com os dados que enviou. Se não precisar mais dele, exclua-o com Excluir host no menu dele.
Agente de IA
Os comandos e o arquivo do Compose acima, o install.sh do agente Podman e o docker-compose.yml no [diretório PodmanAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/PodmanAgent) dele executam todos o Agente de IA do Podman: um segundo contêiner, status200-podman-ai-agent (imagem status200/resource-ai-agent:release), que executa os comandos somente leitura que a Status200 AI pede enquanto investiga um incidente ou alerta neste host — pela API compatível com Docker do Podman, com a CLI docker: docker ps -a, docker logs --tail 200 web, docker container inspect web — e, só se você permitir, aplica correções como reiniciar um contêiner específico. Ele lê os mesmos STATUS200_URL, STATUS200_SERVICE_TOKEN e PODMAN_HOST_NAME que o coletor, então atende exatamente este host, e aparece na página Agente de IA do host no Status200.
- As investigações de IA vêm ativadas por padrão. Assim que o agente se conecta, a Status200 AI investiga com ele os incidentes e alertas deste host, e a Visão geral do host mostra o status do agente. Para parar, defina
STATUS200_AI_INVESTIGATION=falseonde o agente é executado (Alterar, em O que a IA pode fazer na página do agente de IA, mostra como), ou deixe o agente de fora. - Ele é somente leitura, a menos que você o inicie com
STATUS200_AI_ALLOW_WRITES=true;STATUS200_AI_WRITE_TARGETS(por exemploweb-*,api-*) limita quais contêineres uma correção pode tocar. Inicie-o também comSTATUS200_AI_FIXES, para dizer como as correções são executadas —ask-for-approval(uma pessoa aprova cada uma),automaticoubypass-approval— e a página do agente de IA mostra isso somente para leitura (O que a IA pode fazer, definido pelo agente). - Ele precisa do mesmo socket que o coletor e é executado como root com ele montado, porque o socket pertence ao root — e, no Podman rootful, quem pode usar o socket é root neste host, com
:roou não. O limite é a política de comandos do agente: ele nunca executaexec,run,rmouprune, e nunca altera a si mesmo, o coletor ou qualquer coisa emSTATUS200_AI_PROTECTED_TARGETS(globs de nomes de contêineres). install.sh --no-ai-agento deixa de fora;podman rm -f status200-podman-ai-agento remove. Atualize-o como o coletor:podman pull status200/resource-ai-agent:release, remova-o e inicie-o de novo.
O que ele pode executar, como as correções funcionam e como solucionar problemas: Infrastructure AI Agents.
Solução de problemas
O agente reinicia com "client version is too new"
Os logs do agente mostram:
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.41Um servidor de API do Docker que impõe uma versão máxima de cliente recusa uma mais nova, então o receiver nunca inicia e o coletor sai junto com ele. Verifique a versão da API que o socket do Podman informa:
curl -s -o /dev/null -D - --unix-socket /run/podman/podman.sock http://localhost/_ping | grep -i '^api-version'Depois adicione -e DOCKER_API_VERSION=1.41 (ou o valor que você obteve) a podman run, ou defina DOCKER_API_VERSION no Compose. Servidores mais novos continuam atendendo versões mais antigas da API, então a configuração continua válida depois de uma atualização.
Prefere não procurar o número? Defina DOCKER_API_VERSION como a string vazia. O agente então negocia a versão com o socket (um HEAD /_ping e depois o máximo que o socket informa) em vez de fixar uma:
podman run -d ... -e DOCKER_API_VERSION= ...Permissão negada no socket do Podman, ou nenhum socket
O agente precisa ser executado como root para ler /run/podman/podman.sock. Verifique se --user 0:0 está no seu comando podman run, ou user: "0:0" no Compose, e se o socket está ativo: sudo systemctl enable --now podman.socket. O Podman rootless tem o socket em /run/user/<uid>/podman/podman.sock (systemctl --user enable --now podman.socket): monte esse caminho no lugar de /run/podman/podman.sock.
O host aparece como desconectado
- Verifique se o agente está em execução:
podman ps --filter name=status200-podman-agent - Procure erros nos logs dele:
podman logs status200-podman-agent 2>&1 | grep -i error - Verifique
STATUS200_URLeSTATUS200_SERVICE_TOKEN: a chave precisa ser uma chave de ingestão válida que não foi desativada. - Verifique se o host consegue alcançar a sua URL do Status200 pela rede.
Nenhuma métrica aparece
- Verifique se o socket do Podman está montado no agente. A imagem dele não tem shell, então olhe a partir de um contêiner descartável que compartilhe as montagens dele:
podman run --rm --volumes-from status200-podman-agent alpine:3.19 ls -la /run/podman/podman.sock - Procure erros de exportação nos logs dele:
podman logs status200-podman-agent 2>&1 | tail -100 - Verifique se a chave de ingestão é válida e não expirou.
A CPU dos contêineres é uma linha plana
Um agente mais antigo envia o valor de CPU calculado pelo próprio receiver docker_stats, que precisa da leitura de estatísticas anterior à atual, e a API compatível com Docker do Podman nunca a envia: o receiver divide toda a CPU que um contêiner usou desde que iniciou por toda a CPU que o host usou desde que foi ligado. A linha mal se move e não acompanha a carga, enquanto container.cpu.usage.total acompanha. Atualize o agente: a partir da segunda leitura, ele envia a CPU que cada contêiner usou em cada intervalo de 30 segundos. As leituras já armazenadas ficam como estavam.
As métricas chegam, mas os logs dos contêineres não
Os seus contêineres provavelmente usam journald, o driver de log padrão do Podman. Verifique quais arquivos o agente observa e qual driver um contêiner usa:
podman logs status200-podman-agent 2>&1 | grep -E "Started watching file|no files match"
podman inspect <container> --format '{{.HostConfig.LogConfig.Type}}'Se o agente informar no files match the configured criteria, mude os contêineres para k8s-file e recrie-os, como mostra Logs de contêineres precisam do driver de log k8s-file.
Os logs estão em outro host, ou o host se chama podman-host
O nome do host vem de PODMAN_HOST_NAME. Um agente iniciado sem ele informa podman-host, então todo host configurado assim parece ser o mesmo; mude o nome depois e o Status200 registra um segundo host, que passa a ter os dados novos. Defina PODMAN_HOST_NAME com um nome próprio em cada host e recrie o agente. Para verificar o nome que o agente informa:
podman inspect status200-podman-agent --format '{{range .Config.Env}}{{println .}}{{end}}' | grep PODMAN_HOST_NAME