Легковесный инструмент для мониторинга доступности и производительности доменов и эндпоинтов.
Собирает время отклика и HTTP статус-коды, визуализирует тренды доступности и предоставляет обновления в реальном времени.
DomainPulse выполняет периодические или проверки в реальном времени для HTTP эндпоинтов, TCP/UDP портов и ICMP ping.
Он записывает время отклика, классифицирует результаты (таймауты, 2xx, 4xx, 5xx, успешные соединения),
и визуализирует их на интерактивных графиках через веб-интерфейс.
- Множественные типы проверок:
- HTTP (GET/POST/PUT) с кастомными путями и payload
- TCP — проверка доступности порта
- UDP — проверка UDP соединения с опциональным payload
- ICMP — ping проверка (требует привилегий на Windows)
- Гибкие интервалы проверок: от 1 секунды до 1 дня
- Режим реального времени: новый запрос запускается сразу после завершения предыдущего
- Цветовая индикация результатов:
- 🟢 2xx / success — OK
- 🟡 4xx — Ошибка клиента
- 🔴 5xx — Ошибка сервера
- ⚫ Timeout / error — Таймаут или ошибка
- SQLite хранилище (простое и портативное)
- REST API с Swagger документацией
- Веб-интерфейс с интерактивными графиками (Chart.js)
- Статистика и аналитика:
- Процент доступности (uptime %)
- Статистика задержек (min, max, avg, median, p95, p99)
- Агрегация по временным интервалам (1m, 5m, 1h)
- Распределение статусов
- Rate limiting: глобальный и на уровне проверки
- Worker pool: параллельная обработка проверок
- Автоматическое планирование: проверки запускаются автоматически
- Отображает мониторируемые домены и их текущий статус
- Кнопка "➕" — добавить новый домен для проверки
- Колонки: домен, тип проверки, частота, последний ответ
- График мониторинга за последние 10 минут
- Сводные метрики: процент доступности, p50/p95 задержка
- Компактный график временной шкалы с цветовой индикацией точек
- Клик для расширения в полноэкранный вид графика
- Редактирование параметров: частота, таймаут, метод, путь, порт
- Включение/отключение проверок
- Удаление проверок
- Настройка rate limiting
| Method | Path | Описание |
|---|---|---|
GET |
/domains |
Получить список всех доменов |
POST |
/domains |
Создать новый домен |
DELETE |
/domains/{id} |
Удалить домен и все связанные проверки |
| Method | Path | Описание |
|---|---|---|
GET |
/checks |
Получить список всех проверок |
GET |
/domains/{id}/checks |
Получить проверки для домена |
POST |
/domains/{id}/checks |
Создать проверку для домена |
POST |
/checks |
Создать проверку напрямую |
PUT |
/checks/{id} |
Обновить параметры проверки |
DELETE |
/checks/{id} |
Удалить проверку |
POST |
/checks/{id}/enable |
Включить проверку |
POST |
/checks/{id}/disable |
Отключить проверку |
POST |
/run-check |
Запустить проверку вручную |
| Method | Path | Описание |
|---|---|---|
GET |
/results |
Получить результаты (с фильтрами) |
GET |
/checks/{id}/results |
Получить результаты проверки |
GET |
/checks/{id}/stats |
Получить статистику проверки |
GET |
/checks/{id}/intervals |
Получить агрегированные данные по интервалам |
GET |
/dashboard/recent |
Получить данные для dashboard |
| Method | Path | Описание |
|---|---|---|
GET |
/swagger/* |
Swagger UI документация |
| Параметр | Описание | Пример |
|---|---|---|
type |
Тип проверки: http, tcp, udp, icmp |
"http" |
interval_seconds |
Интервал между проверками (в секундах) | 60 |
realtime_mode |
Запускать следующую проверку сразу после завершения предыдущей | true |
rate_limit_per_minute |
Максимальное количество проверок в минуту (для realtime) | 60 |
enabled |
Включена ли проверка | true |
params.path |
Путь для HTTP или путь к файлу | "/health" |
params.port |
Порт для TCP/UDP | 80 |
params.payload |
Тело запроса для POST/PUT или payload для UDP | "ping" |
params.timeout_ms |
Таймаут для каждого запроса (мс) | 5000 |
- Scheduler: автоматически планирует и запускает проверки
- Worker Pool: пул воркеров для параллельной обработки проверок (по умолчанию 5)
- Rate Limiting:
- Глобальный rate limiter (1000 запросов/сек по умолчанию)
- Индивидуальный rate limiter для каждой проверки в realtime режиме
- Graceful shutdown: корректное завершение всех проверок при остановке сервера
- Автоматическое обновление: scheduler проверяет изменения каждые 30 секунд
- Строгие таймауты HTTP клиента
- Защита от избыточного опроса (anti-DoS поведение)
- Очередь заданий с ограничением размера (100 заданий)
- Обработка переполнения очереди
- SQLite — легковесная, портативная база данных
- Автоматическое создание таблиц при запуске
- Каскадное удаление связанных записей
- Индексы для оптимизации запросов
- Go 1.24+
- SQLite3 (встроен через драйвер)
# Клонировать репозиторий
git clone https://github.com/MimoJanra/DomainPulse.git
cd DomainPulse
# Установить зависимости
go mod download
# Запустить сервер
go run cmd/server/main.goСервер запустится на http://localhost:8080
Откройте браузер и перейдите на http://localhost:8080
Доступна по адресу: http://localhost:8080/swagger/index.html
- Total Results — общее количество проверок
- Status Distribution — распределение по статусам (success/failure/timeout/error)
- Uptime % — процент успешных проверок
- Min — минимальная задержка
- Max — максимальная задержка
- Avg — средняя задержка
- Median — медианная задержка
- P95 — 95-й перцентиль
- P99 — 99-й перцентиль
Поддерживаемые интервалы:
1m— 1 минута5m— 5 минут1h— 1 час
Для каждого интервала возвращается:
- Количество проверок
- Количество успешных/неуспешных
- Средняя/минимальная/максимальная задержка
- Распределение статусов
| Компонент | Технология |
|---|---|
| HTTP клиент и таймауты | net/http |
| Context и отмена | context |
| Планирование | time.Ticker |
| Слой базы данных | database/sql |
| SQLite драйвер | mattn/go-sqlite3 |
| Rate limiting | golang.org/x/time/rate |
| ICMP ping | prometheus-community/pro-bing |
| HTTP роутер | go-chi/chi/v5 |
| Swagger | swaggo/swag |
| Графики | Chart.js |
DomainPulse/
├── cmd/
│ └── server/
│ └── main.go # Точка входа приложения
├── internal/
│ ├── api/
│ │ ├── handlers.go # HTTP обработчики
│ │ └── router.go # Настройка роутинга
│ ├── checker/
│ │ ├── scheduler.go # Планировщик проверок
│ │ ├── worker.go # Worker pool
│ │ ├── http_check.go # HTTP проверки
│ │ ├── tcp_check.go # TCP проверки
│ │ ├── udp_check.go # UDP проверки
│ │ ├── icmp_check.go # ICMP проверки
│ │ └── rate_limiter.go # Rate limiting
│ ├── models/
│ │ └── models.go # Модели данных
│ └── storage/
│ ├── db.go # Инициализация БД
│ ├── domain_repo.go # Репозиторий доменов
│ ├── check_repo.go # Репозиторий проверок
│ └── result_repo.go # Репозиторий результатов
├── web/
│ ├── index.html # Веб-интерфейс
│ └── static/
│ ├── app.js # JavaScript логика
│ └── style.css # Стили
├── docs/ # Swagger документация
├── go.mod # Зависимости
└── README.md # Документация
curl -X POST http://localhost:8080/domains \
-H "Content-Type: application/json" \
-d '{"name": "example.com"}'curl -X POST http://localhost:8080/domains/1/checks \
-H "Content-Type: application/json" \
-d '{
"type": "http",
"interval_seconds": 60,
"params": {
"path": "/health",
"timeout_ms": 5000
}
}'curl "http://localhost:8080/checks/1/stats?from=2024-01-01T00:00:00Z&to=2024-01-31T23:59:59Z"curl "http://localhost:8080/checks/1/intervals?interval=1m&page=1&page_size=100"- Валидация доменных имен через регулярные выражения
- Защита от SQL инъекций через параметризованные запросы
- Rate limiting для предотвращения злоупотреблений
- Таймауты для всех сетевых операций
- Graceful shutdown для корректного завершения работы
Приветствуются pull requests и issues!
Для вопросов и предложений создавайте issues в репозитории.