CPRA - это высокопроизводительная система мониторинга инфраструктуры, предназначенная для платформенных команд, управляющих крупномасштабными микросервисными архитектурами. Построенная на принципах Entity-Component-System (ECS) и теории очередей, CPRA обрабатывает более 1 000 000 одновременных проверок работоспособности с автоматическим масштабированием пула рабочих процессов для достижения целей SLO.
Мониторинг миллионов сервисов одновременно с автоматическим восстановлением и динамическим масштабированием рабочих процессов.
CPRA — это высокопроизводительная система мониторинга инфраструктуры, предназначенная для команд платформ, управляющих крупномасштабными микросервисными архитектурами. Построенная на архитектуре Entity-Component-System (ECS) и принципах теории очередей, CPRA обрабатывает более 1 000 000 одновременных проверок работоспособности с автоматическим масштабированием пула рабочих процессов для достижения целей SLO.
Используйте CPRA, когда необходимо:
| Метрика | Значение |
|---|---|
| Максимальное количество одновременных мониторов | 1 000 000+ |
| Пропускная способность | 10 000+ проверок/сек/конвейер |
| Задержка (P95) | < 100 мс (настраивается через SLO) |
| Память на монитор | ~100 байт |
| Общая память (1М мониторов) | ~100 МБ + накладные расходы пула рабочих процессов |
| Масштабирование рабочих процессов | Динамическое (на основе M/M/c) |
Подробные бенчмарки и анализ см. в Обзоре архитектуры.
CPRA использует архитектуру из трёх конвейеров, построенную на принципах Entity-Component-System:


Каждый конвейер работает независимо, имея собственную очередь и динамически масштабируемый пул рабочих процессов, что позволяет:

Реализации очередей:
Динамические пулы рабочих процессов:
Полное объяснение архитектуры см. в Обзоре архитектуры.
# Предварительные требования: Go 1.25 или новее
go version # Должна показывать go1.25 или выше
# Сборка из исходников
git clone https://github.com/ziad/cpra.git
cd cpra
go build .
# Запуск с примером конфигурации
./cpra --yaml mock-servers/test_10k.yaml
Ожидаемый вывод:
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)
Клонируйте репозиторий:
git clone https://github.com/ziad/cpra.git
cd cpra
Загрузите зависимости:
go mod download
Соберите приложение:
go build .
Проверьте установку:
./cpra --help
Соберите Docker-образ:
docker build -f docker/Dockerfile -t cpra:latest .
Запустите контейнер:
docker run -it --rm \
-v $(pwd)/my-monitors.yaml:/app/monitors.yaml \
cpra:latest \
./cpra --yaml monitors.yaml
Создайте файл monitors.yaml для определения проверок работоспособности:
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
Генерация тестовых конфигураций:
Используйте mock-servers/generate_monitors.py для генерации тестовых конфигураций с любым количеством мониторов.
Настройте поведение CPRA программно:
package main
import (
"cpra/internal/controller"
)
func main() {
config := controller.DefaultConfig()
// Режим отладки
config.Debug = true
// Настройки пула рабочих процессов (применяется ко всем трём конвейерам)
config.WorkerConfig.MinWorkers = 10
config.WorkerConfig.MaxWorkers = 500
// Настройки очереди
config.QueueCapacity = 131072 // Должно быть степенью двойки
// Настройка производительности
config.BatchSize = 2000
config.SizingServiceTime = 20 * time.Millisecond // Средняя длительность задания
config.SizingSLO = 100 * time.Millisecond // Целевая задержка
config.SizingHeadroomPct = 0.15 // 15% буфер безопасности
ctrl := controller.NewController(config)
// ... остальная инициализация
}
Полные параметры конфигурации см. в Справочнике API.
./cpra [ОПЦИИ]
| Опция | Тип | По умолчанию | Описание |
|---|---|---|---|
--yaml | string | internal/loader/replicated_test.yaml | Путь к YAML-файлу мониторов |
--config | string | - | Путь к файлу конфигурации (опционально) |
--debug | bool | false | Включить отладочное логирование |
--pprof | bool | true | Включить сервер профилирования pprof |
--pprof.addr | string | localhost:6060 | Адрес прослушивания pprof-сервера |
Примеры:
# Запуск с отладочным логированием
./cpra --yaml monitors.yaml --debug
# Запуск с пользовательским портом pprof
./cpra --yaml monitors.yaml --pprof.addr localhost:8080
# Отключение профилирования
./cpra --yaml monitors.yaml --pprof=false
Проблема: YAML file not found
Warning: YAML file monitors.yaml not found, starting without loading monitors
Решение: Проверьте правильность пути к файлу. Используйте абсолютные пути или пути относительно места запуска бинарного файла:
./cpra --yaml $(pwd)/monitors.yaml
Проблема: Сборка не удалась из-за ошибки версии Go
go.mod requires go >= 1.25
Решение: Обновите Go до версии 1.25 или новее:
go version # Проверьте текущую версию
# Скачайте Go 1.25+ с https://go.dev/dl/
Проблема: Высокое использование памяти
Решение: Проверьте использование памяти с помощью pprof:
# Пока CPRA работает, получите доступ к pprof
go tool pprof http://localhost:6060/debug/pprof/heap
# Просмотр основных потребителей памяти
(pprof) top
Отрегулируйте лимиты памяти в конфигурации:
config.WorkerConfig.MaxWorkers = 200 // Уменьшите максимальное количество рабочих процессов
config.QueueCapacity = 65536 // Уменьшите размер очереди
Проблема: Пул рабочих процессов не масштабируется
Решение: Включите отладочное логирование, чтобы увидеть решения о масштабировании:
./cpra --yaml monitors.yaml --debug
Проверьте параметры теории очередей:
config.SizingServiceTime = 50 * time.Millisecond // Увеличьте, если задания выполняются дольше
config.SizingSLO = 200 * time.Millisecond // Смягчите SLO при необходимости
Проблема: Мониторы не выполняются
Решение: Проверьте формат конфигурации мониторов и посмотрите логи:
./cpra --yaml monitors.yaml --debug 2>&1 | grep ERROR
Проверьте синтаксис YAML:
# Используйте валидатор YAML
python -m yaml monitors.yaml
--debug)Мы приветствуем вклад сообщества! CPRA — это проект с открытым исходным кодом, и мы ценим:
Начало работы:
good first issueРесурсы для разработчиков:
Этот проект лицензирован в соответствии с MIT License — подробнее см. в файле LICENSE.
CPRA построен на отличных библиотеках с открытым исходным кодом:
Документация • Архитектура • Проблемы
Создано с ❤️ для команд платформ, управляющих крупномасштабной инфраструктурой