Node Exporter: métricas do sistema Linux

Node Exporter é o exporter padrão do Prometheus para métricas do sistema operacional Linux, CPU, memória, disco, rede, load average, filesystem. É executado como um processo leve (~50 MB RAM) e expõe mais de 1000 métricas via HTTP. O dashboard ID 1860 do Grafana visualiza tudo com zero configuração adicional.

Instalar Node Exporter (sem Docker)

Para monitorar o host, Node Exporter deve rodar diretamente na VPS (não em container) para ter acesso completo ao sistema:

bash
# Baixar e instalar Node Exporter
NODE_EXPORTER_VERSION="1.8.2"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
mv node_exporter-*/node_exporter /usr/local/bin/
rm -rf node_exporter-*

# Criar usuário dedicado (sem shell, sem home)
useradd --no-create-home --shell /bin/false node_exporter

# Criar serviço systemd
cat > /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
    --web.listen-address=127.0.0.1:9100 \
    --collector.systemd \
    --collector.processes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now node_exporter

# Verificar
curl http://localhost:9100/metrics | head -20

Node Exporter em Docker (com acesso ao host)

Para usar com Docker Compose, monte os filesystems do host:

yaml
services:
  node_exporter:
    image: prom/node-exporter:latest
    restart: always
    pid: host              # acesso ao namespace de processos do host
    network_mode: host     # acesso à rede do host (melhor para métricas de rede)
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--web.listen-address=127.0.0.1:9100'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)'
      - '--collector.systemd'
      - '--no-collector.ipvs'

Collectors mais úteis

Node Exporter tem dezenas de collectors, habilite apenas os necessários:

bash
# Collectors habilitados por padrão (principais):
# cpu           — uso de CPU por modo (user, system, idle, iowait)
# diskstats     — I/O de disco (reads, writes, latência)
# filesystem    — uso de filesystem (available, used, total)
# loadavg       — load average (1m, 5m, 15m)
# meminfo       — memória (total, available, cached, buffers)
# netdev        — tráfego de rede (bytes, packets, errors)
# netstat       — estatísticas TCP/UDP
# stat          — interrupções, context switches
# time          — tempo do sistema
# uname         — informações do kernel

# Collectors extras úteis (não habilitados por padrão):
--collector.systemd       # status de serviços systemd
--collector.processes     # número de processos por estado
--collector.tcpstat       # estado das conexões TCP
--collector.interrupts    # interrupções por CPU

# Desabilitar collectors desnecessários:
--no-collector.arp
--no-collector.bcache
--no-collector.bonding

Queries PromQL para Node Exporter

As queries mais úteis para dashboards e alertas:

promql
# CPU: uso total (%) — média de todos os cores
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# CPU por modo (útil para identificar iowait alto)
irate(node_cpu_seconds_total[5m])

# Memória disponível (%)
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# Disco: espaço usado (%)
100 - ((node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} /
        node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100)

# Disco: I/O por segundo (reads e writes)
irate(node_disk_reads_completed_total[5m])
irate(node_disk_writes_completed_total[5m])

# Rede: tráfego recebido/enviado (bytes/s)
irate(node_network_receive_bytes_total{device!="lo"}[5m])
irate(node_network_transmit_bytes_total{device!="lo"}[5m])

# Tempo de uptime (dias)
(time() - node_boot_time_seconds) / 86400

Alertas essenciais para Node Exporter

Regras de alerta básicas para infraestrutura saudável:

yaml
# prometheus/alerts/node.yml
groups:
  - name: node_alerts
    rules:
      - alert: HighCPU
        expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU alta em {{ $labels.instance }}"
          description: "CPU em {{ $value | printf "%.1f" }}% por mais de 5 minutos"

      - alert: LowDiskSpace
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Disco crítico em {{ $labels.instance }}"
          description: "Apenas {{ $value | printf "%.1f" }}% de disco livre"

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Memória alta em {{ $labels.instance }}"

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Idealmente fora (instalado no host via systemd) para ter acesso completo ao sistema sem os workarounds de volumes e network_mode: host. Se a VPS é gerenciada exclusivamente via Docker Compose: use a configuração com pid: host e network_mode: host para equivalência.

Habilite --collector.systemd. Isso expõe node_systemd_unit_state{name="nginx.service",state="active"}. Crie alerta: node_systemd_unit_state{name="nginx.service",state="active"} == 0 para alertar quando o Nginx parar.

iowait é o tempo que a CPU passa esperando operações de I/O (disco). Alto iowait (>20%) indica gargalo de I/O: disco lento, muitas escritas simultâneas, ou aplicação fazendo I/O síncrono em excesso. Verifique com iostat -x 1 para identificar qual processo está gerando o I/O.

Não por padrão. Ele expõe métricas agregadas (porcentagens, contadores), não conteúdo de arquivos ou dados de aplicação. O endpoint /metrics é público por design (sem autenticação), por isso recomenda-se bind no loopback e acesso via Prometheus interno, nunca exposto diretamente na internet.

NaN em métricas de rate/irate: normal nos primeiros 5 minutos após início (não há histórico suficiente). Métricas ausentes: verifique se o collector está habilitado (--collector.NOME) e se o Node Exporter tem permissão para ler o arquivo de sistema correspondente em /proc ou /sys.