statping/database/routines.go

67 lines
1.7 KiB
Go
Raw Normal View History

2020-02-26 05:38:03 +00:00
package database
import (
"fmt"
"github.com/hunterlong/statping/types"
"github.com/hunterlong/statping/utils"
"os"
"time"
2020-03-03 06:42:37 +00:00
_ "github.com/jinzhu/gorm/dialects/mysql"
_ "github.com/jinzhu/gorm/dialects/postgres"
_ "github.com/jinzhu/gorm/dialects/sqlite"
2020-02-26 05:38:03 +00:00
)
var (
log = utils.Log
removeRowsAfter = types.Month * 6
maintenceDuration = types.Hour
)
func StartMaintenceRoutine() {
dur := os.Getenv("REMOVE_AFTER")
var removeDur time.Duration
if dur != "" {
parsedDur, err := time.ParseDuration(dur)
if err != nil {
log.Errorf("could not parse duration: %s, using default: %s", dur, removeRowsAfter.String())
removeDur = removeRowsAfter
} else {
removeDur = parsedDur
}
} else {
removeDur = removeRowsAfter
}
log.Infof("Service Failure and Hit records will be automatically removed after %s", removeDur.String())
go databaseMaintence(removeDur)
}
// databaseMaintence will automatically delete old records from 'failures' and 'hits'
// this function is currently set to delete records 7+ days old every 60 minutes
func databaseMaintence(dur time.Duration) {
deleteAfter := time.Now().UTC().Add(dur)
2020-03-03 06:42:37 +00:00
time.Sleep(20 * types.Second)
2020-02-26 05:38:03 +00:00
for range time.Tick(maintenceDuration) {
log.Infof("Deleting failures older than %s", dur.String())
DeleteAllSince("failures", deleteAfter)
log.Infof("Deleting hits older than %s", dur.String())
DeleteAllSince("hits", deleteAfter)
maintenceDuration = types.Hour
}
}
// DeleteAllSince will delete a specific table's records based on a time.
func DeleteAllSince(table string, date time.Time) {
sql := fmt.Sprintf("DELETE FROM %v WHERE created_at < '%v';", table, database.FormatTime(date))
db := database.Exec(sql)
if db.Error() != nil {
log.Warnln(db.Error())
}
}