Merge pull request #49678 from smarterclayton/429_metric

Automatic merge from submit-queue

Timeout and Max-in-flight don't report non-resource URLs correctly.

Unify error reporting for 429 and 504 to be correct for timeout and max in flight and eviction. Add better messages to eviction (removing a todo). Return the correct body content for timeouts (reason and code should be correct).

This potentially increases cardinality of 429, but because non-api urls may be under the max-inflight budget we need to report them somewhere (if something breaks and starts fetching API versions endlessly).

```release-note
The 504 timeout error was returning a JSON error body that indicated it was a 500.  The body contents now correctly report a 500 error.
```

Kubernetes-commit: 8d6bbaa85f96f14ac9c9722ed1677e1052c974ba
This commit is contained in:
Kubernetes Publisher 2017-08-05 01:28:00 -07:00
commit 1091ffb59e
3 changed files with 52 additions and 52 deletions

96
Godeps/Godeps.json generated
View File

@ -432,195 +432,195 @@
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/equality", "ImportPath": "k8s.io/apimachinery/pkg/api/equality",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/errors", "ImportPath": "k8s.io/apimachinery/pkg/api/errors",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/meta", "ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/api/resource", "ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apimachinery", "ImportPath": "k8s.io/apimachinery/pkg/apimachinery",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1", "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion", "ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured", "ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/fields", "ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/labels", "ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime", "ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/selection", "ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/types", "ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/cache", "ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/clock", "ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/diff", "ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/errors", "ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/framer", "ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr", "ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/json", "ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/net", "ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime", "ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/sets", "ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation", "ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/wait", "ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml", "ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/version", "ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/pkg/watch", "ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "abee1a2f97bdbf7f5c1bd6f363a3d1478bb1e8ec" "Rev": "8cc513375dee45d0409b6cd3d1bec72cf3ea1be8"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",

View File

@ -889,7 +889,7 @@ func isTextResponse(resp *http.Response) bool {
func checkWait(resp *http.Response) (int, bool) { func checkWait(resp *http.Response) (int, bool) {
switch r := resp.StatusCode; { switch r := resp.StatusCode; {
// any 500 error code and 429 can trigger a wait // any 500 error code and 429 can trigger a wait
case r == errors.StatusTooManyRequests, r >= 500: case r == http.StatusTooManyRequests, r >= 500:
default: default:
return 0, false return 0, false
} }

View File

@ -1130,7 +1130,7 @@ func TestCheckRetryClosesBody(t *testing.T) {
return return
} }
w.Header().Set("Retry-After", "1") w.Header().Set("Retry-After", "1")
http.Error(w, "Too many requests, please try again later.", apierrors.StatusTooManyRequests) http.Error(w, "Too many requests, please try again later.", http.StatusTooManyRequests)
})) }))
defer testServer.Close() defer testServer.Close()
@ -1204,7 +1204,7 @@ func TestCheckRetryHandles429And5xx(t *testing.T) {
return return
} }
w.Header().Set("Retry-After", "0") w.Header().Set("Retry-After", "0")
w.WriteHeader([]int{apierrors.StatusTooManyRequests, 500, 501, 504}[count]) w.WriteHeader([]int{http.StatusTooManyRequests, 500, 501, 504}[count])
count++ count++
})) }))
defer testServer.Close() defer testServer.Close()
@ -1234,7 +1234,7 @@ func BenchmarkCheckRetryClosesBody(b *testing.B) {
return return
} }
w.Header().Set("Retry-After", "0") w.Header().Set("Retry-After", "0")
w.WriteHeader(apierrors.StatusTooManyRequests) w.WriteHeader(http.StatusTooManyRequests)
})) }))
defer testServer.Close() defer testServer.Close()