Skip to content

Commit 036fcda

Browse files
authored
Merge pull request kubernetes#89412 from coderanger/fix-kubelet-method-metrics
Apply the same style of fix as kubernetes#87913 but for HTTP methods too.
2 parents 9eb097c + 1496983 commit 036fcda

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

pkg/kubelet/server/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ go_library(
3838
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
3939
"//staging/src/k8s.io/apimachinery/pkg/util/proxy:go_default_library",
4040
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
41+
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
4142
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
4243
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
4344
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",

pkg/kubelet/server/server.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"k8s.io/apimachinery/pkg/types"
4949
"k8s.io/apimachinery/pkg/util/proxy"
5050
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
51+
"k8s.io/apimachinery/pkg/util/sets"
5152
"k8s.io/apiserver/pkg/authentication/authenticator"
5253
"k8s.io/apiserver/pkg/authorization/authorizer"
5354
"k8s.io/apiserver/pkg/server/healthz"
@@ -90,7 +91,8 @@ type Server struct {
9091
auth AuthInterface
9192
host HostInterface
9293
restfulCont containerInterface
93-
metricsBuckets map[string]bool
94+
metricsBuckets sets.String
95+
metricsMethodBuckets sets.String
9496
resourceAnalyzer stats.ResourceAnalyzer
9597
redirectContainerStreaming bool
9698
}
@@ -227,7 +229,8 @@ func NewServer(
227229
resourceAnalyzer: resourceAnalyzer,
228230
auth: auth,
229231
restfulCont: &filteringContainer{Container: restful.NewContainer()},
230-
metricsBuckets: make(map[string]bool),
232+
metricsBuckets: sets.NewString(),
233+
metricsMethodBuckets: sets.NewString("OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT"),
231234
redirectContainerStreaming: redirectContainerStreaming,
232235
}
233236
if auth != nil {
@@ -286,16 +289,24 @@ func (s *Server) InstallAuthFilter() {
286289
// addMetricsBucketMatcher adds a regexp matcher and the relevant bucket to use when
287290
// it matches. Please be aware this is not thread safe and should not be used dynamically
288291
func (s *Server) addMetricsBucketMatcher(bucket string) {
289-
s.metricsBuckets[bucket] = true
292+
s.metricsBuckets.Insert(bucket)
290293
}
291294

292295
// getMetricBucket find the appropriate metrics reporting bucket for the given path
293296
func (s *Server) getMetricBucket(path string) string {
294297
root := getURLRootPath(path)
295-
if s.metricsBuckets[root] == true {
298+
if s.metricsBuckets.Has(root) {
296299
return root
297300
}
298-
return "Invalid path"
301+
return "other"
302+
}
303+
304+
// getMetricMethodBucket checks for unknown or invalid HTTP verbs
305+
func (s *Server) getMetricMethodBucket(method string) string {
306+
if s.metricsMethodBuckets.Has(method) {
307+
return method
308+
}
309+
return "other"
299310
}
300311

301312
// InstallDefaultHandlers registers the default set of supported HTTP request
@@ -909,7 +920,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
909920
serverType = "readwrite"
910921
}
911922

912-
method, path := req.Method, s.getMetricBucket(req.URL.Path)
923+
method, path := s.getMetricMethodBucket(req.Method), s.getMetricBucket(req.URL.Path)
913924

914925
longRunning := strconv.FormatBool(isLongRunningRequest(path))
915926

pkg/kubelet/server/server_test.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,8 +1510,8 @@ func TestMetricBuckets(t *testing.T) {
15101510
"stats summary sub": {url: "/stats/summary", bucket: "stats"},
15111511
"stats containerName with uid": {url: "/stats/namespace/podName/uid/containerName", bucket: "stats"},
15121512
"stats containerName": {url: "/stats/podName/containerName", bucket: "stats"},
1513-
"invalid path": {url: "/junk", bucket: "Invalid path"},
1514-
"invalid path starting with good": {url: "/healthzjunk", bucket: "Invalid path"},
1513+
"invalid path": {url: "/junk", bucket: "other"},
1514+
"invalid path starting with good": {url: "/healthzjunk", bucket: "other"},
15151515
}
15161516
fw := newServerTest()
15171517
defer fw.testHTTPServer.Close()
@@ -1523,6 +1523,26 @@ func TestMetricBuckets(t *testing.T) {
15231523
}
15241524
}
15251525

1526+
func TestMetricMethodBuckets(t *testing.T) {
1527+
tests := map[string]struct {
1528+
method string
1529+
bucket string
1530+
}{
1531+
"normal GET": {method: "GET", bucket: "GET"},
1532+
"normal POST": {method: "POST", bucket: "POST"},
1533+
"invalid method": {method: "WEIRD", bucket: "other"},
1534+
}
1535+
1536+
fw := newServerTest()
1537+
defer fw.testHTTPServer.Close()
1538+
1539+
for _, test := range tests {
1540+
method := test.method
1541+
bucket := test.bucket
1542+
require.Equal(t, fw.serverUnderTest.getMetricMethodBucket(method), bucket)
1543+
}
1544+
}
1545+
15261546
func TestDebuggingDisabledHandlers(t *testing.T) {
15271547
fw := newServerTestWithDebug(false, false, nil)
15281548
defer fw.testHTTPServer.Close()

0 commit comments

Comments
 (0)