diff --git a/pkg/endpoints/metrics/metrics.go b/pkg/endpoints/metrics/metrics.go index 141f66424..79ee21e8f 100644 --- a/pkg/endpoints/metrics/metrics.go +++ b/pkg/endpoints/metrics/metrics.go @@ -458,12 +458,12 @@ func InstrumentHandlerFunc(verb, group, version, resource, subresource, scope, c // CleanScope returns the scope of the request. func CleanScope(requestInfo *request.RequestInfo) string { + if requestInfo.Name != "" || requestInfo.Verb == "create" { + return "resource" + } if requestInfo.Namespace != "" { return "namespace" } - if requestInfo.Name != "" { - return "resource" - } if requestInfo.IsResourceRequest { return "cluster" } diff --git a/pkg/endpoints/metrics/metrics_test.go b/pkg/endpoints/metrics/metrics_test.go index c753546cd..c0f388557 100644 --- a/pkg/endpoints/metrics/metrics_test.go +++ b/pkg/endpoints/metrics/metrics_test.go @@ -20,6 +20,8 @@ import ( "net/http" "net/url" "testing" + + "k8s.io/apiserver/pkg/endpoints/request" ) func TestCleanVerb(t *testing.T) { @@ -132,3 +134,59 @@ func TestCleanVerb(t *testing.T) { }) } } + +func TestCleanScope(t *testing.T) { + testCases := []struct { + name string + requestInfo *request.RequestInfo + expectedScope string + }{ + { + name: "empty scope", + requestInfo: &request.RequestInfo{}, + expectedScope: "", + }, + { + name: "resource scope", + requestInfo: &request.RequestInfo{ + Name: "my-resource", + Namespace: "my-namespace", + IsResourceRequest: false, + }, + expectedScope: "resource", + }, + { + name: "POST resource scope", + requestInfo: &request.RequestInfo{ + Verb: "create", + Namespace: "my-namespace", + IsResourceRequest: false, + }, + expectedScope: "resource", + }, + { + name: "namespace scope", + requestInfo: &request.RequestInfo{ + Namespace: "my-namespace", + IsResourceRequest: false, + }, + expectedScope: "namespace", + }, + { + name: "cluster scope", + requestInfo: &request.RequestInfo{ + Namespace: "", + IsResourceRequest: true, + }, + expectedScope: "cluster", + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + if CleanScope(test.requestInfo) != test.expectedScope { + t.Errorf("failed to clean scope: %v", test.requestInfo) + } + }) + } +}