Skip to content

Commit 800b2f8

Browse files
guscarreonshunj-nb
authored andcommitted
Metrics: Record GVL fetch count (prebid#4500)
1 parent 1166a9a commit 800b2f8

File tree

14 files changed

+97
-35
lines changed

14 files changed

+97
-35
lines changed

gdpr/gdpr.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"github.com/prebid/prebid-server/v3/config"
7+
"github.com/prebid/prebid-server/v3/metrics"
78
"github.com/prebid/prebid-server/v3/openrtb_ext"
89
)
910

@@ -34,16 +35,16 @@ type RequestInfo struct {
3435
}
3536

3637
// NewPermissionsBuilder takes host config data used to configure the builder function it returns
37-
func NewPermissionsBuilder(cfg config.GDPR, gvlVendorIDs map[openrtb_ext.BidderName]uint16, vendorListFetcher VendorListFetcher) PermissionsBuilder {
38+
func NewPermissionsBuilder(cfg config.GDPR, gvlVendorIDs map[openrtb_ext.BidderName]uint16, vendorListFetcher VendorListFetcher, me metrics.MetricsEngine) PermissionsBuilder {
3839
return func(tcf2Cfg TCF2ConfigReader, requestInfo RequestInfo) Permissions {
3940
purposeEnforcerBuilder := NewPurposeEnforcerBuilder(tcf2Cfg)
4041

41-
return NewPermissions(cfg, tcf2Cfg, gvlVendorIDs, vendorListFetcher, purposeEnforcerBuilder, requestInfo)
42+
return NewPermissions(cfg, tcf2Cfg, gvlVendorIDs, vendorListFetcher, purposeEnforcerBuilder, requestInfo, me)
4243
}
4344
}
4445

4546
// NewPermissions gets a per-request Permissions object that can then be used to check GDPR permissions for a given bidder.
46-
func NewPermissions(cfg config.GDPR, tcf2Config TCF2ConfigReader, vendorIDs map[openrtb_ext.BidderName]uint16, fetcher VendorListFetcher, purposeEnforcerBuilder PurposeEnforcerBuilder, requestInfo RequestInfo) Permissions {
47+
func NewPermissions(cfg config.GDPR, tcf2Config TCF2ConfigReader, vendorIDs map[openrtb_ext.BidderName]uint16, fetcher VendorListFetcher, purposeEnforcerBuilder PurposeEnforcerBuilder, requestInfo RequestInfo, metricsEngine metrics.MetricsEngine) Permissions {
4748
if !cfg.Enabled {
4849
return &AlwaysAllow{}
4950
}
@@ -60,6 +61,7 @@ func NewPermissions(cfg config.GDPR, tcf2Config TCF2ConfigReader, vendorIDs map[
6061
consent: requestInfo.Consent,
6162
aliasGVLIDs: requestInfo.AliasGVLIDs,
6263
purposeEnforcerBuilder: purposeEnforcerBuilder,
64+
metrics: metricsEngine,
6365
}
6466

6567
if cfg.HostVendorID == 0 {

gdpr/gdpr_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/prebid/go-gdpr/consentconstants"
88
"github.com/prebid/go-gdpr/vendorlist"
99
"github.com/prebid/prebid-server/v3/config"
10+
"github.com/prebid/prebid-server/v3/metrics"
1011
"github.com/prebid/prebid-server/v3/openrtb_ext"
1112

1213
"github.com/stretchr/testify/assert"
@@ -43,14 +44,14 @@ func TestNewPermissions(t *testing.T) {
4344
HostVendorID: tt.hostVendorID,
4445
}
4546
vendorIDs := map[openrtb_ext.BidderName]uint16{}
46-
vendorListFetcher := func(ctx context.Context, specVersion, listVersion uint16) (vendorlist.VendorList, error) {
47+
vendorListFetcher := func(ctx context.Context, specVersion, listVersion uint16, metricsEngine metrics.MetricsEngine) (vendorlist.VendorList, error) {
4748
return nil, nil
4849
}
4950

5051
fakePurposeEnforcerBuilder := fakePurposeEnforcerBuilder{
5152
purposeEnforcer: nil,
5253
}.Builder
53-
perms := NewPermissions(config, &tcf2Config{}, vendorIDs, vendorListFetcher, fakePurposeEnforcerBuilder, RequestInfo{})
54+
perms := NewPermissions(config, &tcf2Config{}, vendorIDs, vendorListFetcher, fakePurposeEnforcerBuilder, RequestInfo{}, &metrics.MetricsEngineMock{})
5455

5556
assert.IsType(t, tt.wantType, perms, tt.description)
5657
}

gdpr/impl.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/prebid/go-gdpr/api"
77
"github.com/prebid/go-gdpr/consentconstants"
88
tcf2 "github.com/prebid/go-gdpr/vendorconsent/tcf2"
9+
"github.com/prebid/prebid-server/v3/metrics"
910
"github.com/prebid/prebid-server/v3/openrtb_ext"
1011
)
1112

@@ -19,6 +20,7 @@ type permissionsImpl struct {
1920
fetchVendorList VendorListFetcher
2021
gdprDefaultValue string
2122
hostVendorID int
23+
metrics metrics.MetricsEngine
2224
nonStandardPublishers map[string]struct{}
2325
purposeEnforcerBuilder PurposeEnforcerBuilder
2426
vendorIDs map[openrtb_ext.BidderName]uint16
@@ -199,7 +201,7 @@ func (p *permissionsImpl) allowID(bidder openrtb_ext.BidderName, consentMeta tcf
199201

200202
// getVendor retrieves the GVL vendor information for a particular bidder
201203
func (p *permissionsImpl) getVendor(ctx context.Context, vendorID uint16, pc parsedConsent) (api.Vendor, error) {
202-
vendorList, err := p.fetchVendorList(ctx, pc.specVersion, pc.listVersion)
204+
vendorList, err := p.fetchVendorList(ctx, pc.specVersion, pc.listVersion, p.metrics)
203205
if err != nil {
204206
return nil, err
205207
}

gdpr/impl_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/prebid/go-gdpr/vendorlist"
1111
"github.com/prebid/go-gdpr/vendorlist2"
1212
"github.com/prebid/prebid-server/v3/config"
13+
"github.com/prebid/prebid-server/v3/metrics"
1314
"github.com/prebid/prebid-server/v3/openrtb_ext"
1415

1516
"github.com/stretchr/testify/assert"
@@ -883,8 +884,8 @@ func parseVendorListDataV2(t *testing.T, data string) vendorlist.VendorList {
883884
return parsed
884885
}
885886

886-
func listFetcher(specVersionLists map[uint16]map[uint16]vendorlist.VendorList) func(context.Context, uint16, uint16) (vendorlist.VendorList, error) {
887-
return func(ctx context.Context, specVersion, listVersion uint16) (vendorlist.VendorList, error) {
887+
func listFetcher(specVersionLists map[uint16]map[uint16]vendorlist.VendorList) func(context.Context, uint16, uint16, metrics.MetricsEngine) (vendorlist.VendorList, error) {
888+
return func(ctx context.Context, specVersion, listVersion uint16, metricsEngine metrics.MetricsEngine) (vendorlist.VendorList, error) {
888889
if lists, ok := specVersionLists[specVersion]; ok {
889890
if data, ok := lists[listVersion]; ok {
890891
return data, nil
@@ -894,7 +895,7 @@ func listFetcher(specVersionLists map[uint16]map[uint16]vendorlist.VendorList) f
894895
}
895896
}
896897

897-
func failedListFetcher(ctx context.Context, specVersion, listVersion uint16) (vendorlist.VendorList, error) {
898+
func failedListFetcher(ctx context.Context, specVersion, listVersion uint16, metricsEngine metrics.MetricsEngine) (vendorlist.VendorList, error) {
898899
return nil, errors.New("vendor list can't be fetched")
899900
}
900901

gdpr/vendorlist-fetching.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,36 @@ import (
1515
"github.com/prebid/go-gdpr/vendorlist"
1616
"github.com/prebid/go-gdpr/vendorlist2"
1717
"github.com/prebid/prebid-server/v3/config"
18+
"github.com/prebid/prebid-server/v3/metrics"
1819
"golang.org/x/net/context/ctxhttp"
1920
)
2021

2122
type saveVendors func(uint16, uint16, api.VendorList)
22-
type VendorListFetcher func(ctx context.Context, specVersion uint16, listVersion uint16) (vendorlist.VendorList, error)
23+
type VendorListFetcher func(ctx context.Context, specVersion uint16, listVersion uint16, metricsEngine metrics.MetricsEngine) (vendorlist.VendorList, error)
2324

2425
// This file provides the vendorlist-fetching function for Prebid Server.
2526
//
2627
// For more info, see https://github.com/prebid/prebid-server/issues/504
2728
//
2829
// Nothing in this file is exported. Public APIs can be found in gdpr.go
2930

30-
func NewVendorListFetcher(initCtx context.Context, cfg config.GDPR, client *http.Client, urlMaker func(uint16, uint16) string) VendorListFetcher {
31+
func NewVendorListFetcher(initCtx context.Context, cfg config.GDPR, client *http.Client, metricsEngine metrics.MetricsEngine, urlMaker func(uint16, uint16) string) VendorListFetcher {
3132
cacheSave, cacheLoad := newVendorListCache()
3233

3334
preloadContext, cancel := context.WithTimeout(initCtx, cfg.Timeouts.InitTimeout())
3435
defer cancel()
35-
preloadCache(preloadContext, client, urlMaker, cacheSave)
36+
preloadCache(preloadContext, client, urlMaker, cacheSave, metricsEngine)
3637

3738
saveOneRateLimited := newOccasionalSaver(cfg.Timeouts.ActiveTimeout())
38-
return func(ctx context.Context, specVersion, listVersion uint16) (vendorlist.VendorList, error) {
39+
return func(ctx context.Context, specVersion, listVersion uint16, metricsEngine metrics.MetricsEngine) (vendorlist.VendorList, error) {
3940
// Attempt To Load From Cache
4041
if list := cacheLoad(specVersion, listVersion); list != nil {
4142
return list, nil
4243
}
4344

4445
// Attempt To Download
4546
// - May not add to cache immediately.
46-
saveOneRateLimited(ctx, client, urlMaker(specVersion, listVersion), cacheSave)
47+
saveOneRateLimited(ctx, client, urlMaker(specVersion, listVersion), cacheSave, metricsEngine)
4748

4849
// Attempt To Load From Cache Again
4950
// - May have been added by the call to saveOneRateLimited.
@@ -61,7 +62,7 @@ func makeVendorListNotFoundError(specVersion, listVersion uint16) error {
6162
}
6263

6364
// preloadCache saves all the known versions of the vendor list for future use.
64-
func preloadCache(ctx context.Context, client *http.Client, urlMaker func(uint16, uint16) string, saver saveVendors) {
65+
func preloadCache(ctx context.Context, client *http.Client, urlMaker func(uint16, uint16) string, saver saveVendors, metricsEngine metrics.MetricsEngine) {
6566
versions := [2]struct {
6667
specVersion uint16
6768
firstListVersion uint16
@@ -76,10 +77,10 @@ func preloadCache(ctx context.Context, client *http.Client, urlMaker func(uint16
7677
},
7778
}
7879
for _, v := range versions {
79-
latestVersion := saveOne(ctx, client, urlMaker(v.specVersion, 0), saver)
80+
latestVersion := saveOne(ctx, client, urlMaker(v.specVersion, 0), saver, metricsEngine)
8081

8182
for i := v.firstListVersion; i < latestVersion; i++ {
82-
saveOne(ctx, client, urlMaker(v.specVersion, i), saver)
83+
saveOne(ctx, client, urlMaker(v.specVersion, i), saver, metricsEngine)
8384
}
8485
}
8586
}
@@ -98,24 +99,24 @@ func VendorListURLMaker(specVersion, listVersion uint16) string {
9899
// The goal here is to update quickly when new versions of the VendorList are released, but not wreck
99100
// server performance if a bad CMP starts sending us malformed consent strings that advertize a version
100101
// that doesn't exist yet.
101-
func newOccasionalSaver(timeout time.Duration) func(ctx context.Context, client *http.Client, url string, saver saveVendors) {
102+
func newOccasionalSaver(timeout time.Duration) func(ctx context.Context, client *http.Client, url string, saver saveVendors, metricsEngine metrics.MetricsEngine) {
102103
lastSaved := &atomic.Value{}
103104
lastSaved.Store(time.Time{})
104105

105-
return func(ctx context.Context, client *http.Client, url string, saver saveVendors) {
106+
return func(ctx context.Context, client *http.Client, url string, saver saveVendors, metricsEngine metrics.MetricsEngine) {
106107
now := time.Now()
107108
timeSinceLastSave := now.Sub(lastSaved.Load().(time.Time))
108109

109110
if timeSinceLastSave.Minutes() > 10 {
110111
withTimeout, cancel := context.WithTimeout(ctx, timeout)
111112
defer cancel()
112-
saveOne(withTimeout, client, url, saver)
113+
saveOne(withTimeout, client, url, saver, metricsEngine)
113114
lastSaved.Store(now)
114115
}
115116
}
116117
}
117118

118-
func saveOne(ctx context.Context, client *http.Client, url string, saver saveVendors) uint16 {
119+
func saveOne(ctx context.Context, client *http.Client, url string, saver saveVendors, me metrics.MetricsEngine) uint16 {
119120
req, err := http.NewRequest("GET", url, nil)
120121
if err != nil {
121122
glog.Errorf("Failed to build GET %s request. Cookie syncs may be affected: %v", url, err)
@@ -136,8 +137,11 @@ func saveOne(ctx context.Context, client *http.Client, url string, saver saveVen
136137
}
137138
if resp.StatusCode != http.StatusOK {
138139
glog.Errorf("GET %s returned %d. Cookie syncs may be affected.", url, resp.StatusCode)
140+
me.RecordGvlListRequest()
139141
return 0
140142
}
143+
me.RecordGvlListRequest()
144+
141145
var newList api.VendorList
142146
newList, err = vendorlist2.ParseEagerly(respBody)
143147
if err != nil {

gdpr/vendorlist-fetching_test.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/prebid/go-gdpr/api"
1313
"github.com/prebid/go-gdpr/consentconstants"
1414
"github.com/prebid/prebid-server/v3/config"
15+
"github.com/prebid/prebid-server/v3/metrics"
1516
"github.com/prebid/prebid-server/v3/util/jsonutil"
1617
)
1718

@@ -95,15 +96,17 @@ func TestFetcherThrottling(t *testing.T) {
9596
})))
9697
defer server.Close()
9798

98-
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), testURLMaker(server))
99+
m := &metrics.MetricsEngineMock{}
100+
m.On("RecordGvlListRequest").Times(3)
101+
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), m, testURLMaker(server))
99102

100103
// Dynamically Load List 2 Successfully
101-
_, errList1 := fetcher(context.Background(), 3, 2)
104+
_, errList1 := fetcher(context.Background(), 3, 2, m)
102105
assert.NoError(t, errList1)
103106

104107
// Fail To Load List 3 Due To Rate Limiting
105108
// - The request is rate limited after dynamically list 2.
106-
_, errList2 := fetcher(context.Background(), 3, 3)
109+
_, errList2 := fetcher(context.Background(), 3, 3, m)
107110
assert.EqualError(t, errList2, "gdpr vendor list spec version 3 list version 3 does not exist, or has not been loaded yet. Try again in a few minutes")
108111
}
109112

@@ -118,8 +121,10 @@ func TestMalformedVendorlist(t *testing.T) {
118121
})))
119122
defer server.Close()
120123

121-
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), testURLMaker(server))
122-
_, err := fetcher(context.Background(), 3, 1)
124+
m := &metrics.MetricsEngineMock{}
125+
m.On("RecordGvlListRequest").Times(3)
126+
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), m, testURLMaker(server))
127+
_, err := fetcher(context.Background(), 3, 1, m)
123128

124129
// Fetching should fail since vendor list could not be unmarshalled.
125130
assert.Error(t, err)
@@ -131,8 +136,10 @@ func TestServerUrlInvalid(t *testing.T) {
131136

132137
invalidURLGenerator := func(uint16, uint16) string { return " http://invalid-url-has-leading-whitespace" }
133138

134-
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), invalidURLGenerator)
135-
_, err := fetcher(context.Background(), 3, 1)
139+
m := &metrics.MetricsEngineMock{}
140+
m.On("RecordGvlListRequest").Times(2)
141+
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), m, invalidURLGenerator)
142+
_, err := fetcher(context.Background(), 3, 1, m)
136143

137144
assert.EqualError(t, err, "gdpr vendor list spec version 3 list version 1 does not exist, or has not been loaded yet. Try again in a few minutes")
138145
}
@@ -141,8 +148,10 @@ func TestServerUnavailable(t *testing.T) {
141148
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
142149
server.Close()
143150

144-
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), testURLMaker(server))
145-
_, err := fetcher(context.Background(), 3, 1)
151+
m := &metrics.MetricsEngineMock{}
152+
m.On("RecordGvlListRequest").Times(2)
153+
fetcher := NewVendorListFetcher(context.Background(), testConfig(), server.Client(), m, testURLMaker(server))
154+
_, err := fetcher(context.Background(), 3, 1, m)
146155

147156
assert.EqualError(t, err, "gdpr vendor list spec version 3 list version 1 does not exist, or has not been loaded yet. Try again in a few minutes")
148157
}
@@ -253,7 +262,9 @@ func TestPreloadCache(t *testing.T) {
253262
defer server.Close()
254263

255264
s := make(saver, 0, 5)
256-
preloadCache(context.Background(), server.Client(), testURLMaker(server), s.saveVendorLists)
265+
m := &metrics.MetricsEngineMock{}
266+
m.On("RecordGvlListRequest").Times(5)
267+
preloadCache(context.Background(), server.Client(), testURLMaker(server), s.saveVendorLists, m)
257268

258269
expectedLoadedVersions := []versionInfo{
259270
{specVersion: 2, listVersion: 2},
@@ -380,8 +391,10 @@ type testExpected struct {
380391

381392
func runTest(t *testing.T, test test, server *httptest.Server) {
382393
config := testConfig()
383-
fetcher := NewVendorListFetcher(context.Background(), config, server.Client(), testURLMaker(server))
384-
vendorList, err := fetcher(context.Background(), test.setup.specVersion, test.setup.listVersion)
394+
m := &metrics.MetricsEngineMock{}
395+
m.On("RecordGvlListRequest").Times(3)
396+
fetcher := NewVendorListFetcher(context.Background(), config, server.Client(), m, testURLMaker(server))
397+
vendorList, err := fetcher(context.Background(), test.setup.specVersion, test.setup.listVersion, m)
385398

386399
if test.expected.errorMessage != "" {
387400
assert.EqualError(t, err, test.expected.errorMessage, test.description+":error")

metrics/config/metrics.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,12 @@ func (me *MultiMetricsEngine) RecordStoredResponse(pubId string) {
293293
}
294294
}
295295

296+
func (me *MultiMetricsEngine) RecordGvlListRequest() {
297+
for _, thisME := range *me {
298+
thisME.RecordGvlListRequest()
299+
}
300+
}
301+
296302
func (me *MultiMetricsEngine) RecordAdsCertReq(success bool) {
297303
for _, thisME := range *me {
298304
thisME.RecordAdsCertReq(success)
@@ -513,6 +519,9 @@ func (me *NilMetricsEngine) RecordDebugRequest(debugEnabled bool, pubId string)
513519
func (me *NilMetricsEngine) RecordStoredResponse(pubId string) {
514520
}
515521

522+
func (me *NilMetricsEngine) RecordGvlListRequest() {
523+
}
524+
516525
func (me *NilMetricsEngine) RecordAdsCertReq(success bool) {
517526

518527
}

metrics/go_metrics.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type Metrics struct {
3535
TLSHandshakeTimer metrics.Timer
3636
BidderServerResponseTimer metrics.Timer
3737
StoredResponsesMeter metrics.Meter
38+
GvlListRequestsMeter metrics.Meter
3839

3940
// Metrics for OpenRTB requests specifically
4041
RequestStatuses map[RequestType]map[RequestStatus]metrics.Meter
@@ -182,6 +183,7 @@ func NewBlankMetrics(registry metrics.Registry, exchanges []string, disabledMetr
182183
SetUidStatusMeter: make(map[SetUidStatus]metrics.Meter),
183184
SyncerSetsMeter: make(map[string]map[SyncerSetUidStatus]metrics.Meter),
184185
StoredResponsesMeter: blankMeter,
186+
GvlListRequestsMeter: blankMeter,
185187

186188
ImpsTypeBanner: blankMeter,
187189
ImpsTypeVideo: blankMeter,
@@ -301,6 +303,7 @@ func NewMetrics(registry metrics.Registry, exchanges []openrtb_ext.BidderName, d
301303
newMetrics.PrebidCacheRequestTimerSuccess = metrics.GetOrRegisterTimer("prebid_cache_request_time.ok", registry)
302304
newMetrics.PrebidCacheRequestTimerError = metrics.GetOrRegisterTimer("prebid_cache_request_time.err", registry)
303305
newMetrics.StoredResponsesMeter = metrics.GetOrRegisterMeter("stored_responses", registry)
306+
newMetrics.GvlListRequestsMeter = metrics.GetOrRegisterMeter("gvl_requests", registry)
304307
newMetrics.OverheadTimer = makeOverheadTimerMetrics(registry)
305308
newMetrics.BidderServerResponseTimer = metrics.GetOrRegisterTimer("bidder_server_response_time_seconds", registry)
306309

@@ -627,6 +630,10 @@ func (me *Metrics) RecordStoredResponse(pubId string) {
627630
}
628631
}
629632

633+
func (me *Metrics) RecordGvlListRequest() {
634+
me.GvlListRequestsMeter.Mark(1)
635+
}
636+
630637
func (me *Metrics) RecordImps(labels ImpLabels) {
631638
me.ImpMeter.Mark(int64(1))
632639
if labels.BannerImps {

metrics/go_metrics_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestNewMetrics(t *testing.T) {
3636
ensureContains(t, registry, "setuid_requests.gdpr_blocked_host_cookie", m.SetUidStatusMeter[SetUidGDPRHostCookieBlocked])
3737
ensureContains(t, registry, "setuid_requests.syncer_unknown", m.SetUidStatusMeter[SetUidSyncerUnknown])
3838
ensureContains(t, registry, "stored_responses", m.StoredResponsesMeter)
39+
ensureContains(t, registry, "gvl_requests", m.GvlListRequestsMeter)
3940

4041
ensureContains(t, registry, "prebid_cache_request_time.ok", m.PrebidCacheRequestTimerSuccess)
4142
ensureContains(t, registry, "prebid_cache_request_time.err", m.PrebidCacheRequestTimerError)

metrics/metrics.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ type MetricsEngine interface {
459459
RecordAdapterGDPRRequestBlocked(adapterName openrtb_ext.BidderName)
460460
RecordDebugRequest(debugEnabled bool, pubId string)
461461
RecordStoredResponse(pubId string)
462+
RecordGvlListRequest()
462463
RecordAdsCertReq(success bool)
463464
RecordAdsCertSignTime(adsCertSignTime time.Duration)
464465
RecordBidValidationCreativeSizeError(adapter openrtb_ext.BidderName, account string)

0 commit comments

Comments
 (0)