Skip to content

Commit 3827dfa

Browse files
committed
extrequest -> accountconfig: analytics and rtd + TU
1 parent 09cc765 commit 3827dfa

File tree

5 files changed

+176
-170
lines changed

5 files changed

+176
-170
lines changed

extra/modules/greenbids-real-time-data/src/main/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHook.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.prebid.server.hooks.modules.greenbids.real.time.data.v1;
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.JsonNode;
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.fasterxml.jackson.databind.node.ObjectNode;
67
import com.iab.openrtb.request.BidRequest;
@@ -32,6 +33,8 @@
3233
import org.prebid.server.hooks.v1.auction.AuctionInvocationContext;
3334
import org.prebid.server.hooks.v1.auction.AuctionRequestPayload;
3435
import org.prebid.server.hooks.v1.auction.ProcessedAuctionRequestHook;
36+
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
37+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
3538
import org.prebid.server.settings.model.Account;
3639
import org.prebid.server.settings.model.AccountHooksConfiguration;
3740

@@ -43,6 +46,7 @@
4346

4447
public class GreenbidsRealTimeDataProcessedAuctionRequestHook implements ProcessedAuctionRequestHook {
4548

49+
private static final String BID_REQUEST_ANALYTICS_EXTENSION_NAME = "greenbids-rtd";
4650
private static final String CODE = "greenbids-real-time-data-processed-auction-request";
4751
private static final String ACTIVITY = "greenbids-filter";
4852
private static final String SUCCESS_STATUS = "success";
@@ -73,7 +77,8 @@ public Future<InvocationResult<AuctionRequestPayload>> call(
7377

7478
final AuctionContext auctionContext = invocationContext.auctionContext();
7579
final BidRequest bidRequest = auctionContext.getBidRequest();
76-
final Partner appliedPartner = parseAccountConfig(auctionContext);
80+
final Partner appliedPartner = Optional.ofNullable(parseBidRequestExt(auctionContext))
81+
.orElse(parseAccountConfig(auctionContext));
7782

7883
if (!appliedPartner.getEnabled()) {
7984
return Future.succeededFuture(toInvocationResult(
@@ -92,6 +97,22 @@ public Future<InvocationResult<AuctionRequestPayload>> call(
9297
bidRequest, null, InvocationAction.no_action)));
9398
}
9499

100+
private Partner parseBidRequestExt(AuctionContext auctionContext) {
101+
return Optional.ofNullable(auctionContext)
102+
.map(AuctionContext::getBidRequest)
103+
.map(BidRequest::getExt)
104+
.map(ExtRequest::getPrebid)
105+
.map(ExtRequestPrebid::getAnalytics)
106+
.filter(this::isNotEmptyObjectNode)
107+
.map(analytics -> (ObjectNode) analytics.get(BID_REQUEST_ANALYTICS_EXTENSION_NAME))
108+
.map(this::toPartner)
109+
.orElse(null);
110+
}
111+
112+
private boolean isNotEmptyObjectNode(JsonNode analytics) {
113+
return analytics != null && analytics.isObject() && !analytics.isEmpty();
114+
}
115+
95116
private Partner parseAccountConfig(AuctionContext auctionContext) {
96117
final Map<String, ObjectNode> modules = Optional.ofNullable(auctionContext)
97118
.map(AuctionContext::getAccount)

extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/util/TestBidRequestProvider.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.iab.openrtb.request.Imp;
1212
import com.iab.openrtb.request.Site;
1313
import org.prebid.server.json.ObjectMapperProvider;
14+
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
15+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
1416

1517
import java.util.Collections;
1618
import java.util.List;
@@ -34,6 +36,34 @@ public static BidRequest givenBidRequest(
3436
.device(device)).build();
3537
}
3638

39+
public static BidRequest givenBidRequestWithExtension(
40+
UnaryOperator<BidRequest.BidRequestBuilder> bidRequestCustomizer,
41+
List<Imp> imps) {
42+
final BidRequest.BidRequestBuilder bidRequestBuilder = BidRequest.builder()
43+
.id("request")
44+
.imp(imps)
45+
.site(givenSite(site -> site))
46+
.device(givenDevice(device -> device))
47+
.ext(givenExtRequest());
48+
49+
return bidRequestCustomizer.apply(bidRequestBuilder).build();
50+
}
51+
52+
public static ExtRequest givenExtRequest() {
53+
final ObjectNode greenbidsNode = new ObjectMapper().createObjectNode();
54+
greenbidsNode.put("pbuid", "leparisien");
55+
greenbidsNode.put("greenbidsSampling", 1.0);
56+
57+
final ObjectNode analyticsNode = new ObjectMapper().createObjectNode();
58+
analyticsNode.set("greenbids", greenbidsNode);
59+
60+
return ExtRequest.of(
61+
ExtRequestPrebid
62+
.builder()
63+
.analytics(analyticsNode)
64+
.build());
65+
}
66+
3767
public static Site givenSite(UnaryOperator<Site.SiteBuilder> siteCustomizer) {
3868
return siteCustomizer.apply(Site.builder().domain("www.leparisien.fr")).build();
3969
}

extra/modules/greenbids-real-time-data/src/test/java/org/prebid/server/hooks/modules/greenbids/real/time/data/v1/GreenbidsRealTimeDataProcessedAuctionRequestHookTest.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@
7272
import static org.mockito.Mockito.when;
7373
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenBanner;
7474
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenBidRequest;
75+
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenBidRequestWithExtension;
7576
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenDevice;
7677
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenDeviceWithoutUserAgent;
78+
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenExtRequest;
7779
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenImpExt;
7880
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenSite;
7981

@@ -149,7 +151,7 @@ public void setUp() throws IOException, GeoIp2Exception {
149151
}
150152

151153
@Test
152-
public void callShouldFilterBiddersAndFallbackToAccountLevelConfigWhenPartnerNotActivatedInBidRequest()
154+
public void callShouldFilterBiddersWhenPartnerActivatedInBidRequest()
153155
throws IOException, OrtException {
154156
// given
155157
final Banner banner = givenBanner();
@@ -162,8 +164,11 @@ public void callShouldFilterBiddersAndFallbackToAccountLevelConfigWhenPartnerNot
162164

163165
final Double explorationRate = 0.0001;
164166
final Device device = givenDevice(identity());
165-
final BidRequest bidRequest = givenBidRequest(request -> request, List.of(imp), device);
166-
final AuctionContext auctionContext = givenAuctionContext(bidRequest, context -> context, explorationRate);
167+
final BidRequest bidRequest = givenBidRequestWithExtension(identity(), List.of(imp));
168+
final AuctionContext auctionContext = givenAuctionContext(
169+
bidRequest,
170+
context -> context,
171+
explorationRate);
167172
final AuctionInvocationContext invocationContext = givenAuctionInvocationContext(auctionContext);
168173
when(invocationContext.auctionContext()).thenReturn(auctionContext);
169174
when(modelCacheWithExpiration.getIfPresent("onnxModelRunner_test-pbuid"))
@@ -172,7 +177,7 @@ public void callShouldFilterBiddersAndFallbackToAccountLevelConfigWhenPartnerNot
172177
.thenReturn(givenThrottlingThresholds());
173178

174179
final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
175-
request -> request, device);
180+
request -> request, device, true);
176181
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
177182

178183
// when
@@ -204,7 +209,7 @@ public void callShouldFilterBiddersAndFallbackToAccountLevelConfigWhenPartnerNot
204209
+ ".values._children"
205210
+ ".adunitcodevalue._children"
206211
+ ".greenbids._children.fingerprint")
207-
.isEqualTo(toAnalyticsTags(List.of(expectedAnalyticsResult))); // NOK
212+
.isEqualTo(toAnalyticsTags(List.of(expectedAnalyticsResult)));
208213
assertThat(fingerprint).isNotNull();
209214
assertThat(resultBidRequest).usingRecursiveComparison()
210215
.isEqualTo(expectedBidRequest);
@@ -286,7 +291,7 @@ public void callShouldFilterBiddersBasedOnModelWhenAnyFeatureNotAvailable() thro
286291
.thenReturn(givenThrottlingThresholds());
287292

288293
final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
289-
request -> request, device);
294+
request -> request, device, false);
290295
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
291296

292297
// when
@@ -346,7 +351,7 @@ public void callShouldFilterBiddersBasedOnModelResults() throws OrtException, IO
346351
.thenReturn(givenThrottlingThresholds());
347352

348353
final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
349-
request -> request, device);
354+
request -> request, device, false);
350355
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
351356

352357
// when
@@ -464,7 +469,8 @@ private ThrottlingThresholds givenThrottlingThresholds() throws IOException {
464469

465470
private BidRequest expectedUpdatedBidRequest(
466471
UnaryOperator<BidRequest.BidRequestBuilder> bidRequestCustomizer,
467-
Device device) {
472+
Device device,
473+
Boolean isExtRequest) {
468474

469475
final Banner banner = givenBanner();
470476

@@ -488,6 +494,10 @@ private BidRequest expectedUpdatedBidRequest(
488494
.site(givenSite(site -> site))
489495
.device(device);
490496

497+
if (isExtRequest) {
498+
bidRequestBuilder.ext(givenExtRequest());
499+
}
500+
491501
return bidRequestCustomizer.apply(bidRequestBuilder).build();
492502
}
493503

src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676

7777
public class GreenbidsAnalyticsReporter implements AnalyticsReporter {
7878

79+
private static final String BID_REQUEST_ANALYTICS_EXTENSION_NAME = "greenbids";
7980
private static final int RANGE_16_BIT_INTEGER_DIVISION_BASIS = 0x10000;
8081
private static final String ANALYTICS_REQUEST_ORIGIN_HEADER = "X-Request-Origin";
8182
private static final String PREBID_SERVER_HEADER_VALUE = "Prebid Server";
@@ -119,9 +120,10 @@ public <T> Future<Void> processEvent(T event) {
119120
return Future.failedFuture(new PreBidException("Bid response or auction context cannot be null"));
120121
}
121122

122-
final GreenbidsPrebidExt greenbidsBidRequestExt = parseAccountConfig(auctionContext);
123+
final GreenbidsPrebidExt greenbidsPrebidExt = Optional.ofNullable(parseBidRequestExt(auctionContext))
124+
.orElse(parseAccountConfig(auctionContext));
123125

124-
if (greenbidsBidRequestExt == null) {
126+
if (greenbidsPrebidExt == null) {
125127
return Future.succeededFuture();
126128
}
127129

@@ -132,7 +134,7 @@ public <T> Future<Void> processEvent(T event) {
132134

133135
final String greenbidsId = greenbidsId(analyticsResultFromAnalyticsTag);
134136

135-
if (!isSampled(greenbidsBidRequestExt.getGreenbidsSampling(), greenbidsId)) {
137+
if (!isSampled(greenbidsPrebidExt.getGreenbidsSampling(), greenbidsId)) {
136138
return Future.succeededFuture();
137139
}
138140

@@ -143,7 +145,7 @@ public <T> Future<Void> processEvent(T event) {
143145
bidResponse,
144146
greenbidsId,
145147
billingId,
146-
greenbidsBidRequestExt,
148+
greenbidsPrebidExt,
147149
analyticsResultFromAnalyticsTag);
148150
commonMessageJson = jacksonMapper.encodeToString(commonMessage);
149151
} catch (PreBidException e) {
@@ -162,12 +164,6 @@ public <T> Future<Void> processEvent(T event) {
162164
.map(Device::getUa)
163165
.ifPresent(userAgent -> headers.add(HttpUtil.USER_AGENT_HEADER, userAgent));
164166

165-
System.out.println(
166-
"GreenbidsAnalyticsReporter/ processEvent \n" +
167-
" commonMessageJson: " + commonMessageJson + "\n" +
168-
" headers: " + headers
169-
);
170-
171167
final Future<HttpClientResponse> responseFuture = httpClient.post(
172168
greenbidsAnalyticsProperties.getAnalyticsServerUrl(),
173169
headers,
@@ -177,6 +173,22 @@ public <T> Future<Void> processEvent(T event) {
177173
return responseFuture.compose(this::processAnalyticServerResponse);
178174
}
179175

176+
private GreenbidsPrebidExt parseBidRequestExt(AuctionContext auctionContext) {
177+
return Optional.ofNullable(auctionContext)
178+
.map(AuctionContext::getBidRequest)
179+
.map(BidRequest::getExt)
180+
.map(ExtRequest::getPrebid)
181+
.map(ExtRequestPrebid::getAnalytics)
182+
.filter(this::isNotEmptyObjectNode)
183+
.map(analytics -> (ObjectNode) analytics.get(BID_REQUEST_ANALYTICS_EXTENSION_NAME))
184+
.map(this::toGreenbidsPrebidExt)
185+
.orElse(null);
186+
}
187+
188+
private boolean isNotEmptyObjectNode(JsonNode analytics) {
189+
return analytics != null && analytics.isObject() && !analytics.isEmpty();
190+
}
191+
180192
private GreenbidsPrebidExt parseAccountConfig(AuctionContext auctionContext) {
181193
final Map<String, ObjectNode> modules = Optional.ofNullable(auctionContext)
182194
.map(AuctionContext::getAccount)
@@ -185,24 +197,14 @@ private GreenbidsPrebidExt parseAccountConfig(AuctionContext auctionContext) {
185197
.orElse(null);
186198

187199
GreenbidsPrebidExt greenbidsPrebidExt = null;
188-
if (modules != null && modules.containsKey("greenbids")) {
189-
final ObjectNode moduleConfig = modules.get("greenbids");
200+
if (modules != null && modules.containsKey(BID_REQUEST_ANALYTICS_EXTENSION_NAME)) {
201+
final ObjectNode moduleConfig = modules.get(BID_REQUEST_ANALYTICS_EXTENSION_NAME);
190202
greenbidsPrebidExt = toGreenbidsPrebidExt(moduleConfig);
191-
192-
System.out.println(
193-
"GreenbidsAnalyticsReporter/ parseAccountConfig \n" +
194-
" moduleConfig: " + moduleConfig + "\n" +
195-
" greenbidsPrebidExt: " + greenbidsPrebidExt
196-
);
197203
}
198204

199205
return greenbidsPrebidExt;
200206
}
201207

202-
private boolean isNotEmptyObjectNode(JsonNode analytics) {
203-
return analytics != null && analytics.isObject() && !analytics.isEmpty();
204-
}
205-
206208
private GreenbidsPrebidExt toGreenbidsPrebidExt(ObjectNode adapterNode) {
207209
try {
208210
return jacksonMapper.mapper().treeToValue(adapterNode, GreenbidsPrebidExt.class);

0 commit comments

Comments
 (0)