CPRA é um sistema de monitoramento de infraestrutura de alto desempenho projetado para equipes de plataforma que gerenciam arquiteturas de microsserviços em grande escala. Construído sobre arquitetura Entity-Component-System (ECS) e princípios de teoria de filas, o CPRA lida com mais de 1.000.000 de verificações de saúde concorrentes com escalonamento automático do pool de workers para atingir metas de SLO.
Monitore milhões de serviços simultaneamente com remediação automatizada e escalonamento dinâmico de workers.
CPRA é um sistema de monitoramento de infraestrutura de alto desempenho projetado para equipes de plataforma que gerenciam arquiteturas de microsserviços em grande escala. Construído com base na arquitetura Entidade-Componente-Sistema (ECS) e princípios de teoria de filas, o CPRA lida com mais de 1.000.000 de verificações de integridade simultâneas com escalonamento automático do pool de workers para cumprir metas de SLO.
Use o CPRA quando precisar de:
| Métrica | Valor |
|---|---|
| Máx. Monitores Simultâneos | 1.000.000+ |
| Taxa de Transferência | 10.000+ verificações/s/pipeline |
| Latência (P95) | < 100ms (configurável via SLO) |
| Memória por Monitor | ~100 bytes |
| Memória Total (1M monitores) | ~100 MB + overhead do pool de workers |
| Escalonamento de Workers | Dinâmico (baseado em M/M/c) |
Consulte a Visão Geral da Arquitetura para benchmarks e análises detalhadas.
O CPRA usa uma arquitetura de três pipelines construída sobre princípios de Entidade-Componente-Sistema:


Cada pipeline opera de forma independente com sua própria fila e pool de workers escalado dinamicamente, permitindo:

Implementações de Fila:
Pools de Workers Dinâmicos:
Para uma explicação abrangente da arquitetura, consulte a Visão Geral da Arquitetura.
# Pré-requisitos: Go 1.25 ou superior
go version # Deve mostrar go1.25 ou superior
# Compilar a partir do código-fonte
git clone https://github.com/ziad/cpra.git
cd cpra
go build .
# Executar com configuração de exemplo
./cpra --yaml mock-servers/test_10k.yaml
Saída Esperada:
Starting CPRA Optimized Controller for 1M Monitors
Profiling server listening at http://localhost:6060/debug/pprof/
Loading monitors from mock-servers/test_10k.yaml...
Monitor loading completed in 1.2s
[INFO] Controller started successfully
[INFO] Pulse pipeline processing 10,000 monitors
[INFO] Worker pool scaled to 143 workers (target SLO: 100ms)
Clone o repositório:
git clone https://github.com/ziad/cpra.git
cd cpra
Baixe as dependências:
go mod download
Compile a aplicação:
go build .
Verifique a instalação:
./cpra --help
Construa a imagem Docker:
docker build -f docker/Dockerfile -t cpra:latest .
Execute o contêiner:
docker run -it --rm \
-v $(pwd)/my-monitors.yaml:/app/monitors.yaml \
cpra:latest \
./cpra --yaml monitors.yaml
Crie um arquivo monitors.yaml para definir verificações de integridade:
monitors:
- name: "my-service-health-check"
pulse_check:
type: http
interval: 30s
timeout: 5s
max_failures: 3
config:
method: GET
url: http://my-service.example.com/health
retries: 2
intervention:
action: docker
config:
container: my-service-container
action: restart
codes:
red:
dispatch: true
notify: pagerduty
config:
url: https://events.pagerduty.com/v2/enqueue
yellow:
dispatch: true
notify: log
config:
file: /var/log/cpra-alerts.log
Gerando Configurações de Teste:
Use mock-servers/generate_monitors.py para gerar configurações de teste com qualquer número de monitores.
Configure o comportamento do CPRA programaticamente:
package main
import (
"cpra/internal/controller"
)
func main() {
config := controller.DefaultConfig()
// Modo de depuração
config.Debug = true
// Configurações do pool de workers (aplica-se a todos os três pipelines)
config.WorkerConfig.MinWorkers = 10
config.WorkerConfig.MaxWorkers = 500
// Configurações da fila
config.QueueCapacity = 131072 // Deve ser potência de 2
// Ajuste de desempenho
config.BatchSize = 2000
config.SizingServiceTime = 20 * time.Millisecond // Duração média do job
config.SizingSLO = 100 * time.Millisecond // Latência alvo
config.SizingHeadroomPct = 0.15 // 15% de buffer de segurança
ctrl := controller.NewController(config)
// ... resto da inicialização
}
Consulte a Referência da API para opções completas de configuração.
./cpra [OPÇÕES]
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
--yaml | string | internal/loader/replicated_test.yaml | Caminho para o arquivo YAML de monitores |
--config | string | - | Caminho do arquivo de configuração (opcional) |
--debug | bool | false | Ativa logs em nível de depuração |
--pprof | bool | true | Ativa o servidor de perfilamento pprof |
--pprof.addr | string | localhost:6060 | Endereço de escuta do servidor pprof |
Exemplos:
# Executar com log de depuração
./cpra --yaml monitors.yaml --debug
# Executar com porta pprof personalizada
./cpra --yaml monitors.yaml --pprof.addr localhost:8080
# Desabilitar perfilamento
./cpra --yaml monitors.yaml --pprof=false
Problema: Arquivo YAML não encontrado
Warning: YAML file monitors.yaml not found, starting without loading monitors
Solução: Verifique se o caminho do arquivo está correto. Use caminhos absolutos ou relativos ao diretório onde o binário é executado:
./cpra --yaml $(pwd)/monitors.yaml
Problema: Falha na compilação com erro de versão do Go
go.mod requires go >= 1.25
Solução: Atualize o Go para a versão 1.25 ou superior:
go version # Verifique a versão atual
# Baixe o Go 1.25+ de https://go.dev/dl/
Problema: Alto uso de memória
Solução: Verifique o uso de memória com pprof:
# Enquanto o CPRA estiver em execução, acesse pprof
go tool pprof http://localhost:6060/debug/pprof/heap
# Veja os maiores consumidores de memória
(pprof) top
Ajuste os limites de memória na configuração:
config.WorkerConfig.MaxWorkers = 200 // Reduza o máximo de workers
config.QueueCapacity = 65536 // Reduza o tamanho da fila
Problema: Pool de workers não está escalando
Solução: Ative o log de depuração para ver as decisões de escalonamento:
./cpra --yaml monitors.yaml --debug
Verifique os parâmetros da teoria de filas:
config.SizingServiceTime = 50 * time.Millisecond // Aumente se os jobs demorarem mais
config.SizingSLO = 200 * time.Millisecond // Relaxe o SLO se necessário
Problema: Monitores não estão sendo executados
Solução: Verifique o formato da configuração do monitor e confira os logs:
./cpra --yaml monitors.yaml --debug 2>&1 | grep ERROR
Valide a sintaxe YAML:
# Use um validador YAML
python -m yaml monitors.yaml
--debug)Aceitamos contribuições da comunidade! O CPRA é um projeto de código aberto e apreciamos:
Primeiros Passos:
good first issueRecursos de Desenvolvimento:
Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE para detalhes.
O CPRA é construído sobre excelentes bibliotecas de código aberto:
Documentação • Arquitetura • Issues
Construído com ❤️ para equipes de plataforma que gerenciam infraestrutura em grande escala