* Add feature flag managment system using split.io and remove viper. * Fixing tests. * Attempt to fix postgres tests. * Fix watch filepath for advanced logging. * Review fixes. * Some error wrapping. * Remove unessisary store interface. * Desanitize SplitKey * Simplify. * Review feedback. * Rename split mlog adatper to split logger. * fsInner * Style. * Restore oldcfg test. * Downgrading non-actionable feature flag errors to warnings. Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
159 строки
4.7 KiB
Go
159 строки
4.7 KiB
Go
package synchronizer
|
|
|
|
import (
|
|
"github.com/splitio/go-split-commons/v2/conf"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/event"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/impression"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/impressionscount"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/metric"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/segment"
|
|
"github.com/splitio/go-split-commons/v2/synchronizer/worker/split"
|
|
"github.com/splitio/go-split-commons/v2/tasks"
|
|
"github.com/splitio/go-toolkit/v3/asynctask"
|
|
"github.com/splitio/go-toolkit/v3/logging"
|
|
)
|
|
|
|
// SplitTasks struct for tasks
|
|
type SplitTasks struct {
|
|
SplitSyncTask *asynctask.AsyncTask
|
|
SegmentSyncTask *asynctask.AsyncTask
|
|
TelemetrySyncTask *asynctask.AsyncTask
|
|
ImpressionSyncTask tasks.Task
|
|
EventSyncTask tasks.Task
|
|
ImpressionsCountSyncTask *asynctask.AsyncTask
|
|
}
|
|
|
|
// Workers struct for workers
|
|
type Workers struct {
|
|
SplitFetcher split.SplitFetcher
|
|
SegmentFetcher segment.SegmentFetcher
|
|
TelemetryRecorder metric.MetricRecorder
|
|
ImpressionRecorder impression.ImpressionRecorder
|
|
EventRecorder event.EventRecorder
|
|
ImpressionsCountRecorder impressionscount.ImpressionsCountRecorder
|
|
}
|
|
|
|
// SynchronizerImpl implements Synchronizer
|
|
type SynchronizerImpl struct {
|
|
splitTasks SplitTasks
|
|
workers Workers
|
|
logger logging.LoggerInterface
|
|
inMememoryFullQueue chan string
|
|
impressionBulkSize int64
|
|
eventBulkSize int64
|
|
}
|
|
|
|
// NewSynchronizer creates new SynchronizerImpl
|
|
func NewSynchronizer(
|
|
confAdvanced conf.AdvancedConfig,
|
|
splitTasks SplitTasks,
|
|
workers Workers,
|
|
logger logging.LoggerInterface,
|
|
inMememoryFullQueue chan string,
|
|
) Synchronizer {
|
|
return &SynchronizerImpl{
|
|
impressionBulkSize: confAdvanced.ImpressionsBulkSize,
|
|
eventBulkSize: confAdvanced.EventsBulkSize,
|
|
splitTasks: splitTasks,
|
|
workers: workers,
|
|
logger: logger,
|
|
inMememoryFullQueue: inMememoryFullQueue,
|
|
}
|
|
}
|
|
|
|
func (s *SynchronizerImpl) dataFlusher() {
|
|
for true {
|
|
msg := <-s.inMememoryFullQueue
|
|
switch msg {
|
|
case "EVENTS_FULL":
|
|
s.logger.Debug("FLUSHING storage queue")
|
|
err := s.workers.EventRecorder.SynchronizeEvents(s.eventBulkSize)
|
|
if err != nil {
|
|
s.logger.Error("Error flushing storage queue", err)
|
|
}
|
|
break
|
|
case "IMPRESSIONS_FULL":
|
|
s.logger.Debug("FLUSHING storage queue")
|
|
err := s.workers.ImpressionRecorder.SynchronizeImpressions(s.impressionBulkSize)
|
|
if err != nil {
|
|
s.logger.Error("Error flushing storage queue", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// SyncAll syncs splits and segments
|
|
func (s *SynchronizerImpl) SyncAll() error {
|
|
err := s.workers.SplitFetcher.SynchronizeSplits(nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.workers.SegmentFetcher.SynchronizeSegments()
|
|
}
|
|
|
|
// StartPeriodicFetching starts periodic fetchers tasks
|
|
func (s *SynchronizerImpl) StartPeriodicFetching() {
|
|
if s.splitTasks.SplitSyncTask != nil {
|
|
s.splitTasks.SplitSyncTask.Start()
|
|
}
|
|
if s.splitTasks.SegmentSyncTask != nil {
|
|
s.splitTasks.SegmentSyncTask.Start()
|
|
}
|
|
}
|
|
|
|
// StopPeriodicFetching stops periodic fetchers tasks
|
|
func (s *SynchronizerImpl) StopPeriodicFetching() {
|
|
if s.splitTasks.SplitSyncTask != nil {
|
|
s.splitTasks.SplitSyncTask.Stop(false)
|
|
}
|
|
if s.splitTasks.SegmentSyncTask != nil {
|
|
s.splitTasks.SegmentSyncTask.Stop(true)
|
|
}
|
|
}
|
|
|
|
// StartPeriodicDataRecording starts periodic recorders tasks
|
|
func (s *SynchronizerImpl) StartPeriodicDataRecording() {
|
|
if s.inMememoryFullQueue != nil {
|
|
go s.dataFlusher()
|
|
}
|
|
|
|
if s.splitTasks.ImpressionSyncTask != nil {
|
|
s.splitTasks.ImpressionSyncTask.Start()
|
|
}
|
|
if s.splitTasks.TelemetrySyncTask != nil {
|
|
s.splitTasks.TelemetrySyncTask.Start()
|
|
}
|
|
if s.splitTasks.EventSyncTask != nil {
|
|
s.splitTasks.EventSyncTask.Start()
|
|
}
|
|
if s.splitTasks.ImpressionsCountSyncTask != nil {
|
|
s.splitTasks.ImpressionsCountSyncTask.Start()
|
|
}
|
|
}
|
|
|
|
// StopPeriodicDataRecording stops periodic recorders tasks
|
|
func (s *SynchronizerImpl) StopPeriodicDataRecording() {
|
|
if s.splitTasks.ImpressionSyncTask != nil {
|
|
s.splitTasks.ImpressionSyncTask.Stop(true)
|
|
}
|
|
if s.splitTasks.TelemetrySyncTask != nil {
|
|
s.splitTasks.TelemetrySyncTask.Stop(false)
|
|
}
|
|
if s.splitTasks.EventSyncTask != nil {
|
|
s.splitTasks.EventSyncTask.Stop(true)
|
|
}
|
|
if s.splitTasks.ImpressionsCountSyncTask != nil {
|
|
s.splitTasks.ImpressionsCountSyncTask.Stop(true)
|
|
}
|
|
}
|
|
|
|
// SynchronizeSplits syncs splits
|
|
func (s *SynchronizerImpl) SynchronizeSplits(till *int64) error {
|
|
return s.workers.SplitFetcher.SynchronizeSplits(till)
|
|
}
|
|
|
|
// SynchronizeSegment syncs segment
|
|
func (s *SynchronizerImpl) SynchronizeSegment(name string, till *int64) error {
|
|
return s.workers.SegmentFetcher.SynchronizeSegment(name, till)
|
|
}
|