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
- Add "spinnaker": {"endpoint": "https://your-spinnaker-api"} to the chaos monkey config file
- Verify the config file actually being loaded (check the -config flag / config path used by Execute)
- Check the key spelling and nesting of the endpoint in the config JSON
- 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
- Validate all required config keys (endpoint, user, credentials) at process startup with fail-fast checks
- Commit a config template/example listing spinnaker.endpoint as required
- Check the -config flag points at the intended file in each environment
- Smoke-test NewFromConfig in CI against the real config file
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
- 'attributes' field missing
- 'attributes.chaosMonkey' field missing
- 'attributes.chaosMonkey.enabled' field missing
- attributes.chaosMonkey.meanTimeBetweenKillsInWorkDays missin
- attributes.chaosMonkey.minTimeBetweenKillsInWorkDays missing
AI-assisted analysis of Netflix/chaosmonkey@eaa28fb761 (2026-09-03).
Data as JSON: /api/errors/20ce8ce0b15ca3e5.
Report an issue: GitHub.