Live Query Monitor для PostgreSQL, MySQL и ClickHouse — терминальный TUI-профайлер баз данных в реальном времени.
🔍 Мониторинг в реальном времени
Live-обновление активных запросов каждую секунду
Diff-движок для отслеживания новых/завершённых запросов
История до 5000 запросов в кольцевом буфере
СУБД
Версии
Драйвер
PostgreSQL
12+
pgx/v5
MySQL
5.7+, 8.0+
go-sql-driver/mysql
ClickHouse
21.8+
clickhouse-go/v2
Просмотр активных запросов с детализацией:
PID / query_id
Пользователь и база данных
Состояние (state)
Длительность выполнения
Потребление памяти (ClickHouse)
Настройки сессии (PostgreSQL)
EXPLAIN запросов — план выполнения без выхода из приложения
Kill Query — завершение долгих запросов по PID
Копирование запроса в буфер обмена
TUI на bubbletea — современный терминальный интерфейс
Адаптивная вёрстка — подстраивается под размер терминала
Цветовая схема — выделение статусов и проблемных зон
Модальные окна — для EXPLAIN, подтверждения Kill, копирования
📊 Сравнительный анализ инструментов мониторинга
Критерий
🚀 SQL-Top
🐍 pg_activity
🐘 DBeaver / DataGrip
Тип инструмента
TUI (Terminal UI)
TUI (Terminal UI)
GUI (Desktop IDE)
Язык / Стек
Go (Single Binary)
Python (pip deps)
Java / Eclipse
Портативность
✅ Отличная (~21MB, zero deps)
⚠️ Средняя (нужен Python/Libs)
📦 Низкая (500MB+ installer)
Время запуска
⏱️ Мгновенно (~70ms)
⏱️ Быстро (<500ms)
⏳ Долго (5–15 сек)
Поддержка СУБД
🔌 PG, MySQL, ClickHouse
❌ Только PostgreSQL
✅ Все популярные
Безопасность
🛡️ Safe EXPLAIN (No ANALYZE)
❌ Нет EXPLAIN в TUI
⚠️ Опасно (ANALYZE по умолчанию)
Нагрузка на БД
📉 Минимальная (оптимизирован)
Минимальная
📊 Зависит от плагинов
Киллер-фича
💡 Delta Highlighting
Simple Monitor
Визуальный конструктор
Примечание: Измерения SQL-Top выполнены 07.04.2026 на Windows (Go 1.25.0). Время запуска: среднее из 5 запусков. Размер бинарника: без сжатия UPX. Сравнение с конкурентами основано на публичной документации.
Go 1.25.0+
Terminal с поддержкой UTF-8
Доступ к целевой БД
git clone https://github.com/turkprogrammer/sql-top.git
cd sql-top
go build -o sql-top ./...
go install github.com/turkprogrammer/sql-top/cmd/sql-top@latest
# Windows
sql-top.exe -dsn " postgres://user:pass@localhost:5432/db"
# Linux/macOS
./sql-top -dsn " mysql://user:pass@localhost:3306/db"
sql-top postgres://postgres:password@localhost:5432/mydb
sql-top mysql://root:password@localhost:3306/mydb
sql-top clickhouse://default:password@localhost:9000/mydb
sql-top -dsn postgres://user:pass@host:5432/db
После запуска вы увидите таблицу с активными запросами:
╭──────────────────────────────────────────────────────────────╮
│ SQL-Top — Live Query Monitor ● Connected │
├──────────────────────────────────────────────────────────────┤
│ PID User DB State Duration Query │
├──────────────────────────────────────────────────────────────┤
│ 12345 postgres mydb active 2.5s SELECT… │
│ 67890 app_user analytics idle 15.3s UPDATE… │
╰──────────────────────────────────────────────────────────────╯
↑/↓ или j/k — перемещение по списку запросов
Enter — показать EXPLAIN для выбранного запроса
k — завершить запрос (требуется подтверждение)
y — скопировать запрос в буфер обмена
q или Ctrl+C — выход
╭────────────────────────────────────────────╮
│ EXPLAIN QUERY [×] │
├────────────────────────────────────────────┤
│ Seq Scan on users │
│ Filter: (age > 25) │
│ Cost: 0.00..15.00 │
├────────────────────────────────────────────┤
│ Press ESC to close │
╰────────────────────────────────────────────╯
╭────────────────────────────────────────────╮
│ ⚠ KILL QUERY CONFIRMATION [×] │
├────────────────────────────────────────────┤
│ Are you sure you want to kill query? │
│ PID: 12345 │
│ Query: SELECT * FROM large_table... │
├────────────────────────────────────────────┤
│ [y] Yes, kill it [n] No, cancel │
╰────────────────────────────────────────────╯
Клавиша
Действие
Описание
↑ / k
Navigation Up
Переместиться вверх по списку
↓ / j
Navigation Down
Переместиться вниз по списку
Enter
Show EXPLAIN
Показать план выполнения запроса
k
Kill Query
Завершить выбранный запрос
y
Copy Query
Скопировать текст запроса
ESC
Close Modal
Закрыть модальное окно
q
Quit
Выход из приложения
Ctrl+C
Graceful Shutdown
Корректное завершение работы
Hexagonal Architecture + Composition
┌─────────────────────────────────────────────────┐
│ cmd/sql-top │
│ (Composition Root) │
└────────────────────┬────────────────────────────┘
│
┌────────────┴────────────┐
│ │
┌───────▼────────┐ ┌────────▼────────┐
│ UI Layer │ │ Domain Layer │
│ (bubbletea) │ │ (Interfaces) │
│ - model.go │ │ - provider.go │
│ - styles.go │ │ - sanitize.go │
│ - help.go │ │ - config.go │
└───────┬────────┘ └────────┬────────┘
│ │
│ ┌───────────────────┘
│ │
┌───────▼────────────────────────▼────────┐
│ Infrastructure Layer (Adapters) │
│ ┌──────────┬──────────┬─────────────┐ │
│ │ Postgres │ MySQL │ ClickHouse │ │
│ │ adapter │ adapter │ adapter │ │
│ │ fetcher │ fetcher │ fetcher │ │
│ │ explainer│explainer│ explainer │ │
│ └──────────┴──────────┴─────────────┘ │
└─────────────────────────────────────────┘
sql-top/
├── cmd/
│ └── sql-top/
│ └── main.go # Точка входа, DI, graceful shutdown
├── internal/
│ ├── domain/
│ │ ├── provider.go # Интерфейсы (ports) и типы
│ │ ├── sanitize.go # Санитизация запросов и DSN
│ │ ├── diff.go # Diff-движок для запросов
│ │ ├── query.go # Тип WaitEventType и методы
│ │ └── config.go # Константы конфигурации
│ ├── infrastructure/
│ │ ├── base/
│ │ │ └── adapter.go # Базовый адаптер (composition)
│ │ ├── postgres/
│ │ ├── mysql/
│ │ └── clickhouse/
│ ├── history/
│ │ └── ringbuffer.go # Кольцевой буфер истории
│ └── ui/
│ ├── model.go # TUI модель (bubbletea)
│ ├── styles.go # Стили lipgloss
│ └── help.go # Справка
├── go.mod
├── go.sum
└── README.md
// main.go — Composition Root
func main () {
logger := createLogger ()
adapter := createAdapter (dsn , logger ) // DI logger
model := ui .NewModel (adapter , logger ) // DI logger
p := tea .NewProgram (model , tea .WithAltScreen ())
p .Run ()
}
Константы (domain/config.go)
Константа
Значение
Описание
DefaultMaxConns
2
Макс. количество подключений в пуле
DefaultMinConns
1
Мин. количество подключений в пуле
DefaultConnMaxLifetime
5 мин
Время жизни подключения
Константа
Значение
Описание
DefaultPollInterval
1 сек
Интервал опроса активных запросов
DefaultRingBufferCapacity
5000
Ёмкость буфера истории
Константа
Значение
Описание
DefaultModalWidth
80
Ширина модального окна
DefaultModalHeight
30
Высота модального окна
DefaultQueryTruncateLength
60
Макс. длина запроса в таблице
Константа
Значение
Описание
ClipboardConfirmTimeout
2 сек
Подтверждение копирования
PingInterval
5 сек
Интервал ping проверки
KillQueryTimeout
5 сек
Timeout для kill query
ExplainQueryTimeout
10 сек
Timeout для explain query
Переменная
Значение по умолчанию
Описание
SQLTOP_DEBUG
0
Включает debug-логирование (установите 1)
SQLTOP_KILL_TIMEOUT
5s
Timeout для завершения запроса (kill query)
SQLTOP_EXPLAIN_TIMEOUT
10s
Timeout для получения плана выполнения (EXPLAIN)
SQLTOP_PING_INTERVAL
5s
Интервал проверки подключения к БД
SQLTOP_CLIPBOARD_TIMEOUT
2s
Время отображения подтверждения копирования
# Включить debug-режим
export SQLTOP_DEBUG=1
# Увеличить таймауты для медленной БД
export SQLTOP_KILL_TIMEOUT=30s
export SQLTOP_EXPLAIN_TIMEOUT=60s
# Изменить интервал ping
export SQLTOP_PING_INTERVAL=10s
# Запуск с настройками
sql-top postgres://user:pass@localhost:5432/db
# Локальное подключение
sql-top postgres://postgres:password@localhost:5432/mydb
# Удалённое подключение с SSL
sql-top postgres://user:pass@db.example.com:5432/prod? sslmode=require
# С указанием схемы
sql-top postgres://user:pass@localhost:5432/db? search_path=analytics
# Локальное подключение
sql-top mysql://root:password@localhost:3306/mydb
# Удалённое подключение
sql-top mysql://app:secret@db.example.com:3306/production
# С TLS
sql-top mysql://user:pass@localhost:3306/db? tls=preferred
# Локальное подключение
sql-top clickhouse://default:password@localhost:9000/mydb
# Удалённое подключение
sql-top clickhouse://admin:secret@clickhouse.example.com:9000/analytics
# С указанием базы данных
sql-top clickhouse://user:pass@localhost:9000/default
Требования для разработки
Go 1.25.0+
Git
Доступ к тестовой БД (PostgreSQL/MySQL/ClickHouse)
git clone https://github.com/turkprogrammer/sql-top.git
cd sql-top
go mod download
# Сборка для текущей ОС
go build ./...
# Кросс-компиляция
GOOS=linux GOARCH=amd64 go build -o sql-top-linux ./cmd/sql-top
GOOS=windows GOARCH=amd64 go build -o sql-top.exe ./cmd/sql-top
Запуск в режиме разработки
# С debug-логированием
SQLTOP_DEBUG=1 go run ./cmd/sql-top -dsn " postgres://..."
# С указанием DSN
go run ./cmd/sql-top postgres://localhost:5432/mydb
go test ./... -count=1 -v
go test ./... -coverprofile=coverage.out
go tool cover -html=coverage.out
# Встроенный vet
go vet ./...
# Staticcheck
staticcheck ./...
# Форматирование
gofmt -l .
gofmt -w . # Автоисправление
internal/
├── domain/
│ ├── sanitize_test.go # 6 тестов
│ └── diff_test.go # 8 тестов
├── infrastructure/
│ ├── postgres/
│ │ └── fetcher_test.go # 4 теста
│ ├── mysql/
│ │ └── fetcher_test.go # 4 теста
│ └── clickhouse/
│ └── fetcher_test.go # 4 теста
└── ui/
└── model_test.go # 17 тестов
Итого: 44 unit-теста, покрытие критичных путей ~50%.
Примечание: Текущие тесты покрывают изолированные компоненты (domain, UI логика, конструкторы адаптеров). Интеграционные тесты с реальными БД находятся в разработке.
✅ Соответствие стандартам
SQL-Top соответствует современным Go-практикам:
Принцип
Статус
Описание
KISS
✅
Простая архитектура без избыточных абстракций
YAGNI
✅
Нет преждевременной оптимизации
SOLID
✅
Интерфейсы в domain, реализация в infrastructure
Hexagonal Architecture
✅
Ports & Adapters + Dependency Injection
Error Handling
✅
Все ошибки обёрнуты с %w, errors.Is() для сравнений
Graceful Shutdown
✅
Context cancellation + signal handling
No Globals
✅
DI через параметры, нет синглтонов
Functions ≤50 LOC
✅
Все функции ≤50 строк
Defensive Coding
✅
Nil guards, resource leak prevention, defensive copies
Structured Logging
✅
log/slog во всех слоях, DSN маскируется
# 0 warnings
go vet ./... # ✅ чисто
gofmt -l . # ✅ чисто
# Тесты
go test ./... # ✅ 44 теста проходят
MIT License — см. файл LICENSE для деталей.
Fork репозиторий
Создайте feature branch (git checkout -b feature/amazing-feature)
Commit изменения (git commit -m 'Add amazing feature')
Push в branch (git push origin feature/amazing-feature)
Откройте Pull Request
Форматирование: gofmt перед коммитом
Тесты: Покрытие для новой функциональности
Документация: Обновление README при изменении API
Стандарты: Соответствие Qwen.md принципам