Compilar, Probar y Perfilar desde la Shell
Ejecuta compilaciones y pruebas desde la shell, captura perfiles con go tool pprof y alinea fallos con las marcas de tiempo de journalctl en hosts Linux.
Busca en todas las páginas de la documentación
Ejecuta compilaciones y pruebas desde la shell, captura perfiles con go tool pprof y alinea fallos con las marcas de tiempo de journalctl en hosts Linux.
La toolchain de Go es nativa de la CLI: go build, go test y go tool pprof están diseñados para scripts, CI y sesiones SSH.
Combínalos con redirección de shell, tee y consultas de journal para que una prueba fallida en tu portátil use los mismos comandos que ejecutarás durante un incidente de producción.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Compilar y probar desde la raíz del módulo
go build -o bin/api ./cmd/api
go test ./... -count=1 -race 2>&1 | tee test.log
# Perfilar CPU de un benchmark localmente
go test -bench=. -benchmem -cpuprofile=cpu.prof -run=^$ ./...
go tool pprof -http=:0 cpu.prof
# Obtener perfil de un servidor en ejecución (cuando el endpoint pprof está habilitado)
curl -s "http://localhost:6060/debug/pprof/profile?seconds=30" -o live.prof
go tool pprof live.prof
# Correlacionar con logs de systemd
sudo journalctl -u api.service --since "10 min ago" --no-pagerCuándo usar esto:
go test con las marcas de tiempo del journal.#!/usr/bin/env bash
set -euo pipefail
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
# Compilar
mkdir -p bin
go build -ldflags="-s -w" -o bin/api ./cmd/api
# Probar con detector de carreras; mantener el artefacto de log
go test ./... -count=1 -race -timeout=5m 2>&1 | tee artifacts/test-$(date +%Y%m%d%H%M).log
# Micro-benchmark + perfil de CPU para un paquete
PKG=./internal/handler
go test "$PKG" -bench=BenchmarkHealth -benchmem \
-cpuprofile=artifacts/cpu.prof -run=^$ -count=1
go tool pprof -top artifacts/cpu.prof | head -20
# Si api.service se ejecuta en este host, obtener líneas recientes del journal
if systemctl is-active --quiet api.service 2>/dev/null; then
journalctl -u api.service --since "15 min ago" -n 200 --no-pager \
| tee artifacts/api.journal.snippet
fiLo que esto demuestra:
go test ./... habilitado para detector de carreras, adecuado para paridad con CI.journalctl capturado junto a la salida de la prueba para cuadernos de incidentes.go build compila paquetes; -o nombra el binario de salida y -ldflags inyecta metadatos de versión o elimina símbolos de depuración.go test ejecuta archivos _test.go; flags como -race, -count=1 y -timeout se mapean directamente a YAML de CI.go test -cpuprofile y -memprofile adjuntan muestreo de runtime/pprof durante pruebas o benchmarks.go tool pprof lee archivos de perfil o URLs y puede abrir una interfaz web local (-http) para grafos de llama./debug/pprof/* cuando importas net/http/pprof y escuchan en un puerto de depuración (protege en producción).journalctl lee el journal de systemd; filtrar por unidad y rango de tiempo coloca las trazas de pila de Go junto a eventos OOM o de reinicio.go test| Flag | Propósito |
|---|---|
./... | Todos los paquetes bajo la raíz del módulo |
-race | Detector de carreras (CI para paquetes puramente Go) |
-count=1 | Deshabilita la caché de pruebas |
-run=^$ | Omite pruebas; solo benchmarks |
-bench=. | Ejecuta benchmarks que coinciden con la expresión regular |
-cpuprofile=file | Escribe el perfil de CPU |
-memprofile=file | Escribe el perfil de heap |
-json | Eventos de prueba legibles por máquina (Go 1.20+) |
pprof| Fuente | Comando |
|---|---|
| Prueba/benchmark | go test -cpuprofile=cpu.prof |
| Servidor local | curl localhost:6060/debug/pprof/profile?seconds=30 |
| Pod K8s | kubectl port-forward pod/api 6060:6060 luego curl |
| Análisis de archivo | go tool pprof -http=:0 cpu.prof |
// cmd/api/main.go - listener de depuración opcional (solo staging)
import _ "net/http/pprof"
go func() {
log.Println(http.ListenAndServe("127.0.0.1:6060", nil))
}()Vincula a loopback, protege con autenticación o política de red antes de exponer más allá de localhost.
hey, k6 o pruebas de integración mientras perfilas.pprof en :6060 público - Los atacantes escanean puertos pprof abiertos. Solución: vincula a 127.0.0.1, usa port-forward o limita con autenticación.go test -count=1 en CI y al depurar inestabilidades.-tags consistentemente.go test ./... - Los fallos se desplazan fuera de la pantalla en tmux. Solución: siempre usa tee a un archivo y rg FAIL después.journalctl usa la hora local por defecto; la UTC de CI difiere. Solución: pasa --utc o anota los desfases en los documentos de incidentes.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Ejecutor de pruebas IDE | Bucle interno rápido mientras editas | Necesitas la transcripción exacta del comando CI |
Wrapper make test | Flags y artefactos estándar del equipo | Oculta flags que los nuevos empleados nunca aprenden |
| Perfilado continuo (Parca, Pyroscope) | Historial de producción siempre activo | Solo necesitas un benchmark local único |
perf / bpftrace | Problemas a nivel de kernel o syscall | Los cuellos de botella de CPU de Go suelen ser suficientes en el espacio de usuario |
| Perfilador del proveedor de la nube | Integración gestionada GCP/AWS | Política de dependencia mínima o aislada |
Por paquete mientras iteras; ./... completo antes de enviar y en CI.
Usa -run TestName para acotar aún más.
Relativo al directorio del paquete bajo prueba a menos que pases una ruta absoluta.
Recógelos en artifacts/ en scripts para evitar ensuciar los árboles de git.
15-30 segundos es típico para servicios HTTP bajo carga constante.
Muestras más cortas funcionan para benchmarks ajustados.
Sí.
Usa -memprofile, o curl .../debug/pprof/heap y go tool pprof -top sobre el perfil de heap.
Mensajes del kernel, razones de reinicio de systemd y metadatos de unidad en la misma línea de tiempo que tus logs de Go cuando stdout va al journal.
Fuerte predeterminado para servicios sin CGO pesado.
Presupuesta tiempo extra y omite solo con excepciones documentadas.
go tool pprof -base=old.prof new.prof resalta las diferencias después de una rama de optimización.
Sí.
Herramientas como gotestsum y filtros jq personalizados consumen eventos JSON para anotaciones de CI.
Binarios más pequeños para imágenes de contenedor.
Mantén compilaciones sin símbolos para la simbolización de fallos interna si careces de información de depuración separada.
Establece GODEBUG=gctrace=1 o usa benchmarks de prueba que envuelvan la ruta activa; los CLIs a menudo se perfilan mejor en pruebas unitarias que a través de pprof HTTP.
El proceso probablemente no tuvo muestras durante la ventana.
Aumenta la carga o extiende el parámetro de consulta seconds=.
journalctl -u api.service -g panic busca texto del mensaje.
Exporta una ventana a un archivo y usa rg para buscar marcos de pila como respaldo.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación), y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026