Skip to content

Retriving RateLimiterStatistics from PartitionedRateLimiter without providing a resource #59899

Open
@tnuanchuay

Description

Background and Motivation

Currently, retrieving RateLimitStatistics from a PartitionedRateLimiter requires specifying the resource for which the statistics are needed. This parameter is used to identify the appropriate rate limiter associated with those resources. However, in certain use cases, it may be desirable to retrieve the statistics for all rate limiters managed by the PartitionedRateLimiter.

Proposed API

namespace System.Threading.RateLimiting;

public abstract class PartitionedRateLimiter<TResource> : IAsyncDisposable, IDisposable
{
+    public abstract RateLimiterStatistics[] GetStatistics();
}

Usage Examples

public class RateLimiterHealthCheck : BackgroundService {
   private readonly PartitionedRateLimiter<HttpContext> _partitionedRateLimiter
   public RateLimiterHealthCheck(PartitionedRateLimiter<HttpContext> partitionedRateLimiter){
      _partitionedRateLimiter = partitionedRateLimiter
   }

   protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
      while(!stoppingToken.IsCancellationRequested) {
         foreach(var stats in _partitionedRateLimiter.GetStatistics()){
            //Sending measurement
            MeasurementSender.Send(stats)
         }
      }
   }
}

Alternative Designs

We attempted to retrieve metrics from metric Microsoft.AspNetCore.RateLimiting, but found that the provided data is aggregated, which may not satisfy scenarios requiring more detailed or per-partition insights.

Risks

There is a possibility of encountering race conditions when accessing the dictionary that holds rate limiter instances.

Metadata

Assignees

No one assigned

    Labels

    api-suggestionEarly API idea and discussion, it is NOT ready for implementationarea-middlewareIncludes: URL rewrite, redirect, response cache/compression, session, and other general middlesware

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions