Skip to content

Commit

Permalink
fix: sync checks for canaries added from ui
Browse files Browse the repository at this point in the history
  • Loading branch information
yashmehrotra committed Jul 26, 2023
1 parent ac227af commit 8d36093
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 15 deletions.
39 changes: 24 additions & 15 deletions pkg/db/canary.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,16 +295,9 @@ func CreateCheck(canary pkg.Canary, check *pkg.Check) error {
return Gorm.Create(&check).Error
}

func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]string, bool, error) {
func PersistCanaryModel(model pkg.Canary) (*pkg.Canary, map[string]string, bool, error) {
var err error
changed := false
model, err := pkg.CanaryFromV1(canary)
if err != nil {
return nil, nil, changed, err
}
if canary.GetPersistedID() != "" {
model.ID, _ = uuid.Parse(canary.GetPersistedID())
}
model.Source = source
tx := Gorm.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "agent_id"}, {Name: "name"}, {Name: "namespace"}, {Name: "source"}},
UpdateAll: true,
Expand Down Expand Up @@ -333,15 +326,15 @@ func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]str
return nil, nil, changed, err
}

var spec v1.CanarySpec
if err = json.Unmarshal(model.Spec, &spec); err != nil {
return nil, nil, changed, err
}

var checks = make(map[string]string)
var newCheckIDs []string
for _, config := range canary.Spec.GetAllChecks() {
for _, config := range spec.GetAllChecks() {
check := pkg.FromExternalCheck(model, config)
// not creating the new check if already exists in the status
// status is not patched correctly with the status id
if checkID := canary.GetCheckID(check.Name); checkID != "" {
check.ID, _ = uuid.Parse(checkID)
}
check.Spec, _ = json.Marshal(config)
id, err := PersistCheck(check, model.ID)
if err != nil {
Expand All @@ -361,9 +354,25 @@ func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]str
}
metrics.UnregisterGauge(checkIDsToRemove)
}

model.Checks = checks
return &model, checks, changed, nil
}

func PersistCanary(canary v1.Canary, source string) (*pkg.Canary, map[string]string, bool, error) {
changed := false
model, err := pkg.CanaryFromV1(canary)
if err != nil {
return nil, nil, changed, err
}
if canary.GetPersistedID() != "" {
model.ID, _ = uuid.Parse(canary.GetPersistedID())
}
model.Source = source

return PersistCanaryModel(model)
}

func RefreshCheckStatusSummary() {
if err := duty.RefreshCheckStatusSummary(Pool); err != nil {
logger.Errorf("error refreshing check_status_summary materialized view: %v", err)
Expand Down
41 changes: 41 additions & 0 deletions pkg/jobs/canary/canary_jobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,47 @@ func DeleteCanaryJob(id string) {
CanaryScheduler.Remove(entry.ID)
}

func ReconcileCanaryChecks() {
jobHistory := models.NewJobHistory("ReconcileCanaryChecks", "", "").Start()
_ = db.PersistJobHistory(jobHistory)
defer func() { _ = db.PersistJobHistory(jobHistory.End()) }()

// Get id, updateTime of all non deleted canaries
var rows []struct {
ID string
UpdatedAt time.Time
}
if err := db.Gorm.Raw(`SELECT id, updated_at FROM canaries WHERE deleted_at IS NULL`).Scan(&rows); err != nil {
logger.Errorf("Error fetching canaries: %v", err)
return
}

var idsToPersist []string
for _, r := range rows {
updateTime, exists := canaryUpdateTimeCache.Load(r.ID)
if !exists {
idsToPersist = append(idsToPersist, r.ID)
canaryUpdateTimeCache.Store(r.ID, r.UpdatedAt)
continue
}
if r.UpdatedAt.After(updateTime.(time.Time)) {
idsToPersist = append(idsToPersist, r.ID)
}
}

var canaries []pkg.Canary
if err := db.Gorm.Table("canaries").Where("id IN ?", idsToPersist).Find(&canaries).Error; err != nil {
logger.Errorf("Error fetching canaries: %v", err)
return
}

for _, c := range canaries {
if _, _, _, err := db.PersistCanaryModel(c); err != nil {
logger.Errorf("Error persisting canary: %v", err)
}
}
}

func ReconcileDeletedCanaryChecks() {
jobHistory := models.NewJobHistory("ReconcileDeletedCanaryChecks", "", "").Start()
_ = db.PersistJobHistory(jobHistory)
Expand Down
3 changes: 3 additions & 0 deletions pkg/jobs/jobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ func Start() {
if _, err := ScheduleFunc(ReconcileDeletedCanaryChecksSchedule, canaryJobs.ReconcileDeletedCanaryChecks); err != nil {
logger.Errorf("Failed to schedule ReconcileDeletedCanaryChecks: %v", err)
}
if _, err := ScheduleFunc("@every 5m", canaryJobs.ReconcileCanaryChecks); err != nil {
logger.Errorf("Failed to schedule ReconcileCanaryChecks: %v", err)
}

canaryJobs.CleanupMetricsGauges()
canaryJobs.SyncCanaryJobs()
Expand Down

0 comments on commit 8d36093

Please sign in to comment.