Skip to content

Commit

Permalink
Merge pull request #116622 from Jefftree/add-metrics-openapiv3
Browse files Browse the repository at this point in the history
Add additional metrics for OpenAPI V3

Kubernetes-commit: f0ec1eccb28bbded5f8c659134c500445cd7c4e5
  • Loading branch information
k8s-publishing-bot committed Mar 15, 2023
2 parents a6998cf + 336c431 commit cfeb29d
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 17 deletions.
14 changes: 7 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ require (
golang.org/x/net v0.8.0
k8s.io/api v0.0.0-20230315055831-abe66f57fdb1
k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38
k8s.io/apiserver v0.0.0-20230315073553-6fb7281a6b4e
k8s.io/client-go v0.0.0-20230315061845-84ae514115bd
k8s.io/apiserver v0.0.0-20230315073602-05d2078e680a
k8s.io/client-go v0.0.0-20230315061912-38589731da69
k8s.io/code-generator v0.0.0-20230315053024-8fead9f64de8
k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0
k8s.io/klog/v2 v2.90.1
Expand Down Expand Up @@ -103,18 +103,18 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect
k8s.io/kms v0.0.0-20230315071534-1cd5a2e8b457 // indirect
k8s.io/kms v0.0.0-20230315071547-f5c193c64781 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.1 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)

replace (
k8s.io/api => k8s.io/api v0.0.0-20230315055831-abe66f57fdb1
k8s.io/api => k8s.io/api v0.0.0-20230315032826-0b4c449988b1
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38
k8s.io/apiserver => k8s.io/apiserver v0.0.0-20230315073553-6fb7281a6b4e
k8s.io/client-go => k8s.io/client-go v0.0.0-20230315061845-84ae514115bd
k8s.io/apiserver => k8s.io/apiserver v0.0.0-20230315073602-05d2078e680a
k8s.io/client-go => k8s.io/client-go v0.0.0-20230315061912-38589731da69
k8s.io/code-generator => k8s.io/code-generator v0.0.0-20230315053024-8fead9f64de8
k8s.io/component-base => k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0
k8s.io/kms => k8s.io/kms v0.0.0-20230315071534-1cd5a2e8b457
k8s.io/kms => k8s.io/kms v0.0.0-20230315071547-f5c193c64781
)
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -716,14 +716,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
k8s.io/api v0.0.0-20230315055831-abe66f57fdb1 h1:XQ9kk+GySLR6UE0w0oqxpzP5QrcsELjK2R7rD7hnWsI=
k8s.io/api v0.0.0-20230315055831-abe66f57fdb1/go.mod h1:aZ6MBt4NMLXSxkSKFkoDaP4hTutnZIvH5dCSpOis9g4=
k8s.io/api v0.0.0-20230315032826-0b4c449988b1 h1:wlCdY1kqV0RkfnfRr4mEZ3fGJ1VvLelr5Q2vCnCICIo=
k8s.io/api v0.0.0-20230315032826-0b4c449988b1/go.mod h1:aZ6MBt4NMLXSxkSKFkoDaP4hTutnZIvH5dCSpOis9g4=
k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38 h1:n1qDRCTPAXwyXYg7eSpWDO9FdW79lwAQ9dAr1vETpn4=
k8s.io/apimachinery v0.0.0-20230315054728-8d1258da8f38/go.mod h1:5ikh59fK3AJ287GUvpUsryoMFtH9zj/ARfWCo3AyXTM=
k8s.io/apiserver v0.0.0-20230315073553-6fb7281a6b4e h1:kTLHqdkqQxINH2oGafdnEyCkNk3ZJsvvRoH0JrLwccA=
k8s.io/apiserver v0.0.0-20230315073553-6fb7281a6b4e/go.mod h1:zAYatvCnOC4rwLBV2btewYbbRGpUwo61/7Qd6ltMDOo=
k8s.io/client-go v0.0.0-20230315061845-84ae514115bd h1:dilBefJQ4PnyI4xt/dH3EUQfGx5+tjwQMWL92ICsKoQ=
k8s.io/client-go v0.0.0-20230315061845-84ae514115bd/go.mod h1:Np+Pk6S0Rgul2HDFTuxJLmr5pdZNE9rDxwdzBoxpOF4=
k8s.io/apiserver v0.0.0-20230315073602-05d2078e680a h1:afcOudl9GRBJEUhQwdrNLH7ANDRM8PG29Ua4mp6SPgw=
k8s.io/apiserver v0.0.0-20230315073602-05d2078e680a/go.mod h1:fPZ8XN2AIpVVqcRAVVeJkcH5udJbU86i9VmTf68hUJo=
k8s.io/client-go v0.0.0-20230315061912-38589731da69 h1:LnTXY9Akksk/aAmbebKIaC0doqk1aKbZQA3OoAd0BB0=
k8s.io/client-go v0.0.0-20230315061912-38589731da69/go.mod h1:b0alWGtfu+BI7XZwwdOHJIsr7aDjKf3ANThw8Sr+tw8=
k8s.io/code-generator v0.0.0-20230315053024-8fead9f64de8 h1:abwWEXGDfIhE8v3zs0nSO11/ec+uYCftqHkArBqozaU=
k8s.io/code-generator v0.0.0-20230315053024-8fead9f64de8/go.mod h1:iWtpm0ZMG6Gc4daWfITDSIu+WFhFJArYDhj242zcbnY=
k8s.io/component-base v0.0.0-20230315065615-6b9bb8ecc3d0 h1:IjneP02MOB07PIP9+PQjKrOIZEZ5T7umR+GIZkU4h0U=
Expand All @@ -733,8 +733,8 @@ k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kms v0.0.0-20230315071534-1cd5a2e8b457 h1:o7CT9gfjXIcokhNJm1yawSi7V8f19JIr+CjrvdpYfHU=
k8s.io/kms v0.0.0-20230315071534-1cd5a2e8b457/go.mod h1:BpyIA33GjwNSzo+S61DG/HWYw2XVgP9bDjyqaxNOODc=
k8s.io/kms v0.0.0-20230315071547-f5c193c64781 h1:LH9Z43UgXQkuRc1ImiT3F3LoOfj9Xz0r1BP94+uYpys=
k8s.io/kms v0.0.0-20230315071547-f5c193c64781/go.mod h1:9rk1ftD6YM/h1KCjaoIZ8lv1CYvaCcuo57ZIWqiHHGI=
k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a h1:gmovKNur38vgoWfGtP5QOGNOA7ki4n6qNYoFAgMlNvg=
k8s.io/kube-openapi v0.0.0-20230308215209-15aac26d736a/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
Expand Down
23 changes: 21 additions & 2 deletions pkg/controllers/openapiv3/aggregator/aggregator.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"sync"
"time"

"k8s.io/apiserver/pkg/endpoints/metrics"
"k8s.io/apiserver/pkg/server"
"k8s.io/apiserver/pkg/server/mux"
"k8s.io/klog/v2"
Expand Down Expand Up @@ -268,6 +269,24 @@ func (s *specProxier) handleGroupVersion(w http.ResponseWriter, r *http.Request)

// Register registers the OpenAPI V3 Discovery and GroupVersion handlers
func (s *specProxier) register(handler common.PathHandlerByGroupVersion) {
handler.Handle("/openapi/v3", http.HandlerFunc(s.handleDiscovery))
handler.HandlePrefix("/openapi/v3/", http.HandlerFunc(s.handleGroupVersion))
handler.Handle("/openapi/v3", metrics.InstrumentHandlerFunc("GET",
/* group = */ "",
/* version = */ "",
/* resource = */ "",
/* subresource = */ "openapi/v3",
/* scope = */ "",
/* component = */ "",
/* deprecated */ false,
/* removedRelease */ "",
http.HandlerFunc(s.handleDiscovery)))
handler.HandlePrefix("/openapi/v3/", metrics.InstrumentHandlerFunc("GET",
/* group = */ "",
/* version = */ "",
/* resource = */ "",
/* subresource = */ "openapi/v3/",
/* scope = */ "",
/* component = */ "",
/* deprecated */ false,
/* removedRelease */ "",
http.HandlerFunc(s.handleGroupVersion)))
}
64 changes: 64 additions & 0 deletions pkg/controllers/openapiv3/aggregator/aggregator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,16 @@ import (
"bytes"
"encoding/json"
"net/http"
"strings"
"testing"

"github.com/stretchr/testify/assert"

"k8s.io/apiserver/pkg/endpoints/metrics"
genericapiserver "k8s.io/apiserver/pkg/server"
"k8s.io/apiserver/pkg/server/mux"
"k8s.io/component-base/metrics/legacyregistry"
"k8s.io/component-base/metrics/testutil"
v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
"k8s.io/kube-openapi/pkg/handler3"
)
Expand Down Expand Up @@ -166,6 +170,66 @@ func TestV3APIService(t *testing.T) {
assert.ElementsMatch(t, []string{openAPIV2Converter, apiService.Name}, apiServiceNames)
}

func TestOpenAPIRequestMetrics(t *testing.T) {
metrics.Register()
metrics.Reset()

downloader := Downloader{}

pathHandler := mux.NewPathRecorderMux("aggregator_metrics_test")
var serveHandler http.Handler = pathHandler
specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), pathHandler)
if err != nil {
t.Error(err)
}
specJSON := []byte(`{"openapi":"3.0.0","info":{"title":"Kubernetes","version":"unversioned"}}`)
handler := testV3APIService{
etag: "6E8F849B434D4B98A569B9D7718876E9-356ECAB19D7FBE1336BABB1E70F8F3025050DE218BE78256BE81620681CFC9A268508E542B8B55974E17B2184BBFC8FFFAA577E51BE195D32B3CA2547818ABE4",
data: specJSON,
}
apiService := &v1.APIService{
Spec: v1.APIServiceSpec{
Group: "group.example.com",
Version: "v1",
},
}
apiService.Name = "v1.group.example.com"
specProxier.AddUpdateAPIService(handler, apiService)
specProxier.UpdateAPIServiceSpec("v1.group.example.com")

data := sendReq(t, serveHandler, "/openapi/v3")
groupVersionList := handler3.OpenAPIV3Discovery{}
if err := json.Unmarshal(data, &groupVersionList); err != nil {
t.Fatal(err)
}
_, ok := groupVersionList.Paths["apis/group.example.com/v1"]
if !ok {
t.Error("Expected group.example.com/v1 to be in group version list")
}

// Metrics should be updated after requesting the root document.
if err := testutil.GatherAndCompare(legacyregistry.DefaultGatherer, strings.NewReader(`
# HELP apiserver_request_total [STABLE] Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, and HTTP response code.
# TYPE apiserver_request_total counter
apiserver_request_total{code="200",component="",dry_run="",group="",resource="",scope="",subresource="openapi/v3",verb="GET",version=""} 1
`), "apiserver_request_total"); err != nil {
t.Fatal(err)
}

_ = sendReq(t, serveHandler, "/openapi/v3/apis/group.example.com/v1")

// Metrics should be updated after requesting OpenAPI for a group version.
if err := testutil.GatherAndCompare(legacyregistry.DefaultGatherer, strings.NewReader(`
# HELP apiserver_request_total [STABLE] Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, and HTTP response code.
# TYPE apiserver_request_total counter
apiserver_request_total{code="200",component="",dry_run="",group="",resource="",scope="",subresource="openapi/v3",verb="GET",version=""} 1
apiserver_request_total{code="200",component="",dry_run="",group="",resource="",scope="",subresource="openapi/v3/",verb="GET",version=""} 1
`), "apiserver_request_total"); err != nil {
t.Fatal(err)
}

}

func sendReq(t *testing.T, handler http.Handler, path string) []byte {
req, err := http.NewRequest("GET", path, nil)
if err != nil {
Expand Down

0 comments on commit cfeb29d

Please sign in to comment.