Monitoreo de aplicaciones Go: bibliotecas y herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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/promhttp


Ejemplo: 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 <

Recommendations