From 5cac1d27f2e0d7ce9520761f68a70349c21ae174 Mon Sep 17 00:00:00 2001 From: EvgeniiMunin Date: Tue, 20 Aug 2024 11:20:02 +0200 Subject: [PATCH] refacto --- ...ConfiantAdQualityBidResponsesScanHook.java | 2 - .../modules/greenbids-real-time-data/pom.xml | 36 +++ .../GreenbidsRealTimeDataConfiguration.java | 3 +- .../real/time/data/core/Partner.java | 4 +- .../GreenbidsRealTimeDataProperties.java | 1 + .../time/data/model/GreenbidsUserAgent.java | 20 +- .../real/time/data/model/ModelCache.java | 46 +--- .../real/time/data/model/OnnxModelRunner.java | 6 +- .../real/time/data/model/ThresholdCache.java | 45 +--- .../data/v1/GreenbidsRealTimeDataModule.java | 1 + ...alTimeDataProcessedAuctionRequestHook.java | 212 +++++++----------- .../data/v1/model/analytics/ResultImpl.java | 1 + ...meDataProcessedAuctionRequestHookTest.java | 89 ++++---- ...diaFilterAllProcessedBidResponsesHook.java | 9 +- pom.xml | 22 ++ .../greenbids/GreenbidsAnalyticsReporter.java | 96 ++------ .../greenbids/model/Ortb2ImpExtResult.java | 1 - .../server/auction/ExchangeService.java | 2 - .../requestfactory/AuctionRequestFactory.java | 11 +- .../requestfactory/Ortb2RequestFactory.java | 28 +-- .../validation/BidderParamValidator.java | 3 - .../GreenbidsAnalyticsReporterTest.java | 79 +++---- 22 files changed, 295 insertions(+), 422 deletions(-) diff --git a/extra/modules/confiant-ad-quality/src/main/java/org/prebid/server/hooks/modules/com/confiant/adquality/v1/ConfiantAdQualityBidResponsesScanHook.java b/extra/modules/confiant-ad-quality/src/main/java/org/prebid/server/hooks/modules/com/confiant/adquality/v1/ConfiantAdQualityBidResponsesScanHook.java index 4a6c15d1663..7db1446bcce 100644 --- a/extra/modules/confiant-ad-quality/src/main/java/org/prebid/server/hooks/modules/com/confiant/adquality/v1/ConfiantAdQualityBidResponsesScanHook.java +++ b/extra/modules/confiant-ad-quality/src/main/java/org/prebid/server/hooks/modules/com/confiant/adquality/v1/ConfiantAdQualityBidResponsesScanHook.java @@ -119,8 +119,6 @@ private InvocationResult toInvocationResult( .payloadUpdate(payload -> AllProcessedBidResponsesPayloadImpl.of( Stream.concat(bidderResponsesWithoutIssues.stream(), notScannedBidderResponses.stream()).toList())); - System.out.println("ConfiantAdQualityBidResponsesScanHook/ InvocationResult: " + resultBuilder.build()); - return resultBuilder.build(); } diff --git a/extra/modules/greenbids-real-time-data/pom.xml b/extra/modules/greenbids-real-time-data/pom.xml index 0ab500027be..c207183b0d0 100644 --- a/extra/modules/greenbids-real-time-data/pom.xml +++ b/extra/modules/greenbids-real-time-data/pom.xml @@ -34,4 +34,40 @@ + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.4.0 + + + checkstyle + compile + + check + + + + + + checkstyle.xml + UTF-8 + true + + true + false + true + + + + com.puppycrawl.tools + checkstyle + 10.17.0 + + + + + + diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/config/GreenbidsRealTimeDataConfiguration.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/config/GreenbidsRealTimeDataConfiguration.java index 1db23d623a5..2e71192f7e5 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/config/GreenbidsRealTimeDataConfiguration.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/config/GreenbidsRealTimeDataConfiguration.java @@ -23,7 +23,8 @@ public class GreenbidsRealTimeDataConfiguration { @Bean GreenbidsRealTimeDataModule greenbidsRealTimeDataModule( - @Value("${hooks.modules.greenbids-real-time-data.google-cloud-greenbids-project}") String googleCloudGreenbidsProject, + @Value("${hooks.modules.greenbids-real-time-data.google-cloud-greenbids-project}") + String googleCloudGreenbidsProject, @Value("${hooks.modules.greenbids-real-time-data.gcs-bucket-name}") String gcsBucketName, @Value("${hooks.modules.greenbids-real-time-data.cache-expiration-minutes}") Integer cacheExpirationMinutes, @Value("${hooks.modules.greenbids-real-time-data.geo-lite-country-path}") String geoLiteCountryPath) { diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/Partner.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/Partner.java index 06f5223f385..2f53fc68b6f 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/Partner.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/core/Partner.java @@ -32,8 +32,8 @@ public Partner( } public Double getThresholdForPartner(ThrottlingThresholds throttlingThresholds) { - List truePositiveRates = throttlingThresholds.getTpr(); - List thresholds = throttlingThresholds.getThresholds(); + final List truePositiveRates = throttlingThresholds.getTpr(); + final List thresholds = throttlingThresholds.getThresholds(); return truePositiveRates.stream() .filter(truePositiveRate -> truePositiveRate >= targetTpr) diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsRealTimeDataProperties.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsRealTimeDataProperties.java index 46aca4db96e..3d901c28928 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsRealTimeDataProperties.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsRealTimeDataProperties.java @@ -7,6 +7,7 @@ @Value(staticConstructor = "of") public class GreenbidsRealTimeDataProperties { + @JsonProperty(value = "modelCacheWithExpiration", required = true) Cache modelCacheWithExpiration; diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsUserAgent.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsUserAgent.java index eb75129fafd..5a3d7735d01 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsUserAgent.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/GreenbidsUserAgent.java @@ -8,19 +8,23 @@ import java.util.Set; public class GreenbidsUserAgent { + public static final Set PC_OS_FAMILIES = Set.of( "Windows 95", "Windows 98", "Solaris"); + private static final Parser UA_PARSER = new Parser(); + private final String userAgentString; + private final UserAgent userAgent; + private final ua_parser.Device device; - private final ua_parser.OS os; - private static final Parser uaParser = new Parser(); + private final ua_parser.OS os; public GreenbidsUserAgent(String userAgentString) { this.userAgentString = userAgentString; - Client client = uaParser.parse(userAgentString); + final Client client = UA_PARSER.parse(userAgentString); this.userAgent = client.userAgent; this.device = client.device; this.os = client.os; @@ -43,10 +47,10 @@ public String getBrowser() { } public boolean isPC() { - return userAgentString.contains("Windows NT") || - PC_OS_FAMILIES.contains(os.family) || - ("Windows".equals(os.family) && "ME".equals(os.major)) || - ("Mac OS X".equals(os.family) && !userAgentString.contains("Silk")) || - userAgentString.contains("Linux") && userAgentString.contains("X11"); + return userAgentString.contains("Windows NT") + || PC_OS_FAMILIES.contains(os.family) + || ("Windows".equals(os.family) && "ME".equals(os.major)) + || ("Mac OS X".equals(os.family) && !userAgentString.contains("Silk")) + || userAgentString.contains("Linux") && userAgentString.contains("X11"); } } diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ModelCache.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ModelCache.java index 3263be9e283..5dfaf38d72f 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ModelCache.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ModelCache.java @@ -9,16 +9,19 @@ import lombok.Getter; import org.prebid.server.exception.PreBidException; -import java.util.Map; import java.util.concurrent.locks.ReentrantLock; public class ModelCache { String gcsBucketName; + String modelPath; + @Getter Cache cache; + Storage storage; + ReentrantLock lock; public ModelCache( @@ -34,39 +37,19 @@ public ModelCache( } public OnnxModelRunner getModelRunner(String pbuid) { - String cacheKey = "onnxModelRunner_" + pbuid; - - OnnxModelRunner cachedOnnxModelRunner = cache.getIfPresent(cacheKey); - System.out.println( - "getModelRunner: \n" + - " cacheKey: " + cacheKey + "\n" + - " cachedOnnxModelRunner: " + cachedOnnxModelRunner + "\n" + - " cache: " + cache - ); - - for (Map.Entry entry: cache.asMap().entrySet()) { - System.out.println("\nKey: " + entry.getKey() + ", Value: " + entry.getValue() + "\n"); - } + final String cacheKey = "onnxModelRunner_" + pbuid; + final OnnxModelRunner cachedOnnxModelRunner = cache.getIfPresent(cacheKey); if (cachedOnnxModelRunner != null) { - System.out.println("cachedOnnxModelRunner available"); return cachedOnnxModelRunner; - }; + } - boolean locked = lock.tryLock(); + final boolean locked = lock.tryLock(); try { if (locked) { - Blob blob = getBlob(); - - System.out.println( - "getModelRunner: \n" + - " blob: " + blob + "\n" + - " cache: " + cache - ); - + final Blob blob = getBlob(); cache.put(cacheKey, loadModelRunner(blob)); } else { - System.out.println("Another thread is updating the cache. Skipping fetching predictor."); return null; } } finally { @@ -80,23 +63,16 @@ public OnnxModelRunner getModelRunner(String pbuid) { private Blob getBlob() { try { - System.out.println( - "getBlob: \n" + - " storage: " + storage + "\n" + - " gcsBucketName: " + gcsBucketName + "\n" + - " modelPath: " + modelPath + "\n" - ); - Bucket bucket = storage.get(gcsBucketName); + final Bucket bucket = storage.get(gcsBucketName); return bucket.get(modelPath); } catch (StorageException e) { - System.out.println("Error accessing GCS artefact for model: " + e); throw new PreBidException("Error accessing GCS artefact for model: ", e); } } private OnnxModelRunner loadModelRunner(Blob blob) { try { - byte[] onnxModelBytes = blob.getContent(); + final byte[] onnxModelBytes = blob.getContent(); return new OnnxModelRunner(onnxModelBytes); } catch (OrtException e) { throw new RuntimeException("Failed to load ONNX model", e); diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/OnnxModelRunner.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/OnnxModelRunner.java index ba2b45b882f..c83110a72cc 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/OnnxModelRunner.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/OnnxModelRunner.java @@ -8,17 +8,19 @@ import java.util.Collections; public class OnnxModelRunner { + private OrtSession session; + private OrtEnvironment environment; public OnnxModelRunner(byte[] onnxModelBytes) throws OrtException { environment = OrtEnvironment.getEnvironment(); - OrtSession.SessionOptions options = new OrtSession.SessionOptions(); + final OrtSession.SessionOptions options = new OrtSession.SessionOptions(); session = environment.createSession(onnxModelBytes, options); } public OrtSession.Result runModel(String[][] throttlingInferenceRow) throws OrtException { - OnnxTensor inputTensor = OnnxTensor.createTensor(OrtEnvironment.getEnvironment(), throttlingInferenceRow); + final OnnxTensor inputTensor = OnnxTensor.createTensor(OrtEnvironment.getEnvironment(), throttlingInferenceRow); return session.run(Collections.singletonMap("input", inputTensor)); } } diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ThresholdCache.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ThresholdCache.java index 2eeea7c357a..91a4ff8eb9a 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ThresholdCache.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/model/ThresholdCache.java @@ -11,7 +11,6 @@ import org.prebid.server.hooks.modules.greenbids.real.time.data.core.ThrottlingThresholds; import java.io.IOException; -import java.util.Map; import java.util.concurrent.locks.ReentrantLock; public class ThresholdCache { @@ -39,39 +38,19 @@ public ThresholdCache( } public ThrottlingThresholds getThrottlingThresholds(String pbuid) { - String cacheKey = "throttlingThresholds_" + pbuid; - - ThrottlingThresholds cachedThrottlingThresholds = cache.getIfPresent(cacheKey); - System.out.println( - "getThrottlingThresholds: \n" + - " cacheKey: " + cacheKey + "\n" + - " cachedThrottlingThresholds: " + cachedThrottlingThresholds + "\n" + - " cache: " + cache - ); - - for (Map.Entry entry: cache.asMap().entrySet()) { - System.out.println("\nKey: " + entry.getKey() + ", Value: " + entry.getValue() + "\n"); - } + final String cacheKey = "throttlingThresholds_" + pbuid; + final ThrottlingThresholds cachedThrottlingThresholds = cache.getIfPresent(cacheKey); if (cachedThrottlingThresholds != null) { - System.out.println("cachedThrottlingThresholds available"); return cachedThrottlingThresholds; - }; + } - boolean locked = lock.tryLock(); + final boolean locked = lock.tryLock(); try { if (locked) { - Blob blob = getBlob(); - - System.out.println( - "getThrottlingThresholds: \n" + - "read blob: " + blob + "\n" + - "put in cache: " + cache - ); - + final Blob blob = getBlob(); cache.put(cacheKey, loadThrottlingThresholds(blob)); } else { - System.out.println("Another thread is updating the cache. Skipping fetching predictor."); return null; } } finally { @@ -85,26 +64,18 @@ public ThrottlingThresholds getThrottlingThresholds(String pbuid) { private Blob getBlob() { try { - System.out.println( - "getBlob: \n" + - "storage: " + storage + "\n" + - "gcsBucketName: " + gcsBucketName + "\n" + - "thresholdPath: " + thresholdPath + "\n" - ); return storage.get(gcsBucketName).get(thresholdPath); } catch (StorageException e) { - System.out.println("Error accessing GCS artefact for threshold: " + e); throw new PreBidException("Error accessing GCS artefact for threshold: ", e); } } private ThrottlingThresholds loadThrottlingThresholds(Blob blob) { - JsonNode thresholdsJsonNode; + final JsonNode thresholdsJsonNode; try { - byte[] jsonBytes = blob.getContent(); + final byte[] jsonBytes = blob.getContent(); thresholdsJsonNode = mapper.readTree(jsonBytes); - ThrottlingThresholds throttlingThresholds = mapper.treeToValue(thresholdsJsonNode, ThrottlingThresholds.class); - return throttlingThresholds; + return mapper.treeToValue(thresholdsJsonNode, ThrottlingThresholds.class); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataModule.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataModule.java index 15791c1bf95..8eb103e58d4 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataModule.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataModule.java @@ -8,6 +8,7 @@ import java.util.List; public class GreenbidsRealTimeDataModule implements Module { + public static final String CODE = "greenbids-real-time-data"; private final List> hooks; diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java index c1c9a74fd6e..e47d5ed94eb 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java @@ -67,6 +67,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.StreamSupport; public class GreenbidsRealTimeDataProcessedAuctionRequestHook implements ProcessedAuctionRequestHook { @@ -79,11 +80,11 @@ public class GreenbidsRealTimeDataProcessedAuctionRequestHook implements Process private final ObjectMapper mapper; private final JacksonMapper jacksonMapper; - private Cache modelCacheWithExpiration; - private Cache thresholdsCacheWithExpiration; - private static String geoLiteCountryPath; - private String googleCloudGreenbidsProject; - private String gcsBucketName; + private final Cache modelCacheWithExpiration; + private final Cache thresholdsCacheWithExpiration; + private final String geoLiteCountryPath; + private final String googleCloudGreenbidsProject; + private final String gcsBucketName; public GreenbidsRealTimeDataProcessedAuctionRequestHook( ObjectMapper mapper, @@ -106,13 +107,12 @@ public Future> call( AuctionRequestPayload auctionRequestPayload, AuctionInvocationContext invocationContext) { - AuctionContext auctionContext = invocationContext.auctionContext(); + final AuctionContext auctionContext = invocationContext.auctionContext(); final ZonedDateTime timestamp = ZonedDateTime.now(ZoneId.of("UTC")); final Integer hourBucket = timestamp.getHour(); final Integer minuteQuadrant = (timestamp.getMinute() / 15) + 1; - // extract pbuid from BidRequest extension final BidRequest bidRequest = auctionContext.getBidRequest(); final Partner partner = parseBidRequestExt(bidRequest); @@ -121,115 +121,95 @@ public Future> call( bidRequest, null, InvocationAction.no_action)); } - // check if publisher activated RTD final String userAgent = Optional.ofNullable(bidRequest.getDevice()) .map(Device::getUa) .orElse(null); - GreenbidsUserAgent greenbidsUserAgent = new GreenbidsUserAgent(userAgent); + final GreenbidsUserAgent greenbidsUserAgent = new GreenbidsUserAgent(userAgent); OnnxModelRunner onnxModelRunner = null; Double threshold = null; try { - // select partner + extract threshold by TPR - Storage storage = StorageOptions.newBuilder() + final Storage storage = StorageOptions.newBuilder() .setProjectId(googleCloudGreenbidsProject).build().getService(); - String onnxModelPath = "models_pbuid=" + partner.getPbuid() + ".onnx"; - ModelCache modelCache = new ModelCache(onnxModelPath, storage, gcsBucketName, modelCacheWithExpiration); + final String onnxModelPath = "models_pbuid=" + partner.getPbuid() + ".onnx"; + final ModelCache modelCache = new ModelCache( + onnxModelPath, storage, gcsBucketName, modelCacheWithExpiration); onnxModelRunner = modelCache.getModelRunner(partner.getPbuid()); - String thresholdJsonPath = "thresholds_pbuid=" + partner.getPbuid() + ".json"; - ThresholdCache thresholdCache = new ThresholdCache( + final String thresholdJsonPath = "thresholds_pbuid=" + partner.getPbuid() + ".json"; + final ThresholdCache thresholdCache = new ThresholdCache( thresholdJsonPath, storage, gcsBucketName, mapper, thresholdsCacheWithExpiration); - ThrottlingThresholds throttlingThresholds = thresholdCache.getThrottlingThresholds(partner.getPbuid()); + final ThrottlingThresholds throttlingThresholds = thresholdCache + .getThrottlingThresholds(partner.getPbuid()); threshold = partner.getThresholdForPartner(throttlingThresholds); } catch (PreBidException e) { - System.out.println("Return Future.succeededFuture(): " + e); return Future.succeededFuture(toInvocationResult( bidRequest, null, InvocationAction.no_action)); } - List throttlingMessages = extractThrottlingMessages( + final List throttlingMessages = extractThrottlingMessages( bidRequest, greenbidsUserAgent, hourBucket, minuteQuadrant); - String[][] throttlingInferenceRow = convertToArray(throttlingMessages); - - System.out.println( - "GreenbidsRealTimeDataProcessedAuctionRequestHook/call" + "\n" + - "partner: " + partner + "\n" + - "threshold: " + threshold + "\n" + - "onnxModelRunner: " + onnxModelRunner + "\n" + - "throttlingMessages: " + throttlingMessages + "\n" - ); - - for (String[] row : throttlingInferenceRow) { - for (String col : row) { - System.out.print(col + " "); - } - System.out.println(); - } + final String[][] throttlingInferenceRow = convertToArray(throttlingMessages); if (isAnyFeatureNull(throttlingInferenceRow)) { return Future.succeededFuture(toInvocationResult( bidRequest, null, InvocationAction.no_action)); } - OrtSession.Result results; + final OrtSession.Result results; try { results = onnxModelRunner.runModel(throttlingInferenceRow); } catch (OrtException e) { throw new RuntimeException(e); } - Map> impsBiddersFilterMap = new HashMap<>(); + final Map> impsBiddersFilterMap = new HashMap<>(); final Double finalThreshold = threshold; StreamSupport.stream(results.spliterator(), false) .filter(onnxItem -> Objects.equals(onnxItem.getKey(), "probabilities")) .forEach(onnxItem -> { - System.out.println("Output: " + onnxItem.getKey() + ": " + onnxItem.getValue().toString()); - OnnxValue onnxValue = onnxItem.getValue(); - OnnxTensor tensor = (OnnxTensor) onnxValue; + final OnnxValue onnxValue = onnxItem.getValue(); + final OnnxTensor tensor = (OnnxTensor) onnxValue; try { - float[][] probas = (float[][]) tensor.getValue(); - System.out.println( - " tensor.getValue(): " + tensor.getValue() + - "\n probas: " + Arrays.deepToString(probas) - ); - - // process probas and create map - for (int i = 0; i < probas.length; i++) { - ThrottlingMessage message = throttlingMessages.get(i); - String impId = message.getAdUnitCode(); - String bidder = message.getBidder(); - boolean isKeptInAuction = probas[i][1] > finalThreshold; - impsBiddersFilterMap.computeIfAbsent(impId, k -> new HashMap<>()) - .put(bidder, isKeptInAuction); - } + final float[][] probas = (float[][]) tensor.getValue(); + IntStream.range(0, probas.length) + .mapToObj(i -> { + final ThrottlingMessage message = throttlingMessages.get(i); + final String impId = message.getAdUnitCode(); + final String bidder = message.getBidder(); + final boolean isKeptInAuction = probas[i][1] > finalThreshold; + return Map.entry(impId, Map.entry(bidder, isKeptInAuction)); + }) + .forEach(entry -> impsBiddersFilterMap + .computeIfAbsent(entry.getKey(), k -> new HashMap<>()) + .put(entry.getValue().getKey(), entry.getValue().getValue())); } catch (OrtException e) { throw new RuntimeException(e); } }); - // exploration result for analytics adapter final String greenbidsId = UUID.randomUUID().toString(); final int hashInt = Integer.parseInt( greenbidsId.substring(greenbidsId.length() - 4), 16); final boolean isExploration = hashInt < partner.getExplorationRate() * RANGE_16_BIT_INTEGER_DIVISION_BASIS; - // update Bid Request with filtered bidders - List impsWithFilteredBidders = updateImps(bidRequest, impsBiddersFilterMap); - BidRequest updatedBidRequest = !isExploration + final List impsWithFilteredBidders = updateImps(bidRequest, impsBiddersFilterMap); + final BidRequest updatedBidRequest = !isExploration ? bidRequest.toBuilder().imp(impsWithFilteredBidders).build() : bidRequest; - InvocationAction invocationAction = !isExploration ? InvocationAction.update : InvocationAction.no_action; - Map> impsBiddersFilterMapToAnalyticsTag = !isExploration + final InvocationAction invocationAction = !isExploration + ? InvocationAction.update + : InvocationAction.no_action; + final Map> impsBiddersFilterMapToAnalyticsTag = !isExploration ? impsBiddersFilterMap : keepAllBiddersForAnalyticsResult(impsBiddersFilterMap); @@ -238,19 +218,6 @@ public Future> call( final AnalyticsResult analyticsResult = AnalyticsResult.of( "success", ort2ImpExtResultMap, null, null); - System.out.println( - "GreenbidsRealTimeDataProcessedAuctionRequestHook/call" + "\n" + - " explorationRate: " + partner.getExplorationRate() + "\n" + - " isExploration: " + isExploration + "\n" + - " impsBiddersFilterMap: " + impsBiddersFilterMap + "\n" + - " impsBiddersFilterMapToAnalyticsTag: " + impsBiddersFilterMapToAnalyticsTag + "\n" + - " impsWithFilteredBidders: " + impsWithFilteredBidders + "\n" + - " updatedBidRequest: " + updatedBidRequest + "\n" + - " AnalyticsTag: " + toAnalyticsTags(Collections.singletonList(analyticsResult)) + "\n" + - " ort2ImpExtResultMap: " + ort2ImpExtResultMap + "\n" + - " analyticsResult: " + analyticsResult - ); - return Future.succeededFuture(toInvocationResult( updatedBidRequest, analyticsResult, invocationAction)); } @@ -263,10 +230,10 @@ private Boolean isAnyFeatureNull(String[][] throttlingInferenceRow) { private Map> keepAllBiddersForAnalyticsResult( Map> impsBiddersFilterMap) { - for (Map.Entry> impEntry: impsBiddersFilterMap.entrySet()) { - Map biddersMap = impEntry.getValue(); - biddersMap.replaceAll((bidder, value) -> true); - } + impsBiddersFilterMap.replaceAll((impId, biddersMap) -> + biddersMap + .entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> true))); return impsBiddersFilterMap; } @@ -275,7 +242,7 @@ private InvocationResult toInvocationResult( AnalyticsResult analyticsResult, InvocationAction action ) { - List analyticsResults = (analyticsResult != null) + final List analyticsResults = (analyticsResult != null) ? Collections.singletonList(analyticsResult) : Collections.emptyList(); @@ -322,9 +289,9 @@ private Map createOrtb2ImpExt( .collect(Collectors.toMap( Imp::getId, imp -> { - String tid = imp.getExt().get("tid").asText(); - Map impBiddersFilterMap = impsBiddersFilterMap.get(imp.getId()); - ExplorationResult explorationResult = ExplorationResult.of( + final String tid = imp.getExt().get("tid").asText(); + final Map impBiddersFilterMap = impsBiddersFilterMap.get(imp.getId()); + final ExplorationResult explorationResult = ExplorationResult.of( greenbidsId, impBiddersFilterMap, isExploration); return Ortb2ImpExtResult.of( explorationResult, tid); @@ -376,22 +343,14 @@ private Imp updateImp(Imp imp, Map bidderFilterMap) { } private ObjectNode updateImpExt(ObjectNode impExt, Map bidderFilterMap) { - ObjectNode updatedExt = impExt.deepCopy(); - ObjectNode prebidNode = (ObjectNode) updatedExt.get("prebid"); - if (prebidNode != null) { - ObjectNode bidderNode = (ObjectNode) prebidNode.get("bidder"); - if (bidderNode != null) { - for(Map.Entry entry: bidderFilterMap.entrySet()) { - String bidderName = entry.getKey(); - Boolean isKeptInAuction = entry.getValue(); - - if (!isKeptInAuction) { - bidderNode.remove(bidderName); - } - } - } - } - + final ObjectNode updatedExt = impExt.deepCopy(); + Optional.ofNullable((ObjectNode) updatedExt.get("prebid")) + .map(prebidNode -> (ObjectNode) prebidNode.get("bidder")) + .ifPresent(bidderNode -> + bidderFilterMap.entrySet().stream() + .filter(entry -> !entry.getValue()) + .map(Map.Entry::getKey) + .forEach(bidderNode::remove)); return updatedExt; } @@ -401,38 +360,31 @@ private List extractThrottlingMessages( Integer hourBucket, Integer minuteQuadrant) { final String hostname = bidRequest.getSite().getDomain(); - List imps = bidRequest.getImp(); + final List imps = bidRequest.getImp(); return imps.stream() .flatMap(imp -> { final String impId = imp.getId(); final ObjectNode impExt = imp.getExt(); - JsonNode bidderNode = extImpPrebid(impExt.get("prebid")).getBidder(); + final JsonNode bidderNode = extImpPrebid(impExt.get("prebid")).getBidder(); - List throttlingImpMessages = new ArrayList<>(); + final List throttlingImpMessages = new ArrayList<>(); final String ipv4 = Optional.ofNullable(bidRequest.getDevice()) .map(Device::getIp) .orElse(null); - String countryFromIp; + final String countryFromIp; try { countryFromIp = getCountry(ipv4); } catch (IOException | GeoIp2Exception e) { throw new RuntimeException(e); } - System.out.println( - "extractThrottlingMessages" + "\n" + - "countryFromIp: " + countryFromIp + "\n" + - "greenbidsUserAgent.getBrowser(): " + greenbidsUserAgent.getBrowser() + "\n" + - "greenbidsUserAgent.getDevice(): " + greenbidsUserAgent.getDevice() + "\n" - ); - if (bidderNode.isObject()) { - ObjectNode bidders = (ObjectNode) bidderNode; - Iterator fieldNames = bidders.fieldNames(); + final ObjectNode bidders = (ObjectNode) bidderNode; + final Iterator fieldNames = bidders.fieldNames(); while (fieldNames.hasNext()) { - String bidderName = fieldNames.next(); + final String bidderName = fieldNames.next(); throttlingImpMessages.add( ThrottlingMessage.builder() .browser(greenbidsUserAgent.getBrowser()) @@ -451,17 +403,17 @@ private List extractThrottlingMessages( .collect(Collectors.toList()); } - public static String getCountry(String ip) throws IOException, GeoIp2Exception { + private String getCountry(String ip) throws IOException, GeoIp2Exception { if (ip == null) { return null; } - File database = new File(geoLiteCountryPath); - DatabaseReader dbReader = new DatabaseReader.Builder(database).build(); + final File database = new File(geoLiteCountryPath); + final DatabaseReader dbReader = new DatabaseReader.Builder(database).build(); - InetAddress ipAddress = InetAddress.getByName(ip); - CountryResponse response = dbReader.country(ipAddress); - Country country = response.getCountry(); + final InetAddress ipAddress = InetAddress.getByName(ip); + final CountryResponse response = dbReader.country(ipAddress); + final Country country = response.getCountry(); return country.getName(); } @@ -473,20 +425,18 @@ private ExtImpPrebid extImpPrebid(JsonNode extImpPrebid) { } } - private static String[][] convertToArray(List messages) { - String[][] result = new String[messages.size()][8]; - for (int i = 0; i < messages.size(); i++) { - ThrottlingMessage message = messages.get(i); - result[i][0] = message.getBrowser(); - result[i][1] = message.getBidder(); - result[i][2] = message.getAdUnitCode(); - result[i][3] = message.getCountry(); - result[i][4] = message.getHostname(); - result[i][5] = message.getDevice(); - result[i][6] = message.getHourBucket(); - result[i][7] = message.getMinuteQuadrant(); - } - return result; + private String[][] convertToArray(List messages) { + return messages.stream() + .map(message -> new String[]{ + message.getBrowser(), + message.getBidder(), + message.getAdUnitCode(), + message.getCountry(), + message.getHostname(), + message.getDevice(), + message.getHourBucket(), + message.getMinuteQuadrant()}) + .toArray(String[][]::new); } @Override diff --git a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/model/analytics/ResultImpl.java b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/model/analytics/ResultImpl.java index 9f4f507280d..d234a59eb31 100644 --- a/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/model/analytics/ResultImpl.java +++ b/extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/model/analytics/ResultImpl.java @@ -9,6 +9,7 @@ @Accessors(fluent = true) @Value(staticConstructor = "of") public class ResultImpl implements Result { + String status; ObjectNode values; diff --git a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java index d61ee4167e5..9a804731c6d 100644 --- a/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java +++ b/extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java @@ -59,18 +59,18 @@ public class GreenbidsRealTimeDataProcessedAuctionRequestHookTest { - long CACHE_EXPIRATION_MINUTES = 15; + private static final long CACHE_EXPIRATION_MINUTES = 15; - String GEO_LITE_COUNTRY_PATH = + private static final String GEO_LITE_COUNTRY_PATH = "src/test/resources/GeoLite2-Country.mmdb"; - String MODEL_PATH = "src/test/resources/models_pbuid=lelp-pbuid.onnx"; + private static final String MODEL_PATH = "src/test/resources/models_pbuid=lelp-pbuid.onnx"; - String JSON_PATH = "src/test/resources/thresholds_pbuid=lelp-pbuid.json"; + private static final String JSON_PATH = "src/test/resources/thresholds_pbuid=lelp-pbuid.json"; - String GOOCLE_CLOUD_PROJECT = "test_project"; + private static final String GOOGLE_CLOUD_PROJECT = "test_project"; - String GCS_BUCKET_NAME = "test_bucket"; + private static final String GCS_BUCKET_NAME = "test_bucket"; @Rule public final MockitoRule mockitoRule = MockitoJUnit.rule(); @@ -102,7 +102,7 @@ public void setUp() { modelCacheWithExpiration, thresholdsCacheWithExpiration, GEO_LITE_COUNTRY_PATH, - GOOCLE_CLOUD_PROJECT, + GOOGLE_CLOUD_PROJECT, GCS_BUCKET_NAME); modelCache = new ModelCache( null, null, null, modelCacheWithExpiration); @@ -135,10 +135,10 @@ public void shouldExitEarlyIfPartnerNotActivatedInBidRequest() throws IOExceptio thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds()); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -178,13 +178,13 @@ public void shouldExitEarlyIfThresholdIsNotAvailable() throws OrtException, IOEx modelCache.getCache().cleanUp(); thresholdCache.getCache().cleanUp(); - modelCache.getCache().put("onnxModelRunner_lelp-pbuid", givenOnnxModelRunner() ); + modelCache.getCache().put("onnxModelRunner_lelp-pbuid", givenOnnxModelRunner()); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -224,13 +224,13 @@ public void shouldExitEarlyIfModelIsNotAvailable() throws IOException { modelCache.getCache().cleanUp(); thresholdCache.getCache().cleanUp(); - thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds() ); + thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds()); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -273,13 +273,13 @@ public void shouldNotFilterBiddersAndReturnAnalyticsTagWhenExploration() throws modelCache.getCache().put("onnxModelRunner_lelp-pbuid", givenOnnxModelRunner()); thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds()); - AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, true); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, true); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -295,10 +295,10 @@ public void shouldNotFilterBiddersAndReturnAnalyticsTagWhenExploration() throws assertThat(result.analyticsTags()).isNotNull(); assertThat(result.analyticsTags()).usingRecursiveComparison() .ignoringFields( - "activities.results" + - ".values._children" + - ".adunitcodevalue._children" + - ".greenbids._children.fingerprint", + "activities.results" + + ".values._children" + + ".adunitcodevalue._children" + + ".greenbids._children.fingerprint", "activities.results.values._children.adunitcodevalue._children.tid") .isEqualTo(toAnalyticsTags(List.of(expectedAnalyticsResult))); assertThat(resultBidRequest).usingRecursiveComparison() @@ -330,10 +330,10 @@ public void shouldNotFilterBiddersIfAnyFeatureNotAvailable() throws OrtException thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds()); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -378,13 +378,13 @@ public void shouldFilterBiddersBasedOnModelResults() throws OrtException, IOExce modelCache.getCache().put("onnxModelRunner_lelp-pbuid", givenOnnxModelRunner()); thresholdCache.getCache().put("throttlingThresholds_lelp-pbuid", givenThrottlingThresholds()); - AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false); + final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false); // when - Future> future = hook + final Future> future = hook .call(null, invocationContext); final InvocationResult result = future.result(); - BidRequest resultBidRequest = result + final BidRequest resultBidRequest = result .payloadUpdate() .apply(AuctionRequestPayloadImpl.of(bidRequest)) .bidRequest(); @@ -400,10 +400,10 @@ public void shouldFilterBiddersBasedOnModelResults() throws OrtException, IOExce assertThat(result.analyticsTags()).isNotNull(); assertThat(result.analyticsTags()).usingRecursiveComparison() .ignoringFields( - "activities.results" + - ".values._children" + - ".adunitcodevalue._children" + - ".greenbids._children.fingerprint", + "activities.results" + + ".values._children" + + ".adunitcodevalue._children" + + ".greenbids._children.fingerprint", "activities.results.values._children.adunitcodevalue._children.tid") .isEqualTo(toAnalyticsTags(List.of(expectedAnalyticsResult))); assertThat(resultBidRequest).usingRecursiveComparison() @@ -412,39 +412,39 @@ public void shouldFilterBiddersBasedOnModelResults() throws OrtException, IOExce } private OnnxModelRunner givenOnnxModelRunner() throws OrtException, IOException { - byte[] onnxModelBytes = Files.readAllBytes(Paths.get(MODEL_PATH)); + final byte[] onnxModelBytes = Files.readAllBytes(Paths.get(MODEL_PATH)); return new OnnxModelRunner(onnxModelBytes); } private ThrottlingThresholds givenThrottlingThresholds() throws IOException { - JsonNode thresholdsJsonNode = jacksonMapper.mapper().readTree( + final JsonNode thresholdsJsonNode = jacksonMapper.mapper().readTree( Files.newInputStream(Paths.get(JSON_PATH))); return jacksonMapper.mapper() .treeToValue(thresholdsJsonNode, ThrottlingThresholds.class); } private ObjectNode givenImpExt() { - ObjectNode bidderNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode bidderNode = jacksonMapper.mapper().createObjectNode(); - ObjectNode rubiconNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode rubiconNode = jacksonMapper.mapper().createObjectNode(); rubiconNode.put("accountId", 1001); rubiconNode.put("siteId", 267318); rubiconNode.put("zoneId", 1861698); bidderNode.set("rubicon", rubiconNode); - ObjectNode appnexusNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode appnexusNode = jacksonMapper.mapper().createObjectNode(); appnexusNode.put("placementId", 123456); bidderNode.set("appnexus", appnexusNode); - ObjectNode pubmaticNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode pubmaticNode = jacksonMapper.mapper().createObjectNode(); pubmaticNode.put("publisherId", "156209"); pubmaticNode.put("adSlot", "slot1@300x250"); bidderNode.set("pubmatic", pubmaticNode); - ObjectNode prebidNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode prebidNode = jacksonMapper.mapper().createObjectNode(); prebidNode.set("bidder", bidderNode); - ObjectNode extNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode extNode = jacksonMapper.mapper().createObjectNode(); extNode.set("prebid", prebidNode); extNode.set("tid", null); @@ -452,7 +452,7 @@ private ObjectNode givenImpExt() { } private AuctionInvocationContext givenAuctionInvocationContext(AuctionContext auctionContext) { - AuctionInvocationContext invocationContext = mock(AuctionInvocationContext.class); + final AuctionInvocationContext invocationContext = mock(AuctionInvocationContext.class); when(invocationContext.auctionContext()).thenReturn(auctionContext); return invocationContext; } @@ -486,8 +486,8 @@ private static BidRequest expectedUpdatedBidRequest( Double explorationRate) { final Banner banner = givenBanner(); - ObjectNode bidderNode = jacksonMapper.mapper().createObjectNode(); - ObjectNode prebidNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode bidderNode = jacksonMapper.mapper().createObjectNode(); + final ObjectNode prebidNode = jacksonMapper.mapper().createObjectNode(); prebidNode.set("bidder", bidderNode); final ObjectNode extNode = jacksonMapper.mapper().createObjectNode(); @@ -509,7 +509,8 @@ private static BidRequest expectedUpdatedBidRequest( } private static Device givenDevice(UnaryOperator deviceCustomizer) { - final String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; + final String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36" + + " (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; return deviceCustomizer.apply(Device.builder().ua(userAgent).ip("151.101.194.216")).build(); } @@ -585,7 +586,7 @@ private static Ortb2ImpExtResult expectedOrtb2ImpExtResult(Boolean isExploration } private static ExplorationResult expectedExplorationResult(Boolean isExploration, Boolean isKeptInAuction) { - Map keptInAuction = new HashMap<>(); + final Map keptInAuction = new HashMap<>(); keptInAuction.put("appnexus", isKeptInAuction); keptInAuction.put("pubmatic", isKeptInAuction); keptInAuction.put("rubicon", isKeptInAuction); diff --git a/extra/modules/pb-richmedia-filter/src/main/java/org/prebid/server/hooks/modules/pb/richmedia/filter/v1/PbRichmediaFilterAllProcessedBidResponsesHook.java b/extra/modules/pb-richmedia-filter/src/main/java/org/prebid/server/hooks/modules/pb/richmedia/filter/v1/PbRichmediaFilterAllProcessedBidResponsesHook.java index ee92a5e2064..a25e2b88d6e 100644 --- a/extra/modules/pb-richmedia-filter/src/main/java/org/prebid/server/hooks/modules/pb/richmedia/filter/v1/PbRichmediaFilterAllProcessedBidResponsesHook.java +++ b/extra/modules/pb-richmedia-filter/src/main/java/org/prebid/server/hooks/modules/pb/richmedia/filter/v1/PbRichmediaFilterAllProcessedBidResponsesHook.java @@ -65,12 +65,13 @@ public Future> call( final InvocationAction action = filterResult.hasRejectedBids() ? InvocationAction.update : InvocationAction.no_action; - return Future.succeededFuture(toInvocationResult( - filterResult.getFilterResult(), - toAnalyticsTags(filterResult.getAnalyticsResult()), - action)); + return Future.succeededFuture(toInvocationResult(filterResult.getFilterResult(), toAnalyticsTags(filterResult.getAnalyticsResult()), action)); } + + + + return Future.succeededFuture(toInvocationResult( responses, toAnalyticsTags(Collections.emptyList()), diff --git a/pom.xml b/pom.xml index e7189693a5f..a097bde4b7b 100644 --- a/pom.xml +++ b/pom.xml @@ -389,6 +389,28 @@ + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle-plugin.version} + + + checkstyle.xml + UTF-8 + true + + true + false + true + + + + com.puppycrawl.tools + checkstyle + ${checkstyle.version} + + + org.codehaus.gmavenplus gmavenplus-plugin diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java index 5cfa74e13c6..ed26c23c2cb 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java @@ -128,7 +128,8 @@ public Future processEvent(T event) { final String billingId = UUID.randomUUID().toString(); - final Map analyticsResultFromAnalyticsTag = extractAnalyticsResultFromAnalyticsTag(bidResponse); + final Map analyticsResultFromAnalyticsTag = extractAnalyticsResultFromAnalyticsTag( + bidResponse); final String greenbidsId = Optional.ofNullable(analyticsResultFromAnalyticsTag) .flatMap(analyticsResult -> analyticsResult.values().stream() @@ -139,21 +140,6 @@ public Future processEvent(T event) { .findFirst()) .orElse(UUID.randomUUID().toString()); - /* - final String greenbidsId = analyticsResultFromAnalyticsTag.values().stream() - .map(ortb2ImpExtResult -> - Optional.ofNullable(ortb2ImpExtResult.getGreenbids()) - .map(ExplorationResult::getFingerprint) - .orElse(UUID.randomUUID().toString())) - .findFirst().orElse(null); - */ - - System.out.println( - "GreenbidsAnalyticsReporter/processEvent" + "\n" + - "analyticsResultFromAnalyticsTag: " + analyticsResultFromAnalyticsTag + "\n" + - "greenbidsId: " + greenbidsId - ); - if (!isSampled(greenbidsBidRequestExt.getGreenbidsSampling(), greenbidsId)) { return Future.succeededFuture(); } @@ -190,24 +176,11 @@ public Future processEvent(T event) { commonMessageJson, greenbidsAnalyticsProperties.getTimeoutMs()); - responseFuture - .onSuccess(response -> - System.out.println( - "Analytics Server response body: " + - response.getStatusCode() + "\n" + - response.getHeaders() + "\n" + - response.getBody() + "\n" + - commonMessageJson - )) - .onFailure(error -> System.out.println("Can't send payload to Analytics Server: " + error)); - - return responseFuture.compose(this::processAnalyticServerResponse); } private Map extractAnalyticsResultFromAnalyticsTag(BidResponse bidResponse) { - - final List stageOutcomes = Optional.ofNullable(bidResponse) + return Optional.ofNullable(bidResponse) .map(BidResponse::getExt) .map(ExtBidResponse::getPrebid) .map(ExtBidResponsePrebid::getModules) @@ -216,9 +189,7 @@ private Map extractAnalyticsResultFromAnalyticsTag(Bi .flatMap(stages -> stages.stream() .filter(stage -> Stage.processed_auction_request.equals(stage.getStage())) .findFirst()) - .map(ExtModulesTraceStage::getOutcomes).orElse(null); // OK - - final Optional extModulesTraceInvocationResult = Optional.ofNullable(stageOutcomes) + .map(ExtModulesTraceStage::getOutcomes) .flatMap(outcomes -> outcomes.stream() .filter(outcome -> "auction-request".equals(outcome.getEntity())) .findFirst()) @@ -228,60 +199,32 @@ private Map extractAnalyticsResultFromAnalyticsTag(Bi .flatMap(invocationResults -> invocationResults.stream() .filter(invocationResult -> "greenbids-real-time-data" .equals(invocationResult.getHookId().getModuleCode())) - .findFirst()); // OK - - final Optional analyticsResultValue = extModulesTraceInvocationResult + .findFirst()) .map(ExtModulesTraceInvocationResult::getAnalyticsTags) .map(ExtModulesTraceAnalyticsTags::getActivities) .flatMap(activities -> activities.stream() .flatMap(activity -> activity.getResults().stream()) .findFirst()) - .map(ExtModulesTraceAnalyticsResult::getValues); - - System.out.println( - "GreenbidsAnalyticsReporter/ extractAnalyticsResultFromAnalyticsTag" + "\n" + - "outcomes: " + stageOutcomes + "\n" + - "extModulesTraceInvocationResult: " + extModulesTraceInvocationResult + "\n" + - "analyticsResultValue: " + analyticsResultValue - ); - - final Map parsedAnalyticsResultsMap = analyticsResultValue + .map(ExtModulesTraceAnalyticsResult::getValues) .map(analyticsResult -> { try { - Map parsedAnalyticsResult = new HashMap<>(); - Iterator> fields = analyticsResult.fields(); - // iterate over elements of objectNode by imp + final Map parsedAnalyticsResult = new HashMap<>(); + final Iterator> fields = analyticsResult.fields(); + while (fields.hasNext()) { - Map.Entry field = fields.next(); - String impId = field.getKey(); - JsonNode explorationResultNode = field.getValue(); - Ortb2ImpExtResult ortb2ImpExtResult = jacksonMapper.mapper().treeToValue(explorationResultNode, Ortb2ImpExtResult.class); + final Map.Entry field = fields.next(); + final String impId = field.getKey(); + final JsonNode explorationResultNode = field.getValue(); + final Ortb2ImpExtResult ortb2ImpExtResult = jacksonMapper.mapper() + .treeToValue(explorationResultNode, Ortb2ImpExtResult.class); parsedAnalyticsResult.put(impId, ortb2ImpExtResult); } - System.out.println( - "GreenbidsAnalyticsReporter/ extractAnalyticsResultFromAnalyticsTag/ analyticsResultValue" + "\n" + - "parsedAnalyticsResult: " + parsedAnalyticsResult + "\n" + - "fields: " + fields - ); - return parsedAnalyticsResult; } catch (JsonProcessingException e) { - throw new PreBidException("analytics result parsing error", e); + throw new PreBidException("Analytics result parsing error", e); } }).orElse(null); - - System.out.println( - "GreenbidsAnalyticsReporter/ extractAnalyticsResultFromAnalyticsTag" + "\n" + - //"extBidResponsePrebid: " + extBidResponsePrebid + "\n" + - //"extModules: " + extModules + "\n" + - "outcomes: " + stageOutcomes + "\n" + - "extModulesTraceInvocationResult: " + extModulesTraceInvocationResult + "\n" + - "analyticsResultValue: " + analyticsResultValue + "\n" + - "parsedAnalyticsResultsMap: " + parsedAnalyticsResultsMap - ); - - return parsedAnalyticsResultsMap; } private GreenbidsPrebidExt parseBidRequestExt(BidRequest bidRequest) { @@ -366,11 +309,10 @@ private CommonMessage createBidMessage( final Map seatsWithNonBids = getSeatsWithNonBids(auctionContext); final List adUnitsWithBidResponses = imps.stream().map(imp -> { - final Ortb2ImpExtResult ortb2ImpExtResult = Optional.ofNullable(analyticsResultFromAnalyticsTag) - .map(analyticsResult -> analyticsResult.get(imp.getId())) - .orElse(null); - - return createAdUnit(imp, seatsWithBids, seatsWithNonBids, bidResponse.getCur(), ortb2ImpExtResult); + final Ortb2ImpExtResult ortb2ImpExtResult = Optional.ofNullable(analyticsResultFromAnalyticsTag) + .map(analyticsResult -> analyticsResult.get(imp.getId())) + .orElse(null); + return createAdUnit(imp, seatsWithBids, seatsWithNonBids, bidResponse.getCur(), ortb2ImpExtResult); }).toList(); final String auctionId = bidRequest diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/model/Ortb2ImpExtResult.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/model/Ortb2ImpExtResult.java index dc0125332e7..c6cc8350bd8 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/model/Ortb2ImpExtResult.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/model/Ortb2ImpExtResult.java @@ -1,6 +1,5 @@ package org.prebid.server.analytics.reporter.greenbids.model; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Value; @Value(staticConstructor = "of") diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index dc63e0e99be..d97d0d582ab 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1842,8 +1842,6 @@ private static ExtModulesTrace toHookTrace(AuctionContext context) { .filter(Objects::nonNull) .toList(); - System.out.println("ExchangeService/toHookTrace/ stages: " + stages + "\n traceLevel" + traceLevel); - if (stages.isEmpty()) { return null; } diff --git a/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java index dfda07150db..516205a2af0 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.iab.openrtb.request.BidRequest; -import com.iab.openrtb.request.Imp; import com.iab.openrtb.request.Regs; import io.vertx.core.Future; import io.vertx.ext.web.RoutingContext; @@ -188,15 +187,7 @@ private JsonNode bodyAsJsonNode(String body) { private BidRequest jsonNodeAsBidRequest(JsonNode bidRequestNode) { try { - - BidRequest parsedBidRequest = mapper.mapper().treeToValue(bidRequestNode, BidRequest.class); - - System.out.println( - "AuctionRequestFactory/jsonNodeAsBidRequest: " + "\n" + - "parsedBidRequest.imp[].ext: " + parsedBidRequest.getImp().stream().map(Imp::getExt).toList() - ); - - return parsedBidRequest; + return mapper.mapper().treeToValue(bidRequestNode, BidRequest.class); } catch (JsonProcessingException e) { throw new InvalidRequestException("Error decoding bidRequest: " + e.getMessage()); } diff --git a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java index 86317ee2151..bd7411f24d7 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java @@ -1,6 +1,13 @@ package org.prebid.server.auction.requestfactory; -import com.iab.openrtb.request.*; +import com.iab.openrtb.request.App; +import com.iab.openrtb.request.BidRequest; +import com.iab.openrtb.request.Device; +import com.iab.openrtb.request.Dooh; +import com.iab.openrtb.request.Geo; +import com.iab.openrtb.request.Publisher; +import com.iab.openrtb.request.Regs; +import com.iab.openrtb.request.Site; import io.vertx.core.Future; import io.vertx.core.MultiMap; import io.vertx.ext.web.RoutingContext; @@ -320,25 +327,8 @@ public Future executeRawAuctionRequestHooks(AuctionContext auctionCo } public Future executeProcessedAuctionRequestHooks(AuctionContext auctionContext) { - - BidRequest origBidRequest = auctionContext.getBidRequest(); - - System.out.println( - "executeProcessedAuctionRequestHooks: " + "\n" + - " origBidRequest.imp[].ext: " + origBidRequest.getImp().stream().map(Imp::getExt).toList() - ); - return hookStageExecutor.executeProcessedAuctionRequestStage(auctionContext) - .map(stageResult -> { - BidRequest updatedBidRequest = toBidRequest(stageResult, auctionContext); - - System.out.println( - "executeProcessedAuctionRequestHooks: " + "\n" + - " updatedBidRequest.imp[].ext: " + updatedBidRequest.getImp().stream().map(Imp::getExt).toList() - ); - - return updatedBidRequest; - }); + .map(stageResult -> toBidRequest(stageResult, auctionContext)); } public Future restoreResultFromRejection(Throwable throwable) { diff --git a/src/main/java/org/prebid/server/validation/BidderParamValidator.java b/src/main/java/org/prebid/server/validation/BidderParamValidator.java index d4814aac59f..98dea900d5c 100644 --- a/src/main/java/org/prebid/server/validation/BidderParamValidator.java +++ b/src/main/java/org/prebid/server/validation/BidderParamValidator.java @@ -43,9 +43,6 @@ private BidderParamValidator(Map bidderSchemas, String schem * Validates the {@link JsonNode} input parameter against bidder's JSON-schema */ public Set validate(String bidder, JsonNode jsonNode) { - - System.out.println("bidder: " + bidder + " jsonNode: " + jsonNode); - return bidderSchemas.get(bidder).validate(jsonNode).stream() .map(ValidationMessage::getMessage) .collect(Collectors.toSet()); diff --git a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java index bfb702b455b..ce5486b166d 100644 --- a/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java +++ b/src/test/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporterTest.java @@ -144,7 +144,8 @@ public void shouldReceiveValidResponseOnAuctionContextWithAnalyticsTagForBanner( .banner(banner) .build(); - final AuctionContext auctionContext = givenAuctionContextWithAnalyticsTag(context -> context, List.of(imp), true); + final AuctionContext auctionContext = givenAuctionContextWithAnalyticsTag( + context -> context, List.of(imp), true); final AuctionEvent event = AuctionEvent.builder() .auctionContext(auctionContext) .bidResponse(auctionContext.getBidResponse()) @@ -647,63 +648,53 @@ private static BidResponse givenBidResponseWithAnalyticsTag( "adunitcodevalue", createAnalyticsResultNode())); + final ExtModulesTraceAnalyticsTags analyticsTags = ExtModulesTraceAnalyticsTags.of( + Collections.singletonList( + ExtModulesTraceAnalyticsActivity.of( + null, null, Collections.singletonList( + ExtModulesTraceAnalyticsResult.of( + null, analyticsResultNode, null))))); + + final ExtModulesTraceInvocationResult invocationResult = ExtModulesTraceInvocationResult.builder() + .hookId(HookId.of("greenbids-real-time-data", null)) + .analyticsTags(analyticsTags) + .build(); + + final ExtModulesTraceStageOutcome outcome = ExtModulesTraceStageOutcome.of( + "auction-request", null, + Collections.singletonList(ExtModulesTraceGroup.of( + null, Collections.singletonList(invocationResult)))); + + final ExtModulesTraceStage stage = ExtModulesTraceStage.of( + Stage.processed_auction_request, null, + Collections.singletonList(outcome)); + + final ExtModulesTrace modulesTrace = ExtModulesTrace.of(null, Collections.singletonList(stage)); + + final ExtModules modules = ExtModules.of(null, null, modulesTrace); + + final ExtBidResponsePrebid prebid = ExtBidResponsePrebid.builder().modules(modules).build(); + + final ExtBidResponse extBidResponse = ExtBidResponse.builder().prebid(prebid).build(); + return bidResponseCustomizer.apply(BidResponse.builder() .id("response2") .seatbid(Collections.singletonList(givenSeatBid(seatBid -> seatBid))) .cur("USD") - .ext( - ExtBidResponse.builder().prebid( - ExtBidResponsePrebid.builder() - .modules( - ExtModules.of( - null, null, ExtModulesTrace.of( - null, Collections.singletonList( - ExtModulesTraceStage.of( - Stage.processed_auction_request, null, Collections.singletonList( - ExtModulesTraceStageOutcome.of( - "auction-request", null, Collections.singletonList( - ExtModulesTraceGroup.of( - null, Collections.singletonList( - ExtModulesTraceInvocationResult.builder() - .hookId(HookId.of("greenbids-real-time-data", null)) - .analyticsTags(ExtModulesTraceAnalyticsTags.of( - Collections.singletonList( - ExtModulesTraceAnalyticsActivity.of( - null, null, Collections.singletonList( - ExtModulesTraceAnalyticsResult.of( - null, analyticsResultNode, null - ) - ) - ) - ) - )) - .build() - ) - ) - ) - ) - ) - ) - ) - ) - ) - ).build() - ).build() - ) - ).build(); + .ext(extBidResponse)).build(); } private static ObjectNode createAnalyticsResultNode() { - ObjectNode keptInAuctionNode = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode keptInAuctionNode = new ObjectNode(JsonNodeFactory.instance); keptInAuctionNode.put("rubicon", true); keptInAuctionNode.put("criteo", false); - ObjectNode explorationResultNode = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode explorationResultNode = new ObjectNode(JsonNodeFactory.instance); explorationResultNode.put("fingerprint", "4f8d2e76-87fe-47c7-993f-d905b5fe2aa7"); explorationResultNode.set("keptInAuction", keptInAuctionNode); explorationResultNode.put("isExploration", false); - ObjectNode analyticsResultNode = new ObjectNode(JsonNodeFactory.instance); + final ObjectNode analyticsResultNode = new ObjectNode(JsonNodeFactory.instance); analyticsResultNode.set("greenbids", explorationResultNode); analyticsResultNode.put("tid", "c65c165d-f4ea-4301-bb91-982ce813dd3e");