sql-tap: Visualización de tráfico SQL en tiempo real - Análisis completo
Descubre sql-tap: la herramienta revolucionaria que intercepta y visualiza consultas SQL en tiempo real mediante TUI. Arquitectura, características, casos de uso y comparación con alternativas tradicionales.
Índice de contenido
El problema: debugging de bases de datos en tiempo real
El 14 de febrero de 2026, Tetsuro Mikami (mickamy) liberó sql-tap en GitHub. En menos de 48 horas, el proyecto alcanzó 768 estrellas. ¿Por qué? Porque resolvía un problema que todo desarrollador de backend enfrenta pero nadie había resuelto bien: ¿cómo ver exactamente qué queries está ejecutando tu aplicación en tiempo real, sin modificar código ni configurar logging complejo?
Las soluciones tradicionales tenían tradeoffs significativos:
- Slow query log: útil pero reactivo, solo muestra queries que ya terminaron
- Logging en aplicación: requiere modificar código, agregar dependencias, y genera spam en logs
- pg_stat_statements: excelente para agregación, pero no muestra queries en tiempo real ni contexto de transacción
- Tcpdump/Wireshark: técnico, difícil de filtrar, no entiende el protocolo SQL
sql-tap tomó un enfoque diferente: un proxy transparente con una interfaz TUI hermosa y práctica.
Arquitectura: Proxy + Wire Protocol Parsing
sql-tap consta de dos componentes:
sql-tapd: El proxy daemon
┌─────────────┐ ┌───────────────────────┐ ┌────────────────────┐
│ Application │─────▶│ sql-tapd (proxy) │─────▶│ PostgreSQL / MySQL │
└─────────────┘ │ │ └────────────────────┘
│ captures queries │
│ via wire protocol │
└───────────┬───────────┘
│ gRPC stream
┌───────────▼───────────┐
│ sql-tap (TUI) │
└───────────────────────┘
El daemon se posiciona entre tu aplicación y la base de datos:
# PostgreSQL: proxy en :5433 → database en :5432
DATABASE_URL="postgres://user:pass@localhost:5432/db?sslmode=disable" \
sql-tapd --driver=postgres --listen=:5433 --upstream=localhost:5432
# MySQL: proxy en :3307 → database en :3306
DATABASE_URL="user:pass@tcp(localhost:3306)/db" \
sql-tapd --driver=mysql --listen=:3307 --upstream=localhost:3306
Lo clave: habla el wire protocol nativo. Tu aplicación cree que está hablando directamente con PostgreSQL o MySQL. No hay traducción ni modificación de queries.
Captura de información
El proxy parsea el wire protocol para extraer:
- Queries completas: incluyendo prepared statements y parameter bindings
- Transacciones: agrupa queries por transacción automáticamente
- Métricas: tiempo de ejecución, filas afectadas, errores
- Contexto: stack trace de la aplicación (cuando está disponible)
Los eventos se transmiten en tiempo real vía gRPC a clientes conectados (puedes tener múltiples TUI conectadas al mismo proxy).
Cliente TUI: Interfaz práctica y poderosa
Una vez iniciado el proxy, conectas la TUI:
sql-tap localhost:9091
La interfaz tiene cuatro vistas principales:
Lista de queries (List View)
Muestra todas las queries en tiempo real con atajos:
j/ko↓/↑: navegación/: búsqueda incrementals: toggle sort cronológico/duraciónEnter: inspeccionar querySpace: expandir/colapsar transacciónx: EXPLAINX: EXPLAIN ANALYZEe/E: editar query antes de EXPLAINa: analytics viewc/C: copiar query (con o sin bound args)
Inspector de query
Detalles completos de una query específica:
- SQL completo con syntax highlighting
- Parámetros bindeados
- Tiempo de ejecución
- Filas afectadas
- Contexto de error (si falló)
- Plan de ejecución (si ejecutaste EXPLAIN)
Analytics view
Agregaciones estadísticas:
- Queries más frecuentes
- Queries más lentas
- Distribución de tiempos
- Sorteable por total/count/average
Explain view
Visualización de planes de ejecución con scroll horizontal y vertical, soporte para EXPLAIN y EXPLAIN ANALYZE.
Características únicas
1. Transparencia total
A diferencia de soluciones que requieren instrumentación (ORM logging, middleware), sql-tap no sabe ni le importa tu stack. Node.js, Python, Ruby, Java, Go — funciona con cualquier lenguaje que use el driver estándar de PostgreSQL o MySQL.
2. Soporte para prepared statements
Las herramientas de logging tradicionales suelen mostrar SELECT * FROM users WHERE id = $1 sin los valores. sql-tap captura tanto el statement preparado como los parámetros bindeados, mostrando la query completa y reproducible.
3. Agrupación por transacción
Las queries dentro de una transacción se agrupan visualmente. Puedes expandir/colapsar transacciones con Space para ver el contexto completo. Esto es crítico para debugging de race conditions o deadlocks.
4. EXPLAIN interactivo
Presiona x para ejecutar EXPLAIN en la base de datos upstream directamente desde la TUI. Presiona X para EXPLAIN ANALYZE (ejecuta realmente la query y muestra métricas). Presiona e para editar la query antes de explicarla útil para probar variantes.
Para que funcione, configura DATABASE_URL con credenciales válidas:
DATABASE_URL="postgres://user:pass@localhost:5432/db" \
sql-tapd --driver=postgres --listen=:5433 --upstream=localhost:5432
5. Multiplataforma
Binarios disponibles para:
- macOS (amd64, arm64)
- Linux (amd64, arm64)
- Windows (vía Go install)
También disponible vía Homebrew y Docker.
Casos de uso prácticos
Debugging de N+1 queries
El problema clásico: tu aplicación hace 1 query para traer 100 usuarios, y luego 100 queries más para traer sus profiles. Con sql-tap:
- Inicia el proxy
- Ejecuta la operación problemática
- Presiona
apara analytics view - Ordena por
count - Las queries repetidas aparecen inmediatamente
Análisis de queries lentas
En desarrollo local:
- Conecta la TUI
- Ejecuta la página que está lenta
- Presiona
spara ordenar por duración - Presiona
Xen la query más lenta para EXPLAIN ANALYZE - Identifica missing indexes o joins ineficientes
Debugging de prepared statements
Las herramientas tradicionales muestran:
SELECT * FROM users WHERE email = $1
sql-tap muestra:
SELECT * FROM users WHERE email = '[email protected]'
Crítico para reproducir problemas específicos.
Understanding queries en legacy code
Tomaste un proyecto heredado y no entiendes qué hace. Con sql-tap:
- Inicia el proxy
- Navega la aplicación
- Observa las queries que se ejecutan
- Entiende el comportamiento sin leer 10,000 líneas de código
Especificaciones técnicas
Stack tecnológico
- Lenguaje: Go (131,478 líneas de código Go)
- Licencia: MIT
- Versión actual: v0.0.9 (15 de febrero de 2026)
- Autor: Tetsuro Mikami (mickamy)
- Comunidad: 768 GitHub stars, 17 forks
Bases de datos soportadas
- PostgreSQL: versión 18-alpine en Docker, versiones recientes en bare metal
- MySQL: versión 8+, soporte para MySQL 9.x con fixes para CLIENT_QUERY_ATTRIBUTES
- TiDB: soportado desde v0.0.9 con
--driver=tidb
Protocolos soportados
- PostgreSQL wire protocol: parse completo de messages, including Parse, Bind, Execute, Sync
- MySQL wire protocol: parse de COM_QUERY, con soporte para attributes de MySQL 9
- Compression: soporte para zlib y zstd (stripeado en handshake para prevenir broken connections)
Comunicación
- gRPC: comunicación entre proxy y TUI
- Default port: 9091 (configurable con
--grpc)
Instalación
Homebrew (macOS/Linux)
brew install --cask mickamy/tap/sql-tap
Go install
go install github.com/mickamy/sql-tap@latest
go install github.com/mickamy/sql-tap/cmd/sql-tapd@latest
Build from source
git clone https://github.com/mickamy/sql-tap.git
cd sql-tap
make install
Docker
PostgreSQL
FROM postgres:18-alpine
ARG SQL_TAP_VERSION=0.0.9
ARG TARGETARCH
ADD https://github.com/mickamy/sql-tap/releases/download/v${SQL_TAP_VERSION}/sql-tap_${SQL_TAP_VERSION}_linux_${TARGETARCH}.tar.gz /tmp/sql-tap.tar.gz
RUN tar -xzf /tmp/sql-tap.tar.gz -C /usr/local/bin sql-tapd && rm /tmp/sql-tap.tar.gz
ENTRYPOINT ["sql-tapd", "--driver=postgres", "--listen=:5433", "--upstream=localhost:5432", "--grpc=:9091"]
MySQL
FROM mysql:8
ARG SQL_TAP_VERSION=0.0.9
ARG TARGETARCH
ADD https://github.com/mickamy/sql-tap/releases/download/v${SQL_TAP_VERSION}/sql-tap_${SQL_TAP_VERSION}_linux_${TARGETARCH}.tar.gz /tmp/sql-tap.tar.gz
RUN tar -xzf /tmp/sql-tap.tar.gz -C /usr/local/bin sql-tapd && rm /tmp/sql-tap.tar.gz
ENTRYPOINT ["sql-tapd", "--driver=mysql", "--listen=:3307", "--upstream=localhost:3306", "--grpc=:9091"]
Limitaciones y consideraciones
Latencia
El proxy añade latencia. En development/desconecta el proxy y conecta directamente a la base de datos.
Uso de recursos
El proxy consume CPU y memoria para parsear el wire protocol. En alta carga, puede ser significativo. Monitorea el uso de recursos del daemon sql-tapd.
Compatibilidad con protocolos comprimidos
La versión 0.0.9 corrigió soporte para protocolo comprimido (zlib/zstd) en MySQL, pero requiere testing extensivo en producción. El fix (commit d64140d5, 15 de febrero de 2026) stripea las capacidades de compresión en el handshake para prevenir conexiones rotas.
UTF-8 encoding
El commit 49cfb91b (15 de febrero de 2026) añadió sanitización de UTF-8 inválido en respuestas gRPC, previniendo crashes cuando el database retorna datos no-UTF-8 válidos (binarios, encoding incorrecto).
EXPLAIN requiere credenciales
Sin DATABASE_URL configurada, el proxy captura queries pero EXPLAIN está deshabilitado. Necesitas credenciales válidas para usar esta funcionalidad.
Roadmap y desarrollo activo
El proyecto es extremadamente activo. Creado el 14 de febrero de 2026, en 48 horas tuvo:
- 4 issues cerradas: incluyendo bugs críticos para MySQL 9 y compresión
- 9 releases: desde v0.0.1 hasta v0.0.9
- 67 commits: todos por mickamy (proyecto solitario actualmente)
Fixes recientes
- v0.0.9 (15 de febrero): sanitización de UTF-8, fix para MySQL 9 CLIENT_QUERY_ATTRIBUTES, soporte para TiDB
- v0.0.8: fix para protocolo comprimido en MySQL
- v0.0.7: mejoras en analytics view
Issues cerrados recientes
- Issue #4: Error gRPC con UTF-8 inválido — cerrado en v0.0.9
- Issue #3: EXPLAIN falla con MySQL 9.6.0 debido a CLIENT_QUERY_ATTRIBUTES — cerrado en v0.0.9
- Issue #2: Soporte para protocolo comprimido — cerrado en v0.0.8
- Issue #1: Primer feature request — cerrado
Comparación con alternativas
vs. Slow query log
Slow query log:
- ✅ Nativo, sin dependencias
- ✅ Configurable por threshold
- ❌ Solo queries lentas, no todas
- ❌ Reactivo, no en tiempo real
- ❌ No agrupa por transacción
sql-tap:
- ✅ Todas las queries en tiempo real
- ✅ Agrupa por transacción
- ✅ UI interactiva
- ❌ Requiere proxy adicional
- ❌ Latencia añadida
Veredicto: Complementarios. Usa slow query log en producción, sql-tap en desarrollo.
vs. pg_stat_statements
pg_stat_statements:
- ✅ Nativo de PostgreSQL
- ✅ Agregaciones estadísticas potentes
- ✅ Overhead mínimo
- ❌ No muestra queries en tiempo real
- ❌ No muestra contexto de aplicación
- ❌ Solo PostgreSQL
sql-tap:
- ✅ Tiempo real
- ✅ Contexto completo
- ✅ Multi-database (PostgreSQL, MySQL, TiDB)
- ❌ Overhead de proxy
- ❌ No agrupaciones estadísticas (aunque analytics view ayuda)
Veredicto: pg_stat_statements para tendencias a largo plazo, sql-tap para debugging interactivo.
vs. Logging en aplicación
ORM/driver logging:
- ✅ Sin infra adicional
- ✅ Contexto de aplicación incluido
- ❌ Contamina logs
- ❌ Requiere modificar código
- ❌ Diffícil de filtrar/buscar
sql-tap:
- ✅ Sin modificación de código
- ✅ UI dedicada con filtros
- ✅ No contamina logs
- ❌ Infraestructura adicional
- ❌ Overhead de proxy
Veredicto: sql-tap es superior para debugging temporal. Logging es mejor para tracing permanente.
vs. Tcpdump/Wireshark
Tcpdump/Wireshark:
- ✅ Captura todo el tráfico
- ✅ Sin modificación de infra
- ❌ Muy técnico
- ❌ No entiende protocolo SQL
- ❌ Diffícil de filtrar queries específicas
sql-tap:
- ✕ Entiende wire protocol SQL
- ✕ UI especializada
- ✕ Filtros por transacción, duración, etc.
- ❌ Solo tráfico SQL
- ❌ Requiere proxy
Veredicto: sql-tap es tcpdump especializado para SQL con UX amigable.
Cuándo usar sql-tap
Ideal para:
- Development local: debugging interactivo de queries
- Staging: análisis de rendimiento antes de producción
- Debugging de issues específicos: reproducir queries problemáticas
- Onboarding a nuevos desarrolladores: entender el comportamiento de queries en legacy code
- Optimización de queries: identificar N+1, missing indexes, joins ineficientes
No ideal para:
- Producción de alta carga: el overhead de proxy puede ser significativo
- Monitoring permanente: herramientas especializadas (Datadog, New Relic) son más apropiadas
- Ambientes sin acceso a TTY: requiere terminal interactiva
- Queries extremadamente sensibles: el proxy tiene acceso a todo el tráfico SQL
Conclusión
sql-tap llena un gap importante en el toolkit de desarrolladores backend: una herramienta moderna, interactiva y práctica para debugging de bases de datos en tiempo real. No reemplaza herramientas de monitoring ni logging tradicional, pero complementa el ecosistema de forma única.
El proyecto es joven (creado en febrero de 2026) pero extremadamente activo, con bugs siendo corregidos rápidamente y features siendo añadidas en base a feedback de la comunidad. Con 768 estrellas en 48 horas, es claro que resonó con un dolor real de desarrolladores.
Mi recomendación: agrégalo a tu toolkit de development. Úsalo cuando necesites entender qué está haciendo tu aplicación con la base de datos, debugging de queries lentas, u onboarding a código heredado. Desconéctalo en producción y usa herramientas especializadas para monitoring.
La combinación de arquitectura de proxy transparente + wire protocol parsing + TUI interactiva hace de sql-tap una herramienta que, una vez que la usas, te preguntas cómo vivías sin ella.
Recursos
- Repositorio oficial: https://github.com/mickamy/sql-tap
- Licencia: MIT
- Autor: Tetsuro Mikami (@mickamy)
- Versión: v0.0.9
- Lanzamiento: 14 de febrero de 2026