Skip to content

Commit

Permalink
ping db in health check
Browse files Browse the repository at this point in the history
  • Loading branch information
iSchluff committed Jul 12, 2022
1 parent e0b15c1 commit b2285db
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 13 deletions.
38 changes: 38 additions & 0 deletions api.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,44 @@ const (
)
)

func (h *Headscale) HealthHandler(
writer http.ResponseWriter,
req *http.Request,
) {
respond := func(err error) {
writer.Header().Set("Content-Type", "application/json; charset=utf-8")

res := struct {
Status string `json:"status"`
}{
Status: "pass",
}

if err != nil {
writer.WriteHeader(http.StatusInternalServerError)
log.Error().Caller().Err(err).Msg("health check failed")
res.Status = "fail"
}

buf, err := json.Marshal(res)
if err != nil {
log.Error().Caller().Err(err).Msg("marshal failed")
}
_, err = writer.Write(buf)
if err != nil {
log.Error().Caller().Err(err).Msg("write failed")
}
}

if err := h.pingDB(); err != nil {
respond(err)

return
}

respond(nil)
}

// KeyHandler provides the Headscale pub key
// Listens in /key.
func (h *Headscale) KeyHandler(
Expand Down
14 changes: 1 addition & 13 deletions app.go
Original file line number Diff line number Diff line change
Expand Up @@ -423,19 +423,7 @@ func (h *Headscale) createPrometheusRouter() *gin.Engine {
func (h *Headscale) createRouter(grpcMux *runtime.ServeMux) *mux.Router {
router := mux.NewRouter()

router.HandleFunc(
"/health",
func(writer http.ResponseWriter, req *http.Request) {
writer.WriteHeader(http.StatusOK)
_, err := writer.Write([]byte("{\"healthy\": \"ok\"}"))
if err != nil {
log.Error().
Caller().
Err(err).
Msg("Failed to write response")
}
}).Methods(http.MethodGet)

router.HandleFunc("/health", h.HealthHandler).Methods(http.MethodGet)
router.HandleFunc("/key", h.KeyHandler).Methods(http.MethodGet)
router.HandleFunc("/register", h.RegisterWebAPI).Methods(http.MethodGet)
router.HandleFunc("/machine/{mkey}/map", h.PollNetMapHandler).Methods(http.MethodPost)
Expand Down
12 changes: 12 additions & 0 deletions db.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package headscale

import (
"context"
"database/sql/driver"
"encoding/json"
"errors"
Expand Down Expand Up @@ -220,6 +221,17 @@ func (h *Headscale) setValue(key string, value string) error {
return nil
}

func (h *Headscale) pingDB() error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
db, err := h.db.DB()
if err != nil {
return err
}

return db.PingContext(ctx)
}

// This is a "wrapper" type around tailscales
// Hostinfo to allow us to add database "serialization"
// methods. This allows us to use a typed values throughout
Expand Down

0 comments on commit b2285db

Please sign in to comment.