@@ -174,51 +174,31 @@ func (f *Frontend) ExceedsLimits(ctx context.Context, req *logproto.ExceedsLimit
174
174
175
175
var (
176
176
activeStreamsTotal uint64
177
- tenantRateBytes float64
177
+ rateTotal float64
178
178
)
179
179
// Sum the number of active streams and rates of all responses.
180
180
for _ , resp := range resps {
181
181
activeStreamsTotal += resp .Response .ActiveStreams
182
- tenantRateBytes += float64 (resp .Response .Rate )
182
+ rateTotal += float64 (resp .Response .Rate )
183
183
}
184
-
185
184
f .metrics .tenantActiveStreams .WithLabelValues (req .Tenant ).Set (float64 (activeStreamsTotal ))
186
185
187
- // Take the intersection of unknown streams from all responses by counting
188
- // the number of occurrences. If the number of occurrences matches the
189
- // number of responses, we know the stream was unknown to all instances.
190
- unknownStreams := make (map [uint64 ]int )
191
- for _ , resp := range resps {
192
- for _ , unknownStream := range resp .Response .UnknownStreams {
193
- unknownStreams [unknownStream ]++
194
- }
195
- }
196
-
197
- tenantRateLimit := f .rateLimiter .Limit (time .Now (), req .Tenant )
198
- if tenantRateBytes > tenantRateLimit {
199
- rateLimitedStreams := make ([]* logproto.RejectedStream , 0 , len (streamHashes ))
200
- // Rate limit would be exceeded, all streams must be rejected.
201
- for _ , streamHash := range streamHashes {
202
- rateLimitedStreams = append (rateLimitedStreams , & logproto.RejectedStream {
203
- StreamHash : streamHash ,
204
- Reason : ReasonExceedsRateLimit ,
205
- })
206
- }
207
-
208
- // Count rejections by reason
209
- f .metrics .tenantExceedsLimits .WithLabelValues (req .Tenant ).Inc ()
210
- f .metrics .tenantRejectedStreams .WithLabelValues (req .Tenant , ReasonExceedsRateLimit ).Add (float64 (len (rateLimitedStreams )))
211
-
212
- return & logproto.ExceedsLimitsResponse {
213
- Tenant : req .Tenant ,
214
- RejectedStreams : rateLimitedStreams ,
215
- }, nil
216
- }
217
-
186
+ // A slice containing the rejected streams returned to the caller.
187
+ // If len(rejectedStreams) == 0 then the request does not exceed limits.
218
188
var rejectedStreams []* logproto.RejectedStream
189
+
219
190
// Check if max streams limit would be exceeded.
220
191
maxGlobalStreams := f .limits .MaxGlobalStreamsPerUser (req .Tenant )
221
192
if activeStreamsTotal >= uint64 (maxGlobalStreams ) {
193
+ // Take the intersection of unknown streams from all responses by counting
194
+ // the number of occurrences. If the number of occurrences matches the
195
+ // number of responses, we know the stream was unknown to all instances.
196
+ unknownStreams := make (map [uint64 ]int )
197
+ for _ , resp := range resps {
198
+ for _ , unknownStream := range resp .Response .UnknownStreams {
199
+ unknownStreams [unknownStream ]++
200
+ }
201
+ }
222
202
for _ , resp := range resps {
223
203
for _ , unknownStream := range resp .Response .UnknownStreams {
224
204
// If the stream is unknown to all instances, it must be a new
@@ -232,21 +212,29 @@ func (f *Frontend) ExceedsLimits(ctx context.Context, req *logproto.ExceedsLimit
232
212
}
233
213
}
234
214
}
215
+ f .metrics .tenantRejectedStreams .WithLabelValues (
216
+ req .Tenant ,
217
+ ReasonExceedsMaxStreams ,
218
+ ).Add (float64 (len (rejectedStreams )))
235
219
236
- if len ( rejectedStreams ) > 0 {
237
- f . metrics . tenantExceedsLimits . WithLabelValues ( req .Tenant ). Inc ( )
238
-
239
- // Count rejections by reason
240
- exceedsLimitCount := 0
241
- for _ , rejected := range rejectedStreams {
242
- if rejected . Reason == ReasonExceedsMaxStreams {
243
- exceedsLimitCount ++
244
- }
220
+ // Check if rate limits would be exceeded.
221
+ tenantRateLimit := f . rateLimiter . Limit ( time . Now (), req .Tenant )
222
+ if rateTotal > tenantRateLimit {
223
+ // Rate limit would be exceeded, all streams must be rejected.
224
+ for _ , streamHash := range streamHashes {
225
+ rejectedStreams = append ( rejectedStreams , & logproto. RejectedStream {
226
+ StreamHash : streamHash ,
227
+ Reason : ReasonExceedsRateLimit ,
228
+ })
245
229
}
230
+ f .metrics .tenantRejectedStreams .WithLabelValues (
231
+ req .Tenant ,
232
+ ReasonExceedsRateLimit ,
233
+ ).Add (float64 (len (streamHashes )))
234
+ }
246
235
247
- if exceedsLimitCount > 0 {
248
- f .metrics .tenantRejectedStreams .WithLabelValues (req .Tenant , ReasonExceedsMaxStreams ).Add (float64 (exceedsLimitCount ))
249
- }
236
+ if len (rejectedStreams ) > 0 {
237
+ f .metrics .tenantExceedsLimits .WithLabelValues (req .Tenant ).Inc ()
250
238
}
251
239
252
240
return & logproto.ExceedsLimitsResponse {
0 commit comments