Skip to content

Latest commit

History

16 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SQL-Top 🚀

Live Query Monitor для PostgreSQL, MySQL и ClickHouse — терминальный TUI-профайлер баз данных в реальном времени.

Go VersionLicenseBuild StatusTests

📖 Оглавление


✨ Возможности

🔍 Мониторинг в реальном времени

  • Live-обновление активных запросов каждую секунду
  • Diff-движок для отслеживания новых/завершённых запросов
  • История до 5000 запросов в кольцевом буфере

🎯 Поддержка СУБД

СУБДВерсииДрайвер
PostgreSQL12+pgx/v5
MySQL5.7+, 8.0+go-sql-driver/mysql
ClickHouse21.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 HighlightingSimple 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

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"

🚀 Быстрый старт

PostgreSQL

sql-top postgres://postgres:password@localhost:5432/mydb

MySQL

sql-top mysql://root:password@localhost:3306/mydb

ClickHouse

sql-top clickhouse://default:password@localhost:9000/mydb

С флагом -dsn

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

╭────────────────────────────────────────────╮
│ EXPLAIN QUERY [×] │
├────────────────────────────────────────────┤
│ Seq Scan on users │
│ Filter: (age > 25) │
│ Cost: 0.00..15.00 │
├────────────────────────────────────────────┤
│ Press ESC to close │
╰────────────────────────────────────────────╯

Kill Query Confirmation

╭────────────────────────────────────────────╮
│ ⚠ 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 │
╰────────────────────────────────────────────╯

⌨ Горячие клавиши

КлавишаДействиеОписание
/ kNavigation UpПереместиться вверх по списку
/ jNavigation DownПереместиться вниз по списку
EnterShow EXPLAINПоказать план выполнения запроса
kKill QueryЗавершить выбранный запрос
yCopy QueryСкопировать текст запроса
ESCClose ModalЗакрыть модальное окно
qQuitВыход из приложения
Ctrl+CGraceful 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

Dependency Injection

// main.go — Composition Rootfuncmain() {
logger:=createLogger()
adapter:=createAdapter(dsn, logger) // DI loggermodel:=ui.NewModel(adapter, logger) // DI loggerp:=tea.NewProgram(model, tea.WithAltScreen())
p.Run()
}

⚙ Конфигурация

Константы (domain/config.go)

Подключение к БД

КонстантаЗначениеОписание
DefaultMaxConns2Макс. количество подключений в пуле
DefaultMinConns1Мин. количество подключений в пуле
DefaultConnMaxLifetime5 минВремя жизни подключения

Polling

КонстантаЗначениеОписание
DefaultPollInterval1 секИнтервал опроса активных запросов
DefaultRingBufferCapacity5000Ёмкость буфера истории

UI

КонстантаЗначениеОписание
DefaultModalWidth80Ширина модального окна
DefaultModalHeight30Высота модального окна
DefaultQueryTruncateLength60Макс. длина запроса в таблице

Timeout

КонстантаЗначениеОписание
ClipboardConfirmTimeout2 секПодтверждение копирования
PingInterval5 секИнтервал ping проверки
KillQueryTimeout5 секTimeout для kill query
ExplainQueryTimeout10 секTimeout для explain query

Переменные окружения

ПеременнаяЗначение по умолчаниюОписание
SQLTOP_DEBUG0Включает debug-логирование (установите 1)
SQLTOP_KILL_TIMEOUT5sTimeout для завершения запроса (kill query)
SQLTOP_EXPLAIN_TIMEOUT10sTimeout для получения плана выполнения (EXPLAIN)
SQLTOP_PING_INTERVAL5sИнтервал проверки подключения к БД
SQLTOP_CLIPBOARD_TIMEOUT2sВремя отображения подтверждения копирования
# Включить debug-режимexport SQLTOP_DEBUG=1
# Увеличить таймауты для медленной БДexport SQLTOP_KILL_TIMEOUT=30s
export SQLTOP_EXPLAIN_TIMEOUT=60s
# Изменить интервал pingexport SQLTOP_PING_INTERVAL=10s
# Запуск с настройками
sql-top postgres://user:pass@localhost:5432/db

🔗 Примеры подключения

PostgreSQL

# Локальное подключение
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

MySQL

# Локальное подключение
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

ClickHouse

# Локальное подключение
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 логика, конструкторы адаптеров). Интеграционные тесты с реальными БД находятся в разработке.


✅ Соответствие стандартам

Code Quality

SQL-Top соответствует современным Go-практикам:

ПринципСтатусОписание
KISSПростая архитектура без избыточных абстракций
YAGNIНет преждевременной оптимизации
SOLIDИнтерфейсы в domain, реализация в infrastructure
Hexagonal ArchitecturePorts & Adapters + Dependency Injection
Error HandlingВсе ошибки обёрнуты с %w, errors.Is() для сравнений
Graceful ShutdownContext cancellation + signal handling
No GlobalsDI через параметры, нет синглтонов
Functions ≤50 LOCВсе функции ≤50 строк
Defensive CodingNil guards, resource leak prevention, defensive copies
Structured Logginglog/slog во всех слоях, DSN маскируется

Code Quality Metrics

# 0 warnings
go vet ./... # ✅ чисто
gofmt -l .# ✅ чисто# Тесты
go test ./... # ✅ 44 теста проходят

📝 Лицензия

MIT License — см. файл LICENSE для деталей.


🤝 Contributing

Как внести вклад

  1. Fork репозиторий
  2. Создайте feature branch (git checkout -b feature/amazing-feature)
  3. Commit изменения (git commit -m 'Add amazing feature')
  4. Push в branch (git push origin feature/amazing-feature)
  5. Откройте Pull Request

Требования к коду

  • Форматирование:gofmt перед коммитом
  • Тесты: Покрытие для новой функциональности
  • Документация: Обновление README при изменении API
  • Стандарты: Соответствие Qwen.md принципам

🙏 Благодарности

About

A real-time SQL profiler and monitor TUI for PostgreSQL. High-performance "htop" for your database with instant EXPLAIN, wait event analysis, and delta highlighting.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages