Sistema de Monitoramento Nativo em Nuvem com Prometheus e Grafana

Visão Geral do Prometheus

Prometheus é um sistema de monitoramento e alerta de código aberto, originalmente desenvolvido pela SoundCloud, que agora faz parte da Cloud Native Computing Foundation (CNCF). Ele coleta métricas de alvos configurados em intervalos regulares, armazena os dados em séries temporais e permite consultas poderosas usando a linguagem PromQL.

Principais características:

  • Modelo de dados multidimensional (séries temporais identificadas por nome da métrica e pares chave/valor)
  • Linguagem de consulta flexível (PromQL)
  • Coleta de dados via pull sobre HTTP
  • Monitoramento autônomo sem dependência de armazenamento distribuído
  • Suporte a alertas via Alertmanager

Arquitetura do Prometheus

O ecossistema Prometheus inclui os seguintes componentes principais:

  • Pormetheus Server: responsável pela coleta e armazenamento das métricas.
  • Grafana: ferramenta de visualização de dados, usada para criar dashboards.
  • Alertmanager: gerencia alertas enviados pelo Prometheus, tratando deduplicação, agrupamento e roteamento para diferentes canais (e-mail, Slack, etc.).
  • Node Exporter: coleta métricas do sistema operacional (CPU, memória, disco, rede).
  • Outros exporters específicos (MySQL, Nginx, etc.).

Instalação Manual

Ambiente

  • Prometheus: coleta e armazena dados
  • Grafana: exibição gráfica
  • Alertmanager: recebe alertas do Prometheus
  • node_exporter: coleta métricas do sistema

Instalação do Prometheus

# Baixar o binário mais recente do Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz

# Extrair
tar -xvf prometheus-3.5.0.linux-amd64.tar.gz

# Mover para diretório padrão
mkdir -p /opt/monitoring
mv prometheus-3.5.0.linux-amd64 /opt/monitoring/prometheus

# Criar usuário dedicado
useradd -M -s /usr/sbin/nologin prometheus

# Ajustar permissões
chown -R prometheus:prometheus /opt/monitoring

# Criar serviço systemd
cat > /etc/systemd/system/prometheus.service << "EOF"
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/opt/monitoring/prometheus/prometheus \
  --config.file=/opt/monitoring/prometheus/prometheus.yml \
  --storage.tsdb.path=/opt/monitoring/prometheus/data \
  --storage.tsdb.retention.time=60d \
  --web.enable-lifecycle

[Install]
WantedBy=multi-user.target
EOF

# Iniciar e habilitar
systemctl daemon-reload
systemctl start prometheus.service
systemctl enable prometheus.service

# Verificar status
systemctl status prometheus.service

Após a instalação, acesse http://192.168.11.61:9090 para ver a interface web do Prometheus.

Instalação do Alertmanager

# Download do Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz

tar -xvf alertmanager-0.28.1.linux-amd64.tar.gz
mv alertmanager-0.28.1.linux-amd64 /opt/monitoring/alertmanager

chown -R prometheus:prometheus /opt/monitoring

# Serviço systemd
cat > /etc/systemd/system/alertmanager.service << "EOF"
[Unit]
Description=Alert Manager
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitoring/alertmanager/alertmanager \
  --config.file=/opt/monitoring/alertmanager/alertmanager.yml \
  --storage.path=/opt/monitoring/alertmanager/data
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start alertmanager.service
systemctl enable alertmanager.service

Configure o Prometheus para enviar alertas ao Alertmanager adicionando no prometheus.yml:

alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093']

Crie um arquivo de regras de alerta (alert.yml) dentro do diretório do Prometheus:

groups:
- name: example
  rules:
  - alert: ServiceDown
    expr: up == 0
    for: 30s
    labels:
      severity: critical
    annotations:
      summary: "Service {{ $labels.instance }} is down"
      description: "{{ $labels.job }} has been down for more than 30 seconds."

Instalação do Grafana

# Baixar e extrair
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3.linux-amd64.tar.gz
tar -zxvf grafana-enterprise-9.4.3.linux-amd64.tar.gz
mv grafana-9.4.3 /opt/monitoring/grafana

chown -R prometheus:prometheus /opt/monitoring

# Serviço systemd
cat > /etc/systemd/system/grafana-server.service << "EOF"
[Unit]
Description=Grafana Server
Documentation=http://docs.grafana.org

[Service]
Type=simple
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/opt/monitoring/grafana/bin/grafana-server \
  --config=/opt/monitoring/grafana/conf/defaults.ini \
  --homepath=/opt/monitoring/grafana

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start grafana-server.service
systemctl enable grafana-server.service

Acesse http://192.168.11.61:3000 e faça login com admin/admin. Altere a senha no primeiro acesso.

Instalação do Node Exporter

# Download
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz

tar xvf node_exporter-1.5.0.linux-amd64.tar.gz
mv node_exporter-1.5.0.linux-amd64 /opt/monitoring/node_exporter

chown -R prometheus:prometheus /opt/monitoring/node_exporter

# Serviço systemd
cat > /etc/systemd/system/node_exporter.service << "EOF"
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/monitoring/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start node_exporter.service
systemctl enable node_exporter.service

Adicione o Node Exporter como alvo no prometheus.yml:

scrape_configs:
  - job_name: 'node-exporter'
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9100']
      labels:
        instance: 'Servidor Prometheus'

Recarregue a configuração do Prometheus:

curl -X POST http://localhost:9090/-/reload

Instalação via Docker Compose

Ambiente

  • Host: 192.168.11.61, Ubuntu 20.04, Docker 23.0.1, Docker Compose 1.29.2

Preparação

# Criar diretórios para dados persistentes
mkdir -p /data/docker-prometheus/{grafana,prometheus,alertmanager}
cd /data/docker-prometheus

Arquivos de Configuração

alertmanager/config.yml:

global:
  smtp_smarthost: 'smtp.163.com:465'
  smtp_from: 'cdring@163.com'
  smtp_auth_username: 'cdring@163.com'
  smtp_auth_password: 'sua-senha-aqui'
  smtp_require_tls: false

route:
  group_by: ['alertname']
  group_wait: 10s
  repeat_interval: 10m
  receiver: email

receivers:
- name: 'email'
  email_configs:
  - to: 'cdring@163.com'

inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']

grafana/config.monitoring:

GF_SECURITY_ADMIN_PASSWORD=senha_segura
GF_USERS_ALLOW_SIGN_UP=false

prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets: ['alertmanager:9093']

rule_files:
  - "alert.yml"

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 15s
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'cadvisor'
    scrape_interval: 15s
    static_configs:
    - targets: ['cadvisor:8080']
      labels:
        instance: 'Servidor Prometheus'

  - job_name: 'node-exporter'
    scrape_interval: 15s
    static_configs:
    - targets: ['node_exporter:9100']
      labels:
        instance: 'Servidor Prometheus'

prometheus/alert.yml:

groups:
- name: alerts
  rules:
  - alert: ServicoIndisponivel
    expr: up == 0
    for: 30s
    labels:
      severity: critical
    annotations:
      summary: "Instância {{ $labels.instance }} fora do ar"
      description: "{{ $labels.job }} está indisponível por mais de 30 segundos."

docker-compose.yaml:

version: '3.3'

volumes:
  prometheus_data: {}
  grafana_data: {}

networks:
  monitoring:
    driver: bridge

services:
  prometheus:
    image: prom/prometheus:v2.37.6
    container_name: prometheus
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./prometheus/:/etc/prometheus/
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
      - '--storage.tsdb.retention.time=30d'
    networks:
      - monitoring
    ports:
      - 9090:9090
    depends_on:
      - cadvisor

  alertmanager:
    image: prom/alertmanager:v0.25.0
    container_name: alertmanager
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./alertmanager/:/etc/alertmanager/
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    networks:
      - monitoring
    ports:
      - 9093:9093

  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    restart: always
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      - monitoring
    expose:
      - "8080"

  node_exporter:
    image: prom/node-exporter:v1.5.0
    container_name: node-exporter
    restart: always
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker)($$|/)'
    networks:
      - monitoring
    ports:
      - 9100:9100

  grafana:
    image: grafana/grafana:9.4.3
    container_name: grafana
    restart: always
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/:/etc/grafana/
    env_file:
      - ./grafana/config.monitoring
    networks:
      - monitoring
    ports:
      - 3000:3000
    depends_on:
      - prometheus

Executar o stack

cd /data/docker-prometheus
docker-compose up -d
docker-compose ps

Serviços disponíveis:

  • Prometheus: http://192.168.11.61:9090
  • Alertmanager: http://192.168.11.61:9093
  • Grafana: http://192.168.11.61:3000 (admin/senha definida no config)
  • Node Exporter: http://192.168.11.61:9100/metrics

Configuração do Grafana

Após o login, adicione uma fonte de dados Prometheus:

  1. Clique no ícone de engrenagem (Configurações) → Data Sources → Add data source
  2. Escolha Prometheus
  3. Defina a URL: http://localhost:9090 (ou o IP do container se estiver usando Docker)
  4. Salve e teste

Crie dashboards manualmente ou importe dashboards prontos do Grafana Dashboards. Por exemplo, pesquise por "Node Exporter Full" e copie o ID do dashboard para importar.

Monitoramento de Servidores com Node Exporter

Para monitorar servidores remotos, instale o Node Exporter em cada máquina (binário ou Docker) e adicione o alvo no Prometheus.

Exemplo para servidor remoto (192.168.11.62):

scrape_configs:
  - job_name: 'node-exporter-remoto'
    scrape_interval: 15s
    static_configs:
    - targets: ['192.168.11.62:9100']
      labels:
        instance: 'Servidor Teste'

Métricas disponíveis:

  • CPU: node_cpu_seconds_total
  • Memória: node_memory_MemTotal_bytes, node_memory_MemAvailable_bytes
  • Disco: node_disk_io_time_seconds_total
  • Sistema de arquivos: node_filesystem_size_bytes, node_filesystem_avail_bytes
  • Rede: node_network_receive_bytes_total

Para criar alertas, utilize regras como:

- alert: DiscoCheio
  expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Disco quase cheio em {{ $labels.instance }}"

PromQL Básico

PromQL é a linguagem de consulta do Prometheus. Tipos de dados:

  • Instant vector: conjunto de séries temporais com um único valor no instante da consulta
  • Range vector: conjunto de séries temporais com uma faixa de tempo
  • Scalar: valor numérico simples
  • String: cadeia de caracteres

Filtros por label: {job="node-exporter", instance="localhost:9100"}

Operadores binários: +, -, *, /, %, ==, !=, >, <, etc.

Funções built-in: rate(), irate(), increase(), avg(), sum(), topk(), etc.

Exemplo: rate(node_network_receive_bytes_total[5m]) retorna a taxa média de recebimento de bytes nos últimos 5 minutos.

Tags: Prometheus Grafana alertmanager Node Exporter Docker

Publicado em 7-3 03:07