Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UOE-10822: Prometheus Stat for Bid Recovery #969

Merged
merged 3 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading