{"record":{"id":"6355f91deacb81a4","repo":"Netflix/chaosmonkey","slug":"get-failed-on-s","errorCode":null,"errorMessage":"get failed on %s","messagePattern":"get failed on (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"spinnaker/terminator.go","lineNumber":147,"sourceCode":"\t\t},\n\t}\n\n\tresult, err := json.Marshal(p)\n\tif err != nil {\n\t\tlog.Fatalf(\"chronos.jsonPayload could not marshal data into json: %v\", err)\n\t}\n\n\treturn result\n}\n\n// OtherID returns the alternate instance id of an instance, if it exists\n// If there is no alternate instance id, it returns an empty string\n// This is used by Titus, where we also report the uuid\nfunc (s Spinnaker) OtherID(ins chaosmonkey.Instance) (otherID string, err error) {\n\turl := s.instanceURL(ins.AccountName(), ins.RegionName(), ins.ID())\n\tresp, err := s.client.Get(url)\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, fmt.Sprintf(\"get failed on %s\", url))\n\t}\n\n\tdefer func() {\n\t\tif cerr := resp.Body.Close(); cerr != nil && err == nil {\n\t\t\terr = errors.Wrap(cerr, fmt.Sprintf(\"failed to close response body from %s\", url))\n\t\t}\n\t}()\n\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, fmt.Sprintf(\"body read failed at %s\", url))\n\t}\n\n\t// Example of response body:\n\t/*\n\t\t{\n\t\t\t...\n\t\t\t\"health\": [","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/Netflix/chaosmonkey/blob/eaa28fb761c0ebe8644d1333e5d164e9cc3071e9/spinnaker/terminator.go#L129-L165","documentation":"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.","triggerScenarios":"GET <spinnaker-api>/<account>/<region>/<instanceId> fails with a transport error: DNS resolution failure, connection refused/reset, TLS handshake failure, or request timeout.","commonSituations":"Spinnaker Gate unreachable or down; wrong endpoint config; network/egress restrictions from chaosmonkey host; TLS certificate problems; transient DNS failures in the cluster environment.","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."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"u, err := url.Parse(s.instanceURL(account, region, id))\nif err != nil || u.Host == \"\" {\n\treturn fmt.Errorf(\"bad instance URL: %v\", err)\n}\n// connectivity pre-check\nif resp, err := client.Get(gateBaseURL+\"/health\"); err != nil {\n\treturn fmt.Errorf(\"spinnaker gate unreachable: %v\", err)\n} else {\n\tresp.Body.Close()\n}","typeGuard":null,"tryCatchPattern":"resp, err := s.client.Get(url)\nif err != nil {\n\tif ne, ok := errors.Cause(err).(net.Error); ok && ne.Timeout() {\n\t\t// retry with backoff\n\t}\n\treturn \"\", errors.Wrap(err, fmt.Sprintf(\"get failed on %s\", url))\n}","preventionTips":["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"],"tags":["go","http","network","spinnaker"],"backgroundTag":"http-request-failed","analyzedSha":"eaa28fb761c0ebe8644d1333e5d164e9cc3071e9","analyzedAt":"2026-09-03T17:04:39.020Z","contentChangedAt":"2026-09-03T17:04:39.020Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}