Netflix/chaosmonkey · error
get failed on %s
Error message
get failed on %s
What it means
OtherID throws this when the http.Client.Get to the Spinnaker instance endpoint fails at the transport level, before any HTTP response arrives. OtherID fetches an instance's alternate ID (Titus uuid) required by the terminator, so this error aborts the termination. The URL is embedded so you can reproduce the request.
Source
Thrown at spinnaker/terminator.go:147
},
}
result, err := json.Marshal(p)
if err != nil {
log.Fatalf("chronos.jsonPayload could not marshal data into json: %v", err)
}
return result
}
// OtherID returns the alternate instance id of an instance, if it exists
// If there is no alternate instance id, it returns an empty string
// This is used by Titus, where we also report the uuid
func (s Spinnaker) OtherID(ins chaosmonkey.Instance) (otherID string, err error) {
url := s.instanceURL(ins.AccountName(), ins.RegionName(), ins.ID())
resp, err := s.client.Get(url)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("get failed on %s", url))
}
defer func() {
if cerr := resp.Body.Close(); cerr != nil && err == nil {
err = errors.Wrap(cerr, fmt.Sprintf("failed to close response body from %s", url))
}
}()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", errors.Wrap(err, fmt.Sprintf("body read failed at %s", url))
}
// Example of response body:
/*
{
...
"health": [View on GitHub (pinned to eaa28fb761)
Solutions
- Curl the URL in the error from the chaosmonkey host to test connectivity to Spinnaker Gate.
- Verify spinnaker endpoint configuration (host, scheme, port).
- Check DNS resolution and egress firewall/security-group rules.
- Look at errors.Cause for the specific transport error (timeout vs refused vs TLS) and fix accordingly.
- Add retry with backoff for transient transport errors in the termination flow.
Defensive patterns
Strategy: retry
Validate before calling
u, err := url.Parse(s.instanceURL(account, region, id))
if err != nil || u.Host == "" {
return fmt.Errorf("bad instance URL: %v", err)
}
// connectivity pre-check
if resp, err := client.Get(gateBaseURL+"/health"); err != nil {
return fmt.Errorf("spinnaker gate unreachable: %v", err)
} else {
resp.Body.Close()
} Try / catch
resp, err := s.client.Get(url)
if err != nil {
if ne, ok := errors.Cause(err).(net.Error); ok && ne.Timeout() {
// retry with backoff
}
return "", errors.Wrap(err, fmt.Sprintf("get failed on %s", url))
} Prevention
- Retry idempotent instance GETs with exponential backoff
- Verify DNS and egress connectivity to Gate from the chaosmonkey host
- Set explicit http.Client timeouts to fail fast with clear errors
- Monitor Gate availability during experiment windows
When it happens
Trigger: GET <spinnaker-api>/<account>/<region>/<instanceId> fails with a transport error: DNS resolution failure, connection refused/reset, TLS handshake failure, or request timeout.
Common situations: Spinnaker Gate unreachable or down; wrong endpoint config; network/egress restrictions from chaosmonkey host; TLS certificate problems; transient DNS failures in the cluster environment.
Understand the failure class
Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.
Related errors
- http get failed at %s
- http get failed at %s
- POST to %s failed, (body '%s')
- body read failed at %s
- could not retrieve list of apps from spinnaker url %s: %v
AI-assisted analysis of Netflix/chaosmonkey@eaa28fb761 (2026-09-03).
Data as JSON: /api/errors/6355f91deacb81a4.
Report an issue: GitHub.