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 }