2020"""
2121
2222import abc
23- from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitRequest
24- from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitResponse
25- from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitResponseCode
26- from envoy_data_plane .envoy .extensions .common .ratelimit .v3 import RateLimitDescriptor
27- from envoy_data_plane .envoy .extensions .common .ratelimit .v3 import RateLimitDescriptorEntry
2823import logging
29- import time
3024import threading
31- import random
25+ import time
3226from typing import Dict
3327from typing import List
28+
3429import grpc
35- import time
30+ from envoy_data_plane .envoy .extensions .common .ratelimit .v3 import RateLimitDescriptor
31+ from envoy_data_plane .envoy .extensions .common .ratelimit .v3 import RateLimitDescriptorEntry
32+ from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitRequest
33+ from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitResponse
34+ from envoy_data_plane .envoy .service .ratelimit .v3 import RateLimitResponseCode
35+
3636from apache_beam .io .components import adaptive_throttler
3737from apache_beam .metrics import Metrics
3838
4141_MAX_CONNECTION_RETRIES = 5
4242_RETRY_DELAY_SECONDS = 10
4343
44+
4445class RateLimiter (abc .ABC ):
4546 """Abstract base class for RateLimiters."""
4647 def __init__ (self , namespace : str = "" ):
4748 # Metrics collected from the RateLimiter
4849 # Metric updates are thread safe
4950 self .throttling_signaler = adaptive_throttler .ThrottlingSignaler (
5051 namespace = namespace )
51- self .requests_counter = Metrics .counter (namespace , 'envoyRatelimitRequestsTotal' )
52- self .requests_allowed = Metrics .counter (namespace , 'envoyRatelimitRequestsAllowed' )
53- self .requests_throttled = Metrics .counter (namespace , 'envoyRatelimitRequestsThrottled' )
52+ self .requests_counter = Metrics .counter (
53+ namespace , 'envoyRatelimitRequestsTotal' )
54+ self .requests_allowed = Metrics .counter (
55+ namespace , 'envoyRatelimitRequestsAllowed' )
56+ self .requests_throttled = Metrics .counter (
57+ namespace , 'envoyRatelimitRequestsThrottled' )
5458 self .rpc_errors = Metrics .counter (namespace , 'envoyRatelimitRpcErrors' )
5559 self .rpc_retries = Metrics .counter (namespace , 'envoyRatelimitRpcRetries' )
56- self .rpc_latency = Metrics .distribution (namespace , 'envoyRatelimitRpcLatencyMs' )
60+ self .rpc_latency = Metrics .distribution (
61+ namespace , 'envoyRatelimitRpcLatencyMs' )
5762
5863 @abc .abstractmethod
5964 def throttle (self , ** kwargs ) -> bool :
@@ -69,7 +74,6 @@ def throttle(self, **kwargs) -> bool:
6974 Exception: If an underlying infrastructure error occurs (e.g. RPC failure).
7075 """
7176 pass
72-
7377
7478
7579class EnvoyRateLimiter (RateLimiter ):
@@ -99,7 +103,7 @@ def __init__(
99103 throttling is occurring.
100104 """
101105 super ().__init__ (namespace = namespace )
102-
106+
103107 self .service_address = service_address
104108 self .domain = domain
105109 self .descriptors = descriptors
@@ -154,9 +158,10 @@ def throttle(self, hits_added: int = 1) -> bool:
154158 entries .append (RateLimitDescriptorEntry (key = k , value = v ))
155159 proto_descriptors .append (RateLimitDescriptor (entries = entries ))
156160
157-
158161 request = RateLimitRequest (
159- domain = self .domain , descriptors = proto_descriptors , hits_addend = hits_added )
162+ domain = self .domain ,
163+ descriptors = proto_descriptors ,
164+ hits_addend = hits_added )
160165
161166 self .requests_counter .inc ()
162167 attempt = 0
@@ -199,7 +204,7 @@ def throttle(self, hits_added: int = 1) -> bool:
199204 val = dur .total_seconds ()
200205 if val > sleep_s :
201206 sleep_s = val
202-
207+
203208 _LOGGER .warning ("Throttled for %s seconds" , sleep_s )
204209 # signal throttled time to backend
205210 self .throttling_signaler .signal_throttled (int (sleep_s ))
0 commit comments