Monitoreo de aplicaciones Go (Golang): resumen completo de herramientas y bibliotecas
El monitoreo es una parte críticamente importante de la operación de cualquier aplicación de servidor. Para el ecosistema Go (Golang) se han desarrollado múltiples herramientas que permiten rastrear el rendimiento, el estado y los errores en tiempo real. En este artículo analizaremos las bibliotecas y enfoques clave para el monitoreo de aplicaciones Go, incluyendo Prometheus, expvar, pprof y OpenTelemetry.
¿Por qué es necesario el monitoreo de aplicaciones Go?
Las aplicaciones Go se utilizan a menudo para microservicios de alta carga, puertas de enlace API y procesadores en segundo plano. Sin monitoreo, corre el riesgo de pasar por alto:
- Fugas de memoria y gorutinas;
- Solicitudes lentas y bloqueos;
- Caída del rendimiento bajo carga;
- Errores de conexión a bases de datos y servicios externos.
1. Prometheus — estándar de recopilación de métricas
Prometheus es el estándar de facto para la recopilación de métricas en el mundo Go. La biblioteca cliente oficial prometheus/client_golang permite exportar fácilmente métricas en formato Prometheus.
Instalación
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpEjemplo: contador de solicitudes e histograma de tiempo
package main
import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestCount = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint"}, ) requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() requestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration) })}
func main() { mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/", middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }))) http.ListenAndServe(":8080", mux)}Después de ejecutar, las métricas estarán disponibles en la dirección http://localhost:8080/metrics. Prometheus configurará la recopilación desde este endpoint.
2. expvar — exportación integrada de métricas
La biblioteca estándar de Go ofrece el paquete expvar para publicar variables de estado de la aplicación. No requiere dependencias externas.
Ejemplo de uso
package main
import ( "expvar" "net/http")
var ( requests = expvar.NewInt("requests_total") errors = expvar.NewInt("errors_total"))
func handler(w http.ResponseWriter, r *http.Request) { requests.Add(1) // Simulación de error if r.URL.Query().Get("error") == "1" { errors.Add(1) w.WriteHeader(http.StatusInternalServerError) return } w.Write([]byte("OK"))}
func main() { http.HandleFunc("/debug/vars", expvar.Handler().ServeHTTP) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}Las métricas están disponibles en la ruta /debug/vars en formato JSON. Para la integración con Prometheus, se puede usar <
También en la biblioteca
gRPC para C++: bibliotecas, ejemplos y guía de uso
ts-pattern en TypeScript: guía completa con ejemplos
Procesamiento de imágenes en Java: bibliotecas, herramientas y ejemplos de código
range-v3 para C++: guía completa con ejemplos prácticos
Guía completa de Armadillo para C++ con ejemplos prácticos