Pular para o conteúdo principal

Monitoramento

Este guia explica como monitorar o desempenho e a saúde do PCH-SIG.

Arquitetura de monitoramento

┌─────────────────────────────────────────────────────────────┐
│ Máquina Local │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Grafana │◀───│ Prometheus │ │
│ │ :3001 │ │ :9090 │ │
│ └─────────────┘ └──────┬──────┘ │
└────────────────────────────┼────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ Servidor serveur-production │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ cAdvisor │ │ NodeExporter│ │ PG Exporter │ │
│ │ :8080 │ │ :9100 │ │ :9187 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │Redis Export │ │ Loki │ │ Promtail │ │
│ │ :9121 │ │ :3100 │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘

Iniciar o monitoramento

Prometheus (coleta de métricas)

cd monitoring/prometheus
.\prometheus.exe --config.file=prometheus.yml

Grafana (visualização)

& "C:\Program Files\GrafanaLabs\grafana\bin\grafana-server.exe" `
--homepath="C:\Program Files\GrafanaLabs\grafana" `
--config="C:\Users\clave\WebstormProjects\pch-sig\monitoring\grafana\grafana-custom.ini"

Acesso Grafana


Dashboards disponíveis

Docker Overview

URL: http://localhost:3001/d/pch-docker-overview

Métricas exibidas:

  • CPU por contêiner
  • Memória usada
  • Rede (bytes de entrada/saída)
  • I/O de disco

PostgreSQL

URL: http://localhost:3001/d/pch-postgresql

Métricas exibidas:

  • Conexões ativas
  • Transações por segundo
  • Consultas lentas
  • Tamanho das tabelas
  • Taxa de acerto do cache

Docker Logs

URL: http://localhost:3001/d/pch-docker-logs

Funcionalidades:

  • Logs em tempo real
  • Filtragem por contêiner
  • Pesquisa nos logs
  • Histórico

Métricas chave

Aplicação

MétricaDescriçãoLimite de alerta
Tempo de resposta APILatência média das requisições> 500ms
Erros 5xxNúmero de erros de servidor> 10/min
Requisições/segundoCarga da API> 100/s

Banco de dados

MétricaDescriçãoLimite de alerta
Conexões ativasConexões PostgreSQL> 80% máx
Taxa de acerto do cacheEficiência do cache< 95%
Transações/segundoAtividade DBVariável
Consultas lentasConsultas > 1s> 5/min

Contêineres

MétricaDescriçãoLimite de alerta
CPUUso de CPU> 80%
MemóriaUso de RAM> 90%
ReiníciosNúmero de restarts> 0 em 1h

Sistema

MétricaDescriçãoLimite de alerta
Espaço em discoUso do disco> 85%
Load averageCarga do sistema> nº CPUs
Memória do sistemaRAM usada> 90%

Configuração Prometheus

Arquivo: monitoring/prometheus/prometheus.yml

global:
scrape_interval: 15s

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

- job_name: 'cadvisor'
static_configs:
- targets: ['serveur-production:8080']

- job_name: 'node'
static_configs:
- targets: ['serveur-production:9100']

- job_name: 'postgresql'
static_configs:
- targets: ['serveur-production:9187']

- job_name: 'redis'
static_configs:
- targets: ['serveur-production:9121']

Alertas

Configurar um alerta Grafana

  1. Abra um dashboard
  2. Clique no painel a monitorar
  3. Edit > Alert
  4. Configure:
    • Condição (ex: avg > 80)
    • Duração (ex: for 5m)
    • Notificação (email, Slack, etc.)

Exemplo de alerta CPU

alert: HighCPUUsage
expr: container_cpu_usage_seconds_total{name="pch_backend"} > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "CPU alto no backend"
description: "O backend está usando mais de 80% de CPU há 5 minutos"

Canais de notificação

CanalConfiguração
EmailServidor SMTP
SlackWebhook URL
TeamsWebhook URL
PagerDutyIntegration key

Verificar o estado do monitoramento

Script de verificação

Arquivo: monitoring/check-ports.ps1

# Verificar as portas do monitoramento
$Ports = @{
"cAdvisor" = "serveur-production:8080"
"Node Exporter" = "serveur-production:9100"
"PostgreSQL Exporter" = "serveur-production:9187"
"Redis Exporter" = "serveur-production:9121"
"Loki" = "serveur-production:3100"
}

foreach ($Service in $Ports.Keys) {
$Target = $Ports[$Service]
try {
$Response = Invoke-WebRequest -Uri "http://$Target" -TimeoutSec 5 -UseBasicParsing
Write-Host "$Service ($Target): OK" -ForegroundColor Green
} catch {
Write-Host "$Service ($Target): ERRO" -ForegroundColor Red
}
}

Verificar Prometheus targets

  1. Abra http://localhost:9090/targets
  2. Todos os targets devem estar no estado "UP"

Endpoint de saúde

API Health Check

curl http://localhost:8000/api/health

Resposta esperada:

{
"status": "ok",
"database": "connected",
"redis": "connected",
"timestamp": "2024-01-15T10:30:00Z"
}

Implementar um health check

// src/Controller/HealthController.php
#[Route('/api/health', methods: ['GET'])]
public function health(): JsonResponse
{
$checks = [];

// PostgreSQL
try {
$this->entityManager->getConnection()->executeQuery('SELECT 1');
$checks['database'] = 'connected';
} catch (\Exception $e) {
$checks['database'] = 'error';
}

// Redis
try {
$this->redis->ping();
$checks['redis'] = 'connected';
} catch (\Exception $e) {
$checks['redis'] = 'error';
}

return new JsonResponse([
'status' => 'ok',
...$checks,
'timestamp' => (new \DateTime())->format('c')
]);
}

Exporters no servidor

Iniciar cAdvisor

docker run -d \
--name=pch_cadvisor \
--restart=always \
--privileged \
-p 8080:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor:latest

Iniciar Node Exporter

docker run -d \
--name=pch_node_exporter \
--restart=always \
--net=host \
-v /:/host:ro \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host

Iniciar PostgreSQL Exporter

docker run -d \
--name=pch_postgres_exporter \
--restart=always \
-p 9187:9187 \
-e DATA_SOURCE_NAME="postgresql://pch_admin:pch_secure_2025@pch_postgres:5432/pch_sig?sslmode=disable" \
quay.io/prometheuscommunity/postgres-exporter:latest

Iniciar Redis Exporter

docker run -d \
--name=pch_redis_exporter \
--restart=always \
-p 9121:9121 \
-e REDIS_ADDR=pch_redis:6379 \
-e REDIS_PASSWORD=redis_secure_2025 \
oliver006/redis_exporter:latest

Consultas PromQL úteis

CPU

# CPU por contêiner
rate(container_cpu_usage_seconds_total{name=~"pch_.*"}[5m]) * 100

# Top 5 consumidores de CPU
topk(5, rate(container_cpu_usage_seconds_total[5m]))

Memória

# Memória por contêiner
container_memory_usage_bytes{name=~"pch_.*"} / 1024 / 1024

# Percentual de memória
container_memory_usage_bytes / container_spec_memory_limit_bytes * 100

PostgreSQL

# Conexões ativas
pg_stat_activity_count

# Transações por segundo
rate(pg_stat_database_xact_commit{datname="pch_sig"}[5m])

Boas práticas

Retenção de métricas

  • Métricas detalhadas: 15 dias
  • Métricas agregadas: 90 dias
  • Métricas de tendência: 1 ano

Monitoramento proativo

  • Configurar alertas ANTES dos problemas
  • Definir limites realistas
  • Revisar regularmente os alertas

Documentação

  • Documentar os limites e sua justificativa
  • Manter um registro de incidentes
  • Criar runbooks para cada alerta

Próximos passos