github.com/prebid/prebid-server@v0.275.0/metrics/go_metrics_test.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/prebid/prebid-server/config" 9 "github.com/prebid/prebid-server/openrtb_ext" 10 metrics "github.com/rcrowley/go-metrics" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestNewMetrics(t *testing.T) { 15 registry := metrics.NewRegistry() 16 syncerKeys := []string{"foo"} 17 moduleStageNames := map[string][]string{"foobar": {"entry", "raw"}, "another_module": {"raw", "auction"}} 18 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{}, syncerKeys, moduleStageNames) 19 20 ensureContains(t, registry, "app_requests", m.AppRequestMeter) 21 ensureContains(t, registry, "debug_requests", m.DebugRequestMeter) 22 ensureContains(t, registry, "no_cookie_requests", m.NoCookieMeter) 23 ensureContains(t, registry, "request_time", m.RequestTimer) 24 ensureContains(t, registry, "amp_no_cookie_requests", m.AmpNoCookieMeter) 25 ensureContainsAdapterMetrics(t, registry, "adapter.appnexus", m.AdapterMetrics["appnexus"]) 26 ensureContainsAdapterMetrics(t, registry, "adapter.rubicon", m.AdapterMetrics["rubicon"]) 27 ensureContains(t, registry, "cookie_sync_requests", m.CookieSyncMeter) 28 ensureContains(t, registry, "cookie_sync_requests.ok", m.CookieSyncStatusMeter[CookieSyncOK]) 29 ensureContains(t, registry, "cookie_sync_requests.bad_request", m.CookieSyncStatusMeter[CookieSyncBadRequest]) 30 ensureContains(t, registry, "cookie_sync_requests.opt_out", m.CookieSyncStatusMeter[CookieSyncOptOut]) 31 ensureContains(t, registry, "cookie_sync_requests.gdpr_blocked_host_cookie", m.CookieSyncStatusMeter[CookieSyncGDPRHostCookieBlocked]) 32 ensureContains(t, registry, "setuid_requests", m.SetUidMeter) 33 ensureContains(t, registry, "setuid_requests.ok", m.SetUidStatusMeter[SetUidOK]) 34 ensureContains(t, registry, "setuid_requests.bad_request", m.SetUidStatusMeter[SetUidBadRequest]) 35 ensureContains(t, registry, "setuid_requests.opt_out", m.SetUidStatusMeter[SetUidOptOut]) 36 ensureContains(t, registry, "setuid_requests.gdpr_blocked_host_cookie", m.SetUidStatusMeter[SetUidGDPRHostCookieBlocked]) 37 ensureContains(t, registry, "setuid_requests.syncer_unknown", m.SetUidStatusMeter[SetUidSyncerUnknown]) 38 ensureContains(t, registry, "stored_responses", m.StoredResponsesMeter) 39 40 ensureContains(t, registry, "prebid_cache_request_time.ok", m.PrebidCacheRequestTimerSuccess) 41 ensureContains(t, registry, "prebid_cache_request_time.err", m.PrebidCacheRequestTimerError) 42 43 ensureContains(t, registry, "requests.ok.openrtb2-web", m.RequestStatuses[ReqTypeORTB2Web][RequestStatusOK]) 44 ensureContains(t, registry, "requests.badinput.openrtb2-web", m.RequestStatuses[ReqTypeORTB2Web][RequestStatusBadInput]) 45 ensureContains(t, registry, "requests.err.openrtb2-web", m.RequestStatuses[ReqTypeORTB2Web][RequestStatusErr]) 46 ensureContains(t, registry, "requests.networkerr.openrtb2-web", m.RequestStatuses[ReqTypeORTB2Web][RequestStatusNetworkErr]) 47 ensureContains(t, registry, "requests.ok.openrtb2-app", m.RequestStatuses[ReqTypeORTB2App][RequestStatusOK]) 48 ensureContains(t, registry, "requests.badinput.openrtb2-app", m.RequestStatuses[ReqTypeORTB2App][RequestStatusBadInput]) 49 ensureContains(t, registry, "requests.err.openrtb2-app", m.RequestStatuses[ReqTypeORTB2App][RequestStatusErr]) 50 ensureContains(t, registry, "requests.networkerr.openrtb2-app", m.RequestStatuses[ReqTypeORTB2App][RequestStatusNetworkErr]) 51 ensureContains(t, registry, "requests.ok.amp", m.RequestStatuses[ReqTypeAMP][RequestStatusOK]) 52 ensureContains(t, registry, "requests.badinput.amp", m.RequestStatuses[ReqTypeAMP][RequestStatusBadInput]) 53 ensureContains(t, registry, "requests.err.amp", m.RequestStatuses[ReqTypeAMP][RequestStatusErr]) 54 ensureContains(t, registry, "requests.networkerr.amp", m.RequestStatuses[ReqTypeAMP][RequestStatusNetworkErr]) 55 ensureContains(t, registry, "requests.ok.video", m.RequestStatuses[ReqTypeVideo][RequestStatusOK]) 56 ensureContains(t, registry, "requests.badinput.video", m.RequestStatuses[ReqTypeVideo][RequestStatusBadInput]) 57 ensureContains(t, registry, "requests.err.video", m.RequestStatuses[ReqTypeVideo][RequestStatusErr]) 58 ensureContains(t, registry, "requests.networkerr.video", m.RequestStatuses[ReqTypeVideo][RequestStatusNetworkErr]) 59 60 ensureContains(t, registry, "queued_requests.video.rejected", m.RequestsQueueTimer[ReqTypeVideo][false]) 61 ensureContains(t, registry, "queued_requests.video.accepted", m.RequestsQueueTimer[ReqTypeVideo][true]) 62 63 ensureContains(t, registry, "timeout_notification.ok", m.TimeoutNotificationSuccess) 64 ensureContains(t, registry, "timeout_notification.failed", m.TimeoutNotificationFailure) 65 66 ensureContains(t, registry, "privacy.request.ccpa.specified", m.PrivacyCCPARequest) 67 ensureContains(t, registry, "privacy.request.ccpa.opt-out", m.PrivacyCCPARequestOptOut) 68 ensureContains(t, registry, "privacy.request.coppa", m.PrivacyCOPPARequest) 69 ensureContains(t, registry, "privacy.request.lmt", m.PrivacyLMTRequest) 70 ensureContains(t, registry, "privacy.request.tcf.v2", m.PrivacyTCFRequestVersion[TCFVersionV2]) 71 ensureContains(t, registry, "privacy.request.tcf.err", m.PrivacyTCFRequestVersion[TCFVersionErr]) 72 73 ensureContains(t, registry, "syncer.foo.request.ok", m.SyncerRequestsMeter["foo"][SyncerCookieSyncOK]) 74 ensureContains(t, registry, "syncer.foo.request.privacy_blocked", m.SyncerRequestsMeter["foo"][SyncerCookieSyncPrivacyBlocked]) 75 ensureContains(t, registry, "syncer.foo.request.already_synced", m.SyncerRequestsMeter["foo"][SyncerCookieSyncAlreadySynced]) 76 ensureContains(t, registry, "syncer.foo.request.type_not_supported", m.SyncerRequestsMeter["foo"][SyncerCookieSyncTypeNotSupported]) 77 ensureContains(t, registry, "syncer.foo.set.ok", m.SyncerSetsMeter["foo"][SyncerSetUidOK]) 78 ensureContains(t, registry, "syncer.foo.set.cleared", m.SyncerSetsMeter["foo"][SyncerSetUidCleared]) 79 80 ensureContains(t, registry, "ads_cert_requests.ok", m.AdsCertRequestsSuccess) 81 ensureContains(t, registry, "ads_cert_requests.failed", m.AdsCertRequestsFailure) 82 83 ensureContains(t, registry, "request_over_head_time.pre-bidder", m.OverheadTimer[PreBidder]) 84 ensureContains(t, registry, "request_over_head_time.make-auction-response", m.OverheadTimer[MakeAuctionResponse]) 85 ensureContains(t, registry, "request_over_head_time.make-bidder-requests", m.OverheadTimer[MakeBidderRequests]) 86 ensureContains(t, registry, "bidder_server_response_time_seconds", m.BidderServerResponseTimer) 87 ensureContains(t, registry, "tmax_timeout", m.TMaxTimeoutCounter) 88 89 for module, stages := range moduleStageNames { 90 for _, stage := range stages { 91 ensureContainsModuleMetrics(t, registry, fmt.Sprintf("modules.module.%s.stage.%s", module, stage), m.ModuleMetrics[module][stage]) 92 } 93 } 94 } 95 96 func TestRecordBidType(t *testing.T) { 97 registry := metrics.NewRegistry() 98 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 99 100 m.RecordAdapterBidReceived(AdapterLabels{ 101 Adapter: openrtb_ext.BidderAppnexus, 102 }, openrtb_ext.BidTypeBanner, true) 103 VerifyMetrics(t, "Appnexus Banner Adm Bids", m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[openrtb_ext.BidTypeBanner].AdmMeter.Count(), 1) 104 VerifyMetrics(t, "Appnexus Banner Nurl Bids", m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[openrtb_ext.BidTypeBanner].NurlMeter.Count(), 0) 105 106 m.RecordAdapterBidReceived(AdapterLabels{ 107 Adapter: openrtb_ext.BidderAppnexus, 108 }, openrtb_ext.BidTypeVideo, false) 109 VerifyMetrics(t, "Appnexus Video Adm Bids", m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[openrtb_ext.BidTypeVideo].AdmMeter.Count(), 0) 110 VerifyMetrics(t, "Appnexus Video Nurl Bids", m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[openrtb_ext.BidTypeVideo].NurlMeter.Count(), 1) 111 } 112 113 func ensureContains(t *testing.T, registry metrics.Registry, name string, metric interface{}) { 114 t.Helper() 115 if inRegistry := registry.Get(name); inRegistry == nil { 116 t.Errorf("No metric in registry at %s.", name) 117 } else if inRegistry != metric { 118 t.Errorf("Bad value stored at metric %s.", name) 119 } 120 } 121 122 func ensureContainsAdapterMetrics(t *testing.T, registry metrics.Registry, name string, adapterMetrics *AdapterMetrics) { 123 t.Helper() 124 ensureContains(t, registry, name+".no_cookie_requests", adapterMetrics.NoCookieMeter) 125 ensureContains(t, registry, name+".requests.gotbids", adapterMetrics.GotBidsMeter) 126 ensureContains(t, registry, name+".requests.nobid", adapterMetrics.NoBidMeter) 127 ensureContains(t, registry, name+".requests.badinput", adapterMetrics.ErrorMeters[AdapterErrorBadInput]) 128 ensureContains(t, registry, name+".requests.badserverresponse", adapterMetrics.ErrorMeters[AdapterErrorBadServerResponse]) 129 ensureContains(t, registry, name+".requests.timeout", adapterMetrics.ErrorMeters[AdapterErrorTimeout]) 130 ensureContains(t, registry, name+".requests.unknown_error", adapterMetrics.ErrorMeters[AdapterErrorUnknown]) 131 132 ensureContains(t, registry, name+".request_time", adapterMetrics.RequestTimer) 133 ensureContains(t, registry, name+".prices", adapterMetrics.PriceHistogram) 134 ensureContainsBidTypeMetrics(t, registry, name, adapterMetrics.MarkupMetrics) 135 136 ensureContains(t, registry, name+".connections_created", adapterMetrics.ConnCreated) 137 ensureContains(t, registry, name+".connections_reused", adapterMetrics.ConnReused) 138 ensureContains(t, registry, name+".connection_wait_time", adapterMetrics.ConnWaitTime) 139 140 ensureContains(t, registry, name+".response.validation.size.err", adapterMetrics.BidValidationCreativeSizeErrorMeter) 141 ensureContains(t, registry, name+".response.validation.size.warn", adapterMetrics.BidValidationCreativeSizeWarnMeter) 142 ensureContains(t, registry, name+".response.validation.secure.err", adapterMetrics.BidValidationSecureMarkupErrorMeter) 143 ensureContains(t, registry, name+".response.validation.secure.warn", adapterMetrics.BidValidationSecureMarkupWarnMeter) 144 145 } 146 147 func ensureContainsModuleMetrics(t *testing.T, registry metrics.Registry, name string, moduleMetrics *ModuleMetrics) { 148 t.Helper() 149 ensureContains(t, registry, name+".duration", moduleMetrics.DurationTimer) 150 ensureContains(t, registry, name+".call", moduleMetrics.CallCounter) 151 ensureContains(t, registry, name+".failure", moduleMetrics.FailureCounter) 152 ensureContains(t, registry, name+".success.noop", moduleMetrics.SuccessNoopCounter) 153 ensureContains(t, registry, name+".success.update", moduleMetrics.SuccessUpdateCounter) 154 ensureContains(t, registry, name+".success.reject", moduleMetrics.SuccessRejectCounter) 155 ensureContains(t, registry, name+".execution_error", moduleMetrics.ExecutionErrorCounter) 156 ensureContains(t, registry, name+".timeout", moduleMetrics.TimeoutCounter) 157 } 158 159 func TestRecordBidTypeDisabledConfig(t *testing.T) { 160 testCases := []struct { 161 hasAdm bool 162 DisabledMetrics config.DisabledMetrics 163 ExpectedAdmMeterCount int64 164 ExpectedNurlMeterCount int64 165 BidType openrtb_ext.BidType 166 PubID string 167 }{ 168 { 169 hasAdm: true, 170 DisabledMetrics: config.DisabledMetrics{}, 171 ExpectedAdmMeterCount: 1, 172 ExpectedNurlMeterCount: 0, 173 BidType: openrtb_ext.BidTypeBanner, 174 PubID: "acct-id", 175 }, 176 { 177 hasAdm: false, 178 DisabledMetrics: config.DisabledMetrics{}, 179 ExpectedAdmMeterCount: 0, 180 ExpectedNurlMeterCount: 1, 181 BidType: openrtb_ext.BidTypeVideo, 182 PubID: "acct-id", 183 }, 184 { 185 hasAdm: false, 186 DisabledMetrics: config.DisabledMetrics{AccountAdapterDetails: true}, 187 ExpectedAdmMeterCount: 0, 188 ExpectedNurlMeterCount: 1, 189 BidType: openrtb_ext.BidTypeVideo, 190 PubID: "acct-id", 191 }, 192 { 193 hasAdm: true, 194 DisabledMetrics: config.DisabledMetrics{AccountAdapterDetails: true}, 195 ExpectedAdmMeterCount: 1, 196 ExpectedNurlMeterCount: 0, 197 BidType: openrtb_ext.BidTypeBanner, 198 PubID: "acct-id", 199 }, 200 } 201 202 for _, test := range testCases { 203 registry := metrics.NewRegistry() 204 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, test.DisabledMetrics, nil, nil) 205 206 m.RecordAdapterBidReceived(AdapterLabels{ 207 Adapter: openrtb_ext.BidderAppnexus, 208 PubID: test.PubID, 209 }, test.BidType, test.hasAdm) 210 assert.Equal(t, test.ExpectedAdmMeterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[test.BidType].AdmMeter.Count(), "Appnexus Banner Adm Bids") 211 assert.Equal(t, test.ExpectedNurlMeterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].MarkupMetrics[test.BidType].NurlMeter.Count(), "Appnexus Banner Nurl Bids") 212 213 if test.DisabledMetrics.AccountAdapterDetails { 214 assert.Len(t, m.accountMetrics[test.PubID].adapterMetrics, 0, "Test failed. Account metrics that contain adapter information are disabled, therefore we expect no entries in m.accountMetrics[accountId].adapterMetrics, we have %d \n", len(m.accountMetrics[test.PubID].adapterMetrics)) 215 } else { 216 assert.NotEqual(t, 0, len(m.accountMetrics[test.PubID].adapterMetrics), "Test failed. Account metrics that contain adapter information are disabled, therefore we expect no entries in m.accountMetrics[accountId].adapterMetrics, we have %d \n", len(m.accountMetrics[test.PubID].adapterMetrics)) 217 } 218 } 219 } 220 221 func TestRecordDebugRequest(t *testing.T) { 222 testCases := []struct { 223 description string 224 givenDisabledMetrics config.DisabledMetrics 225 givenDebugEnabledFlag bool 226 givenPubID string 227 expectedAccountDebugCount int64 228 expectedDebugCount int64 229 }{ 230 { 231 description: "Debug is enabled and account debug is enabled, both metrics should be updated", 232 givenDisabledMetrics: config.DisabledMetrics{ 233 AccountAdapterDetails: true, 234 AccountDebug: false, 235 }, 236 givenDebugEnabledFlag: true, 237 givenPubID: "acct-id", 238 expectedAccountDebugCount: 1, 239 expectedDebugCount: 1, 240 }, 241 { 242 description: "Debug and account debug are disabled, niether metrics should be updated", 243 givenDisabledMetrics: config.DisabledMetrics{ 244 AccountAdapterDetails: true, 245 AccountDebug: true, 246 }, 247 givenDebugEnabledFlag: false, 248 givenPubID: "acct-id", 249 expectedAccountDebugCount: 0, 250 expectedDebugCount: 0, 251 }, 252 { 253 description: "Debug is enabled and account debug is enabled, but unknown PubID leads to account debug being 0", 254 givenDisabledMetrics: config.DisabledMetrics{ 255 AccountAdapterDetails: true, 256 AccountDebug: false, 257 }, 258 givenDebugEnabledFlag: true, 259 givenPubID: PublisherUnknown, 260 expectedAccountDebugCount: 0, 261 expectedDebugCount: 1, 262 }, 263 { 264 description: "Debug is disabled, account debug is enabled, niether metric should update", 265 givenDisabledMetrics: config.DisabledMetrics{ 266 AccountAdapterDetails: true, 267 AccountDebug: false, 268 }, 269 givenDebugEnabledFlag: false, 270 givenPubID: "acct-id", 271 expectedAccountDebugCount: 0, 272 expectedDebugCount: 0, 273 }, 274 } 275 for _, test := range testCases { 276 registry := metrics.NewRegistry() 277 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, test.givenDisabledMetrics, nil, nil) 278 279 m.RecordDebugRequest(test.givenDebugEnabledFlag, test.givenPubID) 280 am := m.getAccountMetrics(test.givenPubID) 281 282 assert.Equal(t, test.expectedDebugCount, m.DebugRequestMeter.Count()) 283 assert.Equal(t, test.expectedAccountDebugCount, am.debugRequestMeter.Count()) 284 } 285 } 286 287 func TestRecordBidValidationCreativeSize(t *testing.T) { 288 testCases := []struct { 289 description string 290 givenDisabledMetrics config.DisabledMetrics 291 givenPubID string 292 expectedAccountCount int64 293 expectedAdapterCount int64 294 }{ 295 { 296 description: "Account Metric isn't disabled, so both metrics should be incremented", 297 givenDisabledMetrics: config.DisabledMetrics{ 298 AccountAdapterDetails: false, 299 }, 300 givenPubID: "acct-id", 301 expectedAdapterCount: 1, 302 expectedAccountCount: 1, 303 }, 304 { 305 description: "Account Metric is disabled, so only the adapter metric should increment", 306 givenDisabledMetrics: config.DisabledMetrics{ 307 AccountAdapterDetails: true, 308 }, 309 givenPubID: "acct-id", 310 expectedAdapterCount: 1, 311 expectedAccountCount: 0, 312 }, 313 } 314 for _, test := range testCases { 315 registry := metrics.NewRegistry() 316 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, test.givenDisabledMetrics, nil, nil) 317 318 m.RecordBidValidationCreativeSizeError(openrtb_ext.BidderAppnexus, test.givenPubID) 319 m.RecordBidValidationCreativeSizeWarn(openrtb_ext.BidderAppnexus, test.givenPubID) 320 am := m.getAccountMetrics(test.givenPubID) 321 322 assert.Equal(t, test.expectedAdapterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].BidValidationCreativeSizeErrorMeter.Count()) 323 assert.Equal(t, test.expectedAdapterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].BidValidationCreativeSizeWarnMeter.Count()) 324 assert.Equal(t, test.expectedAccountCount, am.bidValidationCreativeSizeMeter.Count()) 325 assert.Equal(t, test.expectedAccountCount, am.bidValidationCreativeSizeWarnMeter.Count()) 326 } 327 } 328 329 func TestRecordBidValidationSecureMarkup(t *testing.T) { 330 testCases := []struct { 331 description string 332 givenDisabledMetrics config.DisabledMetrics 333 givenPubID string 334 expectedAccountCount int64 335 expectedAdapterCount int64 336 }{ 337 { 338 description: "Account Metric isn't disabled, so both metrics should be incremented", 339 givenDisabledMetrics: config.DisabledMetrics{ 340 AccountAdapterDetails: false, 341 }, 342 givenPubID: "acct-id", 343 expectedAdapterCount: 1, 344 expectedAccountCount: 1, 345 }, 346 { 347 description: "Account Metric is disabled, so only the adapter metric should increment", 348 givenDisabledMetrics: config.DisabledMetrics{ 349 AccountAdapterDetails: true, 350 }, 351 givenPubID: "acct-id", 352 expectedAdapterCount: 1, 353 expectedAccountCount: 0, 354 }, 355 } 356 for _, test := range testCases { 357 registry := metrics.NewRegistry() 358 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, test.givenDisabledMetrics, nil, nil) 359 360 m.RecordBidValidationSecureMarkupError(openrtb_ext.BidderAppnexus, test.givenPubID) 361 m.RecordBidValidationSecureMarkupWarn(openrtb_ext.BidderAppnexus, test.givenPubID) 362 am := m.getAccountMetrics(test.givenPubID) 363 364 assert.Equal(t, test.expectedAdapterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].BidValidationSecureMarkupErrorMeter.Count()) 365 assert.Equal(t, test.expectedAdapterCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].BidValidationSecureMarkupWarnMeter.Count()) 366 assert.Equal(t, test.expectedAccountCount, am.bidValidationSecureMarkupMeter.Count()) 367 assert.Equal(t, test.expectedAccountCount, am.bidValidationSecureMarkupWarnMeter.Count()) 368 } 369 } 370 371 func TestRecordDNSTime(t *testing.T) { 372 testCases := []struct { 373 description string 374 inDnsLookupDuration time.Duration 375 outExpDuration time.Duration 376 }{ 377 { 378 description: "Five second DNS lookup time", 379 inDnsLookupDuration: time.Second * 5, 380 outExpDuration: time.Second * 5, 381 }, 382 { 383 description: "Zero DNS lookup time", 384 inDnsLookupDuration: time.Duration(0), 385 outExpDuration: time.Duration(0), 386 }, 387 } 388 for _, test := range testCases { 389 registry := metrics.NewRegistry() 390 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 391 392 m.RecordDNSTime(test.inDnsLookupDuration) 393 394 assert.Equal(t, test.outExpDuration.Nanoseconds(), m.DNSLookupTimer.Sum(), test.description) 395 } 396 } 397 398 func TestRecordTLSHandshakeTime(t *testing.T) { 399 testCases := []struct { 400 description string 401 tLSHandshakeDuration time.Duration 402 expectedDuration time.Duration 403 }{ 404 { 405 description: "Five second TLS handshake time", 406 tLSHandshakeDuration: time.Second * 5, 407 expectedDuration: time.Second * 5, 408 }, 409 { 410 description: "Zero TLS handshake time", 411 tLSHandshakeDuration: time.Duration(0), 412 expectedDuration: time.Duration(0), 413 }, 414 } 415 for _, test := range testCases { 416 registry := metrics.NewRegistry() 417 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 418 419 m.RecordTLSHandshakeTime(test.tLSHandshakeDuration) 420 421 assert.Equal(t, test.expectedDuration.Nanoseconds(), m.TLSHandshakeTimer.Sum(), test.description) 422 } 423 } 424 425 func TestRecordBidderServerResponseTime(t *testing.T) { 426 testCases := []struct { 427 name string 428 time time.Duration 429 expectedCount int64 430 expectedSum int64 431 }{ 432 { 433 name: "record-bidder-server-response-time-1", 434 time: time.Duration(500), 435 expectedCount: 1, 436 expectedSum: 500, 437 }, 438 { 439 name: "record-bidder-server-response-time-2", 440 time: time.Duration(500), 441 expectedCount: 2, 442 expectedSum: 1000, 443 }, 444 } 445 for _, test := range testCases { 446 registry := metrics.NewRegistry() 447 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 448 449 m.RecordBidderServerResponseTime(test.time) 450 451 assert.Equal(t, test.time.Nanoseconds(), m.BidderServerResponseTimer.Sum(), test.name) 452 } 453 } 454 455 func TestRecordAdapterConnections(t *testing.T) { 456 var fakeBidder openrtb_ext.BidderName = "fooAdvertising" 457 458 type testIn struct { 459 adapterName openrtb_ext.BidderName 460 connWasReused bool 461 connWait time.Duration 462 connMetricsDisabled bool 463 } 464 465 type testOut struct { 466 expectedConnReusedCount int64 467 expectedConnCreatedCount int64 468 expectedConnWaitTime time.Duration 469 } 470 471 testCases := []struct { 472 description string 473 in testIn 474 out testOut 475 }{ 476 { 477 description: "Successful, new connection created, has connection wait", 478 in: testIn{ 479 adapterName: openrtb_ext.BidderAppnexus, 480 connWasReused: false, 481 connWait: time.Second * 5, 482 connMetricsDisabled: false, 483 }, 484 out: testOut{ 485 expectedConnReusedCount: 0, 486 expectedConnCreatedCount: 1, 487 expectedConnWaitTime: time.Second * 5, 488 }, 489 }, 490 { 491 description: "Successful, new connection created, has connection wait", 492 in: testIn{ 493 adapterName: openrtb_ext.BidderAppnexus, 494 connWasReused: false, 495 connWait: time.Second * 4, 496 connMetricsDisabled: false, 497 }, 498 out: testOut{ 499 expectedConnCreatedCount: 1, 500 expectedConnWaitTime: time.Second * 4, 501 }, 502 }, 503 { 504 description: "Successful, was reused, no connection wait", 505 in: testIn{ 506 adapterName: openrtb_ext.BidderAppnexus, 507 connWasReused: true, 508 connMetricsDisabled: false, 509 }, 510 out: testOut{ 511 expectedConnReusedCount: 1, 512 expectedConnWaitTime: 0, 513 }, 514 }, 515 { 516 description: "Successful, was reused, has connection wait", 517 in: testIn{ 518 adapterName: openrtb_ext.BidderAppnexus, 519 connWasReused: true, 520 connWait: time.Second * 5, 521 connMetricsDisabled: false, 522 }, 523 out: testOut{ 524 expectedConnReusedCount: 1, 525 expectedConnWaitTime: time.Second * 5, 526 }, 527 }, 528 { 529 description: "Fake bidder, nothing gets updated", 530 in: testIn{ 531 adapterName: fakeBidder, 532 connWasReused: false, 533 connWait: 0, 534 connMetricsDisabled: false, 535 }, 536 out: testOut{}, 537 }, 538 { 539 description: "Adapter connection metrics are disabled, nothing gets updated", 540 in: testIn{ 541 adapterName: openrtb_ext.BidderAppnexus, 542 connWasReused: false, 543 connWait: time.Second * 5, 544 connMetricsDisabled: true, 545 }, 546 out: testOut{}, 547 }, 548 } 549 550 for i, test := range testCases { 551 registry := metrics.NewRegistry() 552 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AdapterConnectionMetrics: test.in.connMetricsDisabled}, nil, nil) 553 554 m.RecordAdapterConnections(test.in.adapterName, test.in.connWasReused, test.in.connWait) 555 556 assert.Equal(t, test.out.expectedConnReusedCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].ConnReused.Count(), "Test [%d] incorrect number of reused connections to adapter", i) 557 assert.Equal(t, test.out.expectedConnCreatedCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].ConnCreated.Count(), "Test [%d] incorrect number of new connections to adapter created", i) 558 assert.Equal(t, test.out.expectedConnWaitTime.Nanoseconds(), m.AdapterMetrics[openrtb_ext.BidderAppnexus].ConnWaitTime.Sum(), "Test [%d] incorrect wait time in connection to adapter", i) 559 } 560 } 561 562 func TestNewMetricsWithDisabledConfig(t *testing.T) { 563 registry := metrics.NewRegistry() 564 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{AccountAdapterDetails: true, AccountModulesMetrics: true}, nil, map[string][]string{"foobar": {"entry", "raw"}}) 565 566 assert.True(t, m.MetricsDisabled.AccountAdapterDetails, "Accound adapter metrics should be disabled") 567 assert.True(t, m.MetricsDisabled.AccountModulesMetrics, "Accound modules metrics should be disabled") 568 } 569 570 func TestRecordPrebidCacheRequestTimeWithSuccess(t *testing.T) { 571 registry := metrics.NewRegistry() 572 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 573 574 m.RecordPrebidCacheRequestTime(true, 42) 575 576 assert.Equal(t, m.PrebidCacheRequestTimerSuccess.Count(), int64(1)) 577 assert.Equal(t, m.PrebidCacheRequestTimerError.Count(), int64(0)) 578 } 579 580 func TestRecordPrebidCacheRequestTimeWithNotSuccess(t *testing.T) { 581 registry := metrics.NewRegistry() 582 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 583 584 m.RecordPrebidCacheRequestTime(false, 42) 585 586 assert.Equal(t, m.PrebidCacheRequestTimerSuccess.Count(), int64(0)) 587 assert.Equal(t, m.PrebidCacheRequestTimerError.Count(), int64(1)) 588 } 589 590 func TestRecordStoredDataFetchTime(t *testing.T) { 591 tests := []struct { 592 description string 593 dataType StoredDataType 594 fetchType StoredDataFetchType 595 }{ 596 { 597 description: "Update stored_account_fetch_time.all timer", 598 dataType: AccountDataType, 599 fetchType: FetchAll, 600 }, 601 { 602 description: "Update stored_amp_fetch_time.all timer", 603 dataType: AMPDataType, 604 fetchType: FetchAll, 605 }, 606 { 607 description: "Update stored_category_fetch_time.all timer", 608 dataType: CategoryDataType, 609 fetchType: FetchAll, 610 }, 611 { 612 description: "Update stored_request_fetch_time.all timer", 613 dataType: RequestDataType, 614 fetchType: FetchAll, 615 }, 616 { 617 description: "Update stored_video_fetch_time.all timer", 618 dataType: VideoDataType, 619 fetchType: FetchAll, 620 }, 621 { 622 description: "Update stored_account_fetch_time.delta timer", 623 dataType: AccountDataType, 624 fetchType: FetchDelta, 625 }, 626 { 627 description: "Update stored_amp_fetch_time.delta timer", 628 dataType: AMPDataType, 629 fetchType: FetchDelta, 630 }, 631 { 632 description: "Update stored_category_fetch_time.delta timer", 633 dataType: CategoryDataType, 634 fetchType: FetchDelta, 635 }, 636 { 637 description: "Update stored_request_fetch_time.delta timer", 638 dataType: RequestDataType, 639 fetchType: FetchDelta, 640 }, 641 { 642 description: "Update stored_video_fetch_time.delta timer", 643 dataType: VideoDataType, 644 fetchType: FetchDelta, 645 }, 646 } 647 648 for _, tt := range tests { 649 registry := metrics.NewRegistry() 650 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 651 m.RecordStoredDataFetchTime(StoredDataLabels{ 652 DataType: tt.dataType, 653 DataFetchType: tt.fetchType, 654 }, time.Duration(500)) 655 656 actualCount := m.StoredDataFetchTimer[tt.dataType][tt.fetchType].Count() 657 assert.Equal(t, int64(1), actualCount, tt.description) 658 659 actualDuration := m.StoredDataFetchTimer[tt.dataType][tt.fetchType].Sum() 660 assert.Equal(t, int64(500), actualDuration, tt.description) 661 } 662 } 663 664 func TestRecordStoredDataError(t *testing.T) { 665 tests := []struct { 666 description string 667 dataType StoredDataType 668 errorType StoredDataError 669 }{ 670 { 671 description: "Increment stored_account_error.network meter", 672 dataType: AccountDataType, 673 errorType: StoredDataErrorNetwork, 674 }, 675 { 676 description: "Increment stored_amp_error.network meter", 677 dataType: AMPDataType, 678 errorType: StoredDataErrorNetwork, 679 }, 680 { 681 description: "Increment stored_category_error.network meter", 682 dataType: CategoryDataType, 683 errorType: StoredDataErrorNetwork, 684 }, 685 { 686 description: "Increment stored_request_error.network meter", 687 dataType: RequestDataType, 688 errorType: StoredDataErrorNetwork, 689 }, 690 { 691 description: "Increment stored_video_error.network meter", 692 dataType: VideoDataType, 693 errorType: StoredDataErrorNetwork, 694 }, 695 { 696 description: "Increment stored_account_error.undefined meter", 697 dataType: AccountDataType, 698 errorType: StoredDataErrorUndefined, 699 }, 700 { 701 description: "Increment stored_amp_error.undefined meter", 702 dataType: AMPDataType, 703 errorType: StoredDataErrorUndefined, 704 }, 705 { 706 description: "Increment stored_category_error.undefined meter", 707 dataType: CategoryDataType, 708 errorType: StoredDataErrorUndefined, 709 }, 710 { 711 description: "Increment stored_request_error.undefined meter", 712 dataType: RequestDataType, 713 errorType: StoredDataErrorUndefined, 714 }, 715 { 716 description: "Increment stored_video_error.undefined meter", 717 dataType: VideoDataType, 718 errorType: StoredDataErrorUndefined, 719 }, 720 } 721 722 for _, tt := range tests { 723 registry := metrics.NewRegistry() 724 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 725 m.RecordStoredDataError(StoredDataLabels{ 726 DataType: tt.dataType, 727 Error: tt.errorType, 728 }) 729 730 actualCount := m.StoredDataErrorMeter[tt.dataType][tt.errorType].Count() 731 assert.Equal(t, int64(1), actualCount, tt.description) 732 } 733 } 734 735 func TestRecordRequestPrivacy(t *testing.T) { 736 registry := metrics.NewRegistry() 737 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{AccountAdapterDetails: true}, nil, nil) 738 739 // CCPA 740 m.RecordRequestPrivacy(PrivacyLabels{ 741 CCPAEnforced: true, 742 CCPAProvided: true, 743 }) 744 m.RecordRequestPrivacy(PrivacyLabels{ 745 CCPAEnforced: true, 746 CCPAProvided: false, 747 }) 748 m.RecordRequestPrivacy(PrivacyLabels{ 749 CCPAEnforced: false, 750 CCPAProvided: true, 751 }) 752 753 // COPPA 754 m.RecordRequestPrivacy(PrivacyLabels{ 755 COPPAEnforced: true, 756 }) 757 758 // LMT 759 m.RecordRequestPrivacy(PrivacyLabels{ 760 LMTEnforced: true, 761 }) 762 763 // GDPR 764 m.RecordRequestPrivacy(PrivacyLabels{ 765 GDPREnforced: true, 766 GDPRTCFVersion: TCFVersionErr, 767 }) 768 m.RecordRequestPrivacy(PrivacyLabels{ 769 GDPREnforced: true, 770 GDPRTCFVersion: TCFVersionV2, 771 }) 772 773 assert.Equal(t, m.PrivacyCCPARequest.Count(), int64(2), "CCPA") 774 assert.Equal(t, m.PrivacyCCPARequestOptOut.Count(), int64(1), "CCPA Opt Out") 775 assert.Equal(t, m.PrivacyCOPPARequest.Count(), int64(1), "COPPA") 776 assert.Equal(t, m.PrivacyLMTRequest.Count(), int64(1), "LMT") 777 assert.Equal(t, m.PrivacyTCFRequestVersion[TCFVersionErr].Count(), int64(1), "TCF Err") 778 assert.Equal(t, m.PrivacyTCFRequestVersion[TCFVersionV2].Count(), int64(1), "TCF V2") 779 } 780 781 func TestRecordAdapterGDPRRequestBlocked(t *testing.T) { 782 var fakeBidder openrtb_ext.BidderName = "fooAdvertising" 783 784 tests := []struct { 785 description string 786 metricsDisabled bool 787 adapterName openrtb_ext.BidderName 788 expectedCount int64 789 }{ 790 { 791 description: "", 792 metricsDisabled: false, 793 adapterName: openrtb_ext.BidderAppnexus, 794 expectedCount: 1, 795 }, 796 { 797 description: "", 798 metricsDisabled: false, 799 adapterName: fakeBidder, 800 expectedCount: 0, 801 }, 802 { 803 description: "", 804 metricsDisabled: true, 805 adapterName: openrtb_ext.BidderAppnexus, 806 expectedCount: 0, 807 }, 808 } 809 810 for _, tt := range tests { 811 registry := metrics.NewRegistry() 812 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AdapterGDPRRequestBlocked: tt.metricsDisabled}, nil, nil) 813 814 m.RecordAdapterGDPRRequestBlocked(tt.adapterName) 815 816 assert.Equal(t, tt.expectedCount, m.AdapterMetrics[openrtb_ext.BidderAppnexus].GDPRRequestBlocked.Count(), tt.description) 817 } 818 } 819 820 func TestRecordCookieSync(t *testing.T) { 821 registry := metrics.NewRegistry() 822 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{}, nil, nil) 823 824 // Known 825 m.RecordCookieSync(CookieSyncBadRequest) 826 827 // Unknown 828 m.RecordCookieSync(CookieSyncStatus("unknown status")) 829 830 assert.Equal(t, m.CookieSyncMeter.Count(), int64(2)) 831 assert.Equal(t, m.CookieSyncStatusMeter[CookieSyncOK].Count(), int64(0)) 832 assert.Equal(t, m.CookieSyncStatusMeter[CookieSyncBadRequest].Count(), int64(1)) 833 assert.Equal(t, m.CookieSyncStatusMeter[CookieSyncOptOut].Count(), int64(0)) 834 assert.Equal(t, m.CookieSyncStatusMeter[CookieSyncGDPRHostCookieBlocked].Count(), int64(0)) 835 } 836 837 func TestRecordSyncerRequest(t *testing.T) { 838 registry := metrics.NewRegistry() 839 syncerKeys := []string{"foo"} 840 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{}, syncerKeys, nil) 841 842 // Known 843 m.RecordSyncerRequest("foo", SyncerCookieSyncOK) 844 845 // Unknown Bidder 846 m.RecordSyncerRequest("bar", SyncerCookieSyncOK) 847 848 // Unknown Status 849 m.RecordSyncerRequest("foo", SyncerCookieSyncStatus("unknown status")) 850 851 assert.Equal(t, m.SyncerRequestsMeter["foo"][SyncerCookieSyncOK].Count(), int64(1)) 852 assert.Equal(t, m.SyncerRequestsMeter["foo"][SyncerCookieSyncPrivacyBlocked].Count(), int64(0)) 853 assert.Equal(t, m.SyncerRequestsMeter["foo"][SyncerCookieSyncAlreadySynced].Count(), int64(0)) 854 assert.Equal(t, m.SyncerRequestsMeter["foo"][SyncerCookieSyncTypeNotSupported].Count(), int64(0)) 855 } 856 857 func TestRecordSetUid(t *testing.T) { 858 registry := metrics.NewRegistry() 859 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{}, nil, nil) 860 861 // Known 862 m.RecordSetUid(SetUidOptOut) 863 864 // Unknown 865 m.RecordSetUid(SetUidStatus("unknown status")) 866 867 assert.Equal(t, m.SetUidMeter.Count(), int64(2)) 868 assert.Equal(t, m.SetUidStatusMeter[SetUidOK].Count(), int64(0)) 869 assert.Equal(t, m.SetUidStatusMeter[SetUidBadRequest].Count(), int64(0)) 870 assert.Equal(t, m.SetUidStatusMeter[SetUidOptOut].Count(), int64(1)) 871 assert.Equal(t, m.SetUidStatusMeter[SetUidGDPRHostCookieBlocked].Count(), int64(0)) 872 assert.Equal(t, m.SetUidStatusMeter[SetUidSyncerUnknown].Count(), int64(0)) 873 } 874 875 func TestRecordSyncerSet(t *testing.T) { 876 registry := metrics.NewRegistry() 877 syncerKeys := []string{"foo"} 878 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus, openrtb_ext.BidderRubicon}, config.DisabledMetrics{}, syncerKeys, nil) 879 880 // Known 881 m.RecordSyncerSet("foo", SyncerSetUidCleared) 882 883 // Unknown Bidder 884 m.RecordSyncerSet("bar", SyncerSetUidCleared) 885 886 // Unknown Status 887 m.RecordSyncerSet("foo", SyncerSetUidStatus("unknown status")) 888 889 assert.Equal(t, m.SyncerSetsMeter["foo"][SyncerSetUidOK].Count(), int64(0)) 890 assert.Equal(t, m.SyncerSetsMeter["foo"][SyncerSetUidCleared].Count(), int64(1)) 891 } 892 893 func TestStoredResponses(t *testing.T) { 894 testCases := []struct { 895 description string 896 givenPubID string 897 accountStoredResponsesMetricsDisabled bool 898 expectedAccountStoredResponsesCount int64 899 expectedStoredResponsesCount int64 900 }{ 901 { 902 description: "Publisher id is given, account stored responses disabled, both metrics should be updated", 903 givenPubID: "acct-id", 904 accountStoredResponsesMetricsDisabled: true, 905 expectedAccountStoredResponsesCount: 0, 906 expectedStoredResponsesCount: 1, 907 }, 908 { 909 description: "Publisher id is given, account stored responses enabled, both metrics should be updated", 910 givenPubID: "acct-id", 911 accountStoredResponsesMetricsDisabled: false, 912 expectedAccountStoredResponsesCount: 1, 913 expectedStoredResponsesCount: 1, 914 }, 915 { 916 description: "Publisher id is unknown, account stored responses enabled, only expectedStoredResponsesCount metric should be updated", 917 givenPubID: PublisherUnknown, 918 accountStoredResponsesMetricsDisabled: false, 919 expectedAccountStoredResponsesCount: 0, 920 expectedStoredResponsesCount: 1, 921 }, 922 { 923 description: "Publisher id is unknown, account stored responses disabled, only expectedStoredResponsesCount metric should be updated", 924 givenPubID: PublisherUnknown, 925 accountStoredResponsesMetricsDisabled: true, 926 expectedAccountStoredResponsesCount: 0, 927 expectedStoredResponsesCount: 1, 928 }, 929 } 930 for _, test := range testCases { 931 registry := metrics.NewRegistry() 932 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{AccountStoredResponses: test.accountStoredResponsesMetricsDisabled}, nil, nil) 933 934 m.RecordStoredResponse(test.givenPubID) 935 am := m.getAccountMetrics(test.givenPubID) 936 937 assert.Equal(t, test.expectedStoredResponsesCount, m.StoredResponsesMeter.Count()) 938 assert.Equal(t, test.expectedAccountStoredResponsesCount, am.storedResponsesMeter.Count()) 939 } 940 } 941 942 func TestRecordAdsCertSignTime(t *testing.T) { 943 testCases := []struct { 944 description string 945 inAdsCertSignDuration time.Duration 946 outExpDuration time.Duration 947 }{ 948 { 949 description: "Five second AdsCertSign time", 950 inAdsCertSignDuration: time.Second * 5, 951 outExpDuration: time.Second * 5, 952 }, 953 { 954 description: "Five millisecond AdsCertSign time", 955 inAdsCertSignDuration: time.Millisecond * 5, 956 outExpDuration: time.Millisecond * 5, 957 }, 958 { 959 description: "Zero AdsCertSign time", 960 inAdsCertSignDuration: time.Duration(0), 961 outExpDuration: time.Duration(0), 962 }, 963 } 964 for _, test := range testCases { 965 registry := metrics.NewRegistry() 966 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 967 968 m.RecordAdsCertSignTime(test.inAdsCertSignDuration) 969 970 assert.Equal(t, test.outExpDuration.Nanoseconds(), m.adsCertSignTimer.Sum(), test.description) 971 } 972 } 973 974 func TestRecordAdsCertReqMetric(t *testing.T) { 975 testCases := []struct { 976 description string 977 requestSuccess bool 978 expectedSuccessRequestsCount int64 979 expectedFailedRequestsCount int64 980 }{ 981 { 982 description: "Record failed request, expected success request count is 0 and failed request count is 1", 983 requestSuccess: false, 984 expectedSuccessRequestsCount: 0, 985 expectedFailedRequestsCount: 1, 986 }, 987 { 988 description: "Record successful request, expected success request count is 1 and failed request count is 0", 989 requestSuccess: true, 990 expectedSuccessRequestsCount: 1, 991 expectedFailedRequestsCount: 0, 992 }, 993 } 994 995 for _, test := range testCases { 996 registry := metrics.NewRegistry() 997 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 998 999 m.RecordAdsCertReq(test.requestSuccess) 1000 1001 assert.Equal(t, test.expectedSuccessRequestsCount, m.AdsCertRequestsSuccess.Count(), test.description) 1002 assert.Equal(t, test.expectedFailedRequestsCount, m.AdsCertRequestsFailure.Count(), test.description) 1003 } 1004 } 1005 1006 func TestRecordModuleAccountMetrics(t *testing.T) { 1007 registry := metrics.NewRegistry() 1008 module := "foobar" 1009 stage1 := "entrypoint" 1010 stage2 := "raw_auction" 1011 stage3 := "processed_auction" 1012 1013 testCases := []struct { 1014 description string 1015 givenModuleName string 1016 givenStageName string 1017 givenPubID string 1018 givenDisabledMetrics config.DisabledMetrics 1019 expectedModuleMetricCount int64 1020 expectedAccountMetricCount int64 1021 }{ 1022 { 1023 description: "Entrypoint stage should not record account metrics", 1024 givenModuleName: module, 1025 givenStageName: stage1, 1026 givenDisabledMetrics: config.DisabledMetrics{AccountModulesMetrics: false}, 1027 expectedModuleMetricCount: 1, 1028 expectedAccountMetricCount: 0, 1029 }, 1030 { 1031 description: "Rawauction stage should record both metrics", 1032 givenModuleName: module, 1033 givenStageName: stage2, 1034 givenPubID: "acc-1", 1035 givenDisabledMetrics: config.DisabledMetrics{AccountModulesMetrics: false}, 1036 expectedModuleMetricCount: 1, 1037 expectedAccountMetricCount: 1, 1038 }, 1039 { 1040 description: "Rawauction stage should not record account metrics because they are disabled", 1041 givenModuleName: module, 1042 givenStageName: stage3, 1043 givenPubID: "acc-1", 1044 givenDisabledMetrics: config.DisabledMetrics{AccountModulesMetrics: true}, 1045 expectedModuleMetricCount: 1, 1046 expectedAccountMetricCount: 0, 1047 }, 1048 } 1049 for _, test := range testCases { 1050 m := NewMetrics(registry, nil, test.givenDisabledMetrics, nil, map[string][]string{module: {stage1, stage2, stage3}}) 1051 1052 m.RecordModuleCalled(ModuleLabels{ 1053 Module: test.givenModuleName, 1054 Stage: test.givenStageName, 1055 AccountID: test.givenPubID, 1056 }, time.Microsecond) 1057 am := m.getAccountMetrics(test.givenPubID) 1058 1059 assert.Equal(t, test.expectedModuleMetricCount, m.ModuleMetrics[test.givenModuleName][test.givenStageName].CallCounter.Count()) 1060 if !test.givenDisabledMetrics.AccountModulesMetrics { 1061 assert.Equal(t, test.expectedAccountMetricCount, am.moduleMetrics[test.givenModuleName].CallCounter.Count()) 1062 assert.Equal(t, test.expectedAccountMetricCount, am.moduleMetrics[test.givenModuleName].DurationTimer.Count()) 1063 } else { 1064 assert.Len(t, am.moduleMetrics, 0, "Account modules metrics are disabled, they should not be collected. Actual result %d account metrics collected \n", len(am.moduleMetrics)) 1065 } 1066 } 1067 } 1068 1069 func TestRecordAccountGDPRPurposeWarningMetrics(t *testing.T) { 1070 testCases := []struct { 1071 name string 1072 givenPurposeName string 1073 expectedP1MetricCount int64 1074 expectedP2MetricCount int64 1075 expectedP3MetricCount int64 1076 expectedP4MetricCount int64 1077 expectedP5MetricCount int64 1078 expectedP6MetricCount int64 1079 expectedP7MetricCount int64 1080 expectedP8MetricCount int64 1081 expectedP9MetricCount int64 1082 expectedP10MetricCount int64 1083 }{ 1084 { 1085 name: "Purpose1MetricIncremented", 1086 givenPurposeName: "purpose1", 1087 expectedP1MetricCount: 1, 1088 }, 1089 { 1090 name: "Purpose2MetricIncremented", 1091 givenPurposeName: "purpose2", 1092 expectedP2MetricCount: 1, 1093 }, 1094 { 1095 name: "Purpose3MetricIncremented", 1096 givenPurposeName: "purpose3", 1097 expectedP3MetricCount: 1, 1098 }, 1099 { 1100 name: "Purpose4MetricIncremented", 1101 givenPurposeName: "purpose4", 1102 expectedP4MetricCount: 1, 1103 }, 1104 { 1105 name: "Purpose5MetricIncremented", 1106 givenPurposeName: "purpose5", 1107 expectedP5MetricCount: 1, 1108 }, 1109 { 1110 name: "Purpose6MetricIncremented", 1111 givenPurposeName: "purpose6", 1112 expectedP6MetricCount: 1, 1113 }, 1114 { 1115 name: "Purpose7MetricIncremented", 1116 givenPurposeName: "purpose7", 1117 expectedP7MetricCount: 1, 1118 }, 1119 { 1120 name: "Purpose8MetricIncremented", 1121 givenPurposeName: "purpose8", 1122 expectedP8MetricCount: 1, 1123 }, 1124 { 1125 name: "Purpose9MetricIncremented", 1126 givenPurposeName: "purpose9", 1127 expectedP9MetricCount: 1, 1128 }, 1129 { 1130 name: "Purpose10MetricIncremented", 1131 givenPurposeName: "purpose10", 1132 expectedP10MetricCount: 1, 1133 }, 1134 } 1135 for _, test := range testCases { 1136 t.Run(test.name, func(t *testing.T) { 1137 registry := metrics.NewRegistry() 1138 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 1139 1140 m.RecordAccountGDPRPurposeWarning("acct-id", test.givenPurposeName) 1141 am := m.getAccountMetrics("acct-id") 1142 1143 assert.Equal(t, test.expectedP1MetricCount, am.accountDeprecationWarningsPurpose1Meter.Count()) 1144 assert.Equal(t, test.expectedP2MetricCount, am.accountDeprecationWarningsPurpose2Meter.Count()) 1145 assert.Equal(t, test.expectedP3MetricCount, am.accountDeprecationWarningsPurpose3Meter.Count()) 1146 assert.Equal(t, test.expectedP4MetricCount, am.accountDeprecationWarningsPurpose4Meter.Count()) 1147 assert.Equal(t, test.expectedP5MetricCount, am.accountDeprecationWarningsPurpose5Meter.Count()) 1148 assert.Equal(t, test.expectedP6MetricCount, am.accountDeprecationWarningsPurpose6Meter.Count()) 1149 assert.Equal(t, test.expectedP7MetricCount, am.accountDeprecationWarningsPurpose7Meter.Count()) 1150 assert.Equal(t, test.expectedP8MetricCount, am.accountDeprecationWarningsPurpose8Meter.Count()) 1151 assert.Equal(t, test.expectedP9MetricCount, am.accountDeprecationWarningsPurpose9Meter.Count()) 1152 assert.Equal(t, test.expectedP10MetricCount, am.accountDeprecationWarningsPurpose10Meter.Count()) 1153 }) 1154 } 1155 } 1156 1157 func TestRecordAccountGDPRChannelEnabledWarningMetrics(t *testing.T) { 1158 testCases := []struct { 1159 name string 1160 givenPubID string 1161 expectedMetricCount int64 1162 }{ 1163 { 1164 name: "GdprChannelMetricIncremented", 1165 givenPubID: "acct-id", 1166 expectedMetricCount: 1, 1167 }, 1168 } 1169 for _, test := range testCases { 1170 t.Run(test.name, func(t *testing.T) { 1171 registry := metrics.NewRegistry() 1172 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 1173 1174 m.RecordAccountGDPRChannelEnabledWarning(test.givenPubID) 1175 am := m.getAccountMetrics(test.givenPubID) 1176 1177 assert.Equal(t, test.expectedMetricCount, am.channelEnabledGDPRMeter.Count()) 1178 }) 1179 } 1180 } 1181 1182 func TestRecordAccountCCPAChannelEnabledWarningMetrics(t *testing.T) { 1183 testCases := []struct { 1184 name string 1185 givenPubID string 1186 expectedMetricCount int64 1187 }{ 1188 { 1189 name: "CcpaChannelMetricIncremented", 1190 givenPubID: "acct-id", 1191 expectedMetricCount: 1, 1192 }, 1193 } 1194 for _, test := range testCases { 1195 t.Run(test.name, func(t *testing.T) { 1196 registry := metrics.NewRegistry() 1197 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 1198 1199 m.RecordAccountCCPAChannelEnabledWarning(test.givenPubID) 1200 am := m.getAccountMetrics(test.givenPubID) 1201 1202 assert.Equal(t, test.expectedMetricCount, am.channelEnabledCCPAMeter.Count()) 1203 }) 1204 } 1205 } 1206 1207 func TestRecordAccountUpgradeStatusMetrics(t *testing.T) { 1208 testCases := []struct { 1209 name string 1210 givenPubID string 1211 expectedMetricCount int64 1212 }{ 1213 { 1214 name: "AccountDeprecationMeterIncremented", 1215 givenPubID: "acct-id", 1216 expectedMetricCount: 1, 1217 }, 1218 } 1219 for _, test := range testCases { 1220 t.Run(test.name, func(t *testing.T) { 1221 registry := metrics.NewRegistry() 1222 m := NewMetrics(registry, []openrtb_ext.BidderName{openrtb_ext.BidderAppnexus}, config.DisabledMetrics{}, nil, nil) 1223 1224 m.RecordAccountUpgradeStatus(test.givenPubID) 1225 am := m.getAccountMetrics(test.givenPubID) 1226 1227 assert.Equal(t, test.expectedMetricCount, am.accountDeprecationSummaryMeter.Count()) 1228 }) 1229 } 1230 } 1231 1232 func TestRecordOverheadTime(t *testing.T) { 1233 testCases := []struct { 1234 name string 1235 time time.Duration 1236 overheadType OverheadType 1237 expectedCount int64 1238 expectedSum int64 1239 }{ 1240 { 1241 name: "record-pre-bidder-overhead-time-1", 1242 time: time.Duration(500), 1243 overheadType: PreBidder, 1244 expectedCount: 1, 1245 expectedSum: 500, 1246 }, 1247 { 1248 name: "record-pre-bidder-overhead-time-2", 1249 time: time.Duration(500), 1250 overheadType: PreBidder, 1251 expectedCount: 2, 1252 expectedSum: 1000, 1253 }, 1254 { 1255 name: "record-auction-response-overhead-time", 1256 time: time.Duration(500), 1257 overheadType: MakeAuctionResponse, 1258 expectedCount: 1, 1259 expectedSum: 500, 1260 }, 1261 { 1262 name: "record-make-bidder-requests-overhead-time", 1263 time: time.Duration(500), 1264 overheadType: MakeBidderRequests, 1265 expectedCount: 1, 1266 expectedSum: 500, 1267 }, 1268 } 1269 registry := metrics.NewRegistry() 1270 for _, test := range testCases { 1271 t.Run(test.name, func(t *testing.T) { 1272 m := NewMetrics(registry, []openrtb_ext.BidderName{}, config.DisabledMetrics{}, nil, nil) 1273 m.RecordOverheadTime(test.overheadType, test.time) 1274 overheadMetrics := m.OverheadTimer[test.overheadType] 1275 assert.Equal(t, test.expectedCount, overheadMetrics.Count()) 1276 assert.Equal(t, test.expectedSum, overheadMetrics.Sum()) 1277 }) 1278 } 1279 } 1280 1281 func ensureContainsBidTypeMetrics(t *testing.T, registry metrics.Registry, prefix string, mdm map[openrtb_ext.BidType]*MarkupDeliveryMetrics) { 1282 ensureContains(t, registry, prefix+".banner.adm_bids_received", mdm[openrtb_ext.BidTypeBanner].AdmMeter) 1283 ensureContains(t, registry, prefix+".banner.nurl_bids_received", mdm[openrtb_ext.BidTypeBanner].NurlMeter) 1284 ensureContains(t, registry, prefix+".video.adm_bids_received", mdm[openrtb_ext.BidTypeVideo].AdmMeter) 1285 ensureContains(t, registry, prefix+".video.nurl_bids_received", mdm[openrtb_ext.BidTypeVideo].NurlMeter) 1286 ensureContains(t, registry, prefix+".audio.adm_bids_received", mdm[openrtb_ext.BidTypeAudio].AdmMeter) 1287 ensureContains(t, registry, prefix+".audio.nurl_bids_received", mdm[openrtb_ext.BidTypeAudio].NurlMeter) 1288 ensureContains(t, registry, prefix+".native.adm_bids_received", mdm[openrtb_ext.BidTypeNative].AdmMeter) 1289 ensureContains(t, registry, prefix+".native.nurl_bids_received", mdm[openrtb_ext.BidTypeNative].NurlMeter) 1290 } 1291 1292 func VerifyMetrics(t *testing.T, name string, expected int64, actual int64) { 1293 if expected != actual { 1294 t.Errorf("Error in metric %s: expected %d, got %d.", name, expected, actual) 1295 } 1296 }