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  }