package controller import ( "context" "fmt" "github.com/sirupsen/logrus" "net/http" ) func HealthCheckHTTP(w http.ResponseWriter, _ *http.Request) { if err := healthCheckStore(w); err != nil { logrus.Error(err) return } if err := healthCheckMetrics(w); err != nil { logrus.Error(err) return } w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write([]byte("

Healthy

")) } func healthCheckStore(w http.ResponseWriter) error { trx, err := str.Begin() if err != nil { http.Error(w, "error starting transaction", http.StatusInternalServerError) return err } defer func() { _ = trx.Rollback() }() count := -1 if err := trx.QueryRowx("select count(0) from migrations").Scan(&count); err != nil { http.Error(w, "error selecting migration count", http.StatusInternalServerError) return err } logrus.Debugf("%d migrations", count) return nil } func healthCheckMetrics(w http.ResponseWriter) error { if cfg.Metrics != nil && cfg.Metrics.Influx != nil { queryApi := idb.QueryAPI(cfg.Metrics.Influx.Org) query := fmt.Sprintf("from(bucket: \"%v\")\n", cfg.Metrics.Influx.Bucket) + fmt.Sprintf("|> range(start: -5s)\n") + "|> filter(fn: (r) => r[\"_measurement\"] == \"xfer\")\n" + "|> filter(fn: (r) => r[\"_field\"] == \"rx\" or r[\"_field\"] == \"tx\")\n" + "|> filter(fn: (r) => r[\"namespace\"] == \"backend\")\n" + "|> sum()" result, err := queryApi.Query(context.Background(), query) if err != nil { http.Error(w, "error querying influx", http.StatusInternalServerError) return err } results := 0 for result.Next() { results++ } logrus.Debugf("%d results", results) } return nil }