log system improved, performance improvements
This commit is contained in:
parent
ad8cdc6926
commit
1ef0ee381f
|
@ -0,0 +1,67 @@
|
|||
package cron
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/robfig/cron/v3"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
var log = logrus.WithField("package", "cron")
|
||||
|
||||
type Config struct {
|
||||
DB *pg.DB
|
||||
MaxConcurrentWorkers int
|
||||
}
|
||||
|
||||
func Attach(c *cron.Cron, cfg Config) error {
|
||||
if cfg.DB == nil {
|
||||
return fmt.Errorf("cfg.DB cannot be nil, expected go-pg database")
|
||||
}
|
||||
|
||||
h := &handler{cfg.DB, cfg.MaxConcurrentWorkers}
|
||||
if err := h.init(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
updateServerData := trackExecutionTime(h.updateServerData, "updateServerData")
|
||||
updateHistory := trackExecutionTime(h.updateHistory, "updateHistory")
|
||||
vacuumDatabase := trackExecutionTime(h.vacuumDatabase, "vacuumDatabase")
|
||||
updateStats := trackExecutionTime(h.updateStats, "updateStats")
|
||||
if _, err := c.AddFunc("0 * * * *", updateServerData); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 0 * * *", updateHistory); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 1 * * *", vacuumDatabase); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 2 * * *", updateStats); err != nil {
|
||||
return err
|
||||
}
|
||||
go func() {
|
||||
updateServerData()
|
||||
// vacuumDatabase()
|
||||
// updateHistory()
|
||||
// updateStats()
|
||||
}()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func trackExecutionTime(fn func(), fnName string) func() {
|
||||
return func() {
|
||||
now := time.Now()
|
||||
log := log.WithField("fnName", fnName)
|
||||
log.Infof("%s: called", fnName)
|
||||
|
||||
fn()
|
||||
|
||||
log.
|
||||
WithField("executionTime", time.Since(now).String()).
|
||||
Infof("%s: finished executing", fnName)
|
||||
}
|
||||
}
|
120
cron/handler.go
120
cron/handler.go
|
@ -3,16 +3,15 @@ package cron
|
|||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"runtime"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
|
||||
phpserialize "github.com/Kichiyaki/go-php-serialize"
|
||||
"github.com/robfig/cron/v3"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
|
@ -28,43 +27,6 @@ type handler struct {
|
|||
maxConcurrentWorkers int
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
DB *pg.DB
|
||||
MaxConcurrentWorkers int
|
||||
}
|
||||
|
||||
func Attach(c *cron.Cron, cfg Config) error {
|
||||
if cfg.DB == nil {
|
||||
return fmt.Errorf("cfg.DB cannot be nil, expected go-pg database")
|
||||
}
|
||||
|
||||
h := &handler{cfg.DB, cfg.MaxConcurrentWorkers}
|
||||
if err := h.init(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := c.AddFunc("0 * * * *", h.updateServersData); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 0 * * *", h.updateHistory); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 1 * * *", h.vacuumDatabase); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := c.AddFunc("30 2 * * *", h.updateStats); err != nil {
|
||||
return err
|
||||
}
|
||||
go func() {
|
||||
h.updateServersData()
|
||||
h.vacuumDatabase()
|
||||
h.updateHistory()
|
||||
h.updateStats()
|
||||
}()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *handler) init() error {
|
||||
if h.maxConcurrentWorkers <= 0 {
|
||||
h.maxConcurrentWorkers = 1
|
||||
|
@ -85,7 +47,7 @@ func (h *handler) init() error {
|
|||
}
|
||||
|
||||
for _, model := range models {
|
||||
err := tx.CreateTable(model, &orm.CreateTableOptions{
|
||||
err := tx.Model(model).CreateTable(&orm.CreateTableOptions{
|
||||
IfNotExists: true,
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -131,7 +93,7 @@ func (h *handler) createSchema(server *models.Server) error {
|
|||
}
|
||||
|
||||
for _, model := range models {
|
||||
err := tx.CreateTable(model, &orm.CreateTableOptions{
|
||||
err := tx.Model(model).CreateTable(&orm.CreateTableOptions{
|
||||
IfNotExists: true,
|
||||
})
|
||||
if err != nil {
|
||||
|
@ -153,7 +115,6 @@ func (h *handler) createSchema(server *models.Server) error {
|
|||
}
|
||||
|
||||
func (h *handler) getServers() ([]*models.Server, map[string]string, error) {
|
||||
log.Print("Loading servers...")
|
||||
langVersions := []*models.LangVersion{}
|
||||
if err := h.db.Model(&langVersions).Relation("SpecialServers").Order("tag ASC").Select(); err != nil {
|
||||
return nil, nil, errors.Wrap(err, "getServers")
|
||||
|
@ -164,20 +125,22 @@ func (h *handler) getServers() ([]*models.Server, map[string]string, error) {
|
|||
urls := make(map[string]string)
|
||||
loadedLangVersions := []models.LanguageTag{}
|
||||
for _, langVersion := range langVersions {
|
||||
log := log.WithField("host", langVersion.Host)
|
||||
log.Infof("Loading servers from %s", langVersion.Host)
|
||||
resp, err := http.Get(fmt.Sprintf("https://%s%s", langVersion.Host, endpointGetServers))
|
||||
if err != nil {
|
||||
log.Print(errors.Wrapf(err, "Cannot fetch servers from %s", langVersion.Host))
|
||||
log.Errorln(errors.Wrapf(err, "Cannot fetch servers from %s", langVersion.Host))
|
||||
continue
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Print(errors.Wrapf(err, "Cannot read response body from %s", langVersion.Host))
|
||||
log.Errorln(errors.Wrapf(err, "Cannot read response body from %s", langVersion.Host))
|
||||
continue
|
||||
}
|
||||
body, err := phpserialize.Decode(string(bodyBytes))
|
||||
if err != nil {
|
||||
log.Print(errors.Wrapf(err, "Cannot serialize body from %s into go value", langVersion.Host))
|
||||
log.Errorln(errors.Wrapf(err, "Cannot serialize body from %s into go value", langVersion.Host))
|
||||
continue
|
||||
}
|
||||
for serverKey, url := range body.(map[interface{}]interface{}) {
|
||||
|
@ -192,14 +155,13 @@ func (h *handler) getServers() ([]*models.Server, map[string]string, error) {
|
|||
LangVersion: langVersion,
|
||||
}
|
||||
if err := h.createSchema(server); err != nil {
|
||||
log.Print(errors.Wrapf(err, "Cannot create schema for %s", serverKey))
|
||||
log.WithField("serverKey", serverKey).Errorln(errors.Wrapf(err, "Cannot create schema for %s", serverKey))
|
||||
continue
|
||||
}
|
||||
serverKeys = append(serverKeys, serverKeyStr)
|
||||
urls[serverKeyStr] = url.(string)
|
||||
servers = append(servers, server)
|
||||
}
|
||||
|
||||
loadedLangVersions = append(loadedLangVersions, langVersion.Tag)
|
||||
}
|
||||
|
||||
|
@ -221,26 +183,28 @@ func (h *handler) getServers() ([]*models.Server, map[string]string, error) {
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
log.Print("Servers loaded!")
|
||||
|
||||
return servers, urls, nil
|
||||
}
|
||||
|
||||
func (h *handler) updateServersData() {
|
||||
func (h *handler) updateServerData() {
|
||||
servers, urls, err := h.getServers()
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
log.Errorln("updateServerData:", err.Error())
|
||||
return
|
||||
}
|
||||
log.
|
||||
WithField("numberOfServers", len(servers)).
|
||||
Info("updateServerData: loaded servers")
|
||||
|
||||
var wg sync.WaitGroup
|
||||
p := newPool(h.maxConcurrentWorkers)
|
||||
defer p.close()
|
||||
|
||||
for _, server := range servers {
|
||||
log := log.WithField("serverKey", server.Key)
|
||||
url, ok := urls[server.Key]
|
||||
if !ok {
|
||||
log.Printf("No one URL associated with key: %s, skipping...", server.Key)
|
||||
log.Warnf("No one URL associated with key: %s, skipping...", server.Key)
|
||||
continue
|
||||
}
|
||||
p.waitForWorker()
|
||||
|
@ -250,16 +214,17 @@ func (h *handler) updateServersData() {
|
|||
baseURL: url,
|
||||
server: server,
|
||||
}
|
||||
go func(worker *updateServerDataWorker, server *models.Server, url string) {
|
||||
go func(worker *updateServerDataWorker, server *models.Server, url string, log *logrus.Entry) {
|
||||
defer p.releaseWorker()
|
||||
defer wg.Done()
|
||||
log.Printf("%s: updating data", server.Key)
|
||||
if err := sh.update(); err != nil {
|
||||
log.Println(errors.Wrap(err, server.Key))
|
||||
} else {
|
||||
log.Printf("%s: data updated", server.Key)
|
||||
log.Infof("updateServerData: %s: updating data", server.Key)
|
||||
err := sh.update()
|
||||
if err != nil {
|
||||
log.Errorln("updateServerData:", errors.Wrap(err, server.Key))
|
||||
return
|
||||
}
|
||||
}(sh, server, url)
|
||||
log.Infof("updateServerData: %s: data updated", server.Key)
|
||||
}(sh, server, url, log)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
|
@ -274,9 +239,12 @@ func (h *handler) updateHistory() {
|
|||
Where("status = ? AND (history_updated_at < ? OR history_updated_at IS NULL)", models.ServerStatusOpen, t1).
|
||||
Select()
|
||||
if err != nil {
|
||||
log.Println(errors.Wrap(err, "updateHistory"))
|
||||
log.Errorln(errors.Wrap(err, "updateHistory"))
|
||||
return
|
||||
}
|
||||
log.
|
||||
WithField("numberOfServers", len(servers)).
|
||||
Info("updateHistory: loaded servers")
|
||||
|
||||
var wg sync.WaitGroup
|
||||
p := newPool(runtime.NumCPU())
|
||||
|
@ -292,27 +260,29 @@ func (h *handler) updateHistory() {
|
|||
go func(server *models.Server, worker *updateServerHistoryWorker) {
|
||||
defer p.releaseWorker()
|
||||
defer wg.Done()
|
||||
log.Printf("%s: updating history", server.Key)
|
||||
log := log.WithField("serverKey", server.Key)
|
||||
log.Infof("updateHistory: %s: updating history", server.Key)
|
||||
if err := worker.update(); err != nil {
|
||||
log.Println(errors.Wrap(err, server.Key))
|
||||
log.Errorln("updateHistory:", errors.Wrap(err, server.Key))
|
||||
return
|
||||
}
|
||||
log.Printf("%s: history updated", server.Key)
|
||||
log.Infof("updateHistory: %s: history updated", server.Key)
|
||||
}(server, worker)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func (h *handler) updateServersStats(t time.Time) error {
|
||||
func (h *handler) updateServerStats(t time.Time) error {
|
||||
servers := []*models.Server{}
|
||||
err := h.db.
|
||||
Model(&servers).
|
||||
Where("status = ? AND (stats_updated_at < ? OR stats_updated_at IS NULL)", models.ServerStatusOpen, t).
|
||||
Select()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "updateServersStats")
|
||||
return errors.Wrap(err, "updateServerStats")
|
||||
}
|
||||
log.WithField("numberOfServers", len(servers)).Info("updateServerStats: loaded servers")
|
||||
|
||||
var wg sync.WaitGroup
|
||||
p := newPool(runtime.NumCPU())
|
||||
|
@ -328,12 +298,13 @@ func (h *handler) updateServersStats(t time.Time) error {
|
|||
go func(server *models.Server, worker *updateServerStatsWorker) {
|
||||
defer p.releaseWorker()
|
||||
defer wg.Done()
|
||||
log.Printf("%s: updating stats", server.Key)
|
||||
log := log.WithField("serverKey", server.Key)
|
||||
log.Infof("updateServerStats: %s: updating stats", server.Key)
|
||||
if err := worker.update(); err != nil {
|
||||
log.Println(errors.Wrap(err, server.Key))
|
||||
log.Errorln("updateServerStats:", errors.Wrap(err, server.Key))
|
||||
return
|
||||
}
|
||||
log.Printf("%s: stats updated", server.Key)
|
||||
log.Infof("updateServerStats: %s: stats updated", server.Key)
|
||||
}(server, worker)
|
||||
}
|
||||
|
||||
|
@ -344,8 +315,8 @@ func (h *handler) updateServersStats(t time.Time) error {
|
|||
func (h *handler) updateStats() {
|
||||
now := time.Now()
|
||||
t1 := time.Date(now.Year(), now.Month(), now.Day(), 1, 30, 0, 0, time.UTC)
|
||||
if err := h.updateServersStats(t1); err != nil {
|
||||
log.Println(err)
|
||||
if err := h.updateServerStats(t1); err != nil {
|
||||
log.Error(errors.Wrap(err, "updateStats"))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -355,7 +326,7 @@ func (h *handler) vacuumDatabase() {
|
|||
Model(&servers).
|
||||
Select()
|
||||
if err != nil {
|
||||
log.Println(errors.Wrap(err, "vacuumDatabase"))
|
||||
log.Errorln(errors.Wrap(err, "vacuumDatabase"))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -372,12 +343,13 @@ func (h *handler) vacuumDatabase() {
|
|||
go func(server *models.Server, worker *vacuumServerDBWorker, p *pool) {
|
||||
defer p.releaseWorker()
|
||||
defer wg.Done()
|
||||
log.Printf("%s: vacuuming database", server.Key)
|
||||
log := log.WithField("serverKey", server.Key)
|
||||
log.Infof("vacuumDatabase: %s: vacuuming database", server.Key)
|
||||
if err := worker.vacuum(); err != nil {
|
||||
log.Println(errors.Wrap(err, server.Key))
|
||||
log.Errorln("vacuumDatabase:", errors.Wrap(err, server.Key))
|
||||
return
|
||||
}
|
||||
log.Printf("%s: database vacuumed", server.Key)
|
||||
log.Infof("vacuumDatabase: %s: database vacuumed", server.Key)
|
||||
}(server, worker, p)
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package cron
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strconv"
|
||||
|
@ -9,7 +8,6 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/tribalwarshelp/shared/models"
|
||||
"golang.org/x/sync/errgroup"
|
||||
|
||||
"github.com/go-pg/pg/v10"
|
||||
"github.com/go-pg/pg/v10/orm"
|
||||
|
@ -45,15 +43,9 @@ const (
|
|||
)
|
||||
|
||||
type updateServerDataWorker struct {
|
||||
baseURL string
|
||||
db *pg.DB
|
||||
server *models.Server
|
||||
ennoblements []*models.Ennoblement
|
||||
pod map[int]*models.OpponentsDefeated
|
||||
tod map[int]*models.OpponentsDefeated
|
||||
players []*models.Player
|
||||
tribes []*models.Tribe
|
||||
villages []*models.Village
|
||||
baseURL string
|
||||
db *pg.DB
|
||||
server *models.Server
|
||||
}
|
||||
|
||||
type parsedODLine struct {
|
||||
|
@ -454,9 +446,9 @@ func (h *updateServerDataWorker) calculateODifference(od1 models.OpponentsDefeat
|
|||
}
|
||||
}
|
||||
|
||||
func (h *updateServerDataWorker) calculateDailyTribeStats(tribes []*models.Tribe,
|
||||
func (h *updateServerDataWorker) calculateTodaysTribeStats(tribes []*models.Tribe,
|
||||
history []*models.TribeHistory) []*models.DailyTribeStats {
|
||||
dailyStats := []*models.DailyTribeStats{}
|
||||
todaysStats := []*models.DailyTribeStats{}
|
||||
searchableTribes := makeTribesSearchable(tribes)
|
||||
|
||||
for _, historyRecord := range history {
|
||||
|
@ -465,7 +457,7 @@ func (h *updateServerDataWorker) calculateDailyTribeStats(tribes []*models.Tribe
|
|||
}
|
||||
if index := searchByID(searchableTribes, historyRecord.TribeID); index != 0 {
|
||||
tribe := tribes[index]
|
||||
dailyStats = append(dailyStats, &models.DailyTribeStats{
|
||||
todaysStats = append(todaysStats, &models.DailyTribeStats{
|
||||
TribeID: tribe.ID,
|
||||
Members: tribe.TotalMembers - historyRecord.TotalMembers,
|
||||
Villages: tribe.TotalVillages - historyRecord.TotalVillages,
|
||||
|
@ -479,12 +471,12 @@ func (h *updateServerDataWorker) calculateDailyTribeStats(tribes []*models.Tribe
|
|||
}
|
||||
}
|
||||
|
||||
return dailyStats
|
||||
return todaysStats
|
||||
}
|
||||
|
||||
func (h *updateServerDataWorker) calculateDailyPlayerStats(players []*models.Player,
|
||||
history []*models.PlayerHistory) []*models.DailyPlayerStats {
|
||||
dailyStats := []*models.DailyPlayerStats{}
|
||||
todaysStats := []*models.DailyPlayerStats{}
|
||||
searchablePlayers := makePlayersSearchable(players)
|
||||
|
||||
for _, historyRecord := range history {
|
||||
|
@ -493,7 +485,7 @@ func (h *updateServerDataWorker) calculateDailyPlayerStats(players []*models.Pla
|
|||
}
|
||||
if index := searchByID(searchablePlayers, historyRecord.PlayerID); index != 0 {
|
||||
player := players[index]
|
||||
dailyStats = append(dailyStats, &models.DailyPlayerStats{
|
||||
todaysStats = append(todaysStats, &models.DailyPlayerStats{
|
||||
PlayerID: player.ID,
|
||||
Villages: player.TotalVillages - historyRecord.TotalVillages,
|
||||
Points: player.Points - historyRecord.Points,
|
||||
|
@ -504,7 +496,7 @@ func (h *updateServerDataWorker) calculateDailyPlayerStats(players []*models.Pla
|
|||
}
|
||||
}
|
||||
|
||||
return dailyStats
|
||||
return todaysStats
|
||||
}
|
||||
|
||||
func (h *updateServerDataWorker) update() error {
|
||||
|
@ -553,175 +545,140 @@ func (h *updateServerDataWorker) update() error {
|
|||
return err
|
||||
}
|
||||
|
||||
errGroup, _ := errgroup.WithContext(context.Background())
|
||||
tx, err := h.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Close()
|
||||
|
||||
if len(tribes) > 0 {
|
||||
ids := []int{}
|
||||
for _, tribe := range tribes {
|
||||
ids = append(ids, tribe.ID)
|
||||
}
|
||||
errGroup.Go(func() error {
|
||||
tx, err := h.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Close()
|
||||
if _, err := tx.Model(&tribes).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("tag = EXCLUDED.tag").
|
||||
Set("total_members = EXCLUDED.total_members").
|
||||
Set("total_villages = EXCLUDED.total_villages").
|
||||
|
||||
if _, err := tx.Model(&tribes).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("tag = EXCLUDED.tag").
|
||||
Set("total_members = EXCLUDED.total_members").
|
||||
Set("total_villages = EXCLUDED.total_villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("all_points = EXCLUDED.all_points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Set("exists = EXCLUDED.exists").
|
||||
Set("dominance = EXCLUDED.dominance").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert tribes")
|
||||
}
|
||||
if _, err := tx.Model(&tribes).
|
||||
Where("tribe.id NOT IN (?)", pg.In(ids)).
|
||||
Set("exists = false").
|
||||
Update(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot update nonexistent tribes")
|
||||
}
|
||||
|
||||
tribesHistory := []*models.TribeHistory{}
|
||||
if err := h.db.Model(&tribesHistory).
|
||||
DistinctOn("tribe_id").
|
||||
Column("*").
|
||||
Where("tribe_id IN (?)", pg.In(ids)).
|
||||
Order("tribe_id DESC", "create_date DESC").
|
||||
Select(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot select tribe history records")
|
||||
}
|
||||
todaysTribeStats := h.calculateTodaysTribeStats(tribes, tribesHistory)
|
||||
if len(todaysTribeStats) > 0 {
|
||||
if _, err := tx.
|
||||
Model(&todaysTribeStats).
|
||||
OnConflict("ON CONSTRAINT daily_tribe_stats_tribe_id_create_date_key DO UPDATE").
|
||||
Set("members = EXCLUDED.members").
|
||||
Set("villages = EXCLUDED.villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("all_points = EXCLUDED.all_points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Set("exists = EXCLUDED.exists").
|
||||
Set("dominance = EXCLUDED.dominance").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert tribes")
|
||||
return errors.Wrap(err, "cannot insert today's tribe stats")
|
||||
}
|
||||
if _, err := tx.Model(&tribes).
|
||||
Where("tribe.id NOT IN (?)", pg.In(ids)).
|
||||
Set("exists = false").
|
||||
Update(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot update nonexistent tribes")
|
||||
}
|
||||
return tx.Commit()
|
||||
})
|
||||
|
||||
errGroup.Go(func() error {
|
||||
tribesHistory := []*models.TribeHistory{}
|
||||
if err := h.db.Model(&tribesHistory).
|
||||
DistinctOn("tribe_id").
|
||||
Column("*").
|
||||
Where("tribe_id IN (?)", pg.In(ids)).
|
||||
Order("tribe_id DESC", "create_date DESC").
|
||||
Select(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot select tribes history")
|
||||
}
|
||||
todaysTribesStats := h.calculateDailyTribeStats(tribes, tribesHistory)
|
||||
if len(todaysTribesStats) > 0 {
|
||||
if _, err := h.db.
|
||||
Model(&todaysTribesStats).
|
||||
OnConflict("ON CONSTRAINT daily_tribe_stats_tribe_id_create_date_key DO UPDATE").
|
||||
Set("members = EXCLUDED.members").
|
||||
Set("villages = EXCLUDED.villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("all_points = EXCLUDED.all_points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Set("dominance = EXCLUDED.dominance").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert today's tribes stats")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
}
|
||||
if len(players) > 0 {
|
||||
ids := []int{}
|
||||
for _, player := range players {
|
||||
ids = append(ids, player.ID)
|
||||
}
|
||||
errGroup.Go(func() error {
|
||||
tx, err := h.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Close()
|
||||
if _, err := tx.Model(&players).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("total_villages = EXCLUDED.total_villages").
|
||||
if _, err := tx.Model(&players).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("total_villages = EXCLUDED.total_villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Set("exists = EXCLUDED.exists").
|
||||
Set("tribe_id = EXCLUDED.tribe_id").
|
||||
Set("daily_growth = EXCLUDED.daily_growth").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert players")
|
||||
}
|
||||
if _, err := tx.Model(&models.Player{}).
|
||||
Where("id NOT IN (?)", pg.In(ids)).
|
||||
Set("exists = false").
|
||||
Update(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot update nonexistent players")
|
||||
}
|
||||
|
||||
playerHistory := []*models.PlayerHistory{}
|
||||
if err := h.db.Model(&playerHistory).
|
||||
DistinctOn("player_id").
|
||||
Column("*").
|
||||
Where("player_id IN (?)", pg.In(ids)).
|
||||
Order("player_id DESC", "create_date DESC").Select(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot select player history records")
|
||||
}
|
||||
todaysPlayerStats := h.calculateDailyPlayerStats(players, playerHistory)
|
||||
if len(todaysPlayerStats) > 0 {
|
||||
if _, err := tx.
|
||||
Model(&todaysPlayerStats).
|
||||
OnConflict("ON CONSTRAINT daily_player_stats_player_id_create_date_key DO UPDATE").
|
||||
Set("villages = EXCLUDED.villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Set("exists = EXCLUDED.exists").
|
||||
Set("tribe_id = EXCLUDED.tribe_id").
|
||||
Set("daily_growth = EXCLUDED.daily_growth").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert players")
|
||||
return errors.Wrap(err, "cannot insert today's player stats")
|
||||
}
|
||||
if _, err := tx.Model(&models.Player{}).
|
||||
Where("id NOT IN (?)", pg.In(ids)).
|
||||
Set("exists = false").
|
||||
Update(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot update nonexistent players")
|
||||
}
|
||||
return tx.Commit()
|
||||
})
|
||||
}
|
||||
|
||||
errGroup.Go(func() error {
|
||||
tx, err := h.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Close()
|
||||
playerHistory := []*models.PlayerHistory{}
|
||||
if err := h.db.Model(&playerHistory).
|
||||
DistinctOn("player_id").
|
||||
Column("*").
|
||||
Where("player_id IN (?)", pg.In(ids)).
|
||||
Order("player_id DESC", "create_date DESC").Select(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot select players history")
|
||||
}
|
||||
todaysPlayersStats := h.calculateDailyPlayerStats(players, playerHistory)
|
||||
if len(todaysPlayersStats) > 0 {
|
||||
if _, err := tx.
|
||||
Model(&todaysPlayersStats).
|
||||
OnConflict("ON CONSTRAINT daily_player_stats_player_id_create_date_key DO UPDATE").
|
||||
Set("villages = EXCLUDED.villages").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("rank = EXCLUDED.rank").
|
||||
Apply(appendODSetClauses).
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert today's players stats")
|
||||
}
|
||||
}
|
||||
return tx.Commit()
|
||||
})
|
||||
}
|
||||
if len(villages) > 0 {
|
||||
errGroup.Go(func() error {
|
||||
tx, err := h.db.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Close()
|
||||
if _, err := tx.Model(&models.Village{}).
|
||||
Where("true").
|
||||
Delete(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot delete villages")
|
||||
}
|
||||
if _, err := tx.Model(&villages).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("x = EXCLUDED.x").
|
||||
Set("y = EXCLUDED.y").
|
||||
Set("bonus = EXCLUDED.bonus").
|
||||
Set("player_id = EXCLUDED.player_id").
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert villages")
|
||||
}
|
||||
return tx.Commit()
|
||||
})
|
||||
if _, err := tx.Model(&models.Village{}).
|
||||
Where("true").
|
||||
Delete(); err != nil && err != pg.ErrNoRows {
|
||||
return errors.Wrap(err, "cannot delete villages")
|
||||
}
|
||||
if _, err := tx.Model(&villages).
|
||||
OnConflict("(id) DO UPDATE").
|
||||
Set("name = EXCLUDED.name").
|
||||
Set("points = EXCLUDED.points").
|
||||
Set("x = EXCLUDED.x").
|
||||
Set("y = EXCLUDED.y").
|
||||
Set("bonus = EXCLUDED.bonus").
|
||||
Set("player_id = EXCLUDED.player_id").
|
||||
Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert villages")
|
||||
}
|
||||
}
|
||||
if len(ennoblements) > 0 {
|
||||
errGroup.Go(func() error {
|
||||
if _, err := h.db.Model(&ennoblements).Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert ennoblements")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if _, err := tx.Model(&ennoblements).Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert ennoblements")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := errGroup.Wait(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := h.db.Model(h.server).
|
||||
if _, err := tx.Model(h.server).
|
||||
Set("data_updated_at = ?", time.Now()).
|
||||
Set("unit_config = ?", unitCfg).
|
||||
Set("building_config = ?", buildingCfg).
|
||||
|
@ -735,7 +692,7 @@ func (h *updateServerDataWorker) update() error {
|
|||
return errors.Wrap(err, "cannot update server")
|
||||
}
|
||||
|
||||
return nil
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
func appendODSetClauses(q *orm.Query) (*orm.Query, error) {
|
||||
|
|
|
@ -79,7 +79,7 @@ func (h *updateServerStatsWorker) update() error {
|
|||
}
|
||||
defer tx.Close()
|
||||
|
||||
if err := tx.Insert(stats); err != nil {
|
||||
if _, err := tx.Model(stats).Insert(); err != nil {
|
||||
return errors.Wrap(err, "cannot insert server stats")
|
||||
}
|
||||
|
||||
|
|
|
@ -23,8 +23,8 @@ func (h *vacuumServerDBWorker) vacuum() error {
|
|||
}
|
||||
defer tx.Close()
|
||||
|
||||
withNonExistentPlayers := h.db.Model(&models.Player{}).Where("exists = false")
|
||||
withNonExistentTribes := h.db.Model(&models.Tribe{}).Where("exists = false")
|
||||
withNonExistentPlayers := h.db.Model(&models.Player{}).Column("id").Where("exists = false")
|
||||
withNonExistentTribes := h.db.Model(&models.Tribe{}).Column("id").Where("exists = false")
|
||||
|
||||
_, err = tx.Model(&models.PlayerHistory{}).
|
||||
With("players", withNonExistentPlayers).
|
||||
|
|
13
go.mod
13
go.mod
|
@ -4,14 +4,15 @@ go 1.14
|
|||
|
||||
require (
|
||||
github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83
|
||||
github.com/go-pg/pg/v10 v10.0.0-beta.2
|
||||
github.com/go-pg/pg/v10 v10.3.2
|
||||
github.com/joho/godotenv v1.3.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/segmentio/encoding v0.1.14 // indirect
|
||||
github.com/sirupsen/logrus v1.7.0
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200824102353-ef15dea9c1a3
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
|
||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 // indirect
|
||||
google.golang.org/protobuf v1.25.0 // indirect
|
||||
github.com/vmihailenco/tagparser v0.1.2 // indirect
|
||||
go.opentelemetry.io/otel v0.13.0 // indirect
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect
|
||||
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 // indirect
|
||||
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd // indirect
|
||||
)
|
||||
|
|
106
go.sum
106
go.sum
|
@ -6,8 +6,6 @@ github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7 h1:qELHH0AWCvf
|
|||
github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60=
|
||||
github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83 h1:Oa8Bk4LNcknxw50gZOlvPwEreOlAbOnu7V82lUYNbOM=
|
||||
github.com/Kichiyaki/go-php-serialize v0.0.0-20200601110855-47b6982acf83/go.mod h1:+iGkf5HfOVeRVd9K7qQDucIl+/Kt3MyenMa90b/O/c4=
|
||||
github.com/benbjohnson/clock v1.0.0 h1:78Jk/r6m4wCi6sndMpty7A//t4dw/RW5fV4ZgDVfX1w=
|
||||
github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
||||
github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg=
|
||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
|
@ -15,8 +13,6 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+
|
|||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/codemodus/kace v0.5.1 h1:4OCsBlE2c/rSJo375ggfnucv9eRzge/U5LrrOZd47HA=
|
||||
github.com/codemodus/kace v0.5.1/go.mod h1:coddaHoX1ku1YFSe4Ip0mL9kQjJvKkzb9CfIdG1YR04=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -28,20 +24,13 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
|
|||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-pg/pg/v10 v10.0.0-beta.2 h1:8tNEJLtOEw5/Df0BLLBOHCiLaYAiu4uhdngjK955MK8=
|
||||
github.com/go-pg/pg/v10 v10.0.0-beta.2/go.mod h1:UAuqGPC94ySi4rJ3DC5e4SY1rlwugZbJA/XoJ/kf5Rw=
|
||||
github.com/go-pg/pg/v9 v9.0.0-beta.14/go.mod h1:T2Sr6bpTCOr2lUqOUMiXLMJqZHSUBKk1LdgSqjwhZfA=
|
||||
github.com/go-pg/pg/v9 v9.0.3/go.mod h1:Tm/Q3Vt6gdQOH6TTN1H/xLlIXc+Qrka7TZ6uREtu/eA=
|
||||
github.com/go-pg/pg/v9 v9.1.6 h1:IqBayenvp9EWjHncRE7//SRmQuktq60oeO1/MkEx3dY=
|
||||
github.com/go-pg/pg/v9 v9.1.6/go.mod h1:QM13HBLkdml4zcKOfUfGLymM6hb72aKTJLrmaH8rsFg=
|
||||
github.com/go-pg/urlstruct v0.1.0/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0=
|
||||
github.com/go-pg/urlstruct v0.2.6/go.mod h1:dxENwVISWSOX+k87hDt0ueEJadD+gZWv3tHzwfmZPu8=
|
||||
github.com/go-pg/urlstruct v0.3.0/go.mod h1:/XKyiUOUUS3onjF+LJxbfmSywYAdl6qMfVbX33Q8rgg=
|
||||
github.com/go-pg/urlstruct v0.4.0 h1:3lmbUGYQclB3UOx9akDs2T251zwkKQuPkvPTmCm07+A=
|
||||
github.com/go-pg/urlstruct v0.4.0/go.mod h1:/XKyiUOUUS3onjF+LJxbfmSywYAdl6qMfVbX33Q8rgg=
|
||||
github.com/go-pg/zerochecker v0.1.1 h1:av77Qe7Gs+1oYGGh51k0sbZ0bUaxJEdeP0r8YE64Dco=
|
||||
github.com/go-pg/zerochecker v0.1.1/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo=
|
||||
github.com/go-pg/pg/v10 v10.3.2 h1:2GgewrvOE3G0eQH5V6NhAx5vzI+1If0cupnF9Ls3znY=
|
||||
github.com/go-pg/pg/v10 v10.3.2/go.mod h1:wY0cRYyO1JfUXBF2XjkbnNvhce3WyunFDhEvZXnHbP0=
|
||||
github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU=
|
||||
github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo=
|
||||
github.com/go-redis/redis/v8 v8.0.0-beta.7 h1:4HiY+qfsyz8OUr9zyAP2T1CJ0SFRY4mKFvm9TEznuv8=
|
||||
github.com/go-redis/redis/v8 v8.0.0-beta.7/go.mod h1:FGJAWDWFht1sQ4qxyJHZZbVyvnVcKQN0E3u5/5lRz+g=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
|
@ -66,6 +55,8 @@ github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
|||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||
|
@ -79,11 +70,22 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
|
|||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
|
||||
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
|
||||
github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
|
||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
|
||||
github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/opentracing/opentracing-go v1.1.1-0.20190913142402-a7454ce5950e/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
|
@ -93,52 +95,43 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/segmentio/encoding v0.1.10/go.mod h1:RWhr02uzMB9gQC1x+MfYxedtmBibb9cZ6Vv9VxRSSbw=
|
||||
github.com/segmentio/encoding v0.1.13 h1:izH8HknGvMZvlqplu+kmCmbsW5VEvz4yBsZpdUUKUDM=
|
||||
github.com/segmentio/encoding v0.1.13/go.mod h1:RWhr02uzMB9gQC1x+MfYxedtmBibb9cZ6Vv9VxRSSbw=
|
||||
github.com/segmentio/encoding v0.1.14 h1:BfnglNbNRohLaBLf93uP5/IwKqeWrezXK/g6IRnj75c=
|
||||
github.com/segmentio/encoding v0.1.14/go.mod h1:RWhr02uzMB9gQC1x+MfYxedtmBibb9cZ6Vv9VxRSSbw=
|
||||
github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
|
||||
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd h1:AHGZw26jj2uPgFRPLRouFjJJV97Y/p9zLgSW79ZdcVk=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200728103702-87e7e5f1b8fd/go.mod h1:SSWchTkQdgeIDr0C68C7zopEIcBLCUa8Ic2CHenUaac=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200824102353-ef15dea9c1a3 h1:KNH15DdQLxZAahSfX+4U4KUhsqRWj7uxjuOkxxhrQZk=
|
||||
github.com/tribalwarshelp/shared v0.0.0-20200824102353-ef15dea9c1a3/go.mod h1:SSWchTkQdgeIDr0C68C7zopEIcBLCUa8Ic2CHenUaac=
|
||||
github.com/vmihailenco/bufpool v0.1.5/go.mod h1:fL9i/PRTuS7AELqAHwSU1Zf1c70xhkhGe/cD5ud9pJk=
|
||||
github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94=
|
||||
github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ=
|
||||
github.com/vmihailenco/msgpack/v4 v4.3.5/go.mod h1:DuaveEe48abshDmz5UBKyZ+yDugvaeFk5ayfrewUOaw=
|
||||
github.com/vmihailenco/msgpack/v4 v4.3.7/go.mod h1:Ii+PksJlvFT5ZRcB/4YLAInMIp6a0WOCm0L3BU0aNG4=
|
||||
github.com/vmihailenco/msgpack/v4 v4.3.11 h1:Q47CePddpNGNhk4GCnAx9DDtASi2rasatE0cd26cZoE=
|
||||
github.com/vmihailenco/msgpack/v4 v4.3.11/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
|
||||
github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1 h1:d71/KA0LhvkrJ/Ok+Wx9qK7bU8meKA1Hk0jpVI5kJjk=
|
||||
github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1/go.mod h1:xlngVLeyQ/Qi05oQxhQ+oTuqa03RjMwMfk/7/TCs+QI=
|
||||
github.com/vmihailenco/tagparser v0.1.0/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||
github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY=
|
||||
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||
go.opentelemetry.io/otel v0.6.0 h1:+vkHm/XwJ7ekpISV2Ixew93gCrxTbuwTF5rSewnLLgw=
|
||||
go.opentelemetry.io/otel v0.6.0/go.mod h1:jzBIgIzK43Iu1BpDAXwqOd6UPsSAk+ewVZ5ofSXw4Ek=
|
||||
github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc=
|
||||
github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||
go.opentelemetry.io/otel v0.7.0/go.mod h1:aZMyHG5TqDOXEgH2tyLiXSUKly1jT3yqE9PmrzIeCdo=
|
||||
go.opentelemetry.io/otel v0.9.0 h1:nsdCDHzQx1Yv8E2nwCPcMXMfg+EMIlx1LBOXNC8qSQ8=
|
||||
go.opentelemetry.io/otel v0.9.0/go.mod h1:ckxzUEfk7tAkTwEMVdkllBM+YOfE/K9iwg6zYntFYSg=
|
||||
go.opentelemetry.io/otel v0.12.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=
|
||||
go.opentelemetry.io/otel v0.13.0 h1:2isEnyzjjJZq6r2EKMsFj4TxiQiexsM04AVhwbR/oBA=
|
||||
go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY=
|
||||
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20191128160524-b544559bb6d1/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
|
||||
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20200513190911-00229845015e h1:rMqLP+9XLy+LdbCXHjJHAmTfXCr93W7oruWA6Hq1Alc=
|
||||
|
@ -157,43 +150,43 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200222033325-078779b8f2d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
|
||||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
|
||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89 h1:1GKfLldebiSdhTlt3nalwrb7L40Tixr/0IH+kSbRgmk=
|
||||
golang.org/x/net v0.0.0-20201009032441-dbdefad45b89/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
|
||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
|
||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd h1:WgqgiQvkiZWz7XLhphjt2GI2GcGCTIZs9jqXMWmH+oc=
|
||||
golang.org/x/sys v0.0.0-20201022201747-fb209a7c41cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
@ -217,9 +210,6 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi
|
|||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE=
|
||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
|
@ -230,14 +220,14 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
|
|||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
|
@ -247,6 +237,8 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
|
||||
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
|
25
main.go
25
main.go
|
@ -8,6 +8,7 @@ import (
|
|||
"strconv"
|
||||
"syscall"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/tribalwarshelp/shared/mode"
|
||||
|
||||
_cron "github.com/tribalwarshelp/cron/cron"
|
||||
|
@ -23,21 +24,33 @@ func init() {
|
|||
if mode.Get() == mode.DevelopmentMode {
|
||||
godotenv.Load(".env.development")
|
||||
}
|
||||
|
||||
customFormatter := new(logrus.TextFormatter)
|
||||
customFormatter.TimestampFormat = "2006-01-02 15:04:05"
|
||||
customFormatter.FullTimestamp = true
|
||||
logrus.SetFormatter(customFormatter)
|
||||
}
|
||||
|
||||
func main() {
|
||||
db := pg.Connect(&pg.Options{
|
||||
dbOptions := &pg.Options{
|
||||
User: os.Getenv("DB_USER"),
|
||||
Password: os.Getenv("DB_PASSWORD"),
|
||||
Database: os.Getenv("DB_NAME"),
|
||||
Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"),
|
||||
PoolSize: runtime.NumCPU() * 5,
|
||||
})
|
||||
}
|
||||
dbFields := logrus.Fields{
|
||||
"user": dbOptions.User,
|
||||
"database": dbOptions.Database,
|
||||
"addr": dbOptions.Addr,
|
||||
}
|
||||
db := pg.Connect(dbOptions)
|
||||
defer func() {
|
||||
if err := db.Close(); err != nil {
|
||||
log.Fatal(err)
|
||||
logrus.WithFields(dbFields).Fatalln(err)
|
||||
}
|
||||
}()
|
||||
logrus.WithFields(dbFields).Info("Connected to the database")
|
||||
|
||||
c := cron.New(cron.WithChain(
|
||||
cron.SkipIfStillRunning(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))),
|
||||
|
@ -46,18 +59,18 @@ func main() {
|
|||
DB: db,
|
||||
MaxConcurrentWorkers: mustParseEnvToInt("MAX_CONCURRENT_WORKERS"),
|
||||
}); err != nil {
|
||||
log.Fatal(err)
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
c.Start()
|
||||
defer c.Stop()
|
||||
|
||||
log.Print("Cron is running!")
|
||||
logrus.Info("Cron is running!")
|
||||
|
||||
channel := make(chan os.Signal, 1)
|
||||
signal.Notify(channel, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGINT)
|
||||
<-channel
|
||||
|
||||
log.Print("shutting down")
|
||||
logrus.Info("shutting down")
|
||||
}
|
||||
|
||||
func mustParseEnvToInt(key string) int {
|
||||
|
|
Reference in New Issue