{"record":{"id":"6b929dfb54cac67a","repo":"Netflix/chaosmonkey","slug":"could-not-retrieve-list-of-apps-from-spinnaker-url","errorCode":null,"errorMessage":"could not retrieve list of apps from spinnaker url %s: %v","messagePattern":"could not retrieve list of apps from spinnaker url (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"spinnaker/spinnaker.go","lineNumber":350,"sourceCode":"\t\t\t\t}\n\n\t\t\t\tdata[account].Clusters[clusterName][region][asgName] = make([]D.InstanceID, len(asg.Instances))\n\n\t\t\t\tfor i, instance := range asg.Instances {\n\t\t\t\t\tdata[account].Clusters[clusterName][region][asgName][i] = D.InstanceID(instance.Name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn D.NewApp(appName, data), nil\n}\n\n// AppNames returns list of names of all apps\nfunc (s Spinnaker) AppNames() (appnames []string, err error) {\n\turl := s.appsURL()\n\tresp, err := s.client.Get(url)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not retrieve list of apps from spinnaker url %s: %v\", url, err)\n\t}\n\n\tdefer func() {\n\t\tif cerr := resp.Body.Close(); cerr != nil && err == nil {\n\t\t\terr = fmt.Errorf(\"failed to close response body from %s: %v\", url, err)\n\t\t}\n\t}()\n\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read body when retrieving spinnaker app names from %s: %v\", url, err)\n\t}\n\tvar apps []spinnakerApp\n\terr = json.Unmarshal(body, &apps)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not parse spinnaker apps list from %s: body: \\\"%s\\\": %v\", url, string(body), err)\n\t}\n","sourceCodeStart":332,"sourceCodeEnd":368,"githubUrl":"https://github.com/Netflix/chaosmonkey/blob/eaa28fb761c0ebe8644d1333e5d164e9cc3071e9/spinnaker/spinnaker.go#L332-L368","documentation":"AppNames() lists all applications by calling the Spinnaker apps endpoint. This error wraps any failure of the underlying HTTP GET (s.client.Get(url)), typically a transport/TLS/connectivity problem, with the Spinnaker apps URL included for diagnosis.","triggerScenarios":"Calling AppNames() when s.client.Get(appsURL()) returns a non-nil error: DNS failure, connection refused/timeout, TLS handshake failure with the client cert, or an invalid endpoint URL.","commonSituations":"Spinnaker endpoint unreachable or firewall blocking; wrong spinnaker.endpoint in config; TLS client cert (p12/x509) not accepted by the server; corporate proxy interference; Spinnaker gate down.","solutions":["Check network connectivity to the endpoint: curl --cert/--key <appsURL> from the chaosmonkey host","Verify spinnaker.endpoint in the chaosmonkey config is correct and reachable","Confirm the TLS client certificate is valid and accepted (test handshake with openssl s_client)","Check for proxy/firewall/DNS issues on the host running chaosmonkey"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Pre-flight connectivity check:\nresp, err := http.Get(endpoint)\nif err != nil {\n\tlog.Fatalf(\"spinnaker endpoint %s unreachable: %v\", endpoint, err)\n}\nresp.Body.Close()","typeGuard":null,"tryCatchPattern":"names, err := spin.AppNames()\nif err != nil {\n\tif strings.Contains(err.Error(), \"could not retrieve list of apps\") {\n\t\t// transient network problem: retry with backoff\n\t\tnames, err = retryWithBackoff(3, spin.AppNames)\n\t}\n\tif err != nil { return err }\n}","preventionTips":["Verify spinnaker.endpoint reachability from the chaosmonkey host","Test TLS client cert auth before production runs","Monitor Spinnaker gate availability","Set sane HTTP timeouts and allow retries for transient failures"],"tags":["network","http","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"}