pkg/observability/probes.go (35 lines of code) (raw):
package observability
import (
"net"
"net/http"
"strconv"
"time"
"github.com/rs/zerolog/log"
)
// InitProbes will initialize, register and expose, via http server, the probes.
func InitProbes(enabled bool, port int, endpoint string) error {
if !enabled {
return nil
}
http.HandleFunc(endpoint, livenessHandler)
probes := &http.Server{
Addr: net.JoinHostPort("", strconv.Itoa(port)),
ReadTimeout: 1 * time.Second,
WriteTimeout: 1 * time.Second,
}
// Starts HTTP server exposing the probes path
go func() {
log.Info().Msgf("Starting to serve handler %s, port %d", endpoint, port)
if err := probes.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Err(err).Msg("Failed to listen and serve http server")
}
}()
return nil
}
func livenessHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, err := w.Write([]byte(`{"health":"OK"}`))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
log.Warn().Err(err).Msg("Unable to write health response")
}
}