@@ -5,103 +5,40 @@ class RateLimitMetrics(BaseMetrics):
55 """Metrics for rate limiting system."""
66
77 def _create_instruments (self ) -> None :
8- # Request metrics
9- self .requests_total = self ._meter .create_counter (
8+ self ._requests = self ._meter .create_counter (
109 name = "rate_limit.requests.total" ,
1110 description = "Total number of rate limit checks" ,
1211 unit = "1" ,
1312 )
14- self .allowed = self ._meter .create_counter (
13+ self ._allowed = self ._meter .create_counter (
1514 name = "rate_limit.allowed.total" ,
1615 description = "Number of allowed requests" ,
1716 unit = "1" ,
1817 )
19- self .rejected = self ._meter .create_counter (
18+ self ._rejected = self ._meter .create_counter (
2019 name = "rate_limit.rejected.total" ,
2120 description = "Number of rejected requests" ,
2221 unit = "1" ,
2322 )
24- self .bypass = self ._meter .create_counter (
23+ self ._bypass = self ._meter .create_counter (
2524 name = "rate_limit.bypass.total" ,
2625 description = "Number of bypassed rate limit checks" ,
2726 unit = "1" ,
2827 )
2928
30- # Performance metrics
31- self .check_duration = self ._meter .create_histogram (
32- name = "rate_limit.check.duration" ,
33- description = "Duration of rate limit checks" ,
34- unit = "ms" ,
35- )
36- self .redis_duration = self ._meter .create_histogram (
37- name = "rate_limit.redis.duration" ,
38- description = "Duration of Redis operations" ,
39- unit = "ms" ,
40- )
41- self .algorithm_duration = self ._meter .create_histogram (
42- name = "rate_limit.algorithm.duration" ,
43- description = "Time to execute rate limit algorithm" ,
44- unit = "ms" ,
45- )
46-
47- # Usage metrics
48- self .remaining = self ._meter .create_histogram (
49- name = "rate_limit.remaining" ,
50- description = "Remaining requests in rate limit window" ,
51- unit = "1" ,
52- )
53- self .quota_usage = self ._meter .create_histogram (
54- name = "rate_limit.quota.usage" ,
55- description = "Percentage of quota used" ,
56- unit = "%" ,
57- )
58- self .window_size = self ._meter .create_histogram (
59- name = "rate_limit.window.size" ,
60- description = "Size of rate limit window" ,
61- unit = "s" ,
62- )
63-
64- # Configuration metrics - using histograms to record absolute values
65- # We record the current value, and Grafana queries the latest
66- self .active_rules = self ._meter .create_histogram (
67- name = "rate_limit.active.rules" ,
68- description = "Number of active rate limit rules" ,
69- unit = "1" ,
70- )
71- self .custom_users = self ._meter .create_histogram (
72- name = "rate_limit.custom.users" ,
73- description = "Number of users with custom rate limits" ,
74- unit = "1" ,
75- )
76- self .bypass_users = self ._meter .create_histogram (
77- name = "rate_limit.bypass.users" ,
78- description = "Number of users with rate limit bypass" ,
79- unit = "1" ,
80- )
29+ def record_request (self , endpoint : str , authenticated : bool , algorithm : str ) -> None :
30+ """Record a rate limit check request."""
31+ attrs = {"endpoint" : endpoint , "authenticated" : str (authenticated ).lower (), "algorithm" : algorithm }
32+ self ._requests .add (1 , attrs )
8133
82- # Token bucket specific metrics
83- self .token_bucket_tokens = self ._meter .create_histogram (
84- name = "rate_limit.token_bucket.tokens" ,
85- description = "Current tokens in token bucket" ,
86- unit = "1" ,
87- )
88- self .token_bucket_refill_rate = self ._meter .create_histogram (
89- name = "rate_limit.token_bucket.refill_rate" ,
90- description = "Token bucket refill rate" ,
91- unit = "tokens/s" ,
92- )
34+ def record_allowed (self , endpoint : str , group : str ) -> None :
35+ """Record an allowed request."""
36+ self ._allowed .add (1 , {"endpoint" : endpoint , "group" : group })
9337
94- # Error metrics
95- self .redis_errors = self ._meter .create_counter (
96- name = "rate_limit.redis.errors.total" ,
97- description = "Number of Redis errors" ,
98- unit = "1" ,
99- )
100- self .config_errors = self ._meter .create_counter (
101- name = "rate_limit.config.errors.total" ,
102- description = "Number of configuration load errors" ,
103- unit = "1" ,
104- )
38+ def record_rejected (self , endpoint : str , group : str ) -> None :
39+ """Record a rejected request."""
40+ self ._rejected .add (1 , {"endpoint" : endpoint , "group" : group })
10541
106- # Authenticated vs anonymous checks can be derived from labels on requests_total
107- # No separate ip/user counters to avoid duplication and complexity.
42+ def record_bypass (self , endpoint : str ) -> None :
43+ """Record a bypassed rate limit check."""
44+ self ._bypass .add (1 , {"endpoint" : endpoint })
0 commit comments