Skip to content

Commit 3119f39

Browse files
committed
Introduce hard-fail mode switchers and update metrics gathering
1 parent 9ac31e3 commit 3119f39

File tree

8 files changed

+113
-47
lines changed

8 files changed

+113
-47
lines changed

docs/config-app.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ Preconfigured application settings can be obtained from multiple data sources co
302302

303303
Warning! Application will not start in case of no one data source is defined and you'll get an exception in logs.
304304

305+
For requests validation mode available next options:
306+
- `settings.fail-on-unknown-bidders` - fail with validation error or just make warning for unknown bidders.
307+
- `settings.fail-on-disabled-bidders` - fail with validation error or just make warning for disabled bidders.
308+
305309
For filesystem data source available next options:
306310
- `settings.filesystem.settings-filename` - location of file settings.
307311
- `settings.filesystem.stored-requests-dir` - directory with stored requests.

docs/metrics.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ where `[DATASOURCE]` is a data source name, `DEFAULT_DS` by defaul.
4545
- `imps_video` - number of video impressions
4646
- `imps_native` - number of native impressions
4747
- `imps_audio` - number of audio impressions
48+
- `disabled_bidder` - number of disabled bidders received within requests
49+
- `unknown_bidder` - number of unknown bidders received within requests
4850
- `requests.(ok|badinput|err|networkerr|blocklisted_account|blocklisted_app).(openrtb2-web|openrtb-app|amp|legacy)` - number of requests broken down by status and type
4951
- `bidder-cardinality.<cardinality>.requests` - number of requests targeting `<cardinality>` of bidders
5052
- `connection_accept_errors` - number of errors occurred while establishing HTTP connection
@@ -92,6 +94,8 @@ Following metrics are collected and submitted if account is configured with `det
9294
- `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
9395
- `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)
9496
- `account.<account-id>.requests.rejected` - number of rejected requests caused by incorrect `accountId`
97+
- `account.<account-id>.requests.disabled_bidder` - number of disabled bidders received within requests from account with `<account-id>`
98+
- `account.<account-id>.requests.unknown_bidder` - number of unknown bidder names received within requests from account with `<account-id>`
9599
- `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>`
96100
- `account.<account-id>.adapter.<bidder-name>.bids_received` - number of bids received from `<bidder-name>` when incoming request was from `<account-id>`
97101
- `account.<account-id>.adapter.<bidder-name>.requests.(gotbids|nobid)` - number of requests made to `<bidder-name>` broken down by result status when incoming request was from `<account-id>`

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -336,19 +336,19 @@ public void updateAdapterRequestErrorMetric(String bidder, MetricName errorMetri
336336
forAdapter(bidder).request().incCounter(errorMetric);
337337
}
338338

339-
public void updateAdapterRequestDisabledBidderMetric(String bidder, Account account) {
340-
forAdapter(bidder).request().incCounter(MetricName.disabled_bidder);
339+
public void updateDisabledBidderMetric(Account account) {
340+
incCounter(MetricName.disabled_bidder);
341341
if (accountMetricsVerbosityResolver.forAccount(account)
342342
.isAtLeast(AccountMetricsVerbosityLevel.detailed)) {
343-
forAccount(account.getId()).adapter().forAdapter(bidder).request().incCounter(MetricName.disabled_bidder);
343+
forAccount(account.getId()).requests().incCounter(MetricName.disabled_bidder);
344344
}
345345
}
346346

347-
public void updateAdapterRequestUnknownBidderMetric(String bidder, Account account) {
348-
forAdapter(bidder).request().incCounter(MetricName.unknown_bidder);
347+
public void updateUnknownBidderMetric(Account account) {
348+
incCounter(MetricName.unknown_bidder);
349349
if (accountMetricsVerbosityResolver.forAccount(account)
350350
.isAtLeast(AccountMetricsVerbosityLevel.detailed)) {
351-
forAccount(account.getId()).adapter().forAdapter(bidder).request().incCounter(MetricName.unknown_bidder);
351+
forAccount(account.getId()).requests().incCounter(MetricName.unknown_bidder);
352352
}
353353
}
354354

src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,15 +1033,19 @@ RequestValidator requestValidator(
10331033
Metrics metrics,
10341034
JacksonMapper mapper,
10351035
@Value("${logging.sampling-rate:0.01}") double logSamplingRate,
1036-
@Value("${auction.strict-app-site-dooh:false}") boolean enabledStrictAppSiteDoohValidation) {
1036+
@Value("${auction.strict-app-site-dooh:false}") boolean enabledStrictAppSiteDoohValidation,
1037+
@Value("${settings.fail-on-disabled-bidders}") boolean failOnDisabledBidders,
1038+
@Value("${settings.fail-on-unknown-bidders}") boolean failOnUnknownBidders) {
10371039

10381040
return new RequestValidator(
10391041
bidderCatalog,
10401042
impValidator,
10411043
metrics,
10421044
mapper,
10431045
logSamplingRate,
1044-
enabledStrictAppSiteDoohValidation);
1046+
enabledStrictAppSiteDoohValidation,
1047+
failOnDisabledBidders,
1048+
failOnUnknownBidders);
10451049
}
10461050

10471051
@Bean

src/main/java/org/prebid/server/validation/RequestValidator.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public class RequestValidator {
7575
private final JacksonMapper mapper;
7676
private final double logSamplingRate;
7777
private final boolean enabledStrictAppSiteDoohValidation;
78+
private final boolean failOnDisabledBidders;
79+
private final boolean failOnUnknownBidders;
7880

7981
/**
8082
* Constructs a RequestValidator that will use the BidderParamValidator passed in order to validate all critical
@@ -84,14 +86,18 @@ public RequestValidator(BidderCatalog bidderCatalog,
8486
ImpValidator impValidator, Metrics metrics,
8587
JacksonMapper mapper,
8688
double logSamplingRate,
87-
boolean enabledStrictAppSiteDoohValidation) {
89+
boolean enabledStrictAppSiteDoohValidation,
90+
boolean failOnDisabledBidders,
91+
boolean failOnUnknownBidders) {
8892

8993
this.bidderCatalog = Objects.requireNonNull(bidderCatalog);
9094
this.impValidator = Objects.requireNonNull(impValidator);
9195
this.metrics = Objects.requireNonNull(metrics);
9296
this.mapper = Objects.requireNonNull(mapper);
9397
this.logSamplingRate = logSamplingRate;
9498
this.enabledStrictAppSiteDoohValidation = enabledStrictAppSiteDoohValidation;
99+
this.failOnDisabledBidders = failOnDisabledBidders;
100+
this.failOnUnknownBidders = failOnUnknownBidders;
95101
}
96102

97103
/**
@@ -514,13 +520,25 @@ private void validateAliases(Map<String, String> aliases, List<String> warnings,
514520
final String alias = aliasToBidder.getKey();
515521
final String coreBidder = aliasToBidder.getValue();
516522
if (!bidderCatalog.isValidName(coreBidder)) {
517-
warnings.add(
518-
"request.ext.prebid.aliases.%s refers to unknown bidder: %s".formatted(alias, coreBidder));
519-
metrics.updateAdapterRequestUnknownBidderMetric(coreBidder, account);
523+
metrics.updateUnknownBidderMetric(account);
524+
525+
final String message = String.format("request.ext.prebid.aliases.%s refers to unknown bidder: %s",
526+
alias, coreBidder);
527+
if (failOnUnknownBidders) {
528+
throw new ValidationException(message);
529+
} else {
530+
warnings.add(message);
531+
}
520532
} else if (!bidderCatalog.isActive(coreBidder)) {
521-
warnings.add(
522-
"request.ext.prebid.aliases.%s refers to disabled bidder: %s".formatted(alias, coreBidder));
523-
metrics.updateAdapterRequestDisabledBidderMetric(coreBidder, account);
533+
metrics.updateDisabledBidderMetric(account);
534+
535+
final String message = String.format("request.ext.prebid.aliases.%s refers to disabled bidder: %s",
536+
alias, coreBidder);
537+
if (failOnDisabledBidders) {
538+
throw new ValidationException(message);
539+
} else {
540+
warnings.add(message);
541+
}
524542
}
525543

526544
if (alias.equals(coreBidder)) {

src/main/resources/application.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ currency-converter:
158158
settings:
159159
generate-storedrequest-bidrequest-id: false
160160
enforce-valid-account: false
161+
fail-on-unknown-bidders: true
162+
fail-on-disabled-bidders: true
161163
database:
162164
pool-size: 20
163165
idle-connection-timeout: 300

src/test/java/org/prebid/server/metric/MetricsTest.java

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class MetricsTest {
4848
private static final String RUBICON = "rubicon";
4949
private static final String CONVERSANT = "conversant";
5050
private static final String ACCOUNT_ID = "accountId";
51+
private static final String ACCOUNT_ID_1 = "accountId1";
5152
private static final String ANALYTIC_CODE = "analyticCode";
5253

5354
private MetricRegistry metricRegistry;
@@ -615,37 +616,34 @@ public void updateAdapterBidMetricsShouldUpdateMetrics() {
615616
}
616617

617618
@Test
618-
public void updateAdapterRequestUnknownBidderMetricsShouldIncrementMetrics() {
619+
public void updateUnknownBidderMetricsShouldIncrementMetrics() {
619620
// when
620-
metrics.updateAdapterRequestUnknownBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
621-
metrics.updateAdapterRequestUnknownBidderMetric(CONVERSANT, Account.empty(ACCOUNT_ID));
622-
metrics.updateAdapterRequestUnknownBidderMetric(CONVERSANT, Account.empty(ACCOUNT_ID));
621+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID));
622+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID));
623+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID_1));
623624

624625
// then
625-
assertThat(metricRegistry.counter("adapter.rubicon.requests.unknown_bidder").getCount()).isOne();
626+
assertThat(metricRegistry.counter("unknown_bidder").getCount()).isEqualTo(3);
626627
assertThat(metricRegistry.counter(
627-
"account.accountId.adapter.rubicon.requests.unknown_bidder").getCount()).isOne();
628+
"account.accountId.requests.unknown_bidder").getCount()).isEqualTo(2);
628629
assertThat(metricRegistry.counter(
629-
"adapter.conversant.requests.unknown_bidder").getCount()).isEqualTo(2);
630-
assertThat(metricRegistry.counter(
631-
"account.accountId.adapter.conversant.requests.unknown_bidder").getCount()).isEqualTo(2);
630+
"account.accountId1.requests.unknown_bidder").getCount()).isEqualTo(1);
632631
}
633632

634633
@Test
635-
public void updateAdapterRequestDisabledBidderMetricsShouldIncrementMetrics() {
634+
public void updateDisabledBidderMetricsShouldIncrementMetrics() {
636635
// when
637-
metrics.updateAdapterRequestDisabledBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
638-
metrics.updateAdapterRequestDisabledBidderMetric(CONVERSANT, Account.empty(ACCOUNT_ID));
639-
metrics.updateAdapterRequestDisabledBidderMetric(CONVERSANT, Account.empty(ACCOUNT_ID));
636+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID));
637+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID));
638+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID_1));
640639

641640
// then
642-
assertThat(metricRegistry.counter("adapter.rubicon.requests.disabled_bidder").getCount()).isOne();
643641
assertThat(metricRegistry.counter(
644-
"account.accountId.adapter.rubicon.requests.disabled_bidder").getCount()).isOne();
642+
"disabled_bidder").getCount()).isEqualTo(3);
645643
assertThat(metricRegistry.counter(
646-
"adapter.conversant.requests.disabled_bidder").getCount()).isEqualTo(2);
644+
"account.accountId.requests.disabled_bidder").getCount()).isEqualTo(2);
647645
assertThat(metricRegistry.counter(
648-
"account.accountId.adapter.conversant.requests.disabled_bidder").getCount()).isEqualTo(2);
646+
"account.accountId1.requests.disabled_bidder").getCount()).isEqualTo(1);
649647
}
650648

651649
@Test
@@ -999,8 +997,8 @@ public void shouldNotUpdateAccountMetricsIfVerbosityIsNone() {
999997
metrics.updateAdapterRequestNobidMetrics(RUBICON, Account.empty(ACCOUNT_ID));
1000998
metrics.updateAdapterRequestGotbidsMetrics(RUBICON, Account.empty(ACCOUNT_ID));
1001999
metrics.updateAdapterBidMetrics(RUBICON, Account.empty(ACCOUNT_ID), 1234L, true, "banner");
1002-
metrics.updateAdapterRequestDisabledBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1003-
metrics.updateAdapterRequestUnknownBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1000+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID));
1001+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID));
10041002

10051003
// then
10061004
assertThat(metricRegistry.counter("account.accountId.requests").getCount()).isZero();
@@ -1030,8 +1028,8 @@ public void shouldUpdateAccountRequestsMetricOnlyIfVerbosityIsBasic() {
10301028
metrics.updateAdapterRequestNobidMetrics(RUBICON, Account.empty(ACCOUNT_ID));
10311029
metrics.updateAdapterRequestGotbidsMetrics(RUBICON, Account.empty(ACCOUNT_ID));
10321030
metrics.updateAdapterBidMetrics(RUBICON, Account.empty(ACCOUNT_ID), 1234L, true, "banner");
1033-
metrics.updateAdapterRequestDisabledBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1034-
metrics.updateAdapterRequestUnknownBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1031+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID));
1032+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID));
10351033

10361034
// then
10371035
assertThat(metricRegistry.counter("account.accountId.requests").getCount()).isOne();
@@ -1061,8 +1059,8 @@ public void shouldUpdateAccountRequestsMetricOnlyIfVerbosityIsDetailed() {
10611059
metrics.updateAdapterRequestNobidMetrics(RUBICON, Account.empty(ACCOUNT_ID));
10621060
metrics.updateAdapterRequestGotbidsMetrics(RUBICON, Account.empty(ACCOUNT_ID));
10631061
metrics.updateAdapterBidMetrics(RUBICON, Account.empty(ACCOUNT_ID), 1234L, true, "banner");
1064-
metrics.updateAdapterRequestDisabledBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1065-
metrics.updateAdapterRequestUnknownBidderMetric(RUBICON, Account.empty(ACCOUNT_ID));
1062+
metrics.updateDisabledBidderMetric(Account.empty(ACCOUNT_ID));
1063+
metrics.updateUnknownBidderMetric(Account.empty(ACCOUNT_ID));
10661064

10671065
// then
10681066
assertThat(metricRegistry.counter("account.accountId.requests").getCount()).isOne();
@@ -1079,9 +1077,9 @@ public void shouldUpdateAccountRequestsMetricOnlyIfVerbosityIsDetailed() {
10791077
assertThat(metricRegistry.counter("account.accountId.adapter.rubicon.bids_received").getCount())
10801078
.isEqualTo(1);
10811079
assertThat(metricRegistry.counter(
1082-
"account.accountId.adapter.rubicon.requests.unknown_bidder").getCount()).isEqualTo(1);
1080+
"unknown_bidder").getCount()).isEqualTo(1);
10831081
assertThat(metricRegistry.counter(
1084-
"account.accountId.adapter.rubicon.requests.disabled_bidder").getCount()).isEqualTo(1);
1082+
"account.accountId.requests.disabled_bidder").getCount()).isEqualTo(1);
10851083
}
10861084

10871085
@Test

0 commit comments

Comments
 (0)