github.com/prebid/prebid-server@v0.275.0/metrics/config/metrics_test.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  	"time"
     7  
     8  	mainConfig "github.com/prebid/prebid-server/config"
     9  	"github.com/prebid/prebid-server/metrics"
    10  	"github.com/prebid/prebid-server/openrtb_ext"
    11  
    12  	gometrics "github.com/rcrowley/go-metrics"
    13  )
    14  
    15  var modulesStages = map[string][]string{"foobar": {"entry", "raw"}, "another_module": {"raw", "auction"}}
    16  
    17  // Start a simple test to insure we get valid MetricsEngines for various configurations
    18  func TestNilMetricsEngine(t *testing.T) {
    19  	cfg := mainConfig.Configuration{}
    20  	adapterList := make([]openrtb_ext.BidderName, 0, 2)
    21  	syncerKeys := []string{"keyA", "keyB"}
    22  	testEngine := NewMetricsEngine(&cfg, adapterList, syncerKeys, modulesStages)
    23  	_, ok := testEngine.MetricsEngine.(*NilMetricsEngine)
    24  	if !ok {
    25  		t.Error("Expected a NilMetricsEngine, but didn't get it")
    26  	}
    27  }
    28  
    29  func TestGoMetricsEngine(t *testing.T) {
    30  	cfg := mainConfig.Configuration{}
    31  	cfg.Metrics.Influxdb.Host = "localhost"
    32  	adapterList := make([]openrtb_ext.BidderName, 0, 2)
    33  	syncerKeys := []string{"keyA", "keyB"}
    34  	testEngine := NewMetricsEngine(&cfg, adapterList, syncerKeys, modulesStages)
    35  	_, ok := testEngine.MetricsEngine.(*metrics.Metrics)
    36  	if !ok {
    37  		t.Error("Expected a Metrics as MetricsEngine, but didn't get it")
    38  	}
    39  }
    40  
    41  // Test the multiengine
    42  func TestMultiMetricsEngine(t *testing.T) {
    43  	cfg := mainConfig.Configuration{}
    44  	cfg.Metrics.Influxdb.Host = "localhost"
    45  	adapterList := openrtb_ext.CoreBidderNames()
    46  	goEngine := metrics.NewMetrics(gometrics.NewPrefixedRegistry("prebidserver."), adapterList, mainConfig.DisabledMetrics{}, nil, modulesStages)
    47  	engineList := make(MultiMetricsEngine, 2)
    48  	engineList[0] = goEngine
    49  	engineList[1] = &NilMetricsEngine{}
    50  	var metricsEngine metrics.MetricsEngine
    51  	metricsEngine = &engineList
    52  	labels := metrics.Labels{
    53  		Source:        metrics.DemandWeb,
    54  		RType:         metrics.ReqTypeORTB2Web,
    55  		PubID:         "test1",
    56  		CookieFlag:    metrics.CookieFlagYes,
    57  		RequestStatus: metrics.RequestStatusOK,
    58  	}
    59  	apnLabels := metrics.AdapterLabels{
    60  		Source:      metrics.DemandWeb,
    61  		RType:       metrics.ReqTypeORTB2Web,
    62  		Adapter:     openrtb_ext.BidderAppnexus,
    63  		PubID:       "test1",
    64  		CookieFlag:  metrics.CookieFlagYes,
    65  		AdapterBids: metrics.AdapterBidNone,
    66  	}
    67  	pubLabels := metrics.AdapterLabels{
    68  		Source:      metrics.DemandWeb,
    69  		RType:       metrics.ReqTypeORTB2Web,
    70  		Adapter:     openrtb_ext.BidderPubmatic,
    71  		PubID:       "test1",
    72  		CookieFlag:  metrics.CookieFlagYes,
    73  		AdapterBids: metrics.AdapterBidPresent,
    74  	}
    75  	impTypeLabels := metrics.ImpLabels{
    76  		BannerImps: true,
    77  		VideoImps:  false,
    78  		AudioImps:  true,
    79  		NativeImps: true,
    80  	}
    81  	moduleLabels := make([]metrics.ModuleLabels, 0)
    82  	for module, stages := range modulesStages {
    83  		for _, stage := range stages {
    84  			moduleLabels = append(moduleLabels, metrics.ModuleLabels{
    85  				Module:    module,
    86  				Stage:     stage,
    87  				AccountID: "test1",
    88  			})
    89  		}
    90  	}
    91  	for i := 0; i < 5; i++ {
    92  		metricsEngine.RecordRequest(labels)
    93  		metricsEngine.RecordImps(impTypeLabels)
    94  		metricsEngine.RecordRequestTime(labels, time.Millisecond*20)
    95  		metricsEngine.RecordAdapterRequest(pubLabels)
    96  		metricsEngine.RecordAdapterRequest(apnLabels)
    97  		metricsEngine.RecordAdapterPrice(pubLabels, 1.34)
    98  		metricsEngine.RecordAdapterBidReceived(pubLabels, openrtb_ext.BidTypeBanner, true)
    99  		metricsEngine.RecordAdapterTime(pubLabels, time.Millisecond*20)
   100  		metricsEngine.RecordPrebidCacheRequestTime(true, time.Millisecond*20)
   101  	}
   102  	for _, module := range moduleLabels {
   103  		metricsEngine.RecordModuleCalled(module, time.Millisecond*1)
   104  		metricsEngine.RecordModuleFailed(module)
   105  		metricsEngine.RecordModuleSuccessNooped(module)
   106  		metricsEngine.RecordModuleSuccessUpdated(module)
   107  		metricsEngine.RecordModuleSuccessRejected(module)
   108  		metricsEngine.RecordModuleExecutionError(module)
   109  		metricsEngine.RecordModuleTimeout(module)
   110  	}
   111  	labelsBlacklist := []metrics.Labels{
   112  		{
   113  			Source:        metrics.DemandWeb,
   114  			RType:         metrics.ReqTypeAMP,
   115  			PubID:         "test2",
   116  			CookieFlag:    metrics.CookieFlagYes,
   117  			RequestStatus: metrics.RequestStatusBlacklisted,
   118  		},
   119  		{
   120  			Source:        metrics.DemandWeb,
   121  			RType:         metrics.ReqTypeVideo,
   122  			PubID:         "test2",
   123  			CookieFlag:    metrics.CookieFlagYes,
   124  			RequestStatus: metrics.RequestStatusBlacklisted,
   125  		},
   126  	}
   127  	for _, label := range labelsBlacklist {
   128  		metricsEngine.RecordRequest(label)
   129  	}
   130  	impTypeLabels.BannerImps = false
   131  	impTypeLabels.VideoImps = true
   132  	impTypeLabels.AudioImps = false
   133  	impTypeLabels.NativeImps = false
   134  	for i := 0; i < 3; i++ {
   135  		metricsEngine.RecordImps(impTypeLabels)
   136  	}
   137  
   138  	metricsEngine.RecordStoredReqCacheResult(metrics.CacheMiss, 1)
   139  	metricsEngine.RecordStoredImpCacheResult(metrics.CacheMiss, 2)
   140  	metricsEngine.RecordAccountCacheResult(metrics.CacheMiss, 3)
   141  	metricsEngine.RecordStoredReqCacheResult(metrics.CacheHit, 4)
   142  	metricsEngine.RecordStoredImpCacheResult(metrics.CacheHit, 5)
   143  	metricsEngine.RecordAccountCacheResult(metrics.CacheHit, 6)
   144  
   145  	metricsEngine.RecordAdapterGDPRRequestBlocked(openrtb_ext.BidderAppnexus)
   146  
   147  	metricsEngine.RecordRequestQueueTime(false, metrics.ReqTypeVideo, time.Duration(1))
   148  
   149  	//Make the metrics engine, instantiated here with goEngine, fill its RequestStatuses[RequestType][metrics.RequestStatusXX] with the new boolean values added to metrics.Labels
   150  	VerifyMetrics(t, "RequestStatuses.OpenRTB2.OK", goEngine.RequestStatuses[metrics.ReqTypeORTB2Web][metrics.RequestStatusOK].Count(), 5)
   151  	VerifyMetrics(t, "RequestStatuses.AMP.OK", goEngine.RequestStatuses[metrics.ReqTypeAMP][metrics.RequestStatusOK].Count(), 0)
   152  	VerifyMetrics(t, "RequestStatuses.AMP.BlacklistedAcctOrApp", goEngine.RequestStatuses[metrics.ReqTypeAMP][metrics.RequestStatusBlacklisted].Count(), 1)
   153  	VerifyMetrics(t, "RequestStatuses.Video.OK", goEngine.RequestStatuses[metrics.ReqTypeVideo][metrics.RequestStatusOK].Count(), 0)
   154  	VerifyMetrics(t, "RequestStatuses.Video.Error", goEngine.RequestStatuses[metrics.ReqTypeVideo][metrics.RequestStatusErr].Count(), 0)
   155  	VerifyMetrics(t, "RequestStatuses.Video.BadInput", goEngine.RequestStatuses[metrics.ReqTypeVideo][metrics.RequestStatusBadInput].Count(), 0)
   156  	VerifyMetrics(t, "RequestStatuses.Video.BlacklistedAcctOrApp", goEngine.RequestStatuses[metrics.ReqTypeVideo][metrics.RequestStatusBlacklisted].Count(), 1)
   157  	VerifyMetrics(t, "RequestStatuses.OpenRTB2.Error", goEngine.RequestStatuses[metrics.ReqTypeORTB2Web][metrics.RequestStatusErr].Count(), 0)
   158  	VerifyMetrics(t, "RequestStatuses.OpenRTB2.BadInput", goEngine.RequestStatuses[metrics.ReqTypeORTB2Web][metrics.RequestStatusBadInput].Count(), 0)
   159  	VerifyMetrics(t, "RequestStatuses.OpenRTB2.BlacklistedAcctOrApp", goEngine.RequestStatuses[metrics.ReqTypeORTB2Web][metrics.RequestStatusBlacklisted].Count(), 0)
   160  
   161  	VerifyMetrics(t, "ImpsTypeBanner", goEngine.ImpsTypeBanner.Count(), 5)
   162  	VerifyMetrics(t, "ImpsTypeVideo", goEngine.ImpsTypeVideo.Count(), 3)
   163  	VerifyMetrics(t, "ImpsTypeAudio", goEngine.ImpsTypeAudio.Count(), 5)
   164  	VerifyMetrics(t, "ImpsTypeNative", goEngine.ImpsTypeNative.Count(), 5)
   165  
   166  	VerifyMetrics(t, "RecordPrebidCacheRequestTime", goEngine.PrebidCacheRequestTimerSuccess.Count(), 5)
   167  
   168  	VerifyMetrics(t, "Request", goEngine.RequestStatuses[metrics.ReqTypeORTB2Web][metrics.RequestStatusOK].Count(), 5)
   169  	VerifyMetrics(t, "ImpMeter", goEngine.ImpMeter.Count(), 8)
   170  	VerifyMetrics(t, "NoCookieMeter", goEngine.NoCookieMeter.Count(), 0)
   171  	VerifyMetrics(t, "AdapterMetrics.Pubmatic.GotBidsMeter", goEngine.AdapterMetrics[openrtb_ext.BidderPubmatic].GotBidsMeter.Count(), 5)
   172  	VerifyMetrics(t, "AdapterMetrics.Pubmatic.NoBidMeter", goEngine.AdapterMetrics[openrtb_ext.BidderPubmatic].NoBidMeter.Count(), 0)
   173  	for _, err := range metrics.AdapterErrors() {
   174  		VerifyMetrics(t, "AdapterMetrics.Pubmatic.Request.ErrorMeter."+string(err), goEngine.AdapterMetrics[openrtb_ext.BidderPubmatic].ErrorMeters[err].Count(), 0)
   175  	}
   176  	VerifyMetrics(t, "AdapterMetrics.AppNexus.GotBidsMeter", goEngine.AdapterMetrics[openrtb_ext.BidderAppnexus].GotBidsMeter.Count(), 0)
   177  	VerifyMetrics(t, "AdapterMetrics.AppNexus.NoBidMeter", goEngine.AdapterMetrics[openrtb_ext.BidderAppnexus].NoBidMeter.Count(), 5)
   178  
   179  	VerifyMetrics(t, "RecordRequestQueueTime.Video.Rejected", goEngine.RequestsQueueTimer[metrics.ReqTypeVideo][false].Count(), 1)
   180  	VerifyMetrics(t, "RecordRequestQueueTime.Video.Accepted", goEngine.RequestsQueueTimer[metrics.ReqTypeVideo][true].Count(), 0)
   181  
   182  	VerifyMetrics(t, "StoredReqCache.Miss", goEngine.StoredReqCacheMeter[metrics.CacheMiss].Count(), 1)
   183  	VerifyMetrics(t, "StoredImpCache.Miss", goEngine.StoredImpCacheMeter[metrics.CacheMiss].Count(), 2)
   184  	VerifyMetrics(t, "AccountCache.Miss", goEngine.AccountCacheMeter[metrics.CacheMiss].Count(), 3)
   185  	VerifyMetrics(t, "StoredReqCache.Hit", goEngine.StoredReqCacheMeter[metrics.CacheHit].Count(), 4)
   186  	VerifyMetrics(t, "StoredImpCache.Hit", goEngine.StoredImpCacheMeter[metrics.CacheHit].Count(), 5)
   187  	VerifyMetrics(t, "AccountCache.Hit", goEngine.AccountCacheMeter[metrics.CacheHit].Count(), 6)
   188  
   189  	VerifyMetrics(t, "AdapterMetrics.AppNexus.GDPRRequestBlocked", goEngine.AdapterMetrics[openrtb_ext.BidderAppnexus].GDPRRequestBlocked.Count(), 1)
   190  
   191  	// verify that each module has its own metric recorded
   192  	for module, stages := range modulesStages {
   193  		for _, stage := range stages {
   194  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.Duration", module, stage), goEngine.ModuleMetrics[module][stage].DurationTimer.Count(), 1)
   195  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.Call", module, stage), goEngine.ModuleMetrics[module][stage].CallCounter.Count(), 1)
   196  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.Fail", module, stage), goEngine.ModuleMetrics[module][stage].FailureCounter.Count(), 1)
   197  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.SuccessNoop", module, stage), goEngine.ModuleMetrics[module][stage].SuccessNoopCounter.Count(), 1)
   198  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.SuccessUpdate", module, stage), goEngine.ModuleMetrics[module][stage].SuccessUpdateCounter.Count(), 1)
   199  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.SuccessReject", module, stage), goEngine.ModuleMetrics[module][stage].SuccessRejectCounter.Count(), 1)
   200  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.ExecutionError", module, stage), goEngine.ModuleMetrics[module][stage].ExecutionErrorCounter.Count(), 1)
   201  			VerifyMetrics(t, fmt.Sprintf("ModuleMetrics.%s.%s.Timeout", module, stage), goEngine.ModuleMetrics[module][stage].TimeoutCounter.Count(), 1)
   202  		}
   203  	}
   204  }
   205  
   206  func VerifyMetrics(t *testing.T, name string, actual int64, expected int64) {
   207  	if expected != actual {
   208  		t.Errorf("Error in metric %s: got %d, expected %d.", name, actual, expected)
   209  	}
   210  }