Netflix/chaosmonkey · error

failed to populate schedule: %v

Error message

failed to populate schedule: %v

What it means

The schedule command (command/schedule.go do()) builds the termination schedule via schedule.Schedule.Populate, which fetches app configs and allowed/previous terminations from the deployment backend. Any error returned by Populate is wrapped with this message, so the schedule could not be assembled and nothing was deployed. The underlying cause is appended with %v.

Source

Thrown at command/schedule.go:64

	 during terminations. That way, if chaos monkey is disabled during
	 scheduling time but later in the day becomes enabled, it still
	 functions correctly.
	*/
	err = do(d, g, ss, cfg, cons, apps)

	if err != nil {
		log.Fatalf("FATAL: %v", err)
	}

}

// do is the actual implementation for the Schedule function
func do(d deploy.Deployment, g chaosmonkey.AppConfigGetter, ss schedstore.SchedStore, cfg *config.Monkey, cons schedule.Constrainer, apps []string) error {

	s := schedule.New()
	err := s.Populate(d, g, cfg, apps)
	if err != nil {
		return fmt.Errorf("failed to populate schedule: %v", err)
	}

	// Filter out terminations that violate constrains
	sched := cons.Filter(*s)

	err = deploySchedule(&sched, ss, cfg)
	if err != nil {
		return fmt.Errorf("failed to deploy schedule: %v", err)
	}

	return nil
}

// deploySchedule publishes the schedule to chaosmonkey-api
// and registers the schedule with the local cron
func deploySchedule(s *schedule.Schedule, ss schedstore.SchedStore, cfg *config.Monkey) error {
	loc, err := cfg.Location()
	if err != nil {

View on GitHub (pinned to eaa28fb761)

Solutions

  1. Read the wrapped cause after the colon to identify the real failure (API error, permission, bad app name).
  2. Verify the deployment backend (e.g. Datastore) is reachable and credentials/permissions are correct.
  3. Check the app names passed on the command line exist in the deployment environment.
  4. Retry the command once transient network/service errors have been ruled out.
Defensive patterns

Strategy: try-catch

Validate before calling

// before scheduling, sanity-check inputs and backend reachability
if len(apps) == 0 {
    return errors.New("no apps specified for scheduling")
}
if _, err := g.GetConfig(apps[0]); err != nil {
    return fmt.Errorf("deployment backend unreachable: %v", err)
}

Try / catch

if err := do(dep, appCfgGetter, schedStore, cfg, constrainer, apps); err != nil {
    if strings.HasPrefix(err.Error(), "failed to populate schedule:") {
        log.Errorf("schedule population failed, cause: %v", errors.Unwrap(err))
        // inspect wrapped cause; retry only on transient errors
        return err
    }
    return err
}

Prevention

When it happens

Trigger: Running the schedule command (Schedule -> do) when s.Populate fails: deployment API errors (e.g. appengine fetch failures), AppConfigGetter errors, or errors listing allowed terminations for the requested apps.

Common situations: Cloud Datastore / deployment service outages or permission errors, invalid app names passed to the command, missing or misconfigured AppConfigGetter credentials, or network failures in the deployment environment.

Related errors


AI-assisted analysis of Netflix/chaosmonkey@eaa28fb761 (2026-09-03). Data as JSON: /api/errors/b4840cada84013cd. Report an issue: GitHub.