package eventlog
import (
"context"
"github.com/goodrain/rainbond/api/eventlog/entry"
"github.com/goodrain/rainbond/api/eventlog/exit/web"
"github.com/goodrain/rainbond/api/eventlog/store"
"github.com/goodrain/rainbond/config/configs"
"github.com/goodrain/rainbond/config/configs/rbdcomponent"
"github.com/sirupsen/logrus"
"os"
"os/signal"
"strconv"
"syscall"
"time"
)
var defaultEventlogComponent *EventlogComponent
type EventlogComponent struct {
Entry *entry.Entry
SocketServer *web.SocketServer
EventLogConfig *rbdcomponent.EventLogConfig
}
func New() *EventlogComponent {
defaultEventlogComponent = &EventlogComponent{
EventLogConfig: configs.Default().EventLogConfig,
}
return defaultEventlogComponent
}
func (s *EventlogComponent) Start(ctx context.Context) error {
go func() {
err := func() error {
logrus.Debug("Start run server.")
storeManager, err := store.NewManager(s.EventLogConfig.Conf.EventStore, logrus.WithField("module", "MessageStore"))
if err != nil {
return err
}
healthInfo := storeManager.HealthCheck()
if err := storeManager.Run(); err != nil {
return err
}
defer storeManager.Stop()
s.SocketServer = web.NewSocket(s.EventLogConfig.Conf.WebSocket, s.EventLogConfig.Conf.Cluster.Discover,
logrus.WithField("module", "SocketServer"), storeManager, healthInfo)
if err := s.SocketServer.Run(); err != nil {
return err
}
defer s.SocketServer.Stop()
s.Entry = entry.NewEntry(s.EventLogConfig.Conf.Entry, logrus.WithField("module", "EntryServer"), storeManager)
if err := s.Entry.Start(); err != nil {
return err
}
defer s.Entry.Stop()
term := make(chan os.Signal, 1)
signal.Notify(term, os.Interrupt, syscall.SIGTERM)
select {
case <-term:
logrus.Warn("Received SIGTERM, exiting gracefully...")
case err := <-s.SocketServer.ListenError():
logrus.Errorln("Error listen web socket server, exiting gracefully:", err)
case err := <-storeManager.Error():
logrus.Errorln("Store receive a error, exiting gracefully:", err)
}
logrus.Info("See you next time!")
return nil
}()
if err != nil {
panic(err)
}
}()
eventlogTimeout := 2
if os.Getenv("EVENTLOG_TIMEOUT") != "" {
t, err := strconv.Atoi(os.Getenv("EVENTLOG_TIMEOUT"))
if err == nil {
eventlogTimeout = t
}
}
startTime := time.Now()
for {
if defaultEventlogComponent.Entry != nil && defaultEventlogComponent.SocketServer != nil {
logrus.Infof("eventlog server is running...")
break
}
logrus.Info("waiting for eventlog server to start...")
time.Sleep(5 * time.Second)
if time.Since(startTime) > time.Duration(eventlogTimeout)*time.Minute {
logrus.Error("eventlog server start timeout")
break
}
}
return nil
}
func (r *EventlogComponent) CloseHandle() {
}
func Default() *EventlogComponent {
return defaultEventlogComponent
}