Ir para o conteúdo
Monitor de Podman

Monitor de Podman

Ver como Markdown

Um monitor de Podman acompanha os contêineres de um host Podman e avisa você quando um contêiner esquenta demais, fica sem memória ou não para de reiniciar. Ele lê as métricas que o agente Podman do Status200 envia do host, então nada é sondado de fora: instale o agente e depois crie o monitor a partir de um modelo ou da sua própria consulta.

Como funciona

O agente Podman do Status200 é executado como contêiner no host. A cada 30 segundos, ele lê as estatísticas dos contêineres pelo socket de API compatível com Docker do Podman, acompanha os arquivos de log dos contêineres e envia os dois para o Status200 via OTLP. Os primeiros dados de um host o registram no Status200.

Um monitor de Podman está vinculado a um host. A cada minuto, ele executa sua consulta sobre as métricas dos contêineres desse host e compara o resultado com seus critérios.

flowchart TB subgraph host["Seu host Podman"] direction LR containers["Contêineres"] --> agent["Agente Podman do Status200"] end agent -->|"métricas e logs via OTLP"| oneuptime["Status200"] oneuptime -->|"primeiros dados"| registered["Host Podman registrado"] oneuptime --> monitor["Monitor de Podman"] monitor -->|"a cada minuto"| criteria{"Critérios atendidos?"} criteria -->|"sim"| incident["Incidente<br/>ou alerta"] criteria -->|"não"| online["Monitor online"]

De um host Podman ao incidente

Antes de começar

  • Instale o agente Podman no host. O guia do agente Podman cobre a instalação, a atualização e a verificação. O agente precisa do socket de API do Podman em /run/podman/podman.sock.
  • Verifique se o host está registrado. Ele aparece em Produtos → Infraestrutura → Podman → Todos os hosts, com o nome do PODMAN_HOST_NAME do agente, assim que chegam os primeiros dados.
  • Para os logs dos contêineres, execute os contêineres com o driver de log k8s-file. Consulte Requisito do driver de log.

Criar um monitor de Podman

  1. Começar um monitor novo

    Acesse Monitores e clique em Criar monitor.

  2. Escolher Podman Container

    Em Tipo de monitor, clique em Mais tipos de monitor e escolha Podman Container em Infraestrutura, ou digite podman na caixa de busca. Informe um Nome – ele é usado nos títulos de incidentes e alertas – e clique em Próximo.

  3. Escolher o host

    Em Podman Monitor Configuration, escolha o host em Podman Host. Todo host que enviou dados está na lista.

  4. Escolher o que monitorar

    Escolha uma das três abas:

    • Quick Setup – clique em um modelo. Ele define a métrica, a agregação, o intervalo de tempo e os limites, e substitui os critérios abaixo pelos dele. Você ainda pode mudar o Intervalo de tempo.
    • Custom Metric – escolha uma métrica em Podman Metric e depois defina Agregação e Intervalo de tempo. Nome do contêiner e Imagem do contêiner a restringem a alguns contêineres.
    • Avançado – monte você mesmo consultas e fórmulas em Selecionar Métricas. Use Group by resource.container.name para avaliar cada contêiner separadamente.
  5. Revisar os critérios

    Abra cada critério em Critérios do monitor e confira sua Métrica, Agregação, Condição e Threshold. Um modelo os preenche. Com Custom Metric ou Avançado, o monitor começa com os critérios padrão, que só percebem uma métrica caindo para zero, então defina o seu próprio limite.

  6. Criar o monitor

    Clique em Criar monitor. O Status200 abre a página do monitor e o avalia a cada minuto. Os incidentes e alertas que ele gera também aparecem nas páginas Incidentes e Alertas do host.

Dica

Para configurar vários modelos de uma vez, abra o host em Produtos → Infraestrutura → Podman e vá para Recommendations. Escolha os modelos que quiser, escolha quem é acionado, e o Status200 cria um monitor por modelo.

Configurações do monitor

CampoAbaO que faz
Podman HostTodasObrigatório. Restringe cada consulta ao resource.host.name do host. O Status200 também adiciona resource.container.runtime = podman a cada consulta.
Podman MetricCustom MetricUma métrica do catálogo do agente, agrupada em CPU, memória, rede, E/S de bloco e contêiner.
Nome do contêinerCustom Metric, AvançadoOpcional. Correspondência exata com resource.container.name, por exemplo my-container.
Imagem do contêinerCustom Metric, AvançadoOpcional. Correspondência exata com resource.container.image.name, por exemplo nginx:latest.
AgregaçãoCustom MetricComo as amostras são combinadas: Média, Máximo, Mínimo, Soma ou Contagem. Começa na agregação usual da métrica.
Intervalo de tempoTodasA janela móvel que a consulta lê, de Past 1 Minute a Past 365 Days. Um monitor novo começa em Past 1 Minute; os modelos definem a sua.
Selecionar MétricasAvançadoO construtor de consultas: Métrica, Aggregate by, Filter by attributes, Group by, além de Adicionar métrica e Adicionar fórmula para combinar consultas.

Modelos de alerta prontos

Quick Setup oferece cinco modelos. Cada um monta um monitor completo: uma consulta agrupada por resource.container.name, um critério que dispara e outro que se recupera. Cada contêiner é avaliado separadamente e recebe seu próprio incidente e seu próprio alerta. Os limites são pontos de partida que você pode editar.

Um critério só dispara quando a condição vale em todos os minutos da sua janela, e se recupera 10% além do limite para que um valor oscilando na linha não fique mudando de estado.

ModeloGravidadeMonitoraDispara quandoRecupera quando
High Container CPU UsageWarningcontainer.cpu.utilization, Avg por contêiner, últimos 5 minutosAcima de 80 (% de um núcleo)Em 72 ou menos
High Container Memory UsageWarningcontainer.memory.percent, Avg por contêiner, últimos 5 minutosAcima de 85%Em 76,5% ou menos
High Container Restart CountCríticocontainer.restarts, Max por contêiner, últimos 5 minutosAcima de 5 reinícios no total4,5 ou menos
High Container Process CountWarningcontainer.pids.count, Max por contêiner, últimos 5 minutosAcima de 500Em 450 ou menos
Container Restarted (Low Uptime)Críticocontainer.uptime, Min por contêiner, último 1 minutoAbaixo de 120 segundosEm 132 segundos ou mais

Gravidade é o rótulo que o seletor mostra. O incidente e o alerta que um modelo cria começam com a gravidade de incidente e de alerta mais alta do seu projeto; altere-as nos critérios.

Os dois modelos de porcentagem usam Média: as métricas deles já são porcentagens por contêiner, então a média de um minuto é a leitura sustentada. A contagem de reinícios e a contagem de processos usam Máximo, em que uma única amostra acima do limite já é o sinal.

Nota
container.cpu.utilization é o número que o podman stats imprime, em média no intervalo de 30 segundos do agente: 100% é um núcleo de CPU inteiro, não toda a cota de CPU do contêiner. Um contêiner com vários núcleos marca bem acima de 100 quando está saudável, então aumente o limite para esses.

Nota
container.restarts é um total acumulado mantido pelo Podman, não uma contagem de reinícios na janela. Por isso High Container Restart Count fica aberto até o contêiner ser recriado, o que zera a contagem.

Cuidado
container.uptime só existe para contêineres em execução. Um contêiner que para e continua parado não envia dados, então Container Restarted (Low Uptime) pega reinícios e novas implantações, não um desligamento permanente. Um contêiner feito para rodar menos de dois minutos fica em estado de alerta durante toda a vida.

Não há modelo de limitação de CPU. As métricas de limitação que o agente coleta só crescem, e um alerta de "limitado alguma vez" dispararia uma vez e nunca se resolveria. As duas continuam sendo coletadas, então você pode mostrá-las em gráficos.

Métricas coletadas

O agente usa o receptor docker_stats do OpenTelemetry apontado para o socket compatível com Docker do Podman, /run/podman/podman.sock, a cada 30 segundos. As métricas de cada contêiner trazem sua identidade como atributos de recurso: resource.container.name, resource.container.image.name, resource.container.id, resource.container.runtime (podman) e resource.host.name.

CPU

MétricaDescrição
container.cpu.utilizationCPU usada pelo contêiner em cada intervalo de 30 segundos, em que 100% é um núcleo de CPU inteiro.
container.cpu.usage.totalTempo de CPU usado desde que o contêiner iniciou, em nanossegundos. Um contador de toda a vida útil.
container.cpu.throttling_data.throttled_timeNanossegundos em que o contêiner foi limitado pelo seu limite de CPU. Um contador de toda a vida útil.
container.cpu.throttling_data.throttled_periodsPeríodos de limitação desde que o contêiner iniciou. Um contador de toda a vida útil.

Memória

MétricaDescrição
container.memory.usage.totalMemória em uso, em bytes.
container.memory.usage.limitLimite de memória, em bytes.
container.memory.percentUso de memória como porcentagem do limite do contêiner, ou da memória do host quando o contêiner não tem limite.

Rede

MétricaDescrição
container.network.io.usage.rx_bytesBytes recebidos. Um contador de toda a vida útil.
container.network.io.usage.tx_bytesBytes enviados. Um contador de toda a vida útil.

E/S de bloco

MétricaDescrição
container.blockio.io_service_bytes_recursive.readBytes lidos de dispositivos de bloco.
container.blockio.io_service_bytes_recursive.writeBytes gravados em dispositivos de bloco.

Contêiner

MétricaDescrição
container.uptimeSegundos desde que o contêiner iniciou. Só contêineres em execução a informam.
container.restartsQuantas vezes o contêiner reiniciou. Um total acumulado.
container.pids.countTarefas no contêiner. O controlador pids do cgroup conta threads além de processos.

A lista Podman Metric também oferece container.cpu.usage.percpu, container.memory.rss, container.memory.cache e os contadores de pacotes de rede. A configuração do agente distribuída não os ativa, então confira a página Métricas do host antes de depender deles. container.cpu.throttling_data.throttled_periods não está na lista; consulte-a em Avançado.

Critérios de monitoramento

Um critério compara uma das consultas ou fórmulas do monitor com um limite. Os critérios de um monitor de Podman não têm Tipo de filtro: cada regra verifica o valor da métrica, com estes campos.

CampoO que faz
MétricaA consulta ou fórmula a verificar, pelo nome da variável.
AgregaçãoComo os valores da janela viram uma única resposta: Média, Soma, Maximum Value, Minimum Value, All Values (todos os valores precisam corresponder, na janela inteira) ou Any Value (basta um).
CondiçãoMaior que, Menor que, Maior ou igual a, Menor ou igual a ou Igual a – ou uma condição de anomalia: Anomalously High, Anomalously Low ou Anomalous.
ThresholdO valor com que comparar. Uma lista de unidades fica ao lado quando a métrica tem unidade. Não aparece em condições de anomalia.
SensibilidadeSó condições de anomalia. Baixo (4σ), Médio (3σ, o padrão) ou Alto (2σ).
Janela de linha de baseSó condições de anomalia. 14 dias (o padrão), 28, 60 ou 90 dias de histórico.
Se não houver dadosEm Mais campos. O que acontece quando a janela não tem amostras: Ignore (o padrão), Treat As Zero ou Trigger.

As condições de anomalia comparam cada valor com a mesma hora da semana na linha de base. Elas ficam em um estado "Learning", e não geram nada, até a janela de linha de base ter histórico suficiente.

Cada critério também diz o que fazer quando corresponde: mudar o status do monitor, criar um alerta ou declarar um incidente. Os critérios são verificados de cima para baixo, e o primeiro que corresponde decide.

Critérios padrão

Um monitor que você não cria a partir de um modelo começa com dois critérios:

OrdemCritérioCorresponde quandoEntão
1Check if monitor name is offlineQualquer valor da primeira consulta é 0Marca o monitor como Offline e declara o incidente "monitor name is offline", que se resolve sozinho quando o monitor se recupera.
2Check if monitor name is onlineQualquer valor está acima de 0Marca o monitor como Operacional.
Importante

O silêncio não corresponde a nenhum dos dois critérios: um host que para de enviar dados deixa o monitor como estava. Para ser avisado quando os dados param, defina Se não houver dados como Trigger em um critério. O tempo em que o próprio Status200 não estava recebendo nunca é ausência de dados: uma verificação cuja janela contém esse tempo espera no lugar, como explica Quando o Status200 não recebe dados.

Logs coletados

O agente também acompanha o arquivo ctr.log de cada contêiner e envia cada linha como um registro de log do OpenTelemetry com:

CampoValor
resource.host.nameO host, de PODMAN_HOST_NAME.
resource.container.idO ID completo do contêiner.
resource.container.runtimeSempre podman.
attributes["log.iostream"]stdout ou stderr.
severityText / severityNumberLidos de uma palavra-chave de nível onde houver um nível na linha ([ERROR], app.INFO:, {"level":"warn"}, level=error). Uma linha sem nível recorre ao seu fluxo: stderr é ERROR, stdout é INFO.
bodyA linha que o contêiner escreveu. Linhas que começam com espaço ou com um colchete de fechamento, como as linhas de um stack trace, são unidas à linha anterior.
timeO carimbo de data/hora do Podman para a linha.

Os logs aparecem na página Registros do host e na página de cada contêiner.

Requisito do driver de log

O agente lê os arquivos que o driver de log k8s-file do Podman grava, em /var/lib/containers/storage/overlay-containers/*/userdata/ctr.log. O Podman com root usa journald por padrão, que grava no journal do systemd, então não há arquivo para ler:

DriverO que o agente vê
k8s-file (ou json-file, que o Podman trata da mesma forma)Todas as linhas.
journaldNada: os logs ficam no journal do systemd.
noneNada: os logs são descartados.

As métricas não dependem do driver de log: um host cujos contêineres usam journald continua informando métricas; só a página Registros dele fica vazia.

Verifique o driver de um contêiner e o padrão do Podman:

Bash
podman inspect <container> --format '{{.HostConfig.LogConfig.Type}}'
podman info --format '{{.Host.LogDriver}}'

Mude para k8s-file. O Podman define o driver de log de um contêiner quando o contêiner é criado, então recrie cada contêiner depois da mudança – um reinício mantém o driver antigo.

podman run

Inicie o contêiner com o driver:

Bash
podman run --log-driver k8s-file ... <image>

Para mudar um contêiner existente, remova-o e execute-o de novo:

Bash
podman rm -f <container>
podman run --log-driver k8s-file ... <image>

Podman Compose

Defina o driver em cada serviço:

docker-compose.ymlYAML
services:
  my-app:
    image: my-app:latest
    logging:
      driver: "k8s-file"
      options:
        max-size: "100m"

Depois recrie o serviço:

Bash
podman compose up -d --force-recreate <service>

containers.conf

Torne k8s-file o padrão para todo contêiner criado depois, em /etc/containers/containers.conf (com root) ou ~/.config/containers/containers.conf (sem root):

containers.confTOML
[containers]
log_driver = "k8s-file"

Depois remova e recrie cada contêiner.

Solução de problemas

O host não aparece na lista Podman Host

Os hosts se registram sozinhos a partir dos dados do agente. Verifique se o contêiner do agente está em execução, se o socket de API do Podman está ativado e se o host aparece em Produtos → Infraestrutura → Podman → Todos os hosts. O guia do agente Podman traz as verificações a executar no host.

As métricas chegam, mas a página Registros está vazia

Quase certamente os contêineres estão usando journald. Mude para k8s-file os contêineres cujos logs você quer (consulte Requisito do driver de log) e recrie-os.

O agente registra "no files match the configured criteria"

O agente procura /var/lib/containers/storage/overlay-containers/*/userdata/ctr.log e não encontrou nada. Ou nenhum contêiner do host usa k8s-file, ou a montagem de /var/lib/containers/storage do agente está faltando ou vazia, ou o agente e os contêineres rodam em modos diferentes – contêineres sem root guardam o armazenamento em um lugar que o caminho com root não cobre, e vice-versa.

Os dados chegam com o nome de host errado

O Status200 identifica um host por resource.host.name, que o agente obtém de PODMAN_HOST_NAME. Mudar PODMAN_HOST_NAME depois dos primeiros dados cria um segundo host em vez de renomear o primeiro, e um monitor continua vinculado ao nome com que foi criado.

Um alerta de CPU nunca dispara

Agrupe a consulta por resource.container.name, como faz o modelo High Container CPU Usage, para que cada contêiner seja avaliado separadamente. Uma média de todos os contêineres de um host ocupado é puxada para baixo pelos ociosos. Lembre-se de que 100% significa um núcleo inteiro, então um contêiner que pode usar vários núcleos precisa de um limite mais alto. Se a CPU de um contêiner for uma linha plana, qualquer que seja a carga, o host executa um agente antigo: atualize-o.

O alerta de contagem de reinícios nunca se resolve

container.restarts é um total acumulado, então não volta sozinho para baixo do limite. Corrija a causa e depois recrie o contêiner para zerar a contagem, ou aumente o limite.

Próximos passos