
CPRA is a high-performance infrastructure monitoring system designed for platform teams managing large-scale microservice architectures. Built on Entity-Component-System (ECS) architecture and queueing theory principles, CPRA handles 1,000,000+ concurrent health checks with automatic worker pool scaling to meet SLO targets.
Monitora milioni di servizi in contemporanea con riparazione automatica e scalabilità dinamica dei worker.
CPRA è un sistema di monitoraggio dell'infrastruttura ad alte prestazioni progettato per team di piattaforma che gestiscono architetture di microservizi su larga scala. Costruito su architettura Entity-Component-System (ECS) e principi di teoria delle code, CPRA gestisce oltre 1.000.000 di controlli di salute simultanei con scalabilità automatica del pool di worker per raggiungere gli obiettivi SLO.
Usa CPRA quando hai bisogno di:
Consulta la Panoramica dell'architettura per benchmark dettagliati e analisi.
CPRA utilizza un'architettura a tre pipeline costruita su principi Entity-Component-System:


Ogni pipeline opera indipendentemente con la propria coda e pool di worker scalato dinamicamente, consentendo:

Implementazioni delle code:
Pool di worker dinamici:
Per una spiegazione completa dell'architettura, consulta la Panoramica dell'architettura.
# Prerequisiti: Go 1.25 o successivo
go version # Dovrebbe mostrare go1.25 o superiore
# Compila dal sorgente
git clone https://github.com/ziad/cpra.git
cd cpra
go build .
# Esegui con configurazione di esempio
./cpra --yaml mock-servers/test_10k.yaml
Output previsto:
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)
Clona il repository:
git clone https://github.com/ziad/cpra.git
cd cpra
Scarica le dipendenze:
go mod download
Compila l'applicazione:
go build .
Verifica l'installazione:
./cpra --help
Crea l'immagine Docker:
docker build -f docker/Dockerfile -t cpra:latest .
Esegui il container:
docker run -it --rm \
-v $(pwd)/my-monitors.yaml:/app/monitors.yaml \
cpra:latest \
./cpra --yaml monitors.yaml
Crea un file monitors.yaml per definire i controlli di salute:
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
Generazione di configurazioni di test:
Usa mock-servers/generate_monitors.py per generare configurazioni di test con qualsiasi numero di monitor.
Configura il comportamento di CPRA in modo programmatico:
package main
import (
"cpra/internal/controller"
)
func main() {
config := controller.DefaultConfig()
// Modalità debug
config.Debug = true
// Impostazioni del pool di worker (si applicano a tutte e tre le pipeline)
config.WorkerConfig.MinWorkers = 10
config.WorkerConfig.MaxWorkers = 500
// Impostazioni della coda
config.QueueCapacity = 131072 // Deve essere una potenza di 2
// Ottimizzazione delle prestazioni
config.BatchSize = 2000
config.SizingServiceTime = 20 * time.Millisecond // Durata media del job
config.SizingSLO = 100 * time.Millisecond // Latenza target
config.SizingHeadroomPct = 0.15 // 15% di buffer di sicurezza
ctrl := controller.NewController(config)
// ... resto dell'inizializzazione
}
Consulta il Riferimento API per le opzioni di configurazione complete.
./cpra [OPZIONI]
Esempi:
# Esegui con registrazione debug
./cpra --yaml monitors.yaml --debug
# Esegui con porta pprof personalizzata
./cpra --yaml monitors.yaml --pprof.addr localhost:8080
# Disabilita la profilazione
./cpra --yaml monitors.yaml --pprof=false
Problema: File YAML non trovato
Warning: YAML file monitors.yaml not found, starting without loading monitors
Soluzione: Verifica che il percorso del file sia corretto. Usa percorsi assoluti o relativi rispetto alla directory da cui esegui il binario:
./cpra --yaml $(pwd)/monitors.yaml
Problema: La compilazione fallisce con errore di versione Go
go.mod requires go >= 1.25
Soluzione: Aggiorna Go alla versione 1.25 o successiva:
go version # Controlla la versione corrente
# Scarica Go 1.25+ da https://go.dev/dl/
Problema: Utilizzo elevato di memoria
Soluzione: Controlla l'utilizzo della memoria con pprof:
# Mentre CPRA è in esecuzione, accedi a pprof
go tool pprof http://localhost:6060/debug/pprof/heap
# Visualizza i maggiori consumatori di memoria
(pprof) top
Regola i limiti di memoria nella configurazione:
config.WorkerConfig.MaxWorkers = 200 // Riduci il numero massimo di worker
config.QueueCapacity = 65536 // Riduci la dimensione della coda
Problema: Il pool di worker non si scala
Soluzione: Abilita la registrazione debug per vedere le decisioni di scalatura:
./cpra --yaml monitors.yaml --debug
Controlla i parametri della teoria delle code:
config.SizingServiceTime = 50 * time.Millisecond // Aumenta se i job richiedono più tempo
config.SizingSLO = 200 * time.Millisecond // Rilassa lo SLO se necessario
Problema: I monitor non vengono eseguiti
Soluzione: Verifica il formato della configurazione dei monitor e controlla i log:
./cpra --yaml monitors.yaml --debug 2>&1 | grep ERROR
Convalida la sintassi YAML:
# Usa un validatore YAML
python -m yaml monitors.yaml
--debug)Accogliamo con favore i contributi della comunità! CPRA è un progetto open-source e apprezziamo:
Per iniziare:
good first issueRisorse di sviluppo:
Questo progetto è concesso in licenza con la Licenza MIT - consulta il file LICENSE per i dettagli.
CPRA è costruito su eccellenti librerie open-source:
Documentazione • Architettura • Problemi
Costruito con ❤️ per i team di piattaforma che gestiscono infrastrutture su larga scala
| Metrica | Valore |
|---|
| Numero massimo di monitor simultanei | 1.000.000+ |
| Throughput | 10.000+ controlli/sec/pipeline |
| Latenza (P95) | < 100ms (configurabile tramite SLO) |
| Memoria per monitor | ~100 byte |
| Memoria totale (1M monitor) | ~100 MB + overhead del pool di worker |
| Scalabilità dei worker | Dinamica (basata su M/M/c) |
| Opzione | Tipo | Default | Descrizione |
|---|
--yaml | string | internal/loader/replicated_test.yaml | Percorso del file YAML dei monitor |
--config | string | - | Percorso del file di configurazione (opzionale) |
--debug | bool | false | Abilita la registrazione a livello di debug |
--pprof | bool | true | Abilita il server di profilazione pprof |
--pprof.addr | string | localhost:6060 | Indirizzo di ascolto del server pprof |