@@ -15,7 +15,7 @@ import (
15
15
// IncrementRequestCounts add additional api request counts to the log.
16
16
// countsToPersist must not be mutated
17
17
func SetRequestCountsForNode (nodeName string , expiredHour int , countsToPersist * resourceRequestCounts ) v1helpers.UpdateStatusFunc {
18
- return func (status * apiv1.DeprecatedAPIRequestStatus ) {
18
+ return func (status * apiv1.APIRequestCountStatus ) {
19
19
existingLogsFromAPI := apiStatusToRequestCount (countsToPersist .resource , status )
20
20
existingNodeLogFromAPI := existingLogsFromAPI .Node (nodeName )
21
21
existingNodeLogFromAPI .ExpireOldestCounts (expiredHour )
@@ -27,108 +27,124 @@ func SetRequestCountsForNode(nodeName string, expiredHour int, countsToPersist *
27
27
hourlyRequestLogs := resourceRequestCountToHourlyNodeRequestLog (nodeName , updatedCounts )
28
28
29
29
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
32
34
33
35
// TODO remove when we start writing, but I want data tonight.
34
- content , _ := json .MarshalIndent (status .RequestsLastHour , "" , " " )
36
+ content , _ := json .MarshalIndent (status .CurrentHour , "" , " " )
35
37
klog .V (2 ).Infof ("updating top %v APIRequest counts with last hour:\n %v" , countsToPersist .resource , string (content ))
36
38
}
37
39
}
38
40
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 {
40
42
newStatus := status .DeepCopy ()
41
- newStatus .RequestsLast24h = []apiv1.RequestLog {}
42
- newStatus .RequestsLastHour = apiv1.RequestLog {}
43
+ newStatus .Last24h = []apiv1.PerResourceAPIRequestLog {}
44
+ newStatus .CurrentHour = apiv1.PerResourceAPIRequestLog {}
43
45
44
46
for hour , currentNodeCount := range hourlyNodeRequests {
45
- nextHourStatus := apiv1.RequestLog {}
47
+ totalRequestThisHour := int64 (0 )
48
+ nextHourStatus := apiv1.PerResourceAPIRequestLog {}
46
49
if hour == expiredHour {
47
- newStatus .RequestsLast24h = append (newStatus .RequestsLast24h , nextHourStatus )
50
+ newStatus .Last24h = append (newStatus .Last24h , nextHourStatus )
48
51
continue
49
52
}
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 {
52
55
if oldNodeStatus .NodeName == nodeName {
53
56
continue
54
57
}
55
- nextHourStatus .Nodes = append (nextHourStatus .Nodes , * oldNodeStatus .DeepCopy ())
58
+ totalRequestThisHour += oldNodeStatus .RequestCount
59
+ nextHourStatus .ByNode = append (nextHourStatus .ByNode , * oldNodeStatus .DeepCopy ())
56
60
}
57
61
}
58
- nextHourStatus .Nodes = append (nextHourStatus .Nodes , currentNodeCount )
62
+ nextHourStatus .ByNode = append (nextHourStatus .ByNode , currentNodeCount )
63
+ totalRequestThisHour += currentNodeCount .RequestCount
64
+ nextHourStatus .RequestCount = totalRequestThisHour
59
65
60
- newStatus .RequestsLast24h = append (newStatus .RequestsLast24h , nextHourStatus )
66
+ newStatus .Last24h = append (newStatus .Last24h , nextHourStatus )
61
67
}
62
68
69
+ totalRequestsThisDay := int64 (0 )
70
+ for _ , hourCount := range newStatus .Last24h {
71
+ totalRequestsThisDay += hourCount .RequestCount
72
+ }
73
+ newStatus .RequestCount = totalRequestsThisDay
74
+
63
75
// get all our sorting before copying
64
76
canonicalizeStatus (newStatus )
65
77
currentHour := time .Now ().Hour ()
66
- newStatus .RequestsLastHour = newStatus .RequestsLast24h [currentHour ]
78
+ newStatus .CurrentHour = newStatus .Last24h [currentHour ]
67
79
68
80
return newStatus
69
81
}
70
82
71
83
const numberOfUsersInAPI = 10
72
84
73
85
// 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 {}
76
88
for i := 0 ; i < 24 ; i ++ {
77
89
hourlyNodeRequests = append (hourlyNodeRequests ,
78
- apiv1.NodeRequestLog {
90
+ apiv1.PerNodeAPIRequestLog {
79
91
NodeName : nodeName ,
80
- Users : nil ,
92
+ ByUser : nil ,
81
93
},
82
94
)
83
95
}
96
+
84
97
for hour , hourlyCount := range resourceRequestCounts .hourToRequestCount {
98
+ totalRequestsThisHour := int64 (0 )
85
99
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 ,
90
104
}
91
- totalCount := 0
105
+ totalCount := int64 ( 0 )
92
106
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 ,
98
112
})
99
113
}
100
- apiUserStatus .Count = totalCount
114
+ apiUserStatus .RequestCount = totalCount
115
+ totalRequestsThisHour += totalCount
101
116
102
117
// 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
104
119
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 {
107
122
continue
108
123
}
109
124
}
110
125
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 ))
113
128
}
129
+ hourlyNodeRequests [hour ].RequestCount = totalRequestsThisHour
114
130
}
115
131
116
132
return hourlyNodeRequests
117
133
}
118
134
119
- func apiStatusToRequestCount (resource schema.GroupVersionResource , status * apiv1.DeprecatedAPIRequestStatus ) * clusterRequestCounts {
135
+ func apiStatusToRequestCount (resource schema.GroupVersionResource , status * apiv1.APIRequestCountStatus ) * clusterRequestCounts {
120
136
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 {
125
141
requestCount .IncrementRequestCount (
126
142
hourlyNodeCount .NodeName ,
127
143
resource ,
128
144
hour ,
129
145
hourNodeUserCount .UserName ,
130
146
hourlyNodeUserVerbCount .Verb ,
131
- hourlyNodeUserVerbCount .Count ,
147
+ hourlyNodeUserVerbCount .RequestCount ,
132
148
)
133
149
}
134
150
}
@@ -137,23 +153,23 @@ func apiStatusToRequestCount(resource schema.GroupVersionResource, status *apiv1
137
153
return requestCount
138
154
}
139
155
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 ))
148
164
}
149
- sort .Stable (byNumberOfUserRequests (nodeCount .Users ))
165
+ sort .Stable (byNumberOfUserRequests (nodeCount .ByUser ))
150
166
}
151
- sort .Stable (byNode (status .RequestsLast24h [hour ].Nodes ))
167
+ sort .Stable (byNode (status .Last24h [hour ].ByNode ))
152
168
}
153
169
154
170
}
155
171
156
- type byVerb []apiv1.RequestCount
172
+ type byVerb []apiv1.PerVerbAPIRequestCount
157
173
158
174
func (s byVerb ) Len () int {
159
175
return len (s )
@@ -166,7 +182,7 @@ func (s byVerb) Less(i, j int) bool {
166
182
return strings .Compare (s [i ].Verb , s [j ].Verb ) < 0
167
183
}
168
184
169
- type byNode []apiv1.NodeRequestLog
185
+ type byNode []apiv1.PerNodeAPIRequestLog
170
186
171
187
func (s byNode ) Len () int {
172
188
return len (s )
@@ -179,7 +195,7 @@ func (s byNode) Less(i, j int) bool {
179
195
return strings .Compare (s [i ].NodeName , s [j ].NodeName ) < 0
180
196
}
181
197
182
- type byNumberOfUserRequests []apiv1.RequestUser
198
+ type byNumberOfUserRequests []apiv1.PerUserAPIRequestCount
183
199
184
200
func (s byNumberOfUserRequests ) Len () int {
185
201
return len (s )
@@ -189,5 +205,5 @@ func (s byNumberOfUserRequests) Swap(i, j int) {
189
205
}
190
206
191
207
func (s byNumberOfUserRequests ) Less (i , j int ) bool {
192
- return s [i ].Count < s [j ].Count
208
+ return s [i ].RequestCount < s [j ].RequestCount
193
209
}
0 commit comments