Skip to content

Commit

Permalink
UOE-10822: Prometheus Stat for Bid Recovery (#851) (#969)
Browse files Browse the repository at this point in the history
  • Loading branch information
pm-saurabh-narkhede authored Nov 26, 2024
1 parent c42b78d commit 4e06850
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 1 deletion.
14 changes: 14 additions & 0 deletions modules/pubmatic/openwrap/metrics/config/multimetrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -536,3 +536,17 @@ func (me *MultiMetricsEngine) RecordEndpointResponseSize(endpoint string, bodySi
thisME.RecordEndpointResponseSize(endpoint, bodySize)
}
}

// RecordBidRecoveryStatus across all engines
func (me *MultiMetricsEngine) RecordBidRecoveryStatus(publisher, profile string, success bool) {
for _, thisME := range *me {
thisME.RecordBidRecoveryStatus(publisher, profile, success)
}
}

// RecordBidRecoveryResponseTime across all engines
func (me *MultiMetricsEngine) RecordBidRecoveryResponseTime(publisher, profile string, responseTime time.Duration) {
for _, thisME := range *me {
thisME.RecordBidRecoveryResponseTime(publisher, profile, responseTime)
}
}
4 changes: 4 additions & 0 deletions modules/pubmatic/openwrap/metrics/config/multimetrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ func TestRecordFunctionForMultiMetricsEngine(t *testing.T) {
mockEngine.EXPECT().RecordOWServerPanic("endpoint", "methodName", "nodeName", "podName")
mockEngine.EXPECT().RecordAmpVideoRequests("pubid", "profileid")
mockEngine.EXPECT().RecordAmpVideoResponses("pubid", "profileid")
mockEngine.EXPECT().RecordBidRecoveryStatus(publisher, profile, true)
mockEngine.EXPECT().RecordBidRecoveryResponseTime(publisher, profile, time.Duration(200))

// create the multi-metric engine
multiMetricEngine := MultiMetricsEngine{}
Expand Down Expand Up @@ -288,4 +290,6 @@ func TestRecordFunctionForMultiMetricsEngine(t *testing.T) {
multiMetricEngine.RecordOWServerPanic("endpoint", "methodName", "nodeName", "podName")
multiMetricEngine.RecordAmpVideoRequests("pubid", "profileid")
multiMetricEngine.RecordAmpVideoResponses("pubid", "profileid")
multiMetricEngine.RecordBidRecoveryStatus(publisher, profile, true)
multiMetricEngine.RecordBidRecoveryResponseTime(publisher, profile, time.Duration(200))
}
2 changes: 2 additions & 0 deletions modules/pubmatic/openwrap/metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ type MetricsEngine interface {
RecordPublisherRequests(endpoint string, publisher string, platform string)
RecordReqImpsWithContentCount(publisher, contentType string)
RecordInjectTrackerErrorCount(adformat, publisher, partner string)
RecordBidRecoveryStatus(publisher, profile string, success bool)
RecordBidRecoveryResponseTime(publisher, profile string, responseTime time.Duration)

// not-captured in openwrap module, dont provide enough insights
RecordPBSAuctionRequestsStats()
Expand Down
26 changes: 25 additions & 1 deletion modules/pubmatic/openwrap/metrics/mock/mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions modules/pubmatic/openwrap/metrics/prometheus/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type Metrics struct {
pubNoBidResponseErrors *prometheus.CounterVec
pubResponseTime *prometheus.HistogramVec
pubImpsWithContent *prometheus.CounterVec
pubBidRecoveryStatus *prometheus.CounterVec
pubBidRecoveryTime *prometheus.HistogramVec

// publisher-partner-platform level metrics
pubPartnerPlatformRequests *prometheus.CounterVec
Expand Down Expand Up @@ -378,6 +380,19 @@ func newMetrics(cfg *config.PrometheusMetrics, promRegistry *prometheus.Registry
responseSizeBuckets,
)

metrics.pubBidRecoveryTime = newHistogramVec(cfg, promRegistry,
"bid_recovery_response_time",
"Total time taken by request for secondary auction in ms at publisher profile level.",
[]string{pubIDLabel, profileIDLabel},
[]float64{100, 200, 300, 400},
)

metrics.pubBidRecoveryStatus = newCounter(cfg, promRegistry,
"bid_recovery_response_status",
"Count bid recovery status for secondary auction",
[]string{pubIDLabel, profileIDLabel, successLabel},
)

newSSHBMetrics(&metrics, cfg, promRegistry)

return &metrics
Expand Down Expand Up @@ -700,6 +715,21 @@ func (m *Metrics) RecordPrebidCacheRequestTime(success bool, length time.Duratio
}).Observe(float64(length.Milliseconds()))
}

func (m *Metrics) RecordBidRecoveryStatus(publisherID, profileID string, success bool) {
m.pubBidRecoveryStatus.With(prometheus.Labels{
pubIDLabel: publisherID,
profileIDLabel: profileID,
successLabel: strconv.FormatBool(success),
}).Inc()
}

func (m *Metrics) RecordBidRecoveryResponseTime(publisherID, profileID string, responseTime time.Duration) {
m.pubBidRecoveryTime.With(prometheus.Labels{
pubIDLabel: publisherID,
profileIDLabel: profileID,
}).Observe(float64(responseTime.Milliseconds()))
}

func (m *Metrics) RecordEndpointResponseSize(endpoint string, bodySize float64) {
m.endpointResponseSize.With(prometheus.Labels{
endpointLabel: endpoint,
Expand Down
24 changes: 24 additions & 0 deletions modules/pubmatic/openwrap/metrics/prometheus/prometheus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,30 @@ func TestRecordAdruleValidationFailure(t *testing.T) {
})
}

func TestRecordBidRecoveryStatus(t *testing.T) {
m := createMetricsForTesting()

m.RecordBidRecoveryStatus("5890", "123", true)

expectedCount := float64(1)
assertCounterVecValue(t, "", "bid_recovery_response_status", m.pubBidRecoveryStatus,
expectedCount, prometheus.Labels{
pubIDLabel: "5890",
profileIDLabel: "123",
successLabel: "true",
})
}

func TestRecordBidRecoveryResponseTime(t *testing.T) {
m := createMetricsForTesting()

m.RecordBidRecoveryResponseTime("5890", "12345", time.Duration(70)*time.Millisecond)
m.RecordBidRecoveryResponseTime("5890", "12345", time.Duration(130)*time.Millisecond)
resultingHistogram := getHistogramFromHistogramVecByTwoKeys(m.pubBidRecoveryTime,
pubIDLabel, "5890", profileIDLabel, "12345")
assertHistogram(t, "bid_recovery_response_time", resultingHistogram, 2, 200)
}

func getHistogramFromHistogramVec(histogram *prometheus.HistogramVec, labelKey, labelValue string) dto.Histogram {
var result dto.Histogram
processMetrics(histogram, func(m dto.Metric) {
Expand Down
3 changes: 3 additions & 0 deletions modules/pubmatic/openwrap/metrics/stats/tcp_stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,9 @@ func (st *StatsTCP) RecordAdruleEnabled(pubId, profId string)
func (st *StatsTCP) RecordAdruleValidationFailure(pubId, profId string) {}
func (st *StatsTCP) RecordSignalDataStatus(pubid, profileid, signalType string) {}
func (st *StatsTCP) RecordPrebidCacheRequestTime(success bool, length time.Duration) {}
func (st *StatsTCP) RecordBidRecoveryStatus(pubID string, profile string, success bool) {}
func (st *StatsTCP) RecordBidRecoveryResponseTime(pubID string, profile string, responseTime time.Duration) {
}
func (st *StatsTCP) RecordPrebidAuctionBidResponse(publisher string, partnerName string, bidderCode string, adapterCode string) {
}
func (st *StatsTCP) RecordFailedParsingItuneID(pubId, profId string) {}
Expand Down

0 comments on commit 4e06850

Please sign in to comment.