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
}