Netflix/chaosmonkey · critical

FATAL: no spinnaker endpoint specified in config

Error message

FATAL: no spinnaker endpoint specified in config

What it means

NewFromConfig builds a Spinnaker client from chaos monkey configuration. It requires a Spinnaker endpoint (spinnaker.endpoint in the chaos monkey config); if the endpoint string is empty, construction fails immediately with this fatal-style error before any network call is made.

Source

Thrown at spinnaker/spinnaker.go:114

	tlsConfig := &tls.Config{
		Certificates:       []tls.Certificate{cert},
		InsecureSkipVerify: true,
	}
	transport := &http.Transport{TLSClientConfig: tlsConfig}
	return &http.Client{Transport: transport}, nil
}

// NewFromConfig returns a Spinnaker based on config
func NewFromConfig(cfg *config.Monkey) (Spinnaker, error) {
	spinnakerEndpoint := cfg.SpinnakerEndpoint()
	certPath := cfg.SpinnakerCertificate()
	encryptedPassword := cfg.SpinnakerEncryptedPassword()
	user := cfg.SpinnakerUser()
	x509Cert := cfg.SpinnakerX509Cert()
	x509Key := cfg.SpinnakerX509Key()

	if spinnakerEndpoint == "" {
		return Spinnaker{}, errors.New("FATAL: no spinnaker endpoint specified in config")
	}

	var password string
	var err error
	var decryptor chaosmonkey.Decryptor

	if encryptedPassword != "" {
		decryptor, err = deps.GetDecryptor(cfg)
		if err != nil {
			return Spinnaker{}, err
		}

		password, err = decryptor.Decrypt(encryptedPassword)
		if err != nil {
			return Spinnaker{}, err
		}
	}

View on GitHub (pinned to eaa28fb761)

Solutions

  1. Add "spinnaker": {"endpoint": "https://your-spinnaker-api"} to the chaos monkey config file
  2. Verify the config file actually being loaded (check the -config flag / config path used by Execute)
  3. Check the key spelling and nesting of the endpoint in the config JSON
  4. Print/log cfg.SpinnakerEndpoint() early in startup to confirm what the loader sees

Example fix

// before: chaos_monkey.json
{"spinnaker": {"user": "cm", "password": "..."}}
// after
{"spinnaker": {"endpoint": "https://spinnaker.example.com/api/v1", "user": "cm", "password": "..."}}
Defensive patterns

Strategy: validation

Validate before calling

if cfg.SpinnakerEndpoint() == "" {
    return errors.New("chaos monkey config missing spinnaker.endpoint")
}
// safe to call Execute / NewFromConfig

Type guard

func spinnakerConfigured(cfg *chaosmonkey.Config) bool {
    return cfg != nil && cfg.SpinnakerEndpoint() != ""
}

Try / catch

_, err := spinnaker.NewFromConfig(cfg)
if err != nil {
    if strings.Contains(err.Error(), "no spinnaker endpoint specified") {
        return fmt.Errorf("startup aborted: %w", err) // fail fast before scheduling terminations
    }
    return err
}

Prevention

When it happens

Trigger: Calling spinnaker.NewFromConfig (via chaosmonkey.Execute) when cfg.SpinnakerEndpoint() returns "" — i.e. the config file/flags provided to chaos monkey define no spinnaker.endpoint value.

Common situations: Fresh deployment where chaos_monkey.json omits the spinnaker.endpoint key; typo in the config key name; config loaded from the wrong file or environment so endpoint fields are zero-valued; endpoint set only in an environment that isn't read by the config loader.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


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