Skip to content
Open
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
10 changes: 6 additions & 4 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -629,10 +629,11 @@ type InfluxMetrics struct {
}

type PrometheusMetrics struct {
Port int `mapstructure:"port"`
Namespace string `mapstructure:"namespace"`
Subsystem string `mapstructure:"subsystem"`
TimeoutMillisRaw int `mapstructure:"timeout_ms"`
Port int `mapstructure:"port"`
Namespace string `mapstructure:"namespace"`
Subsystem string `mapstructure:"subsystem"`
TimeoutMillisRaw int `mapstructure:"timeout_ms"`
AccountRequestStatusEnabled bool `mapstructure:"account_request_status_enabled"`
}

func (cfg *PrometheusMetrics) validate(errs []error) []error {
Expand Down Expand Up @@ -1020,6 +1021,7 @@ func SetupViper(v *viper.Viper, filename string, bidderInfos BidderInfos) {
v.SetDefault("metrics.prometheus.namespace", "")
v.SetDefault("metrics.prometheus.subsystem", "")
v.SetDefault("metrics.prometheus.timeout_ms", 10000)
v.SetDefault("metrics.prometheus.account_request_status_enabled", false)
v.SetDefault("category_mapping.filesystem.enabled", true)
v.SetDefault("category_mapping.filesystem.directorypath", "./static/category-mapping")
v.SetDefault("category_mapping.http.endpoint", "")
Expand Down
10 changes: 10 additions & 0 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ func TestDefaults(t *testing.T) {
cmpStrings(t, "currency_converter.fetch_url", "https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json", cfg.CurrencyConverter.FetchURL)
cmpBools(t, "account_required", false, cfg.AccountRequired)
cmpInts(t, "metrics.influxdb.collection_rate_seconds", 20, cfg.Metrics.Influxdb.MetricSendInterval)
cmpBools(t, "metrics.prometheus.account_request_status_enabled", false, cfg.Metrics.Prometheus.AccountRequestStatusEnabled)
cmpBools(t, "account_adapter_details", false, cfg.Metrics.Disabled.AccountAdapterDetails)
cmpBools(t, "account_debug", true, cfg.Metrics.Disabled.AccountDebug)
cmpBools(t, "account_stored_responses", true, cfg.Metrics.Disabled.AccountStoredResponses)
Expand Down Expand Up @@ -363,6 +364,15 @@ func TestDefaults(t *testing.T) {
assert.Equal(t, expectedTCF2, cfg.GDPR.TCF2, "gdpr.tcf2")
}

func TestPrometheusAccountRequestStatusEnabled(t *testing.T) {
_, v := newDefaultConfig(t)
v.Set("metrics.prometheus.account_request_status_enabled", true)

cfg, err := New(v, bidderInfos, mockNormalizeBidderName)
assert.NoError(t, err)
assert.True(t, cfg.Metrics.Prometheus.AccountRequestStatusEnabled)
}

// When adding a new field, make sure the indentations are spaces not tabs otherwise read config may fail to parse the new field value.
var fullConfig = []byte(`
accounts:
Expand Down
4 changes: 4 additions & 0 deletions docs/developers/metrics-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ PBS_METRICS_PROMETHEUS_NAMESPACE - this is responsable for the primary prefix ad
- PBS_METRICS_PROMETHEUS_SUBSYSTEM=server - default is empty.

PBS_METRICS_PROMETHEUS_SUBSYSTEM - this is a secondary prefix added to metrics to ensure uniqueness.

- PBS_METRICS_PROMETHEUS_ACCOUNT_REQUEST_STATUS_ENABLED=false - default is false.

PBS_METRICS_PROMETHEUS_ACCOUNT_REQUEST_STATUS_ENABLED - If this flag is set to true, the per-account request status metric is enabled.

- PBS_METRICS_DISABLED_METRICS_ADAPTER_CONNECTIONS_METRICS=false - default is true.

Expand Down
16 changes: 15 additions & 1 deletion metrics/prometheus/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ type Metrics struct {

// Account Metrics
accountRequests *prometheus.CounterVec
accountRequestStatus *prometheus.CounterVec
accountDebugRequests *prometheus.CounterVec
accountStoredResponses *prometheus.CounterVec
accountBidResponseValidationSizeError *prometheus.CounterVec
Expand All @@ -106,7 +107,8 @@ type Metrics struct {
moduleExecutionErrors map[string]*prometheus.CounterVec
moduleTimeouts map[string]*prometheus.CounterVec

metricsDisabled config.DisabledMetrics
accountRequestStatusEnabled bool
metricsDisabled config.DisabledMetrics
}

const (
Expand Down Expand Up @@ -178,6 +180,7 @@ func NewMetrics(cfg config.PrometheusMetrics, disabledMetrics config.DisabledMet

metrics := Metrics{}
reg := prometheus.NewRegistry()
metrics.accountRequestStatusEnabled = cfg.AccountRequestStatusEnabled
metrics.metricsDisabled = disabledMetrics

metrics.connectionsClosed = newCounterWithoutLabels(cfg, reg,
Expand Down Expand Up @@ -499,6 +502,11 @@ func NewMetrics(cfg config.PrometheusMetrics, disabledMetrics config.DisabledMet
"Count of total requests to Prebid Server labeled by account.",
[]string{accountLabel})

metrics.accountRequestStatus = newCounter(cfg, reg,
"account_request_status",
"Count of total requests to Prebid Server labeled by account and request status.",
[]string{accountLabel, requestStatusLabel})

metrics.accountDebugRequests = newCounter(cfg, reg,
"account_debug_requests",
"Count of total requests to Prebid Server that have debug enabled labled by account",
Expand Down Expand Up @@ -718,6 +726,12 @@ func (m *Metrics) RecordRequest(labels metrics.Labels) {
m.accountRequests.With(prometheus.Labels{
accountLabel: labels.PubID,
}).Inc()
if m.accountRequestStatusEnabled {
m.accountRequestStatus.With(prometheus.Labels{
accountLabel: labels.PubID,
requestStatusLabel: string(labels.RequestStatus),
}).Inc()
}
}
}

Expand Down
44 changes: 44 additions & 0 deletions metrics/prometheus/prometheus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,50 @@ func TestAccountMetric(t *testing.T) {
}
}

func TestAccountRequestStatusMetric(t *testing.T) {
testCases := []struct {
description string
enabled bool
pubID string
expectedCount float64
}{
{
description: "Enabled For Known Account",
enabled: true,
pubID: "knownPublisher",
expectedCount: 1,
},
{
description: "Disabled For Known Account",
pubID: "knownPublisher",
expectedCount: 0,
},
{
description: "Enabled For Unknown Account",
enabled: true,
pubID: metrics.PublisherUnknown,
expectedCount: 0,
},
}

for _, test := range testCases {
m := createMetricsForTesting()
m.accountRequestStatusEnabled = test.enabled
m.RecordRequest(metrics.Labels{
RType: metrics.ReqTypeORTB2Web,
RequestStatus: metrics.RequestStatusBadInput,
PubID: test.pubID,
})

assertCounterVecValue(t, test.description, "accountRequestStatus", m.accountRequestStatus,
test.expectedCount,
prometheus.Labels{
accountLabel: test.pubID,
requestStatusLabel: string(metrics.RequestStatusBadInput),
})
}
}

func TestImpressionsMetric(t *testing.T) {
performTest := func(m *Metrics, isBanner, isVideo, isAudio, isNative bool) {
m.RecordImps(metrics.ImpLabels{
Expand Down
Loading