
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.
Surveillez des millions de services en simultané avec une remédiation automatisée et un dimensionnement dynamique des workers.
CPRA est un système de surveillance d'infrastructure haute performance conçu pour les équipes de plateforme gérant des architectures de microservices à grande échelle. Construit sur une architecture Entité-Composant-Système (ECS) et les principes de la théorie des files d'attente, CPRA prend en charge plus d'un million de contrôles de santé simultanés avec un dimensionnement automatique du pool de workers pour atteindre les objectifs de niveau de service (SLO).
Utilisez CPRA lorsque vous devez :
Voir Aperçu de l'architecture pour des benchmarks et analyses détaillés.
CPRA utilise une architecture à trois pipelines basée sur les principes d'Entité-Composant-Système :


Chaque pipeline fonctionne indépendamment avec sa propre file d'attente et son pool de workers dimensionné dynamiquement, permettant :

Implémentations de files d'attente :
Pools de workers dynamiques :
Pour une explication complète de l'architecture, consultez l'Aperçu de l'architecture.
# Prérequis : Go 1.25 ou ultérieur
go version # Devrait afficher go1.25 ou supérieur
# Compiler à partir des sources
git clone https://github.com/ziad/cpra.git
cd cpra
go build .
# Exécuter avec une configuration d'exemple
./cpra --yaml mock-servers/test_10k.yaml
Sortie attendue :
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)
Cloner le dépôt :
git clone https://github.com/ziad/cpra.git
cd cpra
Télécharger les dépendances :
go mod download
Compiler l'application :
go build .
Vérifier l'installation :
./cpra --help
Construire l'image Docker :
docker build -f docker/Dockerfile -t cpra:latest .
Exécuter le conteneur :
docker run -it --rm \
-v $(pwd)/my-monitors.yaml:/app/monitors.yaml \
cpra:latest \
./cpra --yaml monitors.yaml
Créez un fichier monitors.yaml pour définir les contrôles de santé :
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
Génération de configurations de test :
Utilisez mock-servers/generate_monitors.py pour générer des configurations de test avec n'importe quel nombre de moniteurs.
Configurez le comportement de CPRA par programmation :
package main
import (
"cpra/internal/controller"
)
func main() {
config := controller.DefaultConfig()
// Mode débogage
config.Debug = true
// Paramètres du pool de workers (s'applique aux trois pipelines)
config.WorkerConfig.MinWorkers = 10
config.WorkerConfig.MaxWorkers = 500
// Paramètres de la file d'attente
config.QueueCapacity = 131072 // Doit être une puissance de 2
// Réglage des performances
config.BatchSize = 2000
config.SizingServiceTime = 20 * time.Millisecond // Durée moyenne d'un job
config.SizingSLO = 100 * time.Millisecond // Latence cible
config.SizingHeadroomPct = 0.15 // Marge de sécurité de 15 %
ctrl := controller.NewController(config)
// ... suite de l'initialisation
}
Consultez la Référence API pour toutes les options de configuration.
./cpra [OPTIONS]
Exemples :
# Exécuter avec journalisation de débogage
./cpra --yaml monitors.yaml --debug
# Exécuter avec un port pprof personnalisé
./cpra --yaml monitors.yaml --pprof.addr localhost:8080
# Désactiver le profilage
./cpra --yaml monitors.yaml --pprof=false
Problème : Fichier YAML introuvable
Warning: YAML file monitors.yaml not found, starting without loading monitors
Solution : Vérifiez que le chemin du fichier est correct. Utilisez des chemins absolus ou relatifs à l'endroit où vous exécutez le binaire :
./cpra --yaml $(pwd)/monitors.yaml
Problème : La compilation échoue avec une erreur de version Go
go.mod requires go >= 1.25
Solution : Mettez à niveau Go vers la version 1.25 ou ultérieure :
go version # Vérifier la version actuelle
# Télécharger Go 1.25+ depuis https://go.dev/dl/
Problème : Utilisation mémoire élevée
Solution : Vérifiez l'utilisation mémoire avec pprof :
# Pendant que CPRA est en cours d'exécution, accédez à pprof
go tool pprof http://localhost:6060/debug/pprof/heap
# Afficher les principaux consommateurs de mémoire
(pprof) top
Ajustez les limites mémoire dans la configuration :
config.WorkerConfig.MaxWorkers = 200 // Réduire le nombre max de workers
config.QueueCapacity = 65536 // Réduire la taille de la file d'attente
Problème : Le pool de workers ne se dimensionne pas
Solution : Activez la journalisation de débogage pour voir les décisions de dimensionnement :
./cpra --yaml monitors.yaml --debug
Vérifiez les paramètres de la théorie des files d'attente :
config.SizingServiceTime = 50 * time.Millisecond // Augmenter si les jobs prennent plus de temps
config.SizingSLO = 200 * time.Millisecond // Assouplir le SLO si nécessaire
Problème : Les moniteurs ne s'exécutent pas
Solution : Vérifiez le format de configuration des moniteurs et consultez les journaux :
./cpra --yaml monitors.yaml --debug 2>&1 | grep ERROR
Validez la syntaxe YAML :
# Utiliser un validateur YAML
python -m yaml monitors.yaml
--debug)Nous accueillons les contributions de la communauté ! CPRA est un projet open source et nous apprécions :
Pour commencer :
good first issueRessources de développement :
Ce projet est sous licence MIT License - voir le fichier LICENSE pour les détails.
CPRA repose sur d'excellentes bibliothèques open source :
Documentation • Architecture • Problèmes
Construit avec ❤️ pour les équipes de plateforme gérant des infrastructures à grande échelle
| Métrique | Valeur |
|---|
| Moniteurs concurrents max | 1 000 000+ |
| Débit | 10 000+ contrôles/s/pipeline |
| Latence (P95) | < 100 ms (configurable via SLO) |
| Mémoire par moniteur | ~100 octets |
| Mémoire totale (1M moniteurs) | ~100 Mo + surcoût du pool de workers |
| Dimensionnement des workers | Dynamique (basé sur M/M/c) |
| Option | Type | Défaut | Description |
|---|
--yaml | string | internal/loader/replicated_test.yaml | Chemin vers le fichier YAML des moniteurs |
--config | string | - | Chemin vers le fichier de configuration (optionnel) |
--debug | bool | false | Activer la journalisation de niveau débogage |
--pprof | bool | true | Activer le serveur de profilage pprof |
--pprof.addr | string | localhost:6060 | Adresse d'écoute du serveur pprof |