Improve health check endpoint to test database connection

This commit is contained in:
Frédéric Guillot 2021-02-19 18:47:50 -08:00 committed by fguillot
parent c2571f9f47
commit e3c28a6c96
4 changed files with 29 additions and 14 deletions

View File

@ -126,17 +126,21 @@ func Parse() {
config.Opts.DatabaseMaxConns(),
)
if err != nil {
logger.Fatal("Unable to connect to the database: %v", err)
logger.Fatal("Unable to initialize database connection pool: %v", err)
}
defer db.Close()
store := storage.NewStorage(db)
if err := store.Ping(); err != nil {
logger.Fatal("Unable to connect to the database: %v", err)
}
if flagMigrate {
database.Migrate(db)
return
}
store := storage.NewStorage(db)
if flagResetFeedErrors {
store.ResetFeedErrors()
return

View File

@ -184,6 +184,11 @@ func setupHandler(store *storage.Storage, pool *worker.Pool) *mux.Router {
ui.Serve(router, store, pool)
router.HandleFunc("/healthcheck", func(w http.ResponseWriter, r *http.Request) {
if err := store.Ping(); err != nil {
http.Error(w, "Database Connection Error", http.StatusInternalServerError)
return
}
w.Write([]byte("OK"))
}).Name("healthcheck")

View File

@ -79,17 +79,6 @@ func (s *Storage) CountFeeds(userID int64) int {
return result
}
// DatabaseVersion returns the version of the database which is in use
func (s *Storage) DatabaseVersion() string {
var dbVersion string
err := s.db.QueryRow(`SELECT current_setting('server_version')`).Scan(&dbVersion)
if err != nil {
return err.Error()
}
return dbVersion
}
// CountUserFeedsWithErrors returns the number of feeds with parsing errors that belong to the given user.
func (s *Storage) CountUserFeedsWithErrors(userID int64) int {
pollingParsingErrorLimit := config.Opts.PollingParsingErrorLimit()

View File

@ -17,3 +17,20 @@ type Storage struct {
func NewStorage(db *sql.DB) *Storage {
return &Storage{db}
}
// DatabaseVersion returns the version of the database which is in use.
func (s *Storage) DatabaseVersion() string {
var dbVersion string
err := s.db.QueryRow(`SELECT current_setting('server_version')`).Scan(&dbVersion)
if err != nil {
return err.Error()
}
return dbVersion
}
// Ping checks if the database connection works.
func (s *Storage) Ping() error {
_, err := s.db.Exec(`SELECT true`)
return err
}