in src/ad/src/main/java/oteldemo/AdService.java [150:225]
public void getAds(AdRequest req, StreamObserver<AdResponse> responseObserver) {
AdService service = AdService.getInstance();
// get the current span in context
Span span = Span.current();
try {
List<Ad> allAds = new ArrayList<>();
AdRequestType adRequestType;
AdResponseType adResponseType;
Baggage baggage = Baggage.fromContextOrNull(Context.current());
MutableContext evaluationContext = new MutableContext();
if (baggage != null) {
final String sessionId = baggage.getEntryValue("session.id");
span.setAttribute("session.id", sessionId);
evaluationContext.setTargetingKey(sessionId);
evaluationContext.add("session", sessionId);
} else {
logger.info("no baggage found in context");
}
CPULoad cpuload = CPULoad.getInstance();
cpuload.execute(ffClient.getBooleanValue(AD_HIGH_CPU_FEATURE_FLAG, false, evaluationContext));
span.setAttribute("app.ads.contextKeys", req.getContextKeysList().toString());
span.setAttribute("app.ads.contextKeys.count", req.getContextKeysCount());
if (req.getContextKeysCount() > 0) {
logger.info("Targeted ad request received for " + req.getContextKeysList());
for (int i = 0; i < req.getContextKeysCount(); i++) {
Collection<Ad> ads = service.getAdsByCategory(req.getContextKeys(i));
allAds.addAll(ads);
}
adRequestType = AdRequestType.TARGETED;
adResponseType = AdResponseType.TARGETED;
} else {
logger.info("Non-targeted ad request received, preparing random response.");
allAds = service.getRandomAds();
adRequestType = AdRequestType.NOT_TARGETED;
adResponseType = AdResponseType.RANDOM;
}
if (allAds.isEmpty()) {
// Serve random ads.
allAds = service.getRandomAds();
adResponseType = AdResponseType.RANDOM;
}
span.setAttribute("app.ads.count", allAds.size());
span.setAttribute("app.ads.ad_request_type", adRequestType.name());
span.setAttribute("app.ads.ad_response_type", adResponseType.name());
adRequestsCounter.add(
1,
Attributes.of(
adRequestTypeKey, adRequestType.name(), adResponseTypeKey, adResponseType.name()));
// Throw 1/10 of the time to simulate a failure when the feature flag is enabled
if (ffClient.getBooleanValue(AD_FAILURE, false, evaluationContext) && random.nextInt(10) == 0) {
throw new StatusRuntimeException(Status.UNAVAILABLE);
}
if (ffClient.getBooleanValue(AD_MANUAL_GC_FEATURE_FLAG, false, evaluationContext)) {
logger.warn("Feature Flag " + AD_MANUAL_GC_FEATURE_FLAG + " enabled, performing a manual gc now");
GarbageCollectionTrigger gct = new GarbageCollectionTrigger();
gct.doExecute();
}
AdResponse reply = AdResponse.newBuilder().addAllAds(allAds).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
} catch (StatusRuntimeException e) {
span.addEvent(
"Error", Attributes.of(AttributeKey.stringKey("exception.message"), e.getMessage()));
span.setStatus(StatusCode.ERROR);
logger.log(Level.WARN, "GetAds Failed with status {}", e.getStatus());
responseObserver.onError(e);
}
}