From 9afb61e0865cd385a712ca5dd619586af5fce8ef Mon Sep 17 00:00:00 2001 From: antonbabak Date: Wed, 13 Nov 2024 15:42:39 +0100 Subject: [PATCH 1/3] Add Debug Metrics --- docs/metrics.md | 2 ++ .../server/auction/ExchangeService.java | 2 ++ .../server/handler/openrtb2/AmpHandler.java | 7 +++++ .../handler/openrtb2/AuctionHandler.java | 7 +++++ .../server/handler/openrtb2/VideoHandler.java | 7 +++++ .../org/prebid/server/metric/MetricName.java | 1 + .../org/prebid/server/metric/Metrics.java | 14 ++++++++++ .../server/auction/ExchangeServiceTest.java | 1 + .../handler/openrtb2/AmpHandlerTest.java | 1 + .../handler/openrtb2/AuctionHandlerTest.java | 5 +++- .../handler/openrtb2/VideoHandlerTest.java | 4 +++ .../org/prebid/server/metric/MetricsTest.java | 26 +++++++++++++++++++ 12 files changed, 76 insertions(+), 1 deletion(-) diff --git a/docs/metrics.md b/docs/metrics.md index 504cd50f5db..85df92bc269 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -37,6 +37,7 @@ where `[DATASOURCE]` is a data source name, `DEFAULT_DS` by defaul. ## General auction metrics - `app_requests` - number of requests received from applications +- `debug_requests` - number of requests received (when debug mode is enabled) - `no_cookie_requests` - number of requests without `uids` cookie or with one that didn't contain at least one live UID - `request_time` - timer tracking how long did it take for Prebid Server to serve a request - `imps_requested` - number if impressions requested @@ -89,6 +90,7 @@ Following metrics are collected and submitted if account is configured with `bas Following metrics are collected and submitted if account is configured with `detailed` verbosity: - `account..requests.type.(openrtb2-web,openrtb-app,amp,legacy)` - number of requests received from account with `` broken down by type of incoming request +- `account..debug_requests` - number of requests received from account with `` broken down by type of incoming request (when debug mode is enabled) - `account..requests.rejected` - number of rejected requests caused by incorrect `accountId` - `account..adapter..request_time` - timer tracking how long did it take to make a request to `` when incoming request was from `` - `account..adapter..bids_received` - number of bids received from `` when incoming request was from `` diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 27c65afe260..06fa1e9d60c 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1083,9 +1083,11 @@ private AuctionContext updateRequestMetric(AuctionContext context, MetricName requestTypeMetric) { final List auctionParticipations = context.getAuctionParticipations(); + final boolean debugEnabled = context.getDebugContext().isDebugEnabled(); metrics.updateRequestBidderCardinalityMetric(auctionParticipations.size()); metrics.updateAccountRequestMetrics(account, requestTypeMetric); + metrics.updateAccountDebugRequestMetrics(account, debugEnabled); for (AuctionParticipation auctionParticipation : auctionParticipations) { if (auctionParticipation.isRequestBlocked()) { diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java index c1d9c58dca6..8335b48e228 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java @@ -135,6 +135,7 @@ public void handle(RoutingContext routingContext) { ampRequestFactory.fromRequest(routingContext, startTime) + .map(this::updateDebugRequestMetrics) .map(context -> addToEvent(context, ampEventBuilder::auctionContext, context)) .map(this::updateAppAndNoCookieAndImpsMetrics) @@ -146,6 +147,12 @@ public void handle(RoutingContext routingContext) { .onComplete(responseResult -> handleResult(responseResult, ampEventBuilder, routingContext, startTime)); } + private AuctionContext updateDebugRequestMetrics(AuctionContext auctionContext) { + final boolean debugEnabled = auctionContext.getDebugContext().isDebugEnabled(); + metrics.updateDebugRequestMetrics(debugEnabled); + return auctionContext; + } + private static R addToEvent(T field, Consumer consumer, R result) { consumer.accept(field); return result; diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java index b8664bc75fd..1bb5f30f35a 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java @@ -100,11 +100,18 @@ public void handle(RoutingContext routingContext) { .httpContext(HttpRequestContext.from(routingContext)); auctionRequestFactory.parseRequest(routingContext, startTime) + .map(this::updateDebugRequestMetrics) .compose(auctionContext -> skippedAuctionService.skipAuction(auctionContext) .recover(throwable -> holdAuction(auctionEventBuilder, auctionContext))) .onComplete(context -> handleResult(context, auctionEventBuilder, routingContext, startTime)); } + private AuctionContext updateDebugRequestMetrics(AuctionContext auctionContext) { + final boolean debugEnabled = auctionContext.getDebugContext().isDebugEnabled(); + metrics.updateDebugRequestMetrics(debugEnabled); + return auctionContext; + } + private Future holdAuction(AuctionEvent.AuctionEventBuilder auctionEventBuilder, AuctionContext auctionContext) { diff --git a/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java index d5957c15aa7..847540a6166 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java @@ -97,6 +97,7 @@ public void handle(RoutingContext routingContext) { .httpContext(HttpRequestContext.from(routingContext)); videoRequestFactory.fromRequest(routingContext, startTime) + .map(this::updateDebugRequestMetrics) .map(contextToErrors -> addToEvent( contextToErrors.getData(), videoEventBuilder::auctionContext, contextToErrors)) @@ -115,6 +116,12 @@ public void handle(RoutingContext routingContext) { startTime)); } + private WithPodErrors updateDebugRequestMetrics(WithPodErrors contextWithErrors) { + final boolean debugEnabled = contextWithErrors.getData().getDebugContext().isDebugEnabled(); + metrics.updateDebugRequestMetrics(debugEnabled); + return contextWithErrors; + } + private static R addToEvent(T field, Consumer consumer, R result) { consumer.accept(field); return result; diff --git a/src/main/java/org/prebid/server/metric/MetricName.java b/src/main/java/org/prebid/server/metric/MetricName.java index 7f27ea2212e..9ea3d15f0fc 100644 --- a/src/main/java/org/prebid/server/metric/MetricName.java +++ b/src/main/java/org/prebid/server/metric/MetricName.java @@ -25,6 +25,7 @@ public enum MetricName { // auction requests, + debug_requests, app_requests, no_cookie_requests, request_time, diff --git a/src/main/java/org/prebid/server/metric/Metrics.java b/src/main/java/org/prebid/server/metric/Metrics.java index c435e361fec..52964a9f8b0 100644 --- a/src/main/java/org/prebid/server/metric/Metrics.java +++ b/src/main/java/org/prebid/server/metric/Metrics.java @@ -167,6 +167,12 @@ HooksMetrics hooks() { return hooksMetrics; } + public void updateDebugRequestMetrics(boolean debugEnabled) { + if (debugEnabled) { + incCounter(MetricName.debug_requests); + } + } + public void updateAppAndNoCookieAndImpsRequestedMetrics(boolean isApp, boolean liveUidsPresent, int numImps) { if (isApp) { incCounter(MetricName.app_requests); @@ -235,12 +241,20 @@ public void updateAccountRequestMetrics(Account account, MetricName requestType) final AccountMetrics accountMetrics = forAccount(account.getId()); accountMetrics.incCounter(MetricName.requests); + if (verbosityLevel.isAtLeast(AccountMetricsVerbosityLevel.detailed)) { accountMetrics.requestType(requestType).incCounter(MetricName.requests); } } } + public void updateAccountDebugRequestMetrics(Account account, boolean debugEnabled) { + final AccountMetricsVerbosityLevel verbosityLevel = accountMetricsVerbosityResolver.forAccount(account); + if (verbosityLevel.isAtLeast(AccountMetricsVerbosityLevel.detailed) && debugEnabled) { + forAccount(account.getId()).incCounter(MetricName.debug_requests); + } + } + public void updateAccountRequestRejectedByInvalidAccountMetrics(String accountId) { updateAccountRequestsMetrics(accountId, MetricName.rejected_by_invalid_account); } diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 60cc83291f7..8a1129ceb91 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -2979,6 +2979,7 @@ public void shouldIncrementCommonMetrics() { target.holdAuction(givenRequestContext(bidRequest)); // then + verify(metrics).updateAccountDebugRequestMetrics(any(), eq(false)); verify(metrics).updateRequestBidderCardinalityMetric(1); verify(metrics).updateAccountRequestMetrics(any(), eq(MetricName.openrtb2web)); verify(metrics).updateAdapterRequestTypeAndNoCookieMetrics( diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java index 9f40ed1bc81..5d424dd23ee 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java @@ -745,6 +745,7 @@ public void shouldUpdateRequestTimeMetric() { // then verify(metrics).updateRequestTimeMetric(eq(MetricName.request_time), eq(500L)); + verify(metrics).updateDebugRequestMetrics(false); } @Test diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java index c2a84bcc922..091fcf7d3e8 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java @@ -24,6 +24,7 @@ import org.prebid.server.auction.SkippedAuctionService; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.TimeoutContext; +import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.auction.requestfactory.AuctionRequestFactory; import org.prebid.server.cookie.UidsCookie; import org.prebid.server.exception.BlocklistedAccountException; @@ -536,6 +537,7 @@ public void shouldIncrementImpsRequestedMetrics() { // then verify(metrics).updateAppAndNoCookieAndImpsRequestedMetrics(anyBoolean(), anyBoolean(), eq(1)); + verify(metrics).updateDebugRequestMetrics(false); } @Test @@ -865,7 +867,8 @@ private AuctionContext givenAuctionContext( .uidsCookie(uidsCookie) .bidRequest(bidRequest) .requestTypeMetric(MetricName.openrtb2web) - .timeoutContext(TimeoutContext.of(0, timeout, 0)); + .timeoutContext(TimeoutContext.of(0, timeout, 0)) + .debugContext(DebugContext.empty()); return auctionContextCustomizer.apply(auctionContextBuilder) .build(); diff --git a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java index fe59fb31fcc..caa4a797e25 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java @@ -24,6 +24,7 @@ import org.prebid.server.auction.model.CachedDebugLog; import org.prebid.server.auction.model.TimeoutContext; import org.prebid.server.auction.model.WithPodErrors; +import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.auction.requestfactory.VideoRequestFactory; import org.prebid.server.cache.CoreCacheService; import org.prebid.server.cookie.UidsCookie; @@ -300,6 +301,7 @@ public void shouldUpdateVideoEventWithCacheLogIdErrorAndCallCacheForDebugLogWhen .bidRequest(BidRequest.builder().imp(emptyList()).build()) .account(Account.builder().auction(AccountAuctionConfig.builder().videoCacheTtl(100).build()).build()) .cachedDebugLog(new CachedDebugLog(true, 10, null, jacksonMapper)) + .debugContext(DebugContext.empty()) .build(); final WithPodErrors auctionContextWithPodErrors = WithPodErrors.of(auctionContext, emptyList()); @@ -327,6 +329,7 @@ public void shouldCacheDebugLogWhenNoBidsWereReturnedAndDoesNotAddErrorToVideoEv final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().imp(emptyList()).build()) .account(Account.builder().auction(AccountAuctionConfig.builder().videoCacheTtl(100).build()).build()) + .debugContext(DebugContext.empty()) .cachedDebugLog(cachedDebugLog) .build(); @@ -377,6 +380,7 @@ private WithPodErrors givenAuctionContext( .uidsCookie(uidsCookie) .bidRequest(bidRequest) .timeoutContext(TimeoutContext.of(0, timeout, 0)) + .debugContext(DebugContext.empty()) .build(); return WithPodErrors.of(auctionContext, errors); diff --git a/src/test/java/org/prebid/server/metric/MetricsTest.java b/src/test/java/org/prebid/server/metric/MetricsTest.java index 104df273c3e..f4943895116 100644 --- a/src/test/java/org/prebid/server/metric/MetricsTest.java +++ b/src/test/java/org/prebid/server/metric/MetricsTest.java @@ -331,6 +331,16 @@ public void updateAppAndNoCookieAndImpsRequestedMetricsShouldIncrementMetrics() assertThat(metricRegistry.counter("imps_requested").getCount()).isEqualTo(4); } + @Test + public void updateDebugRequestsMetricsShouldIncrementMetrics() { + // when + metrics.updateDebugRequestMetrics(false); + metrics.updateDebugRequestMetrics(true); + + // then + assertThat(metricRegistry.counter("debug_requests").getCount()).isOne(); + } + @Test public void updateImpTypesMetricsByCountPerMediaTypeShouldIncrementMetrics() { // given @@ -427,6 +437,16 @@ public void updateAccountRequestMetricsShouldIncrementMetrics() { assertThat(metricRegistry.counter("account.accountId.requests.type.openrtb2-web").getCount()).isOne(); } + @Test + public void updateAccountDebugRequestMetricsShouldIncrementMetrics() { + // when + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), false); + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), true); + + // then + assertThat(metricRegistry.counter("account.accountId.debug_requests").getCount()).isOne(); + } + @Test public void updateAdapterRequestTypeAndNoCookieMetricsShouldUpdateMetricsAsExpected() { @@ -916,6 +936,8 @@ public void shouldNotUpdateAccountMetricsIfVerbosityIsNone() { given(accountMetricsVerbosityResolver.forAccount(any())).willReturn(AccountMetricsVerbosityLevel.none); // when + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), false); + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), true); metrics.updateAccountRequestMetrics(Account.empty(ACCOUNT_ID), MetricName.openrtb2web); metrics.updateAdapterResponseTime(RUBICON, Account.empty(ACCOUNT_ID), 500); metrics.updateAdapterRequestNobidMetrics(RUBICON, Account.empty(ACCOUNT_ID)); @@ -924,6 +946,7 @@ public void shouldNotUpdateAccountMetricsIfVerbosityIsNone() { // then assertThat(metricRegistry.counter("account.accountId.requests").getCount()).isZero(); + assertThat(metricRegistry.counter("account.accountId.debug_requests").getCount()).isZero(); assertThat(metricRegistry.counter("account.accountId.requests.type.openrtb2-web").getCount()).isZero(); assertThat(metricRegistry.timer("account.accountId.rubicon.request_time").getCount()).isZero(); assertThat(metricRegistry.counter("account.accountId.rubicon.requests.nobid").getCount()).isZero(); @@ -939,6 +962,8 @@ public void shouldUpdateAccountRequestsMetricOnlyIfVerbosityIsBasic() { // when metrics.updateAccountRequestMetrics(Account.empty(ACCOUNT_ID), MetricName.openrtb2web); + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), false); + metrics.updateAccountDebugRequestMetrics(Account.empty(ACCOUNT_ID), true); metrics.updateAdapterResponseTime(RUBICON, Account.empty(ACCOUNT_ID), 500); metrics.updateAdapterRequestNobidMetrics(RUBICON, Account.empty(ACCOUNT_ID)); metrics.updateAdapterRequestGotbidsMetrics(RUBICON, Account.empty(ACCOUNT_ID)); @@ -946,6 +971,7 @@ public void shouldUpdateAccountRequestsMetricOnlyIfVerbosityIsBasic() { // then assertThat(metricRegistry.counter("account.accountId.requests").getCount()).isOne(); + assertThat(metricRegistry.counter("account.accountId.debug_requests").getCount()).isZero(); assertThat(metricRegistry.counter("account.accountId.requests.type.openrtb2-web").getCount()).isZero(); assertThat(metricRegistry.timer("account.accountId.rubicon.request_time").getCount()).isZero(); assertThat(metricRegistry.counter("account.accountId.rubicon.requests.nobid").getCount()).isZero(); From 343d8a12c56434ac84a652398b5c4039efbe57b1 Mon Sep 17 00:00:00 2001 From: antonbabak Date: Thu, 14 Nov 2024 13:51:20 +0100 Subject: [PATCH 2/3] Fix Metrics --- .../org/prebid/server/auction/ExchangeService.java | 10 ++++++---- .../org/prebid/server/handler/openrtb2/AmpHandler.java | 7 ------- .../prebid/server/handler/openrtb2/AuctionHandler.java | 7 ------- .../prebid/server/handler/openrtb2/VideoHandler.java | 7 ------- .../org/prebid/server/auction/ExchangeServiceTest.java | 1 + .../prebid/server/handler/openrtb2/AmpHandlerTest.java | 1 - .../server/handler/openrtb2/AuctionHandlerTest.java | 5 +---- .../server/handler/openrtb2/VideoHandlerTest.java | 4 ---- 8 files changed, 8 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 06fa1e9d60c..5ee8e98dabe 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -249,6 +249,10 @@ private Future runAuction(AuctionContext receivedContext) { final Map bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings); receivedContext.getBidRejectionTrackers().putAll(makeBidRejectionTrackers(bidRequest, aliases)); + final boolean debugEnabled = receivedContext.getDebugContext().isDebugEnabled(); + metrics.updateDebugRequestMetrics(debugEnabled); + metrics.updateAccountDebugRequestMetrics(account, debugEnabled); + return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), timeout) .map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedAuctionResponses)) .compose(storedResponseResult -> @@ -274,7 +278,7 @@ private Future runAuction(AuctionContext receivedContext) { bidRequest.getImp(), context.getBidRejectionTrackers())) .map(auctionParticipations -> dropZeroNonDealBids( - auctionParticipations, debugWarnings, context.getDebugContext().isDebugEnabled())) + auctionParticipations, debugWarnings, debugEnabled)) .map(auctionParticipations -> bidsAdjuster.validateAndAdjustBids(auctionParticipations, context, aliases)) .map(auctionParticipations -> updateResponsesMetrics(auctionParticipations, account, aliases)) @@ -285,7 +289,7 @@ private Future runAuction(AuctionContext receivedContext) { logger, bidResponse, context.getBidRequest(), - context.getDebugContext().isDebugEnabled())) + debugEnabled)) .compose(bidResponse -> bidResponsePostProcessor.postProcess( context.getHttpRequest(), uidsCookie, bidRequest, bidResponse, account)) .map(context::with)); @@ -1083,11 +1087,9 @@ private AuctionContext updateRequestMetric(AuctionContext context, MetricName requestTypeMetric) { final List auctionParticipations = context.getAuctionParticipations(); - final boolean debugEnabled = context.getDebugContext().isDebugEnabled(); metrics.updateRequestBidderCardinalityMetric(auctionParticipations.size()); metrics.updateAccountRequestMetrics(account, requestTypeMetric); - metrics.updateAccountDebugRequestMetrics(account, debugEnabled); for (AuctionParticipation auctionParticipation : auctionParticipations) { if (auctionParticipation.isRequestBlocked()) { diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java index 8335b48e228..c1d9c58dca6 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java @@ -135,7 +135,6 @@ public void handle(RoutingContext routingContext) { ampRequestFactory.fromRequest(routingContext, startTime) - .map(this::updateDebugRequestMetrics) .map(context -> addToEvent(context, ampEventBuilder::auctionContext, context)) .map(this::updateAppAndNoCookieAndImpsMetrics) @@ -147,12 +146,6 @@ public void handle(RoutingContext routingContext) { .onComplete(responseResult -> handleResult(responseResult, ampEventBuilder, routingContext, startTime)); } - private AuctionContext updateDebugRequestMetrics(AuctionContext auctionContext) { - final boolean debugEnabled = auctionContext.getDebugContext().isDebugEnabled(); - metrics.updateDebugRequestMetrics(debugEnabled); - return auctionContext; - } - private static R addToEvent(T field, Consumer consumer, R result) { consumer.accept(field); return result; diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java index 1bb5f30f35a..b8664bc75fd 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java @@ -100,18 +100,11 @@ public void handle(RoutingContext routingContext) { .httpContext(HttpRequestContext.from(routingContext)); auctionRequestFactory.parseRequest(routingContext, startTime) - .map(this::updateDebugRequestMetrics) .compose(auctionContext -> skippedAuctionService.skipAuction(auctionContext) .recover(throwable -> holdAuction(auctionEventBuilder, auctionContext))) .onComplete(context -> handleResult(context, auctionEventBuilder, routingContext, startTime)); } - private AuctionContext updateDebugRequestMetrics(AuctionContext auctionContext) { - final boolean debugEnabled = auctionContext.getDebugContext().isDebugEnabled(); - metrics.updateDebugRequestMetrics(debugEnabled); - return auctionContext; - } - private Future holdAuction(AuctionEvent.AuctionEventBuilder auctionEventBuilder, AuctionContext auctionContext) { diff --git a/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java index 847540a6166..d5957c15aa7 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/VideoHandler.java @@ -97,7 +97,6 @@ public void handle(RoutingContext routingContext) { .httpContext(HttpRequestContext.from(routingContext)); videoRequestFactory.fromRequest(routingContext, startTime) - .map(this::updateDebugRequestMetrics) .map(contextToErrors -> addToEvent( contextToErrors.getData(), videoEventBuilder::auctionContext, contextToErrors)) @@ -116,12 +115,6 @@ public void handle(RoutingContext routingContext) { startTime)); } - private WithPodErrors updateDebugRequestMetrics(WithPodErrors contextWithErrors) { - final boolean debugEnabled = contextWithErrors.getData().getDebugContext().isDebugEnabled(); - metrics.updateDebugRequestMetrics(debugEnabled); - return contextWithErrors; - } - private static R addToEvent(T field, Consumer consumer, R result) { consumer.accept(field); return result; diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 8a1129ceb91..5e2e48d6a74 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -2979,6 +2979,7 @@ public void shouldIncrementCommonMetrics() { target.holdAuction(givenRequestContext(bidRequest)); // then + verify(metrics).updateDebugRequestMetrics(false); verify(metrics).updateAccountDebugRequestMetrics(any(), eq(false)); verify(metrics).updateRequestBidderCardinalityMetric(1); verify(metrics).updateAccountRequestMetrics(any(), eq(MetricName.openrtb2web)); diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java index 5d424dd23ee..9f40ed1bc81 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java @@ -745,7 +745,6 @@ public void shouldUpdateRequestTimeMetric() { // then verify(metrics).updateRequestTimeMetric(eq(MetricName.request_time), eq(500L)); - verify(metrics).updateDebugRequestMetrics(false); } @Test diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java index 091fcf7d3e8..c2a84bcc922 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java @@ -24,7 +24,6 @@ import org.prebid.server.auction.SkippedAuctionService; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.TimeoutContext; -import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.auction.requestfactory.AuctionRequestFactory; import org.prebid.server.cookie.UidsCookie; import org.prebid.server.exception.BlocklistedAccountException; @@ -537,7 +536,6 @@ public void shouldIncrementImpsRequestedMetrics() { // then verify(metrics).updateAppAndNoCookieAndImpsRequestedMetrics(anyBoolean(), anyBoolean(), eq(1)); - verify(metrics).updateDebugRequestMetrics(false); } @Test @@ -867,8 +865,7 @@ private AuctionContext givenAuctionContext( .uidsCookie(uidsCookie) .bidRequest(bidRequest) .requestTypeMetric(MetricName.openrtb2web) - .timeoutContext(TimeoutContext.of(0, timeout, 0)) - .debugContext(DebugContext.empty()); + .timeoutContext(TimeoutContext.of(0, timeout, 0)); return auctionContextCustomizer.apply(auctionContextBuilder) .build(); diff --git a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java index caa4a797e25..fe59fb31fcc 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java @@ -24,7 +24,6 @@ import org.prebid.server.auction.model.CachedDebugLog; import org.prebid.server.auction.model.TimeoutContext; import org.prebid.server.auction.model.WithPodErrors; -import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.auction.requestfactory.VideoRequestFactory; import org.prebid.server.cache.CoreCacheService; import org.prebid.server.cookie.UidsCookie; @@ -301,7 +300,6 @@ public void shouldUpdateVideoEventWithCacheLogIdErrorAndCallCacheForDebugLogWhen .bidRequest(BidRequest.builder().imp(emptyList()).build()) .account(Account.builder().auction(AccountAuctionConfig.builder().videoCacheTtl(100).build()).build()) .cachedDebugLog(new CachedDebugLog(true, 10, null, jacksonMapper)) - .debugContext(DebugContext.empty()) .build(); final WithPodErrors auctionContextWithPodErrors = WithPodErrors.of(auctionContext, emptyList()); @@ -329,7 +327,6 @@ public void shouldCacheDebugLogWhenNoBidsWereReturnedAndDoesNotAddErrorToVideoEv final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().imp(emptyList()).build()) .account(Account.builder().auction(AccountAuctionConfig.builder().videoCacheTtl(100).build()).build()) - .debugContext(DebugContext.empty()) .cachedDebugLog(cachedDebugLog) .build(); @@ -380,7 +377,6 @@ private WithPodErrors givenAuctionContext( .uidsCookie(uidsCookie) .bidRequest(bidRequest) .timeoutContext(TimeoutContext.of(0, timeout, 0)) - .debugContext(DebugContext.empty()) .build(); return WithPodErrors.of(auctionContext, errors); From 5bb95cd7103b19d1018a03156ac59b7cab21969b Mon Sep 17 00:00:00 2001 From: Markiyan Mykush <95693607+marki1an@users.noreply.github.com> Date: Thu, 21 Nov 2024 19:05:06 +0200 Subject: [PATCH 3/3] Test: Debug metrics (#3554) * Add functional tests for debug metrics --- .../server/functional/tests/DebugSpec.groovy | 186 +++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy index 715c20c9dcb..ea169ad00ee 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy @@ -3,18 +3,24 @@ package org.prebid.server.functional.tests import org.apache.commons.lang3.StringUtils import org.prebid.server.functional.model.config.AccountAuctionConfig import org.prebid.server.functional.model.config.AccountConfig +import org.prebid.server.functional.model.config.AccountMetricsConfig import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.db.StoredResponse import org.prebid.server.functional.model.request.amp.AmpRequest import org.prebid.server.functional.model.request.auction.BidRequest +import org.prebid.server.functional.model.request.auction.Site import org.prebid.server.functional.model.request.auction.StoredBidResponse import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.util.PBSUtils import spock.lang.PendingFeature import static org.prebid.server.functional.model.bidder.BidderName.GENERIC +import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.BASIC +import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.DETAILED +import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.NONE import static org.prebid.server.functional.model.request.auction.DebugCondition.DISABLED import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED import static org.prebid.server.functional.model.response.auction.BidderCallType.STORED_BID_RESPONSE @@ -22,19 +28,33 @@ import static org.prebid.server.functional.model.response.auction.BidderCallType class DebugSpec extends BaseSpec { private static final String overrideToken = PBSUtils.randomString + private static final String ACCOUNT_METRICS_PREFIX_NAME = "account" + private static final String DEBUG_REQUESTS_METRIC = "debug_requests" + private static final String ACCOUNT_DEBUG_REQUESTS_METRIC = "account.%s.debug_requests" + private static final String REQUEST_OK_WEB_METRICS = "requests.ok.openrtb2-web" - def "PBS should return debug information when debug flag is #debug and test flag is #test"() { + def "PBS should return debug information and emit metrics when debug flag is #debug and test flag is #test"() { given: "Default BidRequest with test flag" def bidRequest = BidRequest.defaultBidRequest bidRequest.ext.prebid.debug = debug bidRequest.test = test + and: "Flash metrics" + flushMetrics(defaultPbsService) + when: "PBS processes auction request" def response = defaultPbsService.sendAuctionRequest(bidRequest) then: "Response should contain ext.debug" assert response.ext?.debug + and: "Debug metrics should be incremented" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1 + + and: "Account debug metrics shouldn't be incremented" + assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME) + where: debug | test ENABLED | null @@ -48,12 +68,23 @@ class DebugSpec extends BaseSpec { bidRequest.ext.prebid.debug = test bidRequest.test = test + and: "Flash metrics" + flushMetrics(defaultPbsService) + when: "PBS processes auction request" def response = defaultPbsService.sendAuctionRequest(bidRequest) then: "Response shouldn't contain ext.debug" assert !response.ext?.debug + and: "Debug metrics shouldn't be populated" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert !metricsRequest[DEBUG_REQUESTS_METRIC] + assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME) + + and: "General metrics should be present" + assert metricsRequest[REQUEST_OK_WEB_METRICS] == 1 + where: debug | test DISABLED | null @@ -351,4 +382,157 @@ class DebugSpec extends BaseSpec { and: "Response should not contain ext.warnings" assert !response.ext?.warnings } + + def "PBS should return debug information and emit metrics when account debug enabled and verbosity detailed"() { + given: "Default basic generic bid request" + def bidRequest = BidRequest.defaultBidRequest + + and: "Account in the DB" + def accountConfig = new AccountConfig( + metrics: new AccountMetricsConfig(verbosityLevel: DETAILED), + auction: new AccountAuctionConfig(debugAllow: true)) + def account = new Account(uuid: bidRequest.site.publisher.id, config: accountConfig) + accountDao.save(account) + + and: "Flash metrics" + flushMetrics(defaultPbsService) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain ext.debug" + assert response.ext?.debug + + and: "Debug metrics should be incremented" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(bidRequest.accountId)] == 1 + assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1 + } + + def "PBS shouldn't return debug information and emit metrics when account debug enabled and verbosity #verbosityLevel"() { + given: "Default basic generic bid request" + def bidRequest = BidRequest.defaultBidRequest + + and: "Account in the DB" + def accountConfig = new AccountConfig( + metrics: new AccountMetricsConfig(verbosityLevel: verbosityLevel), + auction: new AccountAuctionConfig(debugAllow: true)) + def account = new Account(uuid: bidRequest.site.publisher.id, config: accountConfig) + accountDao.save(account) + + and: "Flash metrics" + flushMetrics(defaultPbsService) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain ext.debug" + assert response.ext?.debug + + and: "Account debug metrics shouldn't be incremented" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert !metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(bidRequest.accountId)] + + and: "Request debug metrics should be incremented" + assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1 + + where: + verbosityLevel << [NONE, BASIC] + } + + def "PBS amp should return debug information and emit metrics when account debug enabled and verbosity detailed"() { + given: "Default AMP request" + def ampRequest = AmpRequest.defaultAmpRequest + + and: "Default stored request" + def ampStoredRequest = BidRequest.defaultStoredRequest + + and: "Account in the DB" + def accountConfig = new AccountConfig( + metrics: new AccountMetricsConfig(verbosityLevel: DETAILED), + auction: new AccountAuctionConfig(debugAllow: true)) + def account = new Account(uuid: ampRequest.account, config: accountConfig) + accountDao.save(account) + + and: "Flash metrics" + flushMetrics(defaultPbsService) + + and: "Save storedRequest into DB" + def storedRequest = StoredRequest.getStoredRequest(ampRequest, ampStoredRequest) + storedRequestDao.save(storedRequest) + + when: "PBS processes amp request" + def response = defaultPbsService.sendAmpRequest(ampRequest) + + then: "Response should contain ext.debug" + assert response.ext?.debug + + and: "Debug metrics should be incremented" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(ampRequest.account)] == 1 + assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1 + } + + def "PBS amp should return debug information and emit metrics when account debug enabled and verbosity #verbosityLevel"() { + given: "Default AMP request" + def ampRequest = AmpRequest.defaultAmpRequest + + and: "Default stored request" + def ampStoredRequest = BidRequest.defaultStoredRequest + + and: "Account in the DB" + def accountConfig = new AccountConfig( + metrics: new AccountMetricsConfig(verbosityLevel: verbosityLevel), + auction: new AccountAuctionConfig(debugAllow: true)) + def account = new Account(uuid: ampRequest.account, config: accountConfig) + accountDao.save(account) + + and: "Flash metrics" + flushMetrics(defaultPbsService) + + and: "Save storedRequest into DB" + def storedRequest = StoredRequest.getStoredRequest(ampRequest, ampStoredRequest) + storedRequestDao.save(storedRequest) + + when: "PBS processes amp request" + def response = defaultPbsService.sendAmpRequest(ampRequest) + + then: "Response should contain ext.debug" + assert response.ext?.debug + + and: "Account debug metrics shouldn't be incremented" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert !metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(ampRequest.account)] + + and: "Debug metrics should be incremented" + assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1 + + where: + verbosityLevel << [NONE, BASIC] + } + + def "PBS shouldn't emit auction request metric when incoming request invalid"() { + given: "Default basic BidRequest" + def bidRequest = BidRequest.defaultBidRequest + bidRequest.site = new Site(id: null, name: PBSUtils.randomString, page: null) + bidRequest.ext.prebid.debug = ENABLED + + and: "Flash metrics" + flushMetrics(defaultPbsService) + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Request should fail with error" + def exception = thrown(PrebidServerException) + assert exception.responseBody.contains("request.site should include at least one of request.site.id or request.site.page") + + and: "Debug metrics shouldn't be populated" + def metricsRequest = defaultPbsService.sendCollectedMetricsRequest() + assert !metricsRequest[DEBUG_REQUESTS_METRIC] + assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME) + + and: "General metrics shouldn't be present" + assert !metricsRequest[REQUEST_OK_WEB_METRICS] + } }