From 1da193f5a3016ca46232e28b684d980e9dad760b Mon Sep 17 00:00:00 2001 From: antonbabak Date: Mon, 5 May 2025 10:52:21 +0200 Subject: [PATCH] Fix Price Floors Logs --- .../floors/BasicPriceFloorProcessor.java | 69 +++++++++---------- .../floors/BasicPriceFloorProcessorTest.java | 17 ++--- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/prebid/server/floors/BasicPriceFloorProcessor.java b/src/main/java/org/prebid/server/floors/BasicPriceFloorProcessor.java index 8619a4b12a9..dcfb2e6a166 100644 --- a/src/main/java/org/prebid/server/floors/BasicPriceFloorProcessor.java +++ b/src/main/java/org/prebid/server/floors/BasicPriceFloorProcessor.java @@ -152,41 +152,17 @@ private PriceFloorRules resolveFloors(Account account, BidRequest bidRequest, Li return createFloorsFrom(mergedFloors, fetchStatus, PriceFloorLocation.fetch); } - final String fetchErrorMessage = resolveFetchErrorMessage(fetchResult, isUsingDynamicDataAllowed); - return requestFloors == null - ? noPriceFloorData(fetchStatus, account.getId(), bidRequest.getId(), fetchErrorMessage, warnings) - : getPriceFloorRules(bidRequest, account, requestFloors, fetchStatus, fetchErrorMessage, warnings); - } - - private static String resolveFetchErrorMessage(FetchResult fetchResult, boolean isUsingDynamicDataAllowed) { - return switch (fetchResult.getFetchStatus()) { - case inprogress -> null; - case error, timeout, none -> fetchResult.getErrorMessage(); - case success -> isUsingDynamicDataAllowed ? null : "Using dynamic data is not allowed"; - }; - } - - private PriceFloorRules noPriceFloorData(FetchStatus fetchStatus, - String accountId, - String requestId, - String errorMessage, - List warnings) { - - if (errorMessage != null) { - warnings.add(errorMessage); - conditionalLogger.error("No price floor data for account %s and request %s, reason: %s" - .formatted(accountId, requestId, errorMessage), logSamplingRate); - metrics.updateAlertsMetrics(MetricName.general); - } - - return createFloorsFrom(null, fetchStatus, PriceFloorLocation.noData); + return requestFloors == null || BooleanUtils.isNotTrue(requestFloors.getEnabled()) + ? createFloorsFrom(null, fetchStatus, PriceFloorLocation.noData) + : getPriceFloorRules( + bidRequest, account, requestFloors, fetchResult, isUsingDynamicDataAllowed, warnings); } private PriceFloorRules getPriceFloorRules(BidRequest bidRequest, Account account, PriceFloorRules requestFloors, - FetchStatus fetchStatus, - String fetchErrorMessage, + FetchResult fetchResult, + boolean isUsingDynamicDataAllowed, List warnings) { try { @@ -203,13 +179,36 @@ private PriceFloorRules getPriceFloorRules(BidRequest bidRequest, PriceFloorsConfigResolver.resolveMaxValue(maxRules), PriceFloorsConfigResolver.resolveMaxValue(maxDimensions)); - return createFloorsFrom(requestFloors, fetchStatus, PriceFloorLocation.request); + return createFloorsFrom(requestFloors, fetchResult.getFetchStatus(), PriceFloorLocation.request); } catch (PreBidException e) { - final String errorMessage = fetchErrorMessage == null + logErrorMessage(fetchResult, isUsingDynamicDataAllowed, e, account.getId(), bidRequest.getId(), warnings); + return createFloorsFrom(null, fetchResult.getFetchStatus(), PriceFloorLocation.noData); + } + } + + private void logErrorMessage(FetchResult fetchResult, + boolean isUsingDynamicDataAllowed, + PreBidException requestFloorsValidationException, + String accountId, + String requestId, + List warnings) { + + final String validationErrorMessage = requestFloorsValidationException.getMessage(); + final String errorMessage = switch (fetchResult.getFetchStatus()) { + case inprogress -> null; + case error, timeout, none -> "%s. Following parsing of request price floors is failed: %s" + .formatted(fetchResult.getErrorMessage(), validationErrorMessage); + case success -> isUsingDynamicDataAllowed ? null - : "%s. Following parsing of request price floors is failed: %s" - .formatted(fetchErrorMessage, e.getMessage()); - return noPriceFloorData(fetchStatus, account.getId(), bidRequest.getId(), errorMessage, warnings); + : "Using dynamic data is not allowed. Following parsing of request price floors is failed: %s" + .formatted(validationErrorMessage); + }; + + if (errorMessage != null) { + warnings.add(errorMessage); + conditionalLogger.error("No price floor data for account %s and request %s, reason: %s" + .formatted(accountId, requestId, errorMessage), logSamplingRate); + metrics.updateAlertsMetrics(MetricName.general); } } diff --git a/src/test/java/org/prebid/server/floors/BasicPriceFloorProcessorTest.java b/src/test/java/org/prebid/server/floors/BasicPriceFloorProcessorTest.java index 432b68c0c6b..23fe89d9db1 100644 --- a/src/test/java/org/prebid/server/floors/BasicPriceFloorProcessorTest.java +++ b/src/test/java/org/prebid/server/floors/BasicPriceFloorProcessorTest.java @@ -282,8 +282,8 @@ public void shouldNotUseFloorsFromProviderIfUseDynamicDataIsFalse() { .skipped(false) .location(PriceFloorLocation.noData) .build()); - verify(metrics).updateAlertsMetrics(MetricName.general); - assertThat(warnings).containsExactly("Using dynamic data is not allowed"); + verifyNoInteractions(metrics); + assertThat(warnings).isEmpty(); } @Test @@ -366,8 +366,8 @@ public void shouldNotUseFloorsWhenProviderFetchingIsDisabled() { .skipped(false) .location(PriceFloorLocation.noData) .build()); - verify(metrics).updateAlertsMetrics(MetricName.general); - assertThat(warnings).containsExactly("errorMessage"); + verifyNoInteractions(metrics); + assertThat(warnings).isEmpty(); } @Test @@ -417,8 +417,8 @@ public void shouldNotUseFloorsWhenProviderFetchingIsFailed() { .skipped(false) .location(PriceFloorLocation.noData) .build()); - verify(metrics).updateAlertsMetrics(MetricName.general); - assertThat(warnings).containsExactly("errorMessage"); + verifyNoInteractions(metrics); + assertThat(warnings).isEmpty(); } @Test @@ -469,8 +469,8 @@ public void shouldNotUseFloorsWhenProviderFetchingIsFailedWithTimeout() { .skipped(false) .location(PriceFloorLocation.noData) .build()); - verify(metrics).updateAlertsMetrics(MetricName.general); - assertThat(warnings).containsExactly("errorMessage"); + verifyNoInteractions(metrics); + assertThat(warnings).isEmpty(); } @Test @@ -1086,6 +1086,7 @@ private static PriceFloorRules givenFloors( UnaryOperator floorsCustomizer) { return floorsCustomizer.apply(PriceFloorRules.builder() + .enabled(true) .data(PriceFloorData.builder() .modelGroups(singletonList(PriceFloorModelGroup.builder() .value("someKey", BigDecimal.ONE)