diff --git a/waku/common/rate_limit/request_limiter.nim b/waku/common/rate_limit/request_limiter.nim index 70fcc4905..7f33d0348 100644 --- a/waku/common/rate_limit/request_limiter.nim +++ b/waku/common/rate_limit/request_limiter.nim @@ -22,6 +22,8 @@ import libp2p/stream/connection, libp2p/utility +import std/times except TimeInterval, Duration, seconds, minutes + import ./[single_token_limiter, service_metrics, timed_map] export token_bucket, setting, service_metrics @@ -76,8 +78,15 @@ template checkUsageLimit*( bodyWithinLimit, bodyRejected: untyped, ) = if t.checkUsage(proto, conn): + let requestStartTime = getTime().toUnixFloat() waku_service_requests.inc(labelValues = [proto, "served"]) + bodyWithinLimit + + let requestDurationSec = getTime().toUnixFloat() - requestStartTime + waku_service_request_handling_duration_seconds.observe( + requestDurationSec, labelValues = [proto] + ) else: waku_service_requests.inc(labelValues = [proto, "rejected"]) bodyRejected diff --git a/waku/common/rate_limit/service_metrics.nim b/waku/common/rate_limit/service_metrics.nim index 339bf7f38..7d24d9530 100644 --- a/waku/common/rate_limit/service_metrics.nim +++ b/waku/common/rate_limit/service_metrics.nim @@ -17,3 +17,6 @@ proc setServiceLimitMetric*(service: string, limit: Option[RateLimitSetting]) = waku_service_requests_limit.set( limit.get().calculateLimitPerSecond(), labelValues = [service] ) + +declarePublicHistogram waku_service_request_handling_duration_seconds, + "duration of non-relay service handling", ["service"] diff --git a/waku/common/rate_limit/single_token_limiter.nim b/waku/common/rate_limit/single_token_limiter.nim index 1b62114bf..da01f61bb 100644 --- a/waku/common/rate_limit/single_token_limiter.nim +++ b/waku/common/rate_limit/single_token_limiter.nim @@ -4,6 +4,8 @@ import std/[options], chronos/timer, libp2p/stream/connection, libp2p/utility +import std/times except TimeInterval, Duration + import ./[token_bucket, setting, service_metrics] export token_bucket, setting, service_metrics @@ -43,8 +45,15 @@ template checkUsageLimit*( bodyWithinLimit, bodyRejected: untyped, ) = if t.checkUsage(proto): + let requestStartTime = getTime().toUnixFloat() waku_service_requests.inc(labelValues = [proto, "served"]) + bodyWithinLimit + + let requestDurationSec = getTime().toUnixFloat() - requestStartTime + waku_service_request_handling_duration_seconds.observe( + requestDurationSec, labelValues = [proto] + ) else: waku_service_requests.inc(labelValues = [proto, "rejected"]) bodyRejected