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:
- Clique no ícone de engrenagem (Configurações) → Data Sources → Add data source
- Escolha Prometheus
- Defina a URL:
http://localhost:9090(ou o IP do container se estiver usando Docker) - 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.