Add metrics to track rate limiter queue timing (#13544)

This commit is contained in:
Eric Eastwood 2022-08-17 04:38:05 -05:00 committed by GitHub
parent 088bcb7ecb
commit c6ee9c0ee4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

1
changelog.d/13544.misc Normal file
View File

@ -0,0 +1 @@
Add metrics to track rate limiter queue timing (`synapse_rate_limit_queue_wait_time_seconds`).

View File

@ -28,6 +28,7 @@ from synapse.logging.context import (
run_in_background, run_in_background,
) )
from synapse.logging.opentracing import start_active_span from synapse.logging.opentracing import start_active_span
from synapse.metrics import Histogram
from synapse.util import Clock from synapse.util import Clock
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
@ -36,6 +37,29 @@ if typing.TYPE_CHECKING:
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
queue_wait_timer = Histogram(
"synapse_rate_limit_queue_wait_time_seconds",
"sec",
[],
buckets=(
0.005,
0.01,
0.025,
0.05,
0.1,
0.25,
0.5,
0.75,
1.0,
2.5,
5.0,
10.0,
20.0,
"+Inf",
),
)
class FederationRateLimiter: class FederationRateLimiter:
def __init__(self, clock: Clock, config: FederationRatelimitSettings): def __init__(self, clock: Clock, config: FederationRatelimitSettings):
def new_limiter() -> "_PerHostRatelimiter": def new_limiter() -> "_PerHostRatelimiter":
@ -178,10 +202,16 @@ class _PerHostRatelimiter:
self.sleeping_requests.discard(request_id) self.sleeping_requests.discard(request_id)
self.ready_request_queue.pop(request_id, None) self.ready_request_queue.pop(request_id, None)
wait_span_scope.__exit__(None, None, None) wait_span_scope.__exit__(None, None, None)
wait_timer_cm.__exit__(None, None, None)
return r return r
# Tracing
wait_span_scope = start_active_span("ratelimit wait") wait_span_scope = start_active_span("ratelimit wait")
wait_span_scope.__enter__() wait_span_scope.__enter__()
# Metrics
wait_timer_cm = queue_wait_timer.time()
wait_timer_cm.__enter__()
ret_defer.addCallbacks(on_start, on_err) ret_defer.addCallbacks(on_start, on_err)
ret_defer.addBoth(on_both) ret_defer.addBoth(on_both)
return make_deferred_yieldable(ret_defer) return make_deferred_yieldable(ret_defer)