From 36ee2aa9bf1062cc44f277145f873466de69aeb0 Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Mon, 31 Mar 2025 13:27:51 +0200 Subject: [PATCH] chore: non-relay protocols cross performance measurement metrics (#3299) * Introducing new non-relay protocol request handling time metric --- waku/common/rate_limit/request_limiter.nim | 9 +++++++++ waku/common/rate_limit/service_metrics.nim | 3 +++ waku/common/rate_limit/single_token_limiter.nim | 9 +++++++++ 3 files changed, 21 insertions(+) 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