Skip to content

Commit ade95cc

Browse files
committed
UPSTREAM: <carry>: switch to apirequestcount for all resources
1 parent d68f7b4 commit ade95cc

File tree

8 files changed

+367
-307
lines changed

8 files changed

+367
-307
lines changed

openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
)
1515

1616
// NewController returns a controller
17-
func NewController(client apiclientv1.DeprecatedAPIRequestInterface, nodeName string) *controller {
17+
func NewController(client apiclientv1.APIRequestCountInterface, nodeName string) *controller {
1818
ret := &controller{
1919
client: client,
2020
nodeName: nodeName,
@@ -32,7 +32,7 @@ type APIRequestLogger interface {
3232
}
3333

3434
type controller struct {
35-
client apiclientv1.DeprecatedAPIRequestInterface
35+
client apiclientv1.APIRequestCountInterface
3636
nodeName string
3737
updatePeriod time.Duration
3838

openshift-kube-apiserver/filters/deprecatedapirequest/apiaccess_count_controller_test.go

Lines changed: 262 additions & 227 deletions
Large diffs are not rendered by default.

openshift-kube-apiserver/filters/deprecatedapirequest/request_counts.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,21 @@ func (c *clusterRequestCounts) Node(nodeName string) *apiRequestCounts {
3737
return c.nodeToRequestCount[nodeName]
3838
}
3939

40-
func (c *clusterRequestCounts) IncrementRequestCount(node string, resource schema.GroupVersionResource, hour int, user, verb string, count int) {
40+
func (c *clusterRequestCounts) IncrementRequestCount(node string, resource schema.GroupVersionResource, hour int, user, verb string, count int64) {
4141
c.Node(node).IncrementRequestCount(resource, hour, user, verb, count)
4242
}
4343

44+
func (c *clusterRequestCounts) String() string {
45+
c.lock.RLock()
46+
defer c.lock.RUnlock()
47+
48+
mapStrings := []string{}
49+
for _, k := range sets.StringKeySet(c.nodeToRequestCount).List() {
50+
mapStrings = append(mapStrings, fmt.Sprintf("%q: %v", k, c.nodeToRequestCount[k]))
51+
}
52+
return fmt.Sprintf("nodeToRequestCount: {%v}", strings.Join(mapStrings, ", "))
53+
}
54+
4455
type apiRequestCounts struct {
4556
lock sync.RWMutex
4657
nodeName string
@@ -76,7 +87,7 @@ func (c *apiRequestCounts) Add(requestCounts *apiRequestCounts) {
7687
}
7788
}
7889

79-
func (c *apiRequestCounts) IncrementRequestCount(resource schema.GroupVersionResource, hour int, user, verb string, count int) {
90+
func (c *apiRequestCounts) IncrementRequestCount(resource schema.GroupVersionResource, hour int, user, verb string, count int64) {
8091
c.Resource(resource).IncrementRequestCount(hour, user, verb, count)
8192
}
8293

@@ -176,7 +187,7 @@ func (c *resourceRequestCounts) Add(requestCounts *resourceRequestCounts) {
176187
}
177188
}
178189

179-
func (c *resourceRequestCounts) IncrementRequestCount(hour int, user, verb string, count int) {
190+
func (c *resourceRequestCounts) IncrementRequestCount(hour int, user, verb string, count int64) {
180191
c.Hour(hour).IncrementRequestCount(user, verb, count)
181192
}
182193

@@ -250,7 +261,7 @@ func (c *hourlyRequestCounts) Add(requestCounts *hourlyRequestCounts) {
250261
}
251262
}
252263

253-
func (c *hourlyRequestCounts) IncrementRequestCount(user, verb string, count int) {
264+
func (c *hourlyRequestCounts) IncrementRequestCount(user, verb string, count int64) {
254265
c.User(user).IncrementRequestCount(verb, count)
255266
}
256267

@@ -322,7 +333,7 @@ func (c *userRequestCounts) Add(requestCounts *userRequestCounts) {
322333
}
323334
}
324335

325-
func (c *userRequestCounts) IncrementRequestCount(verb string, count int) {
336+
func (c *userRequestCounts) IncrementRequestCount(verb string, count int64) {
326337
c.Verb(verb).IncrementRequestCount(count)
327338
}
328339

@@ -364,19 +375,19 @@ func (c *userRequestCounts) String() string {
364375
}
365376

366377
type verbRequestCount struct {
367-
count uint32
378+
count int64
368379
}
369380

370-
func (c *verbRequestCount) Add(count uint32) {
371-
atomic.AddUint32(&c.count, count)
381+
func (c *verbRequestCount) Add(count int64) {
382+
atomic.AddInt64(&c.count, count)
372383
}
373384

374-
func (c *verbRequestCount) IncrementRequestCount(count int) {
375-
c.Add(uint32(count))
385+
func (c *verbRequestCount) IncrementRequestCount(count int64) {
386+
c.Add(count)
376387
}
377388

378389
func (c *verbRequestCount) Equals(rhs *verbRequestCount) bool {
379-
lhsV := atomic.LoadUint32(&c.count)
380-
rhsV := atomic.LoadUint32(&rhs.count)
390+
lhsV := atomic.LoadInt64(&c.count)
391+
rhsV := atomic.LoadInt64(&rhs.count)
381392
return lhsV == rhsV
382393
}

openshift-kube-apiserver/filters/deprecatedapirequest/request_counts_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestAPIRequestCounts_IncrementRequestCount(t *testing.T) {
2828
ts time.Time
2929
user string
3030
verb string
31-
count int
31+
count int64
3232
}{
3333
{gvr("test.v1.group"), testTime(0, 0), "bob", "get", 1},
3434
{gvr("test.v1.group"), testTime(0, 1), "bob", "list", 2},

openshift-kube-apiserver/filters/deprecatedapirequest/update_func.go

Lines changed: 71 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
// IncrementRequestCounts add additional api request counts to the log.
1616
// countsToPersist must not be mutated
1717
func SetRequestCountsForNode(nodeName string, expiredHour int, countsToPersist *resourceRequestCounts) v1helpers.UpdateStatusFunc {
18-
return func(status *apiv1.DeprecatedAPIRequestStatus) {
18+
return func(status *apiv1.APIRequestCountStatus) {
1919
existingLogsFromAPI := apiStatusToRequestCount(countsToPersist.resource, status)
2020
existingNodeLogFromAPI := existingLogsFromAPI.Node(nodeName)
2121
existingNodeLogFromAPI.ExpireOldestCounts(expiredHour)
@@ -27,108 +27,124 @@ func SetRequestCountsForNode(nodeName string, expiredHour int, countsToPersist *
2727
hourlyRequestLogs := resourceRequestCountToHourlyNodeRequestLog(nodeName, updatedCounts)
2828

2929
newStatus := setRequestCountsForNode(status, nodeName, expiredHour, hourlyRequestLogs)
30-
status.RequestsLast24h = newStatus.RequestsLast24h
31-
status.RequestsLastHour = newStatus.RequestsLastHour
30+
status.Last24h = newStatus.Last24h
31+
status.CurrentHour = newStatus.CurrentHour
32+
status.RemovedInRelease = removedRelease(countsToPersist.resource)
33+
status.RequestCount = newStatus.RequestCount
3234

3335
// TODO remove when we start writing, but I want data tonight.
34-
content, _ := json.MarshalIndent(status.RequestsLastHour, "", " ")
36+
content, _ := json.MarshalIndent(status.CurrentHour, "", " ")
3537
klog.V(2).Infof("updating top %v APIRequest counts with last hour:\n%v", countsToPersist.resource, string(content))
3638
}
3739
}
3840

39-
func setRequestCountsForNode(status *apiv1.DeprecatedAPIRequestStatus, nodeName string, expiredHour int, hourlyNodeRequests []apiv1.NodeRequestLog) *apiv1.DeprecatedAPIRequestStatus {
41+
func setRequestCountsForNode(status *apiv1.APIRequestCountStatus, nodeName string, expiredHour int, hourlyNodeRequests []apiv1.PerNodeAPIRequestLog) *apiv1.APIRequestCountStatus {
4042
newStatus := status.DeepCopy()
41-
newStatus.RequestsLast24h = []apiv1.RequestLog{}
42-
newStatus.RequestsLastHour = apiv1.RequestLog{}
43+
newStatus.Last24h = []apiv1.PerResourceAPIRequestLog{}
44+
newStatus.CurrentHour = apiv1.PerResourceAPIRequestLog{}
4345

4446
for hour, currentNodeCount := range hourlyNodeRequests {
45-
nextHourStatus := apiv1.RequestLog{}
47+
totalRequestThisHour := int64(0)
48+
nextHourStatus := apiv1.PerResourceAPIRequestLog{}
4649
if hour == expiredHour {
47-
newStatus.RequestsLast24h = append(newStatus.RequestsLast24h, nextHourStatus)
50+
newStatus.Last24h = append(newStatus.Last24h, nextHourStatus)
4851
continue
4952
}
50-
if len(status.RequestsLast24h) > hour {
51-
for _, oldNodeStatus := range status.RequestsLast24h[hour].Nodes {
53+
if len(status.Last24h) > hour {
54+
for _, oldNodeStatus := range status.Last24h[hour].ByNode {
5255
if oldNodeStatus.NodeName == nodeName {
5356
continue
5457
}
55-
nextHourStatus.Nodes = append(nextHourStatus.Nodes, *oldNodeStatus.DeepCopy())
58+
totalRequestThisHour += oldNodeStatus.RequestCount
59+
nextHourStatus.ByNode = append(nextHourStatus.ByNode, *oldNodeStatus.DeepCopy())
5660
}
5761
}
58-
nextHourStatus.Nodes = append(nextHourStatus.Nodes, currentNodeCount)
62+
nextHourStatus.ByNode = append(nextHourStatus.ByNode, currentNodeCount)
63+
totalRequestThisHour += currentNodeCount.RequestCount
64+
nextHourStatus.RequestCount = totalRequestThisHour
5965

60-
newStatus.RequestsLast24h = append(newStatus.RequestsLast24h, nextHourStatus)
66+
newStatus.Last24h = append(newStatus.Last24h, nextHourStatus)
6167
}
6268

69+
totalRequestsThisDay := int64(0)
70+
for _, hourCount := range newStatus.Last24h {
71+
totalRequestsThisDay += hourCount.RequestCount
72+
}
73+
newStatus.RequestCount = totalRequestsThisDay
74+
6375
// get all our sorting before copying
6476
canonicalizeStatus(newStatus)
6577
currentHour := time.Now().Hour()
66-
newStatus.RequestsLastHour = newStatus.RequestsLast24h[currentHour]
78+
newStatus.CurrentHour = newStatus.Last24h[currentHour]
6779

6880
return newStatus
6981
}
7082

7183
const numberOfUsersInAPI = 10
7284

7385
// in this function we have exclusive access to resourceRequestCounts, so do the easy map navigation
74-
func resourceRequestCountToHourlyNodeRequestLog(nodeName string, resourceRequestCounts *resourceRequestCounts) []apiv1.NodeRequestLog {
75-
hourlyNodeRequests := []apiv1.NodeRequestLog{}
86+
func resourceRequestCountToHourlyNodeRequestLog(nodeName string, resourceRequestCounts *resourceRequestCounts) []apiv1.PerNodeAPIRequestLog {
87+
hourlyNodeRequests := []apiv1.PerNodeAPIRequestLog{}
7688
for i := 0; i < 24; i++ {
7789
hourlyNodeRequests = append(hourlyNodeRequests,
78-
apiv1.NodeRequestLog{
90+
apiv1.PerNodeAPIRequestLog{
7991
NodeName: nodeName,
80-
Users: nil,
92+
ByUser: nil,
8193
},
8294
)
8395
}
96+
8497
for hour, hourlyCount := range resourceRequestCounts.hourToRequestCount {
98+
totalRequestsThisHour := int64(0)
8599
for user, userCount := range hourlyCount.usersToRequestCounts {
86-
apiUserStatus := apiv1.RequestUser{
87-
UserName: user,
88-
Count: 0,
89-
Requests: nil,
100+
apiUserStatus := apiv1.PerUserAPIRequestCount{
101+
UserName: user,
102+
RequestCount: 0,
103+
ByVerb: nil,
90104
}
91-
totalCount := 0
105+
totalCount := int64(0)
92106
for verb, verbCount := range userCount.verbsToRequestCounts {
93-
totalCount += int(verbCount.count)
94-
apiUserStatus.Requests = append(apiUserStatus.Requests,
95-
apiv1.RequestCount{
96-
Verb: verb,
97-
Count: int(verbCount.count),
107+
totalCount += verbCount.count
108+
apiUserStatus.ByVerb = append(apiUserStatus.ByVerb,
109+
apiv1.PerVerbAPIRequestCount{
110+
Verb: verb,
111+
RequestCount: verbCount.count,
98112
})
99113
}
100-
apiUserStatus.Count = totalCount
114+
apiUserStatus.RequestCount = totalCount
115+
totalRequestsThisHour += totalCount
101116

102117
// the api resource has an interesting property of only keeping the last few. Having a short list makes the sort faster
103-
hasMaxEntries := len(hourlyNodeRequests[hour].Users) >= numberOfUsersInAPI
118+
hasMaxEntries := len(hourlyNodeRequests[hour].ByUser) >= numberOfUsersInAPI
104119
if hasMaxEntries {
105-
currentSmallestCount := hourlyNodeRequests[hour].Users[len(hourlyNodeRequests[hour].Users)-1].Count
106-
if apiUserStatus.Count <= currentSmallestCount {
120+
currentSmallestCount := hourlyNodeRequests[hour].ByUser[len(hourlyNodeRequests[hour].ByUser)-1].RequestCount
121+
if apiUserStatus.RequestCount <= currentSmallestCount {
107122
continue
108123
}
109124
}
110125

111-
hourlyNodeRequests[hour].Users = append(hourlyNodeRequests[hour].Users, apiUserStatus)
112-
sort.Stable(byNumberOfUserRequests(hourlyNodeRequests[hour].Users))
126+
hourlyNodeRequests[hour].ByUser = append(hourlyNodeRequests[hour].ByUser, apiUserStatus)
127+
sort.Stable(byNumberOfUserRequests(hourlyNodeRequests[hour].ByUser))
113128
}
129+
hourlyNodeRequests[hour].RequestCount = totalRequestsThisHour
114130
}
115131

116132
return hourlyNodeRequests
117133
}
118134

119-
func apiStatusToRequestCount(resource schema.GroupVersionResource, status *apiv1.DeprecatedAPIRequestStatus) *clusterRequestCounts {
135+
func apiStatusToRequestCount(resource schema.GroupVersionResource, status *apiv1.APIRequestCountStatus) *clusterRequestCounts {
120136
requestCount := newClusterRequestCounts()
121-
for hour, hourlyCount := range status.RequestsLast24h {
122-
for _, hourlyNodeCount := range hourlyCount.Nodes {
123-
for _, hourNodeUserCount := range hourlyNodeCount.Users {
124-
for _, hourlyNodeUserVerbCount := range hourNodeUserCount.Requests {
137+
for hour, hourlyCount := range status.Last24h {
138+
for _, hourlyNodeCount := range hourlyCount.ByNode {
139+
for _, hourNodeUserCount := range hourlyNodeCount.ByUser {
140+
for _, hourlyNodeUserVerbCount := range hourNodeUserCount.ByVerb {
125141
requestCount.IncrementRequestCount(
126142
hourlyNodeCount.NodeName,
127143
resource,
128144
hour,
129145
hourNodeUserCount.UserName,
130146
hourlyNodeUserVerbCount.Verb,
131-
hourlyNodeUserVerbCount.Count,
147+
hourlyNodeUserVerbCount.RequestCount,
132148
)
133149
}
134150
}
@@ -137,23 +153,23 @@ func apiStatusToRequestCount(resource schema.GroupVersionResource, status *apiv1
137153
return requestCount
138154
}
139155

140-
func canonicalizeStatus(status *apiv1.DeprecatedAPIRequestStatus) {
141-
for hour := range status.RequestsLast24h {
142-
hourlyCount := status.RequestsLast24h[hour]
143-
for j := range hourlyCount.Nodes {
144-
nodeCount := hourlyCount.Nodes[j]
145-
for k := range nodeCount.Users {
146-
userCount := nodeCount.Users[k]
147-
sort.Stable(byVerb(userCount.Requests))
156+
func canonicalizeStatus(status *apiv1.APIRequestCountStatus) {
157+
for hour := range status.Last24h {
158+
hourlyCount := status.Last24h[hour]
159+
for j := range hourlyCount.ByNode {
160+
nodeCount := hourlyCount.ByNode[j]
161+
for k := range nodeCount.ByUser {
162+
userCount := nodeCount.ByUser[k]
163+
sort.Stable(byVerb(userCount.ByVerb))
148164
}
149-
sort.Stable(byNumberOfUserRequests(nodeCount.Users))
165+
sort.Stable(byNumberOfUserRequests(nodeCount.ByUser))
150166
}
151-
sort.Stable(byNode(status.RequestsLast24h[hour].Nodes))
167+
sort.Stable(byNode(status.Last24h[hour].ByNode))
152168
}
153169

154170
}
155171

156-
type byVerb []apiv1.RequestCount
172+
type byVerb []apiv1.PerVerbAPIRequestCount
157173

158174
func (s byVerb) Len() int {
159175
return len(s)
@@ -166,7 +182,7 @@ func (s byVerb) Less(i, j int) bool {
166182
return strings.Compare(s[i].Verb, s[j].Verb) < 0
167183
}
168184

169-
type byNode []apiv1.NodeRequestLog
185+
type byNode []apiv1.PerNodeAPIRequestLog
170186

171187
func (s byNode) Len() int {
172188
return len(s)
@@ -179,7 +195,7 @@ func (s byNode) Less(i, j int) bool {
179195
return strings.Compare(s[i].NodeName, s[j].NodeName) < 0
180196
}
181197

182-
type byNumberOfUserRequests []apiv1.RequestUser
198+
type byNumberOfUserRequests []apiv1.PerUserAPIRequestCount
183199

184200
func (s byNumberOfUserRequests) Len() int {
185201
return len(s)
@@ -189,5 +205,5 @@ func (s byNumberOfUserRequests) Swap(i, j int) {
189205
}
190206

191207
func (s byNumberOfUserRequests) Less(i, j int) bool {
192-
return s[i].Count < s[j].Count
208+
return s[i].RequestCount < s[j].RequestCount
193209
}

openshift-kube-apiserver/filters/deprecatedapirequest/v1helpers/helpers.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,20 @@ import (
1212
"k8s.io/client-go/util/retry"
1313
)
1414

15-
type UpdateStatusFunc func(status *apiv1.DeprecatedAPIRequestStatus)
15+
type UpdateStatusFunc func(status *apiv1.APIRequestCountStatus)
1616

17-
func ApplyStatus(ctx context.Context, client apiclientv1.DeprecatedAPIRequestInterface, name string, updateFuncs ...UpdateStatusFunc) (*apiv1.DeprecatedAPIRequestStatus, bool, error) {
17+
func ApplyStatus(ctx context.Context, client apiclientv1.APIRequestCountInterface, name string, updateFuncs ...UpdateStatusFunc) (*apiv1.APIRequestCountStatus, bool, error) {
1818
updated := false
19-
var updatedStatus *apiv1.DeprecatedAPIRequestStatus
19+
var updatedStatus *apiv1.APIRequestCountStatus
2020
err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
2121
check, err := client.Get(ctx, name, metav1.GetOptions{})
2222
if errors.IsNotFound(err) {
2323
// on a not found, let's create this thing.
24-
requestCount := &apiv1.DeprecatedAPIRequest{
24+
requestCount := &apiv1.APIRequestCount{
2525
ObjectMeta: metav1.ObjectMeta{Name: name},
26-
// TODO fix spec here
27-
Spec: apiv1.DeprecatedAPIRequestSpec{RemovedRelease: "1.1"},
26+
Spec: apiv1.APIRequestCountSpec{
27+
NumberOfUsersToReport: 10,
28+
},
2829
}
2930
check, err = client.Create(ctx, requestCount, metav1.CreateOptions{})
3031
}

openshift-kube-apiserver/filters/deprecatedapirequest_filter.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ func WithDeprecatedApiRequestLogging(handler http.Handler, controller deprecated
1717
if !ok {
1818
return
1919
}
20-
if !controller.IsDeprecated(info.Resource, info.APIVersion, info.APIGroup) {
21-
return
22-
}
2320
timestamp, ok := request.ReceivedTimestampFrom(req.Context())
2421
if !ok {
2522
return

openshift-kube-apiserver/openshiftkubeapiserver/patch.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func OpenShiftKubeAPIServerConfigPatch(genericConfig *genericapiserver.Config, k
8181
if err != nil {
8282
return err
8383
}
84-
deprecatedAPIRequestController := deprecatedapirequest.NewController(deprecatedAPIClient.DeprecatedAPIRequests(), nodeFor())
84+
deprecatedAPIRequestController := deprecatedapirequest.NewController(deprecatedAPIClient.APIRequestCounts(), nodeFor())
8585
genericConfig.AddPostStartHook("openshift.io-deprecated-api-requests-filter", func(context genericapiserver.PostStartHookContext) error {
8686
go deprecatedAPIRequestController.Start(context.StopCh)
8787
return nil

0 commit comments

Comments
 (0)