Skip to content

Commit f10de54

Browse files
authored
Merge pull request kubernetes#83598 from jktomer/healthz-metrics
healthz: instrument root healthz requests for metrics
2 parents dcd0755 + 9dadafa commit f10de54

File tree

3 files changed

+47
-1
lines changed

3 files changed

+47
-1
lines changed

staging/src/k8s.io/apiserver/pkg/server/healthz/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ go_test(
1212
embed = [":go_default_library"],
1313
deps = [
1414
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
15+
"//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
16+
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
17+
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
1518
],
1619
)
1720

@@ -26,6 +29,7 @@ go_library(
2629
deps = [
2730
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
2831
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
32+
"//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
2933
"//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library",
3034
"//vendor/k8s.io/klog:go_default_library",
3135
],

staging/src/k8s.io/apiserver/pkg/server/healthz/healthz.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
"k8s.io/apimachinery/pkg/util/sets"
2929
"k8s.io/apimachinery/pkg/util/wait"
30+
"k8s.io/apiserver/pkg/endpoints/metrics"
3031
"k8s.io/apiserver/pkg/server/httplog"
3132
"k8s.io/klog"
3233
)
@@ -122,7 +123,15 @@ func InstallPathHandler(mux mux, path string, checks ...HealthChecker) {
122123

123124
klog.V(5).Infof("Installing health checkers for (%v): %v", path, formatQuoted(checkerNames(checks...)...))
124125

125-
mux.Handle(path, handleRootHealthz(checks...))
126+
mux.Handle(path,
127+
metrics.InstrumentHandlerFunc("GET",
128+
/* group = */ "",
129+
/* version = */ "",
130+
/* resource = */ "",
131+
/* subresource = */ path,
132+
/* scope = */ "",
133+
/* component = */ "",
134+
handleRootHealthz(checks...)))
126135
for _, check := range checks {
127136
mux.Handle(fmt.Sprintf("%s/%v", path, check.Name()), adaptCheckToHandler(check.Check))
128137
}

staging/src/k8s.io/apiserver/pkg/server/healthz/healthz_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ import (
2323
"net/http/httptest"
2424
"net/url"
2525
"reflect"
26+
"strings"
2627
"testing"
2728

2829
"k8s.io/apimachinery/pkg/util/sets"
30+
"k8s.io/apiserver/pkg/endpoints/metrics"
31+
"k8s.io/component-base/metrics/legacyregistry"
32+
"k8s.io/component-base/metrics/testutil"
2933
)
3034

3135
func TestInstallHandler(t *testing.T) {
@@ -232,6 +236,35 @@ func TestGetExcludedChecks(t *testing.T) {
232236
}
233237
}
234238

239+
func TestMetrics(t *testing.T) {
240+
mux := http.NewServeMux()
241+
InstallHandler(mux)
242+
InstallLivezHandler(mux)
243+
InstallReadyzHandler(mux)
244+
metrics.Register()
245+
metrics.Reset()
246+
247+
paths := []string{"/healthz", "/livez", "/readyz"}
248+
for _, path := range paths {
249+
req, err := http.NewRequest("GET", fmt.Sprintf("http://example.com%s", path), nil)
250+
if err != nil {
251+
t.Errorf("%v", err)
252+
}
253+
mux.ServeHTTP(httptest.NewRecorder(), req)
254+
}
255+
256+
expected := strings.NewReader(`
257+
# HELP apiserver_request_total [ALPHA] Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, client, and HTTP response contentType and code.
258+
# TYPE apiserver_request_total counter
259+
apiserver_request_total{client="unknown",code="200",component="",contentType="text/plain; charset=utf-8",dry_run="",group="",resource="",scope="",subresource="/healthz",verb="GET",version=""} 1
260+
apiserver_request_total{client="unknown",code="200",component="",contentType="text/plain; charset=utf-8",dry_run="",group="",resource="",scope="",subresource="/livez",verb="GET",version=""} 1
261+
apiserver_request_total{client="unknown",code="200",component="",contentType="text/plain; charset=utf-8",dry_run="",group="",resource="",scope="",subresource="/readyz",verb="GET",version=""} 1
262+
`)
263+
if err := testutil.GatherAndCompare(legacyregistry.DefaultGatherer, expected, "apiserver_request_total"); err != nil {
264+
t.Error(err)
265+
}
266+
}
267+
235268
func createGetRequestWithUrl(rawUrlString string) *http.Request {
236269
url, _ := url.Parse(rawUrlString)
237270
return &http.Request{

0 commit comments

Comments
 (0)