Monitoramento
Esta seção descreve as práticas de monitoramento do sistema.
Visão Geral
O monitoramento do sistema é essencial para garantir disponibilidade, performance e identificar problemas antes que afetem os usuários.
Endpoints de Health Check
Backend
# Health check básico
curl http://localhost:8000/api/health/
# Resposta esperada
{
"status": "healthy",
"database": "connected",
"redis": "connected",
"minio": "connected"
}
Frontend
curl http://localhost:9501/
# Deve retornar status 200
MinIO
curl http://localhost:9000/minio/health/live
# Deve retornar status 200
Monitoramento de Containers
Status dos Containers
# Verificar status de todos os containers
docker-compose ps
# Output esperado - todos com status "Up"
NAME STATUS
backend Up
celery-worker Up
celery-worker-emails Up
db Up
frontend Up
minio Up
redis Up
Recursos (CPU/Memória)
# Monitorar recursos em tempo real
docker stats
# Snapshot único
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Logs
# Logs de todos os serviços
docker-compose logs -f
# Logs de um serviço específico
docker-compose logs -f backend
# Últimas 100 linhas
docker-compose logs --tail=100 backend
# Logs desde uma data específica
docker-compose logs --since="2024-01-01" backend
Monitoramento do Banco de Dados
Conexões Ativas
docker-compose exec db psql -U postgres -d empreendedorismo -c "
SELECT count(*) as conexoes_ativas
FROM pg_stat_activity
WHERE state = 'active';"
Tamanho do Banco
docker-compose exec db psql -U postgres -d empreendedorismo -c "
SELECT pg_size_pretty(pg_database_size('empreendedorismo')) as tamanho;"
Tabelas Maiores
docker-compose exec db psql -U postgres -d empreendedorismo -c "
SELECT relname as tabela,
pg_size_pretty(pg_total_relation_size(relid)) as tamanho
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;"
Monitoramento do Celery
Workers Ativos
docker-compose exec backend celery -A core inspect active
Tarefas na Fila
docker-compose exec backend celery -A core inspect reserved
Estatísticas
docker-compose exec backend celery -A core inspect stats
Monitoramento do MinIO
Espaço Utilizado
# Acessar console MinIO
# http://localhost:9001
# Dashboard mostra métricas de uso
Via API
docker-compose exec minio mc admin info local
Alertas Recomendados
Configurar alertas para:
| Métrica | Limite | Ação |
|---|---|---|
| CPU container > 80% | Warning | Investigar |
| CPU container > 95% | Critical | Escalar/Otimizar |
| Memória container > 80% | Warning | Investigar |
| Disco > 80% | Warning | Limpar/Expandir |
| Disco > 90% | Critical | Ação imediata |
| Container down | Critical | Reiniciar/Investigar |
| Tempo de resposta API > 2s | Warning | Otimizar |
| Erros 5xx > 1% | Warning | Investigar logs |
| Fila Celery > 100 tarefas | Warning | Verificar workers |
Script de Monitoramento
Criar /opt/scripts/monitor.sh:
#!/bin/bash
echo "=== Status dos Containers ==="
docker-compose ps
echo ""
echo "=== Uso de Recursos ==="
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
echo ""
echo "=== Espaço em Disco ==="
df -h | grep -E '^/dev'
echo ""
echo "=== Conexões do Banco ==="
docker-compose exec -T db psql -U postgres -d empreendedorismo -c "
SELECT count(*) as conexoes FROM pg_stat_activity WHERE state = 'active';" 2>/dev/null
echo ""
echo "=== Filas Celery ==="
docker-compose exec -T backend celery -A core inspect active 2>/dev/null | head -20
echo ""
echo "=== Últimos Erros (Backend) ==="
docker-compose logs --tail=20 backend 2>&1 | grep -i error || echo "Nenhum erro recente"
Dashboards Recomendados
Para monitoramento avançado, considerar:
-
Grafana + Prometheus
- Métricas de containers
- Dashboards customizados
- Alertas configuráveis
-
Sentry
- Monitoramento de erros
- Performance tracking
- Alertas em tempo real
-
pgAdmin
- Monitoramento do PostgreSQL
- Análise de queries
- Dashboards de performance
Logs Estruturados
Para facilitar o monitoramento, configurar logs estruturados no Django:
# settings.py
LOGGING = {
'version': 1,
'formatters': {
'json': {
'class': 'pythonjsonlogger.jsonlogger.JsonFormatter',
'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'json'
}
},
'root': {
'level': 'INFO',
'handlers': ['console']
}
}