CPRA es un sistema de monitoreo de infraestructura de alto rendimiento diseñado para equipos de plataforma que gestionan arquitecturas de microservicios a gran escala. Construido sobre la arquitectura Entity-Component-System (ECS) y principios de teoría de colas, CPRA maneja más de 1,000,000 de verificaciones de salud concurrentes con escalado automático del grupo de trabajadores para cumplir los objetivos de SLO.
Monitoree millones de servicios de forma concurrente con corrección automatizada y escalado dinámico de trabajadores.
CPRA es un sistema de monitoreo de infraestructura de alto rendimiento diseñado para equipos de plataforma que gestionan arquitecturas de microservicios a gran escala. Construido sobre una arquitectura de Entidad-Componente-Sistema (ECS) y principios de teoría de colas, CPRA maneja más de 1.000.000 de comprobaciones de salud concurrentes con escalado automático del pool de trabajadores para cumplir los objetivos de SLO.
Use CPRA cuando necesite:
| Métrica | Valor |
|---|---|
| Monitores Concurrentes Máximos | Más de 1.000.000 |
| Rendimiento | Más de 10.000 comprobaciones/seg/pipeline |
| Latencia (P95) | < 100ms (configurable mediante SLO) |
| Memoria por Monitor | ~100 bytes |
| Memoria Total (1M monitores) | ~100 MB + sobrecarga del pool de trabajadores |
| Escalado de Trabajadores | Dinámico (basado en M/M/c) |
Consulte Descripción General de la Arquitectura para benchmarks detallados y análisis.
CPRA utiliza una arquitectura de tres pipelines construida sobre principios de Entidad-Componente-Sistema:


Cada pipeline opera de forma independiente con su propia cola y pool de trabajadores escalado dinámicamente, permitiendo:

Implementaciones de Cola:
Pools de Trabajadores Dinámicos:
Para una explicación completa de la arquitectura, consulte la Descripción General de la Arquitectura.
# Requisitos previos: Go 1.25 o superior
go version # Debe mostrar go1.25 o superior
# Compilar desde el código fuente
git clone https://github.com/ziad/cpra.git
cd cpra
go build .
# Ejecutar con configuración de ejemplo
./cpra --yaml mock-servers/test_10k.yaml
Salida 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 el repositorio:
git clone https://github.com/ziad/cpra.git
cd cpra
Descargue las dependencias:
go mod download
Compile la aplicación:
go build .
Verifique la instalación:
./cpra --help
Compile la imagen Docker:
docker build -f docker/Dockerfile -t cpra:latest .
Ejecute el contenedor:
docker run -it --rm \
-v $(pwd)/my-monitors.yaml:/app/monitors.yaml \
cpra:latest \
./cpra --yaml monitors.yaml
Cree un archivo monitors.yaml para definir las comprobaciones de salud:
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
Generación de Configuraciones de Prueba:
Use mock-servers/generate_monitors.py para generar configuraciones de prueba con cualquier número de monitores.
Configure el comportamiento de CPRA mediante programación:
package main
import (
"cpra/internal/controller"
)
func main() {
config := controller.DefaultConfig()
// Modo depuración
config.Debug = true
// Ajustes del pool de trabajadores (aplica a los tres pipelines)
config.WorkerConfig.MinWorkers = 10
config.WorkerConfig.MaxWorkers = 500
// Ajustes de cola
config.QueueCapacity = 131072 // Debe ser potencia de 2
// Ajuste de rendimiento
config.BatchSize = 2000
config.SizingServiceTime = 20 * time.Millisecond // Duración media del trabajo
config.SizingSLO = 100 * time.Millisecond // Latencia objetivo
config.SizingHeadroomPct = 0.15 // 15% de margen de seguridad
ctrl := controller.NewController(config)
// ... resto de la inicialización
}
Consulte la Referencia de la API para conocer todas las opciones de configuración.
./cpra [OPCIONES]
| Opción | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
--yaml | string | internal/loader/replicated_test.yaml | Ruta del archivo YAML de monitores |
--config | string | - | Ruta del archivo de configuración (opcional) |
--debug | bool | false | Habilita el registro a nivel de depuración |
--pprof | bool | true | Habilita el servidor de perfilado pprof |
--pprof.addr | string | localhost:6060 | Dirección de escucha del servidor pprof |
Ejemplos:
# Ejecutar con registro de depuración
./cpra --yaml monitors.yaml --debug
# Ejecutar con puerto pprof personalizado
./cpra --yaml monitors.yaml --pprof.addr localhost:8080
# Deshabilitar perfilado
./cpra --yaml monitors.yaml --pprof=false
Problema: Archivo YAML no encontrado
Warning: YAML file monitors.yaml not found, starting without loading monitors
Solución: Verifique que la ruta del archivo sea correcta. Use rutas absolutas o relativas al lugar donde ejecuta el binario:
./cpra --yaml $(pwd)/monitors.yaml
Problema: La compilación falla con error de versión de Go
go.mod requires go >= 1.25
Solución: Actualice Go a la versión 1.25 o superior:
go version # Verifique la versión actual
# Descargue Go 1.25+ desde https://go.dev/dl/
Problema: Uso elevado de memoria
Solución: Verifique el uso de memoria con pprof:
# Mientras CPRA está en ejecución, acceda a pprof
go tool pprof http://localhost:6060/debug/pprof/heap
# Vea los principales consumidores de memoria
(pprof) top
Ajuste los límites de memoria en la configuración:
config.WorkerConfig.MaxWorkers = 200 // Reduzca el máximo de trabajadores
config.QueueCapacity = 65536 // Reduzca el tamaño de la cola
Problema: El pool de trabajadores no escala
Solución: Habilite el registro de depuración para ver las decisiones de escalado:
./cpra --yaml monitors.yaml --debug
Revise los parámetros de teoría de colas:
config.SizingServiceTime = 50 * time.Millisecond // Aumente si los trabajos tardan más
config.SizingSLO = 200 * time.Millisecond // Relaje el SLO si es necesario
Problema: Los monitores no se ejecutan
Solución: Verifique el formato de configuración de los monitores y revise los registros:
./cpra --yaml monitors.yaml --debug 2>&1 | grep ERROR
Valide la sintaxis YAML:
# Use un validador YAML
python -m yaml monitors.yaml
--debug)¡Agradecemos las contribuciones de la comunidad! CPRA es un proyecto de código abierto y valoramos:
Primeros Pasos:
good first issueRecursos de Desarrollo:
Este proyecto está licenciado bajo la Licencia MIT - consulte el archivo LICENSE para más detalles.
CPRA está construido sobre excelentes bibliotecas de código abierto:
Documentación • Arquitectura • Incidencias
Construido con ❤️ para equipos de plataforma que gestionan infraestructura a gran escala