Skip to content

Commit cd14f9d

Browse files
Add Debug Metrics (#3548)
1 parent 0aa35c1 commit cd14f9d

File tree

7 files changed

+236
-3
lines changed

7 files changed

+236
-3
lines changed

docs/metrics.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ where `[DATASOURCE]` is a data source name, `DEFAULT_DS` by defaul.
3737

3838
## General auction metrics
3939
- `app_requests` - number of requests received from applications
40+
- `debug_requests` - number of requests received (when debug mode is enabled)
4041
- `no_cookie_requests` - number of requests without `uids` cookie or with one that didn't contain at least one live UID
4142
- `request_time` - timer tracking how long did it take for Prebid Server to serve a request
4243
- `imps_requested` - number if impressions requested
@@ -89,6 +90,7 @@ Following metrics are collected and submitted if account is configured with `bas
8990

9091
Following metrics are collected and submitted if account is configured with `detailed` verbosity:
9192
- `account.<account-id>.requests.type.(openrtb2-web,openrtb-app,amp,legacy)` - number of requests received from account with `<account-id>` broken down by type of incoming request
93+
- `account.<account-id>.debug_requests` - number of requests received from account with `<account-id>` broken down by type of incoming request (when debug mode is enabled)
9294
- `account.<account-id>.requests.rejected` - number of rejected requests caused by incorrect `accountId`
9395
- `account.<account-id>.adapter.<bidder-name>.request_time` - timer tracking how long did it take to make a request to `<bidder-name>` when incoming request was from `<account-id>`
9496
- `account.<account-id>.adapter.<bidder-name>.bids_received` - number of bids received from `<bidder-name>` when incoming request was from `<account-id>`

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
249249
final Map<String, MultiBidConfig> bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings);
250250
receivedContext.getBidRejectionTrackers().putAll(makeBidRejectionTrackers(bidRequest, aliases));
251251

252+
final boolean debugEnabled = receivedContext.getDebugContext().isDebugEnabled();
253+
metrics.updateDebugRequestMetrics(debugEnabled);
254+
metrics.updateAccountDebugRequestMetrics(account, debugEnabled);
255+
252256
return storedResponseProcessor.getStoredResponseResult(bidRequest.getImp(), timeout)
253257
.map(storedResponseResult -> populateStoredResponse(storedResponseResult, storedAuctionResponses))
254258
.compose(storedResponseResult ->
@@ -274,7 +278,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
274278
bidRequest.getImp(),
275279
context.getBidRejectionTrackers()))
276280
.map(auctionParticipations -> dropZeroNonDealBids(
277-
auctionParticipations, debugWarnings, context.getDebugContext().isDebugEnabled()))
281+
auctionParticipations, debugWarnings, debugEnabled))
278282
.map(auctionParticipations ->
279283
bidsAdjuster.validateAndAdjustBids(auctionParticipations, context, aliases))
280284
.map(auctionParticipations -> updateResponsesMetrics(auctionParticipations, account, aliases))
@@ -285,7 +289,7 @@ private Future<AuctionContext> runAuction(AuctionContext receivedContext) {
285289
logger,
286290
bidResponse,
287291
context.getBidRequest(),
288-
context.getDebugContext().isDebugEnabled()))
292+
debugEnabled))
289293
.compose(bidResponse -> bidResponsePostProcessor.postProcess(
290294
context.getHttpRequest(), uidsCookie, bidRequest, bidResponse, account))
291295
.map(context::with));

src/main/java/org/prebid/server/metric/MetricName.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public enum MetricName {
2525

2626
// auction
2727
requests,
28+
debug_requests,
2829
app_requests,
2930
no_cookie_requests,
3031
request_time,

src/main/java/org/prebid/server/metric/Metrics.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ HooksMetrics hooks() {
167167
return hooksMetrics;
168168
}
169169

170+
public void updateDebugRequestMetrics(boolean debugEnabled) {
171+
if (debugEnabled) {
172+
incCounter(MetricName.debug_requests);
173+
}
174+
}
175+
170176
public void updateAppAndNoCookieAndImpsRequestedMetrics(boolean isApp, boolean liveUidsPresent, int numImps) {
171177
if (isApp) {
172178
incCounter(MetricName.app_requests);
@@ -235,12 +241,20 @@ public void updateAccountRequestMetrics(Account account, MetricName requestType)
235241
final AccountMetrics accountMetrics = forAccount(account.getId());
236242

237243
accountMetrics.incCounter(MetricName.requests);
244+
238245
if (verbosityLevel.isAtLeast(AccountMetricsVerbosityLevel.detailed)) {
239246
accountMetrics.requestType(requestType).incCounter(MetricName.requests);
240247
}
241248
}
242249
}
243250

251+
public void updateAccountDebugRequestMetrics(Account account, boolean debugEnabled) {
252+
final AccountMetricsVerbosityLevel verbosityLevel = accountMetricsVerbosityResolver.forAccount(account);
253+
if (verbosityLevel.isAtLeast(AccountMetricsVerbosityLevel.detailed) && debugEnabled) {
254+
forAccount(account.getId()).incCounter(MetricName.debug_requests);
255+
}
256+
}
257+
244258
public void updateAccountRequestRejectedByInvalidAccountMetrics(String accountId) {
245259
updateAccountRequestsMetrics(accountId, MetricName.rejected_by_invalid_account);
246260
}

src/test/groovy/org/prebid/server/functional/tests/DebugSpec.groovy

Lines changed: 185 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,58 @@ package org.prebid.server.functional.tests
33
import org.apache.commons.lang3.StringUtils
44
import org.prebid.server.functional.model.config.AccountAuctionConfig
55
import org.prebid.server.functional.model.config.AccountConfig
6+
import org.prebid.server.functional.model.config.AccountMetricsConfig
67
import org.prebid.server.functional.model.db.Account
78
import org.prebid.server.functional.model.db.StoredRequest
89
import org.prebid.server.functional.model.db.StoredResponse
910
import org.prebid.server.functional.model.request.amp.AmpRequest
1011
import org.prebid.server.functional.model.request.auction.BidRequest
12+
import org.prebid.server.functional.model.request.auction.Site
1113
import org.prebid.server.functional.model.request.auction.StoredBidResponse
1214
import org.prebid.server.functional.model.response.auction.BidResponse
1315
import org.prebid.server.functional.model.response.auction.ErrorType
16+
import org.prebid.server.functional.service.PrebidServerException
1417
import org.prebid.server.functional.util.PBSUtils
1518
import spock.lang.PendingFeature
1619

1720
import static org.prebid.server.functional.model.bidder.BidderName.GENERIC
21+
import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.BASIC
22+
import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.DETAILED
23+
import static org.prebid.server.functional.model.config.AccountMetricsVerbosityLevel.NONE
1824
import static org.prebid.server.functional.model.request.auction.DebugCondition.DISABLED
1925
import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED
2026
import static org.prebid.server.functional.model.response.auction.BidderCallType.STORED_BID_RESPONSE
2127

2228
class DebugSpec extends BaseSpec {
2329

2430
private static final String overrideToken = PBSUtils.randomString
31+
private static final String ACCOUNT_METRICS_PREFIX_NAME = "account"
32+
private static final String DEBUG_REQUESTS_METRIC = "debug_requests"
33+
private static final String ACCOUNT_DEBUG_REQUESTS_METRIC = "account.%s.debug_requests"
34+
private static final String REQUEST_OK_WEB_METRICS = "requests.ok.openrtb2-web"
2535

26-
def "PBS should return debug information when debug flag is #debug and test flag is #test"() {
36+
def "PBS should return debug information and emit metrics when debug flag is #debug and test flag is #test"() {
2737
given: "Default BidRequest with test flag"
2838
def bidRequest = BidRequest.defaultBidRequest
2939
bidRequest.ext.prebid.debug = debug
3040
bidRequest.test = test
3141

42+
and: "Flash metrics"
43+
flushMetrics(defaultPbsService)
44+
3245
when: "PBS processes auction request"
3346
def response = defaultPbsService.sendAuctionRequest(bidRequest)
3447

3548
then: "Response should contain ext.debug"
3649
assert response.ext?.debug
3750

51+
and: "Debug metrics should be incremented"
52+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
53+
assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1
54+
55+
and: "Account debug metrics shouldn't be incremented"
56+
assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME)
57+
3858
where:
3959
debug | test
4060
ENABLED | null
@@ -48,12 +68,23 @@ class DebugSpec extends BaseSpec {
4868
bidRequest.ext.prebid.debug = test
4969
bidRequest.test = test
5070

71+
and: "Flash metrics"
72+
flushMetrics(defaultPbsService)
73+
5174
when: "PBS processes auction request"
5275
def response = defaultPbsService.sendAuctionRequest(bidRequest)
5376

5477
then: "Response shouldn't contain ext.debug"
5578
assert !response.ext?.debug
5679

80+
and: "Debug metrics shouldn't be populated"
81+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
82+
assert !metricsRequest[DEBUG_REQUESTS_METRIC]
83+
assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME)
84+
85+
and: "General metrics should be present"
86+
assert metricsRequest[REQUEST_OK_WEB_METRICS] == 1
87+
5788
where:
5889
debug | test
5990
DISABLED | null
@@ -351,4 +382,157 @@ class DebugSpec extends BaseSpec {
351382
and: "Response should not contain ext.warnings"
352383
assert !response.ext?.warnings
353384
}
385+
386+
def "PBS should return debug information and emit metrics when account debug enabled and verbosity detailed"() {
387+
given: "Default basic generic bid request"
388+
def bidRequest = BidRequest.defaultBidRequest
389+
390+
and: "Account in the DB"
391+
def accountConfig = new AccountConfig(
392+
metrics: new AccountMetricsConfig(verbosityLevel: DETAILED),
393+
auction: new AccountAuctionConfig(debugAllow: true))
394+
def account = new Account(uuid: bidRequest.site.publisher.id, config: accountConfig)
395+
accountDao.save(account)
396+
397+
and: "Flash metrics"
398+
flushMetrics(defaultPbsService)
399+
400+
when: "PBS processes auction request"
401+
def response = defaultPbsService.sendAuctionRequest(bidRequest)
402+
403+
then: "Response should contain ext.debug"
404+
assert response.ext?.debug
405+
406+
and: "Debug metrics should be incremented"
407+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
408+
assert metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(bidRequest.accountId)] == 1
409+
assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1
410+
}
411+
412+
def "PBS shouldn't return debug information and emit metrics when account debug enabled and verbosity #verbosityLevel"() {
413+
given: "Default basic generic bid request"
414+
def bidRequest = BidRequest.defaultBidRequest
415+
416+
and: "Account in the DB"
417+
def accountConfig = new AccountConfig(
418+
metrics: new AccountMetricsConfig(verbosityLevel: verbosityLevel),
419+
auction: new AccountAuctionConfig(debugAllow: true))
420+
def account = new Account(uuid: bidRequest.site.publisher.id, config: accountConfig)
421+
accountDao.save(account)
422+
423+
and: "Flash metrics"
424+
flushMetrics(defaultPbsService)
425+
426+
when: "PBS processes auction request"
427+
def response = defaultPbsService.sendAuctionRequest(bidRequest)
428+
429+
then: "Response should contain ext.debug"
430+
assert response.ext?.debug
431+
432+
and: "Account debug metrics shouldn't be incremented"
433+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
434+
assert !metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(bidRequest.accountId)]
435+
436+
and: "Request debug metrics should be incremented"
437+
assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1
438+
439+
where:
440+
verbosityLevel << [NONE, BASIC]
441+
}
442+
443+
def "PBS amp should return debug information and emit metrics when account debug enabled and verbosity detailed"() {
444+
given: "Default AMP request"
445+
def ampRequest = AmpRequest.defaultAmpRequest
446+
447+
and: "Default stored request"
448+
def ampStoredRequest = BidRequest.defaultStoredRequest
449+
450+
and: "Account in the DB"
451+
def accountConfig = new AccountConfig(
452+
metrics: new AccountMetricsConfig(verbosityLevel: DETAILED),
453+
auction: new AccountAuctionConfig(debugAllow: true))
454+
def account = new Account(uuid: ampRequest.account, config: accountConfig)
455+
accountDao.save(account)
456+
457+
and: "Flash metrics"
458+
flushMetrics(defaultPbsService)
459+
460+
and: "Save storedRequest into DB"
461+
def storedRequest = StoredRequest.getStoredRequest(ampRequest, ampStoredRequest)
462+
storedRequestDao.save(storedRequest)
463+
464+
when: "PBS processes amp request"
465+
def response = defaultPbsService.sendAmpRequest(ampRequest)
466+
467+
then: "Response should contain ext.debug"
468+
assert response.ext?.debug
469+
470+
and: "Debug metrics should be incremented"
471+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
472+
assert metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(ampRequest.account)] == 1
473+
assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1
474+
}
475+
476+
def "PBS amp should return debug information and emit metrics when account debug enabled and verbosity #verbosityLevel"() {
477+
given: "Default AMP request"
478+
def ampRequest = AmpRequest.defaultAmpRequest
479+
480+
and: "Default stored request"
481+
def ampStoredRequest = BidRequest.defaultStoredRequest
482+
483+
and: "Account in the DB"
484+
def accountConfig = new AccountConfig(
485+
metrics: new AccountMetricsConfig(verbosityLevel: verbosityLevel),
486+
auction: new AccountAuctionConfig(debugAllow: true))
487+
def account = new Account(uuid: ampRequest.account, config: accountConfig)
488+
accountDao.save(account)
489+
490+
and: "Flash metrics"
491+
flushMetrics(defaultPbsService)
492+
493+
and: "Save storedRequest into DB"
494+
def storedRequest = StoredRequest.getStoredRequest(ampRequest, ampStoredRequest)
495+
storedRequestDao.save(storedRequest)
496+
497+
when: "PBS processes amp request"
498+
def response = defaultPbsService.sendAmpRequest(ampRequest)
499+
500+
then: "Response should contain ext.debug"
501+
assert response.ext?.debug
502+
503+
and: "Account debug metrics shouldn't be incremented"
504+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
505+
assert !metricsRequest[ACCOUNT_DEBUG_REQUESTS_METRIC.formatted(ampRequest.account)]
506+
507+
and: "Debug metrics should be incremented"
508+
assert metricsRequest[DEBUG_REQUESTS_METRIC] == 1
509+
510+
where:
511+
verbosityLevel << [NONE, BASIC]
512+
}
513+
514+
def "PBS shouldn't emit auction request metric when incoming request invalid"() {
515+
given: "Default basic BidRequest"
516+
def bidRequest = BidRequest.defaultBidRequest
517+
bidRequest.site = new Site(id: null, name: PBSUtils.randomString, page: null)
518+
bidRequest.ext.prebid.debug = ENABLED
519+
520+
and: "Flash metrics"
521+
flushMetrics(defaultPbsService)
522+
523+
when: "PBS processes auction request"
524+
defaultPbsService.sendAuctionRequest(bidRequest)
525+
526+
then: "Request should fail with error"
527+
def exception = thrown(PrebidServerException)
528+
assert exception.responseBody.contains("request.site should include at least one of request.site.id or request.site.page")
529+
530+
and: "Debug metrics shouldn't be populated"
531+
def metricsRequest = defaultPbsService.sendCollectedMetricsRequest()
532+
assert !metricsRequest[DEBUG_REQUESTS_METRIC]
533+
assert !metricsRequest.keySet().contains(ACCOUNT_METRICS_PREFIX_NAME)
534+
535+
and: "General metrics shouldn't be present"
536+
assert !metricsRequest[REQUEST_OK_WEB_METRICS]
537+
}
354538
}

src/test/java/org/prebid/server/auction/ExchangeServiceTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2979,6 +2979,8 @@ public void shouldIncrementCommonMetrics() {
29792979
target.holdAuction(givenRequestContext(bidRequest));
29802980

29812981
// then
2982+
verify(metrics).updateDebugRequestMetrics(false);
2983+
verify(metrics).updateAccountDebugRequestMetrics(any(), eq(false));
29822984
verify(metrics).updateRequestBidderCardinalityMetric(1);
29832985
verify(metrics).updateAccountRequestMetrics(any(), eq(MetricName.openrtb2web));
29842986
verify(metrics).updateAdapterRequestTypeAndNoCookieMetrics(

0 commit comments

Comments
 (0)