mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Merge pull request #83598 from jktomer/healthz-metrics
healthz: instrument root healthz requests for metrics
This commit is contained in:
		@@ -12,6 +12,9 @@ go_test(
 | 
			
		||||
    embed = [":go_default_library"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -26,6 +29,7 @@ go_library(
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library",
 | 
			
		||||
        "//vendor/k8s.io/klog:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
			
		||||
	"k8s.io/apiserver/pkg/endpoints/metrics"
 | 
			
		||||
	"k8s.io/apiserver/pkg/server/httplog"
 | 
			
		||||
	"k8s.io/klog"
 | 
			
		||||
)
 | 
			
		||||
@@ -122,7 +123,15 @@ func InstallPathHandler(mux mux, path string, checks ...HealthChecker) {
 | 
			
		||||
 | 
			
		||||
	klog.V(5).Infof("Installing health checkers for (%v): %v", path, formatQuoted(checkerNames(checks...)...))
 | 
			
		||||
 | 
			
		||||
	mux.Handle(path, handleRootHealthz(checks...))
 | 
			
		||||
	mux.Handle(path,
 | 
			
		||||
		metrics.InstrumentHandlerFunc("GET",
 | 
			
		||||
			/* group = */ "",
 | 
			
		||||
			/* version = */ "",
 | 
			
		||||
			/* resource = */ "",
 | 
			
		||||
			/* subresource = */ path,
 | 
			
		||||
			/* scope = */ "",
 | 
			
		||||
			/* component = */ "",
 | 
			
		||||
			handleRootHealthz(checks...)))
 | 
			
		||||
	for _, check := range checks {
 | 
			
		||||
		mux.Handle(fmt.Sprintf("%s/%v", path, check.Name()), adaptCheckToHandler(check.Check))
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,9 +23,13 @@ import (
 | 
			
		||||
	"net/http/httptest"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/sets"
 | 
			
		||||
	"k8s.io/apiserver/pkg/endpoints/metrics"
 | 
			
		||||
	"k8s.io/component-base/metrics/legacyregistry"
 | 
			
		||||
	"k8s.io/component-base/metrics/testutil"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestInstallHandler(t *testing.T) {
 | 
			
		||||
@@ -232,6 +236,35 @@ func TestGetExcludedChecks(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMetrics(t *testing.T) {
 | 
			
		||||
	mux := http.NewServeMux()
 | 
			
		||||
	InstallHandler(mux)
 | 
			
		||||
	InstallLivezHandler(mux)
 | 
			
		||||
	InstallReadyzHandler(mux)
 | 
			
		||||
	metrics.Register()
 | 
			
		||||
	metrics.Reset()
 | 
			
		||||
 | 
			
		||||
	paths := []string{"/healthz", "/livez", "/readyz"}
 | 
			
		||||
	for _, path := range paths {
 | 
			
		||||
		req, err := http.NewRequest("GET", fmt.Sprintf("http://example.com%s", path), nil)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("%v", err)
 | 
			
		||||
		}
 | 
			
		||||
		mux.ServeHTTP(httptest.NewRecorder(), req)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	expected := strings.NewReader(`
 | 
			
		||||
        # 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.
 | 
			
		||||
        # TYPE apiserver_request_total counter
 | 
			
		||||
        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
 | 
			
		||||
        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
 | 
			
		||||
        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
 | 
			
		||||
`)
 | 
			
		||||
	if err := testutil.GatherAndCompare(legacyregistry.DefaultGatherer, expected, "apiserver_request_total"); err != nil {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createGetRequestWithUrl(rawUrlString string) *http.Request {
 | 
			
		||||
	url, _ := url.Parse(rawUrlString)
 | 
			
		||||
	return &http.Request{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user