From f328e23a938b4d79719fb6730860b6aa4c61a212 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Thu, 10 Aug 2023 12:27:54 -0700 Subject: [PATCH 01/15] ActivityReportAnalytics integration and enforcer fix --- analytics/config/config.go | 5 ++ analytics/config/config_test.go | 5 ++ analytics/core.go | 1 + analytics/filesystem/file_module.go | 5 ++ analytics/pubstack/pubstack_module.go | 5 ++ endpoints/cookie_sync_test.go | 5 ++ endpoints/events/event_test.go | 5 ++ endpoints/openrtb2/amp_auction_test.go | 5 ++ endpoints/openrtb2/auction.go | 16 ++-- endpoints/openrtb2/video_auction_test.go | 5 ++ privacy/enforcer.go | 37 ++++++-- privacy/enforcer_test.go | 110 ++++++++++++++++++++++- 12 files changed, 190 insertions(+), 14 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index 557fec361dc..cbdfaa8110d 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -43,6 +43,11 @@ func NewPBSAnalytics(analytics *config.Analytics) analytics.PBSAnalyticsModule { // Collection of all the correctly configured analytics modules - implements the PBSAnalyticsModule interface type enabledAnalytics []analytics.PBSAnalyticsModule +// Returns the name of the analytics module +func (ea enabledAnalytics) GetName() string { + return "enabledAnalytics" +} + func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { for _, module := range ea { module.LogAuctionObject(ao) diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index c0ad9c26a16..2d9b04aae0b 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -62,6 +62,11 @@ type sampleModule struct { count *int } +// Returns the name of the analytics module +func (m *sampleModule) GetName() string { + return "sampleModule" +} + func (m *sampleModule) LogAuctionObject(ao *analytics.AuctionObject) { *m.count++ } func (m *sampleModule) LogVideoObject(vo *analytics.VideoObject) { *m.count++ } diff --git a/analytics/core.go b/analytics/core.go index eca93741bd2..de5d683008b 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -13,6 +13,7 @@ import ( // activities. Do not use marshal the parameter objects directly as they can change over time. Use a separate // model for each analytics module and transform as appropriate. type PBSAnalyticsModule interface { + GetName() string LogAuctionObject(*AuctionObject) LogVideoObject(*VideoObject) LogCookieSyncObject(*CookieSyncObject) diff --git a/analytics/filesystem/file_module.go b/analytics/filesystem/file_module.go index 9a357529c3a..1980db083c2 100644 --- a/analytics/filesystem/file_module.go +++ b/analytics/filesystem/file_module.go @@ -26,6 +26,11 @@ type FileLogger struct { Logger *glog.Logger } +// Returns the name of the analytics module +func (f *FileLogger) GetName() string { + return "filelogger" +} + // Writes AuctionObject to file func (f *FileLogger) LogAuctionObject(ao *analytics.AuctionObject) { var b bytes.Buffer diff --git a/analytics/pubstack/pubstack_module.go b/analytics/pubstack/pubstack_module.go index 987c935f884..5c53210e672 100644 --- a/analytics/pubstack/pubstack_module.go +++ b/analytics/pubstack/pubstack_module.go @@ -107,6 +107,11 @@ func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEve return &pb, nil } +// Returns the name of the analytics module +func (p *PubstackModule) GetName() string { + return "pubstack" +} + func (p *PubstackModule) LogAuctionObject(ao *analytics.AuctionObject) { p.muxConfig.RLock() defer p.muxConfig.RUnlock() diff --git a/endpoints/cookie_sync_test.go b/endpoints/cookie_sync_test.go index 22ecc1faf9e..0d987656f93 100644 --- a/endpoints/cookie_sync_test.go +++ b/endpoints/cookie_sync_test.go @@ -2030,6 +2030,11 @@ type MockAnalytics struct { mock.Mock } +// Returns the name of the analytics module +func (m *MockAnalytics) GetName() string { + return "mockAnalytics" +} + func (m *MockAnalytics) LogAuctionObject(obj *analytics.AuctionObject) { m.Called(obj) } diff --git a/endpoints/events/event_test.go b/endpoints/events/event_test.go index 95711ba1328..190148e8964 100644 --- a/endpoints/events/event_test.go +++ b/endpoints/events/event_test.go @@ -27,6 +27,11 @@ type eventsMockAnalyticsModule struct { Invoked bool } +// Returns the name of the analytics module +func (e *eventsMockAnalyticsModule) GetName() string { + return "eventsMockAnalyticsModule" +} + func (e *eventsMockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { if e.Fail { panic(e.Error) diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 87033f71b64..2520dc32074 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -1647,6 +1647,11 @@ func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) ana } } +// Returns the name of the analytics module +func (logger mockLogger) GetName() string { + return "mockLogger" +} + func (logger mockLogger) LogAuctionObject(ao *analytics.AuctionObject) { *logger.auctionObject = *ao } diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index edb478d2b73..dd6aa52042e 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -173,11 +173,6 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http CookieFlag: metrics.CookieFlagUnknown, RequestStatus: metrics.RequestStatusOK, } - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogAuctionObject(&ao) - }() w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) @@ -203,6 +198,17 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http } } + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + + scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: deps.analytics.GetName()} + reportAnalyticsActivityAllowed := activities.Allow(privacy.ActivityReportAnalytics, scopedName) + if reportAnalyticsActivityAllowed { + deps.analytics.LogAuctionObject(&ao) + } + }() + ctx := context.Background() timeout := deps.cfg.AuctionTimeouts.LimitAuctionTimeout(time.Duration(req.TMax) * time.Millisecond) diff --git a/endpoints/openrtb2/video_auction_test.go b/endpoints/openrtb2/video_auction_test.go index 1f28efb8a6f..e29de9fd467 100644 --- a/endpoints/openrtb2/video_auction_test.go +++ b/endpoints/openrtb2/video_auction_test.go @@ -1235,6 +1235,11 @@ type mockAnalyticsModule struct { videoObjects []*analytics.VideoObject } +// Returns the name of the analytics module +func (m *mockAnalyticsModule) GetName() string { + return "mockAnalyticsModule" +} + func (m *mockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { m.auctionObjects = append(m.auctionObjects, ao) } diff --git a/privacy/enforcer.go b/privacy/enforcer.go index aeaaab8dd27..af2ef706c60 100644 --- a/privacy/enforcer.go +++ b/privacy/enforcer.go @@ -99,7 +99,7 @@ func activityRulesToEnforcementRules(rules []config.ActivityRule) ([]ActivityRul result = ActivityDeny } - componentName, err := conditionToRuleComponentNames(r.Condition.ComponentName) + componentName, err := conditionToRuleComponentNames(r.Condition) if err != nil { return nil, err } @@ -114,14 +114,40 @@ func activityRulesToEnforcementRules(rules []config.ActivityRule) ([]ActivityRul return enfRules, nil } -func conditionToRuleComponentNames(conditions []string) ([]ScopedName, error) { +func conditionToRuleComponentNames(conditions config.ActivityCondition) ([]ScopedName, error) { + // condition can contain more than one component type and component name may have more than one names + // in this case scopes should have all combinations of names and types + // for instance for the config like this + // "condition": { + // "componentName": ["enabledAnalytics", "filelogger", "bidder.appnexus"], + // "componentType":["analytics", "rtd"] + // } + // result scopes should be: + // analytics.enabledAnalytics + // analytics.filelogger + // rtd.enabledAnalytics + // rtd.filelogger + // bidder.appnexus + sn := make([]ScopedName, 0) - for _, condition := range conditions { - scope, err := NewScopedName(condition) + for _, conditionName := range conditions.ComponentName { + scope, err := NewScopedName(conditionName) if err != nil { return sn, err } - sn = append(sn, scope) + if scope.Scope != "" { + sn = append(sn, scope) + } else if scope.Scope == "" && len(conditions.ComponentType) == 0 { + scope.Scope = ScopeTypeBidder + sn = append(sn, scope) + } else { + for _, conditionType := range conditions.ComponentType { + if conditionType != scope.Scope { + newSN := ScopedName{Scope: conditionType, Name: scope.Name} + sn = append(sn, newSN) + } + } + } } return sn, nil } @@ -235,7 +261,6 @@ func NewScopedName(condition string) (ScopedName, error) { } name = split[1] } else if len(split) == 1 { - scope = ScopeTypeBidder name = split[0] } else { return ScopedName{}, fmt.Errorf("unable to parse condition: %s", condition) diff --git a/privacy/enforcer_test.go b/privacy/enforcer_test.go index 864964c2a51..5f17f2e99a9 100644 --- a/privacy/enforcer_test.go +++ b/privacy/enforcer_test.go @@ -354,13 +354,13 @@ func TestNewScopedName(t *testing.T) { err: nil, }, { - name: "scope-default", + name: "scope-no-type", condition: "bidderA", - expectedScopeName: ScopedName{Scope: "bidder", Name: "bidderA"}, + expectedScopeName: ScopedName{Scope: "", Name: "bidderA"}, err: nil, }, { - name: "scope-rtf", + name: "scope-rtd", condition: "rtd.test", expectedScopeName: ScopedName{Scope: "rtd", Name: "test"}, err: nil, @@ -386,6 +386,110 @@ func TestNewScopedName(t *testing.T) { } } +func TestConditionToRuleComponentNames(t *testing.T) { + testCases := []struct { + name string + condition config.ActivityCondition + expectedScopeNames []ScopedName + err error + }{ + { + name: "empty", + condition: config.ActivityCondition{}, + expectedScopeNames: []ScopedName{}, + err: nil, + }, + { + name: "incorrect", + condition: config.ActivityCondition{ComponentName: []string{"bidder.bidderA.bidderB"}}, + expectedScopeNames: []ScopedName{}, + err: errors.New("unable to parse condition: bidder.bidderA.bidderB"), + }, + { + name: "scope-bidder", + condition: config.ActivityCondition{ComponentName: []string{"bidder.bidderA"}}, + expectedScopeNames: []ScopedName{{Scope: "bidder", Name: "bidderA"}}, + err: nil, + }, + { + name: "scope-bidder-default", + condition: config.ActivityCondition{ComponentName: []string{"bidderA"}}, + expectedScopeNames: []ScopedName{{Scope: "bidder", Name: "bidderA"}}, + err: nil, + }, + { + name: "scope-and-type-single", + condition: config.ActivityCondition{ComponentName: []string{"analyticsA"}, ComponentType: []string{"analytics"}}, + expectedScopeNames: []ScopedName{{Scope: "analytics", Name: "analyticsA"}}, + err: nil, + }, + { + name: "single-name-andtyped-name-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "rtd.componentB"}, ComponentType: []string{"analytics", "bidder"}}, + expectedScopeNames: []ScopedName{ + {Scope: "analytics", Name: "componentA"}, + {Scope: "bidder", Name: "componentA"}, + {Scope: "rtd", Name: "componentB"}, + }, + err: nil, + }, + { + name: "single-scope-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA"}, ComponentType: []string{"analytics", "bidder"}}, + expectedScopeNames: []ScopedName{ + {Scope: "analytics", Name: "componentA"}, + {Scope: "bidder", Name: "componentA"}, + }, + err: nil, + }, + { + name: "multiple-scope-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB"}, ComponentType: []string{"analytics", "bidder"}}, + expectedScopeNames: []ScopedName{ + {Scope: "analytics", Name: "componentA"}, + {Scope: "bidder", Name: "componentA"}, + {Scope: "analytics", Name: "componentB"}, + {Scope: "bidder", Name: "componentB"}, + }, + err: nil, + }, + { + name: "mixed-scope-and-type", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB", "rtd.componentC"}, ComponentType: []string{"analytics", "bidder"}}, + expectedScopeNames: []ScopedName{ + {Scope: "analytics", Name: "componentA"}, + {Scope: "bidder", Name: "componentA"}, + {Scope: "analytics", Name: "componentB"}, + {Scope: "bidder", Name: "componentB"}, + {Scope: "rtd", Name: "componentC"}, + }, + err: nil, + }, + { + name: "default-and-no-default-scope", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB", "rtd.componentC"}}, + expectedScopeNames: []ScopedName{ + {Scope: "bidder", Name: "componentA"}, + {Scope: "bidder", Name: "componentB"}, + {Scope: "rtd", Name: "componentC"}, + }, + err: nil, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + actualSN, actualErr := conditionToRuleComponentNames(test.condition) + if test.err == nil { + assert.EqualValues(t, test.expectedScopeNames, actualSN) + assert.NoError(t, actualErr) + } else { + assert.EqualError(t, actualErr, test.err.Error()) + } + }) + } +} + // constants func getDefaultActivityConfig() config.Activity { return config.Activity{ From 5860da95b6838996cf190be81282b4eb90c4b2af Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Thu, 10 Aug 2023 17:04:13 -0700 Subject: [PATCH 02/15] Moved activity evaluation in the composite --- analytics/config/config.go | 7 ++++++- analytics/core.go | 2 ++ endpoints/openrtb2/auction.go | 20 +++++++++----------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index cbdfaa8110d..bf416e9d3aa 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -8,6 +8,7 @@ import ( "github.com/prebid/prebid-server/analytics/filesystem" "github.com/prebid/prebid-server/analytics/pubstack" "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/privacy" ) // Modules that need to be logged to need to be initialized here @@ -50,7 +51,11 @@ func (ea enabledAnalytics) GetName() string { func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { for _, module := range ea { - module.LogAuctionObject(ao) + scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) + if reportAnalyticsActivityAllowed { + module.LogAuctionObject(ao) + } } } diff --git a/analytics/core.go b/analytics/core.go index de5d683008b..335af47d8d7 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -1,6 +1,7 @@ package analytics import ( + "github.com/prebid/prebid-server/privacy" "time" "github.com/prebid/openrtb/v19/openrtb2" @@ -32,6 +33,7 @@ type AuctionObject struct { HookExecutionOutcome []hookexecution.StageOutcome SeatNonBid []openrtb_ext.SeatNonBid RequestWrapper *openrtb_ext.RequestWrapper + ActivityControl privacy.ActivityControl } // Loggable object of a transaction at /openrtb2/amp endpoint diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index dd6aa52042e..adfd4a5e2fc 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -174,6 +174,12 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http RequestStatus: metrics.RequestStatusOK, } + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogAuctionObject(&ao) + }() + w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) req, impExtInfoMap, storedAuctionResponses, storedBidResponses, bidderImpReplaceImp, account, errL := deps.parseRequest(r, &labels, hookExecutor) @@ -197,17 +203,9 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http return } } - - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - - scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: deps.analytics.GetName()} - reportAnalyticsActivityAllowed := activities.Allow(privacy.ActivityReportAnalytics, scopedName) - if reportAnalyticsActivityAllowed { - deps.analytics.LogAuctionObject(&ao) - } - }() + // pass activities to analytics object here, after activities are evaluated + // request may have an additional account id that can change activity control + ao.ActivityControl = activities ctx := context.Background() From fdfc3b95633027a41d562ef9152608525b5984e0 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Thu, 10 Aug 2023 17:25:03 -0700 Subject: [PATCH 03/15] Activity integration in amp and event --- analytics/config/config.go | 18 +++++++++++++++--- analytics/core.go | 23 +++++++++++++---------- endpoints/events/event.go | 13 +++++++++++-- endpoints/openrtb2/amp_auction.go | 1 + 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index bf416e9d3aa..2ab46b351a1 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -61,7 +61,11 @@ func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject) { for _, module := range ea { - module.LogVideoObject(vo) + scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + reportAnalyticsActivityAllowed := vo.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) + if reportAnalyticsActivityAllowed { + module.LogVideoObject(vo) + } } } @@ -79,12 +83,20 @@ func (ea enabledAnalytics) LogSetUIDObject(so *analytics.SetUIDObject) { func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject) { for _, module := range ea { - module.LogAmpObject(ao) + scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) + if reportAnalyticsActivityAllowed { + module.LogAmpObject(ao) + } } } func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent) { for _, module := range ea { - module.LogNotificationEventObject(ne) + scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + reportAnalyticsActivityAllowed := ne.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) + if reportAnalyticsActivityAllowed { + module.LogNotificationEventObject(ne) + } } } diff --git a/analytics/core.go b/analytics/core.go index 335af47d8d7..b1a84515c65 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -47,18 +47,20 @@ type AmpObject struct { HookExecutionOutcome []hookexecution.StageOutcome SeatNonBid []openrtb_ext.SeatNonBid RequestWrapper *openrtb_ext.RequestWrapper + ActivityControl privacy.ActivityControl } // Loggable object of a transaction at /openrtb2/video endpoint type VideoObject struct { - Status int - Errors []error - Response *openrtb2.BidResponse - VideoRequest *openrtb_ext.BidRequestVideo - VideoResponse *openrtb_ext.BidResponseVideo - StartTime time.Time - SeatNonBid []openrtb_ext.SeatNonBid - RequestWrapper *openrtb_ext.RequestWrapper + Status int + Errors []error + Response *openrtb2.BidResponse + VideoRequest *openrtb_ext.BidRequestVideo + VideoResponse *openrtb_ext.BidResponseVideo + StartTime time.Time + SeatNonBid []openrtb_ext.SeatNonBid + RequestWrapper *openrtb_ext.RequestWrapper + ActivityControl privacy.ActivityControl } // Loggable object of a transaction at /setuid @@ -91,6 +93,7 @@ type UsersyncInfo struct { // NotificationEvent object of a transaction at /event type NotificationEvent struct { - Request *EventRequest `json:"request"` - Account *config.Account `json:"account"` + Request *EventRequest `json:"request"` + Account *config.Account `json:"account"` + ActivityControl privacy.ActivityControl } diff --git a/endpoints/events/event.go b/endpoints/events/event.go index 089d5606552..103f371d025 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/prebid/prebid-server/privacy" "net/http" "net/url" "strconv" @@ -114,10 +115,18 @@ func (e *eventEndpoint) Handle(w http.ResponseWriter, r *http.Request, _ httprou return } + activities, activitiesErr := privacy.NewActivityControl(account.Privacy) + if activitiesErr != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(fmt.Sprintf("Activity evaluation failed: '%s' ", activitiesErr))) + return + } + // handle notification event e.Analytics.LogNotificationEventObject(&analytics.NotificationEvent{ - Request: eventRequest, - Account: account, + Request: eventRequest, + Account: account, + ActivityControl: activities, }) // Add tracking pixel if format == image diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index fb4b192824a..e855bf3e7b3 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -235,6 +235,7 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h writeError(errL, w, &labels) return } + ao.ActivityControl = activities secGPC := r.Header.Get("Sec-GPC") From b204433ec6b013d6ee86bb25c19e280af41f0fd1 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Tue, 15 Aug 2023 17:02:51 -0700 Subject: [PATCH 04/15] Added config unit tests --- analytics/config/config_test.go | 94 ++++++++++++++++++++++++++++++++- analytics/core.go | 2 +- endpoints/events/event.go | 2 +- 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index 2d9b04aae0b..7c5829d9c0f 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -6,10 +6,11 @@ import ( "testing" "github.com/prebid/openrtb/v19/openrtb2" - "github.com/stretchr/testify/assert" - "github.com/prebid/prebid-server/analytics" "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/privacy" + "github.com/prebid/prebid-server/util/ptrutil" + "github.com/stretchr/testify/assert" ) const TEST_DIR string = "testFiles" @@ -142,3 +143,92 @@ func TestNewPBSAnalytics_Pubstack(t *testing.T) { instanceWithError := pbsAnalyticsWithError.(enabledAnalytics) assert.Equal(t, len(instanceWithError), 0) } + +func TestSampleModuleActivitiesAllowed(t *testing.T) { + var count int + am := initAnalytics(&count) + + acAllowed, err := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", true)) + assert.NoError(t, err, "unexpected error returned") + + ao := &analytics.AuctionObject{ + Status: http.StatusOK, + Errors: nil, + Response: &openrtb2.BidResponse{}, + ActivityControl: acAllowed, + } + + am.LogAuctionObject(ao) + if count != 1 { + t.Errorf("PBSAnalyticsModule failed at LogAuctionObject") + } + + am.LogAmpObject(&analytics.AmpObject{ActivityControl: acAllowed}) + if count != 2 { + t.Errorf("PBSAnalyticsModule failed at LogAmpObject") + } + + am.LogVideoObject(&analytics.VideoObject{ActivityControl: acAllowed}) + if count != 3 { + t.Errorf("PBSAnalyticsModule failed at LogVideoObject") + } + + am.LogNotificationEventObject(&analytics.NotificationEvent{ActivityControl: acAllowed}) + if count != 4 { + t.Errorf("PBSAnalyticsModule failed at LogNotificationEventObject") + } +} + +func TestSampleModuleActivitiesDenied(t *testing.T) { + var count int + am := initAnalytics(&count) + + acDenied, err := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", false)) + assert.NoError(t, err, "unexpected error returned") + + ao := &analytics.AuctionObject{ + Status: http.StatusOK, + Errors: nil, + Response: &openrtb2.BidResponse{}, + ActivityControl: acDenied, + } + + am.LogAuctionObject(ao) + if count != 0 { + t.Errorf("PBSAnalyticsModule failed at LogAuctionObject") + } + + am.LogAmpObject(&analytics.AmpObject{ActivityControl: acDenied}) + if count != 0 { + t.Errorf("PBSAnalyticsModule failed at LogAmpObject") + } + + am.LogVideoObject(&analytics.VideoObject{ActivityControl: acDenied}) + if count != 0 { + t.Errorf("PBSAnalyticsModule failed at LogVideoObject") + } + + am.LogNotificationEventObject(&analytics.NotificationEvent{ActivityControl: acDenied}) + if count != 0 { + t.Errorf("PBSAnalyticsModule failed at LogNotificationEventObject") + } +} + +func getDefaultActivityConfig(componentName string, allow bool) *config.AccountPrivacy { + return &config.AccountPrivacy{ + AllowActivities: config.AllowActivities{ + ReportAnalytics: config.Activity{ + Default: ptrutil.ToPtr(true), + Rules: []config.ActivityRule{ + { + Allow: allow, + Condition: config.ActivityCondition{ + ComponentName: []string{componentName}, + ComponentType: []string{"analytics"}, + }, + }, + }, + }, + }, + } +} diff --git a/analytics/core.go b/analytics/core.go index b1a84515c65..932d72ef473 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -1,13 +1,13 @@ package analytics import ( - "github.com/prebid/prebid-server/privacy" "time" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/hooks/hookexecution" "github.com/prebid/prebid-server/openrtb_ext" + "github.com/prebid/prebid-server/privacy" ) // PBSAnalyticsModule must be implemented by analytics modules to extract the required information and logging diff --git a/endpoints/events/event.go b/endpoints/events/event.go index 103f371d025..efcac357160 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/prebid/prebid-server/privacy" "net/http" "net/url" "strconv" @@ -17,6 +16,7 @@ import ( "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/metrics" + "github.com/prebid/prebid-server/privacy" "github.com/prebid/prebid-server/stored_requests" "github.com/prebid/prebid-server/util/httputil" ) From 18157299dd85823406de5b797ea68cc378a78988 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Mon, 21 Aug 2023 17:57:38 -0700 Subject: [PATCH 05/15] Merge fixes --- analytics/config/config.go | 8 +-- privacy/activitycontrol.go | 42 ++++++++++--- privacy/activitycontrol_test.go | 104 ++++++++++++++++++++++++++++++++ privacy/component.go | 1 - privacy/component_test.go | 4 +- 5 files changed, 144 insertions(+), 15 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index 2ab46b351a1..28466614702 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -51,7 +51,7 @@ func (ea enabledAnalytics) GetName() string { func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { for _, module := range ea { - scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogAuctionObject(ao) @@ -61,7 +61,7 @@ func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject) { for _, module := range ea { - scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} reportAnalyticsActivityAllowed := vo.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogVideoObject(vo) @@ -83,7 +83,7 @@ func (ea enabledAnalytics) LogSetUIDObject(so *analytics.SetUIDObject) { func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject) { for _, module := range ea { - scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogAmpObject(ao) @@ -93,7 +93,7 @@ func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject) { func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent) { for _, module := range ea { - scopedName := privacy.ScopedName{Scope: privacy.ScopeTypeAnalytics, Name: module.GetName()} + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} reportAnalyticsActivityAllowed := ne.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogNotificationEventObject(ne) diff --git a/privacy/activitycontrol.go b/privacy/activitycontrol.go index fee5c6508a6..2d8c4122fb1 100644 --- a/privacy/activitycontrol.go +++ b/privacy/activitycontrol.go @@ -88,7 +88,7 @@ func activityRulesToEnforcementRules(rules []config.ActivityRule) ([]Rule, error result = ActivityDeny } - componentName, err := conditionToRuleComponentNames(r.Condition.ComponentName) + componentName, err := conditionToRuleComponentNames(r.Condition) if err != nil { return nil, err } @@ -103,16 +103,42 @@ func activityRulesToEnforcementRules(rules []config.ActivityRule) ([]Rule, error return enfRules, nil } -func conditionToRuleComponentNames(conditions []string) ([]Component, error) { - sn := make([]Component, 0) - for _, condition := range conditions { - scope, err := ParseComponent(condition) +func conditionToRuleComponentNames(conditions config.ActivityCondition) ([]Component, error) { + // condition can contain more than one component type and component name may have more than one names + // in this case scopes should have all combinations of names and types + // for instance for the config like this + // "condition": { + // "componentName": ["enabledAnalytics", "filelogger", "bidder.appnexus"], + // "componentType":["analytics", "rtd"] + // } + // result scopes should be: + // analytics.enabledAnalytics + // analytics.filelogger + // rtd.enabledAnalytics + // rtd.filelogger + // bidder.appnexus + + components := make([]Component, 0) + for _, conditionName := range conditions.ComponentName { + component, err := ParseComponent(conditionName) if err != nil { - return nil, err + return components, err + } + if component.Type != "" { + components = append(components, component) + } else if component.Type == "" && len(conditions.ComponentType) == 0 { + component.Type = ComponentTypeBidder + components = append(components, component) + } else { + for _, conditionType := range conditions.ComponentType { + if conditionType != component.Type { + newSN := Component{Type: conditionType, Name: component.Name} + components = append(components, newSN) + } + } } - sn = append(sn, scope) } - return sn, nil + return components, nil } func activityDefaultToDefaultResult(activityDefault *bool) bool { diff --git a/privacy/activitycontrol_test.go b/privacy/activitycontrol_test.go index 7927014a928..73f1c1895ed 100644 --- a/privacy/activitycontrol_test.go +++ b/privacy/activitycontrol_test.go @@ -225,6 +225,110 @@ func TestAllowActivityControl(t *testing.T) { } } +func TestConditionToRuleComponentNames(t *testing.T) { + testCases := []struct { + name string + condition config.ActivityCondition + expectedComponent []Component + err error + }{ + { + name: "empty", + condition: config.ActivityCondition{}, + expectedComponent: []Component{}, + err: nil, + }, + { + name: "incorrect", + condition: config.ActivityCondition{ComponentName: []string{"bidder.bidderA.bidderB"}}, + expectedComponent: []Component{}, + err: errors.New("unable to parse component: bidder.bidderA.bidderB"), + }, + { + name: "scope-bidder", + condition: config.ActivityCondition{ComponentName: []string{"bidder.bidderA"}}, + expectedComponent: []Component{{Type: "bidder", Name: "bidderA"}}, + err: nil, + }, + { + name: "scope-bidder-default", + condition: config.ActivityCondition{ComponentName: []string{"bidderA"}}, + expectedComponent: []Component{{Type: "bidder", Name: "bidderA"}}, + err: nil, + }, + { + name: "scope-and-type-single", + condition: config.ActivityCondition{ComponentName: []string{"analyticsA"}, ComponentType: []string{"analytics"}}, + expectedComponent: []Component{{Type: "analytics", Name: "analyticsA"}}, + err: nil, + }, + { + name: "single-name-andtyped-name-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "rtd.componentB"}, ComponentType: []string{"analytics", "bidder"}}, + expectedComponent: []Component{ + {Type: "analytics", Name: "componentA"}, + {Type: "bidder", Name: "componentA"}, + {Type: "rtd", Name: "componentB"}, + }, + err: nil, + }, + { + name: "single-scope-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA"}, ComponentType: []string{"analytics", "bidder"}}, + expectedComponent: []Component{ + {Type: "analytics", Name: "componentA"}, + {Type: "bidder", Name: "componentA"}, + }, + err: nil, + }, + { + name: "multiple-scope-and-multiple-types", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB"}, ComponentType: []string{"analytics", "bidder"}}, + expectedComponent: []Component{ + {Type: "analytics", Name: "componentA"}, + {Type: "bidder", Name: "componentA"}, + {Type: "analytics", Name: "componentB"}, + {Type: "bidder", Name: "componentB"}, + }, + err: nil, + }, + { + name: "mixed-scope-and-type", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB", "rtd.componentC"}, ComponentType: []string{"analytics", "bidder"}}, + expectedComponent: []Component{ + {Type: "analytics", Name: "componentA"}, + {Type: "bidder", Name: "componentA"}, + {Type: "analytics", Name: "componentB"}, + {Type: "bidder", Name: "componentB"}, + {Type: "rtd", Name: "componentC"}, + }, + err: nil, + }, + { + name: "default-and-no-default-scope", + condition: config.ActivityCondition{ComponentName: []string{"componentA", "componentB", "rtd.componentC"}}, + expectedComponent: []Component{ + {Type: "bidder", Name: "componentA"}, + {Type: "bidder", Name: "componentB"}, + {Type: "rtd", Name: "componentC"}, + }, + err: nil, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + actualSN, actualErr := conditionToRuleComponentNames(test.condition) + if test.err == nil { + assert.EqualValues(t, test.expectedComponent, actualSN) + assert.NoError(t, actualErr) + } else { + assert.EqualError(t, actualErr, test.err.Error()) + } + }) + } +} + // constants func getDefaultActivityConfig() config.Activity { return config.Activity{ diff --git a/privacy/component.go b/privacy/component.go index a203c6bdb3b..a9966c3ba2b 100644 --- a/privacy/component.go +++ b/privacy/component.go @@ -43,7 +43,6 @@ func ParseComponent(v string) (Component, error) { if len(split) == 1 { return Component{ - Type: ComponentTypeBidder, Name: split[0], }, nil } diff --git a/privacy/component_test.go b/privacy/component_test.go index 38aa105d602..a343787a12e 100644 --- a/privacy/component_test.go +++ b/privacy/component_test.go @@ -85,9 +85,9 @@ func TestParseComponent(t *testing.T) { expectedError: nil, }, { - name: "type-default", + name: "type-no-type", component: "bidderA", - expected: Component{Type: "bidder", Name: "bidderA"}, + expected: Component{Type: "", Name: "bidderA"}, expectedError: nil, }, { From 25e73c7774772a3bc230ec63a072ee86a1bdb552 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Mon, 21 Aug 2023 18:06:15 -0700 Subject: [PATCH 06/15] Added activities to Video analytics object --- endpoints/openrtb2/video_auction.go | 1 + 1 file changed, 1 insertion(+) diff --git a/endpoints/openrtb2/video_auction.go b/endpoints/openrtb2/video_auction.go index 8fc2f844c71..cbd825e4f37 100644 --- a/endpoints/openrtb2/video_auction.go +++ b/endpoints/openrtb2/video_auction.go @@ -311,6 +311,7 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re return } } + vo.ActivityControl = activities secGPC := r.Header.Get("Sec-GPC") auctionRequest := &exchange.AuctionRequest{ From b5bb7e3c24411c46e9bab773cddeaad59d934876 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Tue, 29 Aug 2023 14:05:18 -0700 Subject: [PATCH 07/15] Initial change from PBSAnalyticsModule to AnalyticsRunner --- analytics/config/config.go | 54 +++++++++++++----------- analytics/config/config_test.go | 5 --- analytics/core.go | 24 +++++------ analytics/filesystem/file_module.go | 7 +-- analytics/pubstack/pubstack_module.go | 9 +--- endpoints/cookie_sync.go | 7 +-- endpoints/cookie_sync_test.go | 5 --- endpoints/events/event.go | 12 +++--- endpoints/events/event_test.go | 5 --- endpoints/openrtb2/amp_auction.go | 18 ++++---- endpoints/openrtb2/amp_auction_test.go | 5 --- endpoints/openrtb2/auction.go | 21 +++++---- endpoints/openrtb2/test_utils.go | 3 +- endpoints/openrtb2/video_auction.go | 30 ++++++------- endpoints/openrtb2/video_auction_test.go | 5 --- endpoints/setuid.go | 5 ++- router/router.go | 14 +++--- 17 files changed, 97 insertions(+), 132 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index 28466614702..50d3798dfc2 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -11,12 +11,21 @@ import ( "github.com/prebid/prebid-server/privacy" ) +type AnalyticsRunner interface { + LogAuctionObject(*analytics.AuctionObject, privacy.ActivityControl) + LogVideoObject(*analytics.VideoObject, privacy.ActivityControl) + LogCookieSyncObject(*analytics.CookieSyncObject) + LogSetUIDObject(*analytics.SetUIDObject) + LogAmpObject(*analytics.AmpObject, privacy.ActivityControl) + LogNotificationEventObject(*analytics.NotificationEvent, privacy.ActivityControl) +} + // Modules that need to be logged to need to be initialized here -func NewPBSAnalytics(analytics *config.Analytics) analytics.PBSAnalyticsModule { +func NewPBSAnalytics(analytics *config.Analytics) AnalyticsRunner { modules := make(enabledAnalytics, 0) if len(analytics.File.Filename) > 0 { if mod, err := filesystem.NewFileLogger(analytics.File.Filename); err == nil { - modules = append(modules, mod) + modules["filelogger"] = mod } else { glog.Fatalf("Could not initialize FileLogger for file %v :%v", analytics.File.Filename, err) } @@ -33,7 +42,7 @@ func NewPBSAnalytics(analytics *config.Analytics) analytics.PBSAnalyticsModule { analytics.Pubstack.Buffers.Timeout, clock.New()) if err == nil { - modules = append(modules, pubstackModule) + modules["pubstack"] = pubstackModule } else { glog.Errorf("Could not initialize PubstackModule: %v", err) } @@ -42,27 +51,22 @@ func NewPBSAnalytics(analytics *config.Analytics) analytics.PBSAnalyticsModule { } // Collection of all the correctly configured analytics modules - implements the PBSAnalyticsModule interface -type enabledAnalytics []analytics.PBSAnalyticsModule - -// Returns the name of the analytics module -func (ea enabledAnalytics) GetName() string { - return "enabledAnalytics" -} +type enabledAnalytics map[string]analytics.Module -func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject) { - for _, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} - reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) +func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject, ac privacy.ActivityControl) { + for name, module := range ea { + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogAuctionObject(ao) } } } -func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject) { - for _, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} - reportAnalyticsActivityAllowed := vo.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) +func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject, ac privacy.ActivityControl) { + for name, module := range ea { + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogVideoObject(vo) } @@ -81,20 +85,20 @@ func (ea enabledAnalytics) LogSetUIDObject(so *analytics.SetUIDObject) { } } -func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject) { - for _, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} - reportAnalyticsActivityAllowed := ao.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) +func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject, ac privacy.ActivityControl) { + for name, module := range ea { + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogAmpObject(ao) } } } -func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent) { - for _, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: module.GetName()} - reportAnalyticsActivityAllowed := ne.ActivityControl.Allow(privacy.ActivityReportAnalytics, scopedName) +func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent, ac privacy.ActivityControl) { + for name, module := range ea { + scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) if reportAnalyticsActivityAllowed { module.LogNotificationEventObject(ne) } diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index 7c5829d9c0f..8bcbf13004e 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -63,11 +63,6 @@ type sampleModule struct { count *int } -// Returns the name of the analytics module -func (m *sampleModule) GetName() string { - return "sampleModule" -} - func (m *sampleModule) LogAuctionObject(ao *analytics.AuctionObject) { *m.count++ } func (m *sampleModule) LogVideoObject(vo *analytics.VideoObject) { *m.count++ } diff --git a/analytics/core.go b/analytics/core.go index 932d72ef473..2e58c300492 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -10,11 +10,10 @@ import ( "github.com/prebid/prebid-server/privacy" ) -// PBSAnalyticsModule must be implemented by analytics modules to extract the required information and logging +// Module must be implemented by analytics modules to extract the required information and logging // activities. Do not use marshal the parameter objects directly as they can change over time. Use a separate // model for each analytics module and transform as appropriate. -type PBSAnalyticsModule interface { - GetName() string +type Module interface { LogAuctionObject(*AuctionObject) LogVideoObject(*VideoObject) LogCookieSyncObject(*CookieSyncObject) @@ -33,7 +32,6 @@ type AuctionObject struct { HookExecutionOutcome []hookexecution.StageOutcome SeatNonBid []openrtb_ext.SeatNonBid RequestWrapper *openrtb_ext.RequestWrapper - ActivityControl privacy.ActivityControl } // Loggable object of a transaction at /openrtb2/amp endpoint @@ -47,20 +45,18 @@ type AmpObject struct { HookExecutionOutcome []hookexecution.StageOutcome SeatNonBid []openrtb_ext.SeatNonBid RequestWrapper *openrtb_ext.RequestWrapper - ActivityControl privacy.ActivityControl } // Loggable object of a transaction at /openrtb2/video endpoint type VideoObject struct { - Status int - Errors []error - Response *openrtb2.BidResponse - VideoRequest *openrtb_ext.BidRequestVideo - VideoResponse *openrtb_ext.BidResponseVideo - StartTime time.Time - SeatNonBid []openrtb_ext.SeatNonBid - RequestWrapper *openrtb_ext.RequestWrapper - ActivityControl privacy.ActivityControl + Status int + Errors []error + Response *openrtb2.BidResponse + VideoRequest *openrtb_ext.BidRequestVideo + VideoResponse *openrtb_ext.BidResponseVideo + StartTime time.Time + SeatNonBid []openrtb_ext.SeatNonBid + RequestWrapper *openrtb_ext.RequestWrapper } // Loggable object of a transaction at /setuid diff --git a/analytics/filesystem/file_module.go b/analytics/filesystem/file_module.go index 1980db083c2..f055e4470b1 100644 --- a/analytics/filesystem/file_module.go +++ b/analytics/filesystem/file_module.go @@ -26,11 +26,6 @@ type FileLogger struct { Logger *glog.Logger } -// Returns the name of the analytics module -func (f *FileLogger) GetName() string { - return "filelogger" -} - // Writes AuctionObject to file func (f *FileLogger) LogAuctionObject(ao *analytics.AuctionObject) { var b bytes.Buffer @@ -91,7 +86,7 @@ func (f *FileLogger) LogNotificationEventObject(ne *analytics.NotificationEvent) } // Method to initialize the analytic module -func NewFileLogger(filename string) (analytics.PBSAnalyticsModule, error) { +func NewFileLogger(filename string) (analytics.Module, error) { options := glog.LogOptions{ File: filename, Flag: glog.LstdFlags, diff --git a/analytics/pubstack/pubstack_module.go b/analytics/pubstack/pubstack_module.go index 5c53210e672..f2d8726d356 100644 --- a/analytics/pubstack/pubstack_module.go +++ b/analytics/pubstack/pubstack_module.go @@ -50,7 +50,7 @@ type PubstackModule struct { clock clock.Clock } -func NewModule(client *http.Client, scope, endpoint, configRefreshDelay string, maxEventCount int, maxByteSize, maxTime string, clock clock.Clock) (analytics.PBSAnalyticsModule, error) { +func NewModule(client *http.Client, scope, endpoint, configRefreshDelay string, maxEventCount int, maxByteSize, maxTime string, clock clock.Clock) (analytics.Module, error) { configUpdateTask, err := NewConfigUpdateHttpTask( client, scope, @@ -63,7 +63,7 @@ func NewModule(client *http.Client, scope, endpoint, configRefreshDelay string, return NewModuleWithConfigTask(client, scope, endpoint, maxEventCount, maxByteSize, maxTime, configUpdateTask, clock) } -func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEventCount int, maxByteSize, maxTime string, configTask ConfigUpdateTask, clock clock.Clock) (analytics.PBSAnalyticsModule, error) { +func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEventCount int, maxByteSize, maxTime string, configTask ConfigUpdateTask, clock clock.Clock) (analytics.Module, error) { glog.Infof("[pubstack] Initializing module scope=%s endpoint=%s\n", scope, endpoint) // parse args @@ -107,11 +107,6 @@ func NewModuleWithConfigTask(client *http.Client, scope, endpoint string, maxEve return &pb, nil } -// Returns the name of the analytics module -func (p *PubstackModule) GetName() string { - return "pubstack" -} - func (p *PubstackModule) LogAuctionObject(ao *analytics.AuctionObject) { p.muxConfig.RLock() defer p.muxConfig.RUnlock() diff --git a/endpoints/cookie_sync.go b/endpoints/cookie_sync.go index 5caa543cbea..fc77807f1ab 100644 --- a/endpoints/cookie_sync.go +++ b/endpoints/cookie_sync.go @@ -16,6 +16,7 @@ import ( gppConstants "github.com/prebid/go-gpp/constants" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" + analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/gdpr" @@ -49,7 +50,7 @@ func NewCookieSyncEndpoint( gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, metrics metrics.MetricsEngine, - pbsAnalytics analytics.PBSAnalyticsModule, + analyticsRunner analyticsConf.AnalyticsRunner, accountsFetcher stored_requests.AccountFetcher, bidders map[string]openrtb_ext.BidderName) HTTPRouterHandler { @@ -69,7 +70,7 @@ func NewCookieSyncEndpoint( bidderHashSet: bidderHashSet, }, metrics: metrics, - pbsAnalytics: pbsAnalytics, + pbsAnalytics: analyticsRunner, accountsFetcher: accountsFetcher, } } @@ -79,7 +80,7 @@ type cookieSyncEndpoint struct { config *config.Configuration privacyConfig usersyncPrivacyConfig metrics metrics.MetricsEngine - pbsAnalytics analytics.PBSAnalyticsModule + pbsAnalytics analyticsConf.AnalyticsRunner accountsFetcher stored_requests.AccountFetcher } diff --git a/endpoints/cookie_sync_test.go b/endpoints/cookie_sync_test.go index 0d987656f93..22ecc1faf9e 100644 --- a/endpoints/cookie_sync_test.go +++ b/endpoints/cookie_sync_test.go @@ -2030,11 +2030,6 @@ type MockAnalytics struct { mock.Mock } -// Returns the name of the analytics module -func (m *MockAnalytics) GetName() string { - return "mockAnalytics" -} - func (m *MockAnalytics) LogAuctionObject(obj *analytics.AuctionObject) { m.Called(obj) } diff --git a/endpoints/events/event.go b/endpoints/events/event.go index efcac357160..b4629ce422c 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -13,6 +13,7 @@ import ( "github.com/julienschmidt/httprouter" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" + config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/metrics" @@ -41,13 +42,13 @@ const integrationParamMaxLength = 64 type eventEndpoint struct { Accounts stored_requests.AccountFetcher - Analytics analytics.PBSAnalyticsModule + Analytics config2.AnalyticsRunner Cfg *config.Configuration TrackingPixel *httputil.Pixel MetricsEngine metrics.MetricsEngine } -func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics analytics.PBSAnalyticsModule, me metrics.MetricsEngine) httprouter.Handle { +func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics config2.AnalyticsRunner, me metrics.MetricsEngine) httprouter.Handle { ee := &eventEndpoint{ Accounts: accounts, Analytics: analytics, @@ -124,10 +125,9 @@ func (e *eventEndpoint) Handle(w http.ResponseWriter, r *http.Request, _ httprou // handle notification event e.Analytics.LogNotificationEventObject(&analytics.NotificationEvent{ - Request: eventRequest, - Account: account, - ActivityControl: activities, - }) + Request: eventRequest, + Account: account, + }, activities) // Add tracking pixel if format == image if eventRequest.Format == analytics.Image { diff --git a/endpoints/events/event_test.go b/endpoints/events/event_test.go index 190148e8964..95711ba1328 100644 --- a/endpoints/events/event_test.go +++ b/endpoints/events/event_test.go @@ -27,11 +27,6 @@ type eventsMockAnalyticsModule struct { Invoked bool } -// Returns the name of the analytics module -func (e *eventsMockAnalyticsModule) GetName() string { - return "eventsMockAnalyticsModule" -} - func (e *eventsMockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { if e.Fail { panic(e.Error) diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index e855bf3e7b3..a3cfe58e92c 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -17,6 +17,7 @@ import ( "github.com/julienschmidt/httprouter" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" + config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/hooks/hookexecution" "github.com/prebid/prebid-server/ortb" "github.com/prebid/prebid-server/util/uuidutil" @@ -63,7 +64,7 @@ func NewAmpEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - pbsAnalytics analytics.PBSAnalyticsModule, + analyticsRunner config2.AnalyticsRunner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -92,7 +93,7 @@ func NewAmpEndpoint( accounts, cfg, metricsEngine, - pbsAnalytics, + analyticsRunner, disabledBidders, defRequest, defReqJSON, @@ -134,12 +135,6 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h RequestStatus: metrics.RequestStatusOK, } - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogAmpObject(&ao) - }() - // Add AMP headers origin := r.FormValue("__amp_source_origin") if len(origin) == 0 { @@ -235,7 +230,12 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h writeError(errL, w, &labels) return } - ao.ActivityControl = activities + + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogAmpObject(&ao, activities) + }() secGPC := r.Header.Get("Sec-GPC") diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 2520dc32074..87033f71b64 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -1647,11 +1647,6 @@ func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) ana } } -// Returns the name of the analytics module -func (logger mockLogger) GetName() string { - return "mockLogger" -} - func (logger mockLogger) LogAuctionObject(ao *analytics.AuctionObject) { *logger.auctionObject = *ao } diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index 092f25b4fe7..f1e22830eca 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/prebid/prebid-server/privacy" "io" "net/http" "net/url" @@ -26,9 +25,11 @@ import ( nativeRequests "github.com/prebid/openrtb/v19/native1/request" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" + config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/bidadjustment" "github.com/prebid/prebid-server/hooks" "github.com/prebid/prebid-server/ortb" + "github.com/prebid/prebid-server/privacy" "golang.org/x/net/publicsuffix" jsonpatch "gopkg.in/evanphx/json-patch.v4" @@ -85,7 +86,7 @@ func NewEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - pbsAnalytics analytics.PBSAnalyticsModule, + analyticsRunner config2.AnalyticsRunner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -113,7 +114,7 @@ func NewEndpoint( accounts, cfg, metricsEngine, - pbsAnalytics, + analyticsRunner, disabledBidders, defRequest, defReqJSON, @@ -135,7 +136,7 @@ type endpointDeps struct { accounts stored_requests.AccountFetcher cfg *config.Configuration metricsEngine metrics.MetricsEngine - analytics analytics.PBSAnalyticsModule + analytics config2.AnalyticsRunner disabledBidders map[string]string defaultRequest bool defReqJSON []byte @@ -173,12 +174,6 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http RequestStatus: metrics.RequestStatusOK, } - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogAuctionObject(&ao) - }() - w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) req, impExtInfoMap, storedAuctionResponses, storedBidResponses, bidderImpReplaceImp, account, errL := deps.parseRequest(r, &labels, hookExecutor) @@ -204,7 +199,11 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http } // pass activities to analytics object here, after activities are evaluated // request may have an additional account id that can change activity control - ao.ActivityControl = activities + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogAuctionObject(&ao, activities) + }() ctx := context.Background() diff --git a/endpoints/openrtb2/test_utils.go b/endpoints/openrtb2/test_utils.go index 3d249dc8d59..f740af545f8 100644 --- a/endpoints/openrtb2/test_utils.go +++ b/endpoints/openrtb2/test_utils.go @@ -19,7 +19,6 @@ import ( "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" "github.com/prebid/prebid-server/adapters" - "github.com/prebid/prebid-server/analytics" analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/currency" @@ -1290,7 +1289,7 @@ func buildTestEndpoint(test testCase, cfg *config.Configuration) (httprouter.Han planBuilder = hooks.EmptyPlanBuilder{} } - var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analytics.PBSAnalyticsModule, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) + var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analyticsConf.AnalyticsRunner, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) switch test.endpointType { case AMP_ENDPOINT: diff --git a/endpoints/openrtb2/video_auction.go b/endpoints/openrtb2/video_auction.go index cbd825e4f37..4962b622eb8 100644 --- a/endpoints/openrtb2/video_auction.go +++ b/endpoints/openrtb2/video_auction.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + analyticsConf "github.com/prebid/prebid-server/analytics/config" "io" "net/http" "net/url" @@ -52,7 +53,7 @@ func NewVideoEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, met metrics.MetricsEngine, - pbsAnalytics analytics.PBSAnalyticsModule, + analyticsRunner analyticsConf.AnalyticsRunner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -82,7 +83,7 @@ func NewVideoEndpoint( accounts, cfg, met, - pbsAnalytics, + analyticsRunner, disabledBidders, defRequest, defReqJSON, @@ -149,18 +150,6 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re } debugLog.DebugEnabledOrOverridden = debugLog.Enabled || debugLog.DebugOverride - defer func() { - if len(debugLog.CacheKey) > 0 && vo.VideoResponse == nil { - err := debugLog.PutDebugLogError(deps.cache, deps.cfg.CacheURL.ExpectedTimeMillis, vo.Errors) - if err != nil { - vo.Errors = append(vo.Errors, err) - } - } - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogVideoObject(&vo) - }() - w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) lr := &io.LimitedReader{ @@ -311,7 +300,18 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re return } } - vo.ActivityControl = activities + + defer func() { + if len(debugLog.CacheKey) > 0 && vo.VideoResponse == nil { + err := debugLog.PutDebugLogError(deps.cache, deps.cfg.CacheURL.ExpectedTimeMillis, vo.Errors) + if err != nil { + vo.Errors = append(vo.Errors, err) + } + } + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogVideoObject(&vo, activities) + }() secGPC := r.Header.Get("Sec-GPC") auctionRequest := &exchange.AuctionRequest{ diff --git a/endpoints/openrtb2/video_auction_test.go b/endpoints/openrtb2/video_auction_test.go index da6a8ab845a..a32afd24907 100644 --- a/endpoints/openrtb2/video_auction_test.go +++ b/endpoints/openrtb2/video_auction_test.go @@ -1249,11 +1249,6 @@ type mockAnalyticsModule struct { videoObjects []*analytics.VideoObject } -// Returns the name of the analytics module -func (m *mockAnalyticsModule) GetName() string { - return "mockAnalyticsModule" -} - func (m *mockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { m.auctionObjects = append(m.auctionObjects, ao) } diff --git a/endpoints/setuid.go b/endpoints/setuid.go index 561989e029d..a42fddc25c2 100644 --- a/endpoints/setuid.go +++ b/endpoints/setuid.go @@ -14,6 +14,7 @@ import ( gppConstants "github.com/prebid/go-gpp/constants" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" + config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/gdpr" @@ -36,7 +37,7 @@ const ( const uidCookieName = "uids" -func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, pbsanalytics analytics.PBSAnalyticsModule, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { +func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, analyticsRunner config2.AnalyticsRunner, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { encoder := usersync.Base64Encoder{} decoder := usersync.Base64Decoder{} @@ -46,7 +47,7 @@ func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]use Errors: make([]error, 0), } - defer pbsanalytics.LogSetUIDObject(&so) + defer analyticsRunner.LogSetUIDObject(&so) cookie := usersync.ReadCookie(r, decoder, &cfg.HostCookie) if !cookie.AllowSyncs() { diff --git a/router/router.go b/router/router.go index fcf674b4143..b7ccb9b4767 100644 --- a/router/router.go +++ b/router/router.go @@ -182,7 +182,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R // todo(zachbadgett): better shutdown r.Shutdown = shutdown - pbsAnalytics := analyticsConf.NewPBSAnalytics(&cfg.Analytics) + analyticsRunner := analyticsConf.NewPBSAnalytics(&cfg.Analytics) paramsValidator, err := openrtb_ext.NewBidderParamsValidator(schemaDirectory) if err != nil { @@ -219,17 +219,17 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R macroReplacer := macros.NewStringIndexBasedReplacer() theExchange := exchange.NewExchange(adapters, cacheClient, cfg, syncersByBidder, r.MetricsEngine, cfg.BidderInfos, gdprPermsBuilder, rateConvertor, categoriesFetcher, adsCertSigner, macroReplacer) var uuidGenerator uuidutil.UUIDRandomGenerator - openrtbEndpoint, err := openrtb2.NewEndpoint(uuidGenerator, theExchange, paramsValidator, fetcher, accounts, cfg, r.MetricsEngine, pbsAnalytics, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) + openrtbEndpoint, err := openrtb2.NewEndpoint(uuidGenerator, theExchange, paramsValidator, fetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) if err != nil { glog.Fatalf("Failed to create the openrtb2 endpoint handler. %v", err) } - ampEndpoint, err := openrtb2.NewAmpEndpoint(uuidGenerator, theExchange, paramsValidator, ampFetcher, accounts, cfg, r.MetricsEngine, pbsAnalytics, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) + ampEndpoint, err := openrtb2.NewAmpEndpoint(uuidGenerator, theExchange, paramsValidator, ampFetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, storedRespFetcher, planBuilder, tmaxAdjustments) if err != nil { glog.Fatalf("Failed to create the amp endpoint handler. %v", err) } - videoEndpoint, err := openrtb2.NewVideoEndpoint(uuidGenerator, theExchange, paramsValidator, fetcher, videoFetcher, accounts, cfg, r.MetricsEngine, pbsAnalytics, disabledBidders, defReqJSON, activeBidders, cacheClient, tmaxAdjustments) + videoEndpoint, err := openrtb2.NewVideoEndpoint(uuidGenerator, theExchange, paramsValidator, fetcher, videoFetcher, accounts, cfg, r.MetricsEngine, analyticsRunner, disabledBidders, defReqJSON, activeBidders, cacheClient, tmaxAdjustments) if err != nil { glog.Fatalf("Failed to create the video endpoint handler. %v", err) } @@ -245,7 +245,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R r.GET("/info/bidders", infoEndpoints.NewBiddersEndpoint(cfg.BidderInfos, defaultAliases)) r.GET("/info/bidders/:bidderName", infoEndpoints.NewBiddersDetailEndpoint(cfg.BidderInfos, defaultAliases)) r.GET("/bidders/params", NewJsonDirectoryServer(schemaDirectory, paramsValidator, defaultAliases)) - r.POST("/cookie_sync", endpoints.NewCookieSyncEndpoint(syncersByBidder, cfg, gdprPermsBuilder, tcf2CfgBuilder, r.MetricsEngine, pbsAnalytics, accounts, activeBidders).Handle) + r.POST("/cookie_sync", endpoints.NewCookieSyncEndpoint(syncersByBidder, cfg, gdprPermsBuilder, tcf2CfgBuilder, r.MetricsEngine, analyticsRunner, accounts, activeBidders).Handle) r.GET("/status", endpoints.NewStatusEndpoint(cfg.StatusResponse)) r.GET("/", serveIndex) r.Handler("GET", "/version", endpoints.NewVersionEndpoint(version.Ver, version.Rev)) @@ -258,7 +258,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R } // event endpoint - eventEndpoint := events.NewEventEndpoint(cfg, accounts, pbsAnalytics, r.MetricsEngine) + eventEndpoint := events.NewEventEndpoint(cfg, accounts, analyticsRunner, r.MetricsEngine) r.GET("/event", eventEndpoint) userSyncDeps := &pbs.UserSyncDeps{ @@ -267,7 +267,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R RecaptchaSecret: cfg.RecaptchaSecret, } - r.GET("/setuid", endpoints.NewSetUIDEndpoint(cfg, syncersByBidder, gdprPermsBuilder, tcf2CfgBuilder, pbsAnalytics, accounts, r.MetricsEngine)) + r.GET("/setuid", endpoints.NewSetUIDEndpoint(cfg, syncersByBidder, gdprPermsBuilder, tcf2CfgBuilder, analyticsRunner, accounts, r.MetricsEngine)) r.GET("/getuids", endpoints.NewGetUIDsEndpoint(cfg.HostCookie)) r.POST("/optout", userSyncDeps.OptOut) r.GET("/optout", userSyncDeps.OptOut) From 32e37d12170a2739362d6852b31b200e44d793c0 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Wed, 30 Aug 2023 11:19:21 -0700 Subject: [PATCH 08/15] Rename, refactoring and unit tests fixes --- analytics/config/config.go | 4 +- analytics/config/config_test.go | 52 ++++++++-------- analytics/pubstack/pubstack_module_test.go | 14 ++--- endpoints/cookie_sync.go | 4 +- endpoints/cookie_sync_test.go | 44 +++++++------- endpoints/events/event.go | 4 +- endpoints/events/event_test.go | 9 +-- endpoints/openrtb2/amp_auction.go | 19 +++--- endpoints/openrtb2/amp_auction_test.go | 35 +++++------ endpoints/openrtb2/auction.go | 22 +++---- endpoints/openrtb2/auction_benchmark_test.go | 2 +- endpoints/openrtb2/auction_test.go | 64 ++++++++++---------- endpoints/openrtb2/test_utils.go | 4 +- endpoints/openrtb2/video_auction.go | 34 ++++++----- endpoints/openrtb2/video_auction_test.go | 18 +++--- endpoints/setuid.go | 2 +- endpoints/setuid_test.go | 34 +++++------ router/router.go | 2 +- 18 files changed, 186 insertions(+), 181 deletions(-) diff --git a/analytics/config/config.go b/analytics/config/config.go index 50d3798dfc2..4303c760c5e 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -11,7 +11,7 @@ import ( "github.com/prebid/prebid-server/privacy" ) -type AnalyticsRunner interface { +type Runner interface { LogAuctionObject(*analytics.AuctionObject, privacy.ActivityControl) LogVideoObject(*analytics.VideoObject, privacy.ActivityControl) LogCookieSyncObject(*analytics.CookieSyncObject) @@ -21,7 +21,7 @@ type AnalyticsRunner interface { } // Modules that need to be logged to need to be initialized here -func NewPBSAnalytics(analytics *config.Analytics) AnalyticsRunner { +func New(analytics *config.Analytics) Runner { modules := make(enabledAnalytics, 0) if len(analytics.File.Filename) > 0 { if mod, err := filesystem.NewFileLogger(analytics.File.Filename); err == nil { diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index 8bcbf13004e..dc64d902257 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -22,7 +22,7 @@ func TestSampleModule(t *testing.T) { Status: http.StatusOK, Errors: nil, Response: &openrtb2.BidResponse{}, - }) + }, privacy.ActivityControl{}) if count != 1 { t.Errorf("PBSAnalyticsModule failed at LogAuctionObject") } @@ -43,17 +43,17 @@ func TestSampleModule(t *testing.T) { t.Errorf("PBSAnalyticsModule failed at LogCookieSyncObject") } - am.LogAmpObject(&analytics.AmpObject{}) + am.LogAmpObject(&analytics.AmpObject{}, privacy.ActivityControl{}) if count != 4 { t.Errorf("PBSAnalyticsModule failed at LogAmpObject") } - am.LogVideoObject(&analytics.VideoObject{}) + am.LogVideoObject(&analytics.VideoObject{}, privacy.ActivityControl{}) if count != 5 { t.Errorf("PBSAnalyticsModule failed at LogVideoObject") } - am.LogNotificationEventObject(&analytics.NotificationEvent{}) + am.LogNotificationEventObject(&analytics.NotificationEvent{}, privacy.ActivityControl{}) if count != 6 { t.Errorf("PBSAnalyticsModule failed at LogNotificationEventObject") } @@ -75,14 +75,14 @@ func (m *sampleModule) LogAmpObject(ao *analytics.AmpObject) { *m.count++ } func (m *sampleModule) LogNotificationEventObject(ne *analytics.NotificationEvent) { *m.count++ } -func initAnalytics(count *int) analytics.PBSAnalyticsModule { +func initAnalytics(count *int) Runner { modules := make(enabledAnalytics, 0) - modules = append(modules, &sampleModule{count}) + modules["sampleModule"] = &sampleModule{count} return &modules } func TestNewPBSAnalytics(t *testing.T) { - pbsAnalytics := NewPBSAnalytics(&config.Analytics{}) + pbsAnalytics := New(&config.Analytics{}) instance := pbsAnalytics.(enabledAnalytics) assert.Equal(t, len(instance), 0) @@ -95,7 +95,7 @@ func TestNewPBSAnalytics_FileLogger(t *testing.T) { } } defer os.RemoveAll(TEST_DIR) - mod := NewPBSAnalytics(&config.Analytics{File: config.FileLogs{Filename: TEST_DIR + "/test"}}) + mod := New(&config.Analytics{File: config.FileLogs{Filename: TEST_DIR + "/test"}}) switch modType := mod.(type) { case enabledAnalytics: if len(enabledAnalytics(modType)) != 1 { @@ -105,7 +105,7 @@ func TestNewPBSAnalytics_FileLogger(t *testing.T) { t.Fatalf("Failed to initialize analytics module") } - pbsAnalytics := NewPBSAnalytics(&config.Analytics{File: config.FileLogs{Filename: TEST_DIR + "/test"}}) + pbsAnalytics := New(&config.Analytics{File: config.FileLogs{Filename: TEST_DIR + "/test"}}) instance := pbsAnalytics.(enabledAnalytics) assert.Equal(t, len(instance), 1) @@ -113,7 +113,7 @@ func TestNewPBSAnalytics_FileLogger(t *testing.T) { func TestNewPBSAnalytics_Pubstack(t *testing.T) { - pbsAnalyticsWithoutError := NewPBSAnalytics(&config.Analytics{ + pbsAnalyticsWithoutError := New(&config.Analytics{ Pubstack: config.Pubstack{ Enabled: true, ScopeId: "scopeId", @@ -130,7 +130,7 @@ func TestNewPBSAnalytics_Pubstack(t *testing.T) { assert.Equal(t, len(instanceWithoutError), 1) - pbsAnalyticsWithError := NewPBSAnalytics(&config.Analytics{ + pbsAnalyticsWithError := New(&config.Analytics{ Pubstack: config.Pubstack{ Enabled: true, }, @@ -147,28 +147,27 @@ func TestSampleModuleActivitiesAllowed(t *testing.T) { assert.NoError(t, err, "unexpected error returned") ao := &analytics.AuctionObject{ - Status: http.StatusOK, - Errors: nil, - Response: &openrtb2.BidResponse{}, - ActivityControl: acAllowed, + Status: http.StatusOK, + Errors: nil, + Response: &openrtb2.BidResponse{}, } - am.LogAuctionObject(ao) + am.LogAuctionObject(ao, acAllowed) if count != 1 { t.Errorf("PBSAnalyticsModule failed at LogAuctionObject") } - am.LogAmpObject(&analytics.AmpObject{ActivityControl: acAllowed}) + am.LogAmpObject(&analytics.AmpObject{}, acAllowed) if count != 2 { t.Errorf("PBSAnalyticsModule failed at LogAmpObject") } - am.LogVideoObject(&analytics.VideoObject{ActivityControl: acAllowed}) + am.LogVideoObject(&analytics.VideoObject{}, acAllowed) if count != 3 { t.Errorf("PBSAnalyticsModule failed at LogVideoObject") } - am.LogNotificationEventObject(&analytics.NotificationEvent{ActivityControl: acAllowed}) + am.LogNotificationEventObject(&analytics.NotificationEvent{}, acAllowed) if count != 4 { t.Errorf("PBSAnalyticsModule failed at LogNotificationEventObject") } @@ -182,28 +181,27 @@ func TestSampleModuleActivitiesDenied(t *testing.T) { assert.NoError(t, err, "unexpected error returned") ao := &analytics.AuctionObject{ - Status: http.StatusOK, - Errors: nil, - Response: &openrtb2.BidResponse{}, - ActivityControl: acDenied, + Status: http.StatusOK, + Errors: nil, + Response: &openrtb2.BidResponse{}, } - am.LogAuctionObject(ao) + am.LogAuctionObject(ao, acDenied) if count != 0 { t.Errorf("PBSAnalyticsModule failed at LogAuctionObject") } - am.LogAmpObject(&analytics.AmpObject{ActivityControl: acDenied}) + am.LogAmpObject(&analytics.AmpObject{}, acDenied) if count != 0 { t.Errorf("PBSAnalyticsModule failed at LogAmpObject") } - am.LogVideoObject(&analytics.VideoObject{ActivityControl: acDenied}) + am.LogVideoObject(&analytics.VideoObject{}, acDenied) if count != 0 { t.Errorf("PBSAnalyticsModule failed at LogVideoObject") } - am.LogNotificationEventObject(&analytics.NotificationEvent{ActivityControl: acDenied}) + am.LogNotificationEventObject(&analytics.NotificationEvent{}, acDenied) if count != 0 { t.Errorf("PBSAnalyticsModule failed at LogNotificationEventObject") } diff --git a/analytics/pubstack/pubstack_module_test.go b/analytics/pubstack/pubstack_module_test.go index 504a1cfe17e..23e110df9c1 100644 --- a/analytics/pubstack/pubstack_module_test.go +++ b/analytics/pubstack/pubstack_module_test.go @@ -50,47 +50,47 @@ func TestNewModuleSuccess(t *testing.T) { tests := []struct { description string feature string - logObject func(analytics.PBSAnalyticsModule) + logObject func(analytics.Module) }{ { description: "auction events are only published when logging an auction object with auction feature on", feature: auction, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogAuctionObject(&analytics.AuctionObject{Status: http.StatusOK}) }, }, { description: "AMP events are only published when logging an AMP object with AMP feature on", feature: amp, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogAmpObject(&analytics.AmpObject{Status: http.StatusOK}) }, }, { description: "video events are only published when logging a video object with video feature on", feature: video, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogVideoObject(&analytics.VideoObject{Status: http.StatusOK}) }, }, { description: "cookie events are only published when logging a cookie object with cookie feature on", feature: cookieSync, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogCookieSyncObject(&analytics.CookieSyncObject{Status: http.StatusOK}) }, }, { description: "setUID events are only published when logging a setUID object with setUID feature on", feature: setUID, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogSetUIDObject(&analytics.SetUIDObject{Status: http.StatusOK}) }, }, { description: "Ignore excluded fields from marshal", feature: auction, - logObject: func(module analytics.PBSAnalyticsModule) { + logObject: func(module analytics.Module) { module.LogAuctionObject(&analytics.AuctionObject{ RequestWrapper: &openrtb_ext.RequestWrapper{}, SeatNonBid: []openrtb_ext.SeatNonBid{ diff --git a/endpoints/cookie_sync.go b/endpoints/cookie_sync.go index fc77807f1ab..c79e3f27f3e 100644 --- a/endpoints/cookie_sync.go +++ b/endpoints/cookie_sync.go @@ -50,7 +50,7 @@ func NewCookieSyncEndpoint( gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, metrics metrics.MetricsEngine, - analyticsRunner analyticsConf.AnalyticsRunner, + analyticsRunner analyticsConf.Runner, accountsFetcher stored_requests.AccountFetcher, bidders map[string]openrtb_ext.BidderName) HTTPRouterHandler { @@ -80,7 +80,7 @@ type cookieSyncEndpoint struct { config *config.Configuration privacyConfig usersyncPrivacyConfig metrics metrics.MetricsEngine - pbsAnalytics analyticsConf.AnalyticsRunner + pbsAnalytics analyticsConf.Runner accountsFetcher stored_requests.AccountFetcher } diff --git a/endpoints/cookie_sync_test.go b/endpoints/cookie_sync_test.go index 22ecc1faf9e..b5539798e1c 100644 --- a/endpoints/cookie_sync_test.go +++ b/endpoints/cookie_sync_test.go @@ -43,7 +43,7 @@ func TestNewCookieSyncEndpoint(t *testing.T) { configGDPR = config.GDPR{HostVendorID: 42} configCCPAEnforce = true metrics = metrics.MetricsEngineMock{} - analytics = MockAnalytics{} + analytics = MockAnalyticsRunner{} fetcher = FakeAccountsFetcher{} bidders = map[string]openrtb_ext.BidderName{"bidderA": openrtb_ext.BidderName("bidderA"), "bidderB": openrtb_ext.BidderName("bidderB")} ) @@ -115,7 +115,7 @@ func TestCookieSyncHandle(t *testing.T) { expectedStatusCode int expectedBody string setMetricsExpectations func(*metrics.MetricsEngineMock) - setAnalyticsExpectations func(*MockAnalytics) + setAnalyticsExpectations func(*MockAnalyticsRunner) }{ { description: "Request With Cookie", @@ -134,7 +134,7 @@ func TestCookieSyncHandle(t *testing.T) { m.On("RecordCookieSync", metrics.CookieSyncOK).Once() m.On("RecordSyncerRequest", "aSyncer", metrics.SyncerCookieSyncOK).Once() }, - setAnalyticsExpectations: func(a *MockAnalytics) { + setAnalyticsExpectations: func(a *MockAnalyticsRunner) { expected := analytics.CookieSyncObject{ Status: 200, Errors: nil, @@ -166,7 +166,7 @@ func TestCookieSyncHandle(t *testing.T) { m.On("RecordCookieSync", metrics.CookieSyncOK).Once() m.On("RecordSyncerRequest", "aSyncer", metrics.SyncerCookieSyncOK).Once() }, - setAnalyticsExpectations: func(a *MockAnalytics) { + setAnalyticsExpectations: func(a *MockAnalyticsRunner) { expected := analytics.CookieSyncObject{ Status: 200, Errors: nil, @@ -195,7 +195,7 @@ func TestCookieSyncHandle(t *testing.T) { setMetricsExpectations: func(m *metrics.MetricsEngineMock) { m.On("RecordCookieSync", metrics.CookieSyncBadRequest).Once() }, - setAnalyticsExpectations: func(a *MockAnalytics) { + setAnalyticsExpectations: func(a *MockAnalyticsRunner) { expected := analytics.CookieSyncObject{ Status: 400, Errors: []error{errors.New("JSON parsing failed: invalid character 'm' looking for beginning of value")}, @@ -218,7 +218,7 @@ func TestCookieSyncHandle(t *testing.T) { setMetricsExpectations: func(m *metrics.MetricsEngineMock) { m.On("RecordCookieSync", metrics.CookieSyncOptOut).Once() }, - setAnalyticsExpectations: func(a *MockAnalytics) { + setAnalyticsExpectations: func(a *MockAnalyticsRunner) { expected := analytics.CookieSyncObject{ Status: 401, Errors: []error{errors.New("User has opted out")}, @@ -241,7 +241,7 @@ func TestCookieSyncHandle(t *testing.T) { setMetricsExpectations: func(m *metrics.MetricsEngineMock) { m.On("RecordCookieSync", metrics.CookieSyncGDPRHostCookieBlocked).Once() }, - setAnalyticsExpectations: func(a *MockAnalytics) { + setAnalyticsExpectations: func(a *MockAnalyticsRunner) { expected := analytics.CookieSyncObject{ Status: 200, Errors: nil, @@ -256,7 +256,7 @@ func TestCookieSyncHandle(t *testing.T) { mockMetrics := metrics.MetricsEngineMock{} test.setMetricsExpectations(&mockMetrics) - mockAnalytics := MockAnalytics{} + mockAnalytics := MockAnalyticsRunner{} test.setAnalyticsExpectations(&mockAnalytics) fakeAccountFetcher := FakeAccountsFetcher{} @@ -1277,7 +1277,7 @@ func TestSetCooperativeSync(t *testing.T) { func TestWriteParseRequestErrorMetrics(t *testing.T) { err := errors.New("anyError") - mockAnalytics := MockAnalytics{} + mockAnalytics := MockAnalyticsRunner{} mockAnalytics.On("LogCookieSyncObject", mock.Anything) writer := httptest.NewRecorder() @@ -1500,7 +1500,7 @@ func TestParseBidderFilter(t *testing.T) { func TestCookieSyncHandleError(t *testing.T) { err := errors.New("anyError") - mockAnalytics := MockAnalytics{} + mockAnalytics := MockAnalyticsRunner{} mockAnalytics.On("LogCookieSyncObject", mock.Anything) writer := httptest.NewRecorder() @@ -1693,7 +1693,7 @@ func TestCookieSyncHandleResponse(t *testing.T) { } for _, test := range testCases { - mockAnalytics := MockAnalytics{} + mockAnalytics := MockAnalyticsRunner{} mockAnalytics.On("LogCookieSyncObject", &test.expectedAnalytics).Once() cookie := usersync.NewCookie() @@ -2026,32 +2026,32 @@ func (m *MockSyncer) GetSync(syncTypes []usersync.SyncType, privacyPolicies priv return args.Get(0).(usersync.Sync), args.Error(1) } -type MockAnalytics struct { +type MockAnalyticsRunner struct { mock.Mock } -func (m *MockAnalytics) LogAuctionObject(obj *analytics.AuctionObject) { - m.Called(obj) +func (m *MockAnalyticsRunner) LogAuctionObject(obj *analytics.AuctionObject, ac privacy.ActivityControl) { + m.Called(obj, ac) } -func (m *MockAnalytics) LogVideoObject(obj *analytics.VideoObject) { - m.Called(obj) +func (m *MockAnalyticsRunner) LogVideoObject(obj *analytics.VideoObject, ac privacy.ActivityControl) { + m.Called(obj, ac) } -func (m *MockAnalytics) LogCookieSyncObject(obj *analytics.CookieSyncObject) { +func (m *MockAnalyticsRunner) LogCookieSyncObject(obj *analytics.CookieSyncObject) { m.Called(obj) } -func (m *MockAnalytics) LogSetUIDObject(obj *analytics.SetUIDObject) { +func (m *MockAnalyticsRunner) LogSetUIDObject(obj *analytics.SetUIDObject) { m.Called(obj) } -func (m *MockAnalytics) LogAmpObject(obj *analytics.AmpObject) { - m.Called(obj) +func (m *MockAnalyticsRunner) LogAmpObject(obj *analytics.AmpObject, ac privacy.ActivityControl) { + m.Called(obj, ac) } -func (m *MockAnalytics) LogNotificationEventObject(obj *analytics.NotificationEvent) { - m.Called(obj) +func (m *MockAnalyticsRunner) LogNotificationEventObject(obj *analytics.NotificationEvent, ac privacy.ActivityControl) { + m.Called(obj, ac) } type MockGDPRPerms struct { diff --git a/endpoints/events/event.go b/endpoints/events/event.go index b4629ce422c..5f9f9de06e8 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -42,13 +42,13 @@ const integrationParamMaxLength = 64 type eventEndpoint struct { Accounts stored_requests.AccountFetcher - Analytics config2.AnalyticsRunner + Analytics config2.Runner Cfg *config.Configuration TrackingPixel *httputil.Pixel MetricsEngine metrics.MetricsEngine } -func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics config2.AnalyticsRunner, me metrics.MetricsEngine) httprouter.Handle { +func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics config2.Runner, me metrics.MetricsEngine) httprouter.Handle { ee := &eventEndpoint{ Accounts: accounts, Analytics: analytics, diff --git a/endpoints/events/event_test.go b/endpoints/events/event_test.go index 95711ba1328..48439b036ff 100644 --- a/endpoints/events/event_test.go +++ b/endpoints/events/event_test.go @@ -16,6 +16,7 @@ import ( "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/metrics" + "github.com/prebid/prebid-server/privacy" "github.com/prebid/prebid-server/stored_requests" "github.com/stretchr/testify/assert" ) @@ -27,14 +28,14 @@ type eventsMockAnalyticsModule struct { Invoked bool } -func (e *eventsMockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { +func (e *eventsMockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject, _ privacy.ActivityControl) { if e.Fail { panic(e.Error) } return } -func (e *eventsMockAnalyticsModule) LogVideoObject(vo *analytics.VideoObject) { +func (e *eventsMockAnalyticsModule) LogVideoObject(vo *analytics.VideoObject, _ privacy.ActivityControl) { if e.Fail { panic(e.Error) } @@ -55,14 +56,14 @@ func (e *eventsMockAnalyticsModule) LogSetUIDObject(so *analytics.SetUIDObject) return } -func (e *eventsMockAnalyticsModule) LogAmpObject(ao *analytics.AmpObject) { +func (e *eventsMockAnalyticsModule) LogAmpObject(ao *analytics.AmpObject, _ privacy.ActivityControl) { if e.Fail { panic(e.Error) } return } -func (e *eventsMockAnalyticsModule) LogNotificationEventObject(ne *analytics.NotificationEvent) { +func (e *eventsMockAnalyticsModule) LogNotificationEventObject(ne *analytics.NotificationEvent, _ privacy.ActivityControl) { if e.Fail { panic(e.Error) } diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index a3cfe58e92c..7f13c6a4fa5 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -64,7 +64,7 @@ func NewAmpEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - analyticsRunner config2.AnalyticsRunner, + analyticsRunner config2.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -134,6 +134,13 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h CookieFlag: metrics.CookieFlagUnknown, RequestStatus: metrics.RequestStatusOK, } + activityControl := privacy.ActivityControl{} + + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogAmpObject(&ao, activityControl) + }() // Add AMP headers origin := r.FormValue("__amp_source_origin") @@ -224,19 +231,13 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h tcf2Config := gdpr.NewTCF2Config(deps.cfg.GDPR.TCF2, account.GDPR) - activities, activitiesErr := privacy.NewActivityControl(account.Privacy) + activityControl, activitiesErr := privacy.NewActivityControl(account.Privacy) if activitiesErr != nil { errL = append(errL, activitiesErr) writeError(errL, w, &labels) return } - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogAmpObject(&ao, activities) - }() - secGPC := r.Header.Get("Sec-GPC") auctionRequest := &exchange.AuctionRequest{ @@ -254,7 +255,7 @@ func (deps *endpointDeps) AmpAuction(w http.ResponseWriter, r *http.Request, _ h HookExecutor: hookExecutor, QueryParams: r.URL.Query(), TCF2Config: tcf2Config, - Activities: activities, + Activities: activityControl, TmaxAdjustments: deps.tmaxAdjustments, } diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 87033f71b64..9911f76a56a 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -30,6 +30,7 @@ import ( "github.com/prebid/prebid-server/metrics" metricsConfig "github.com/prebid/prebid-server/metrics/config" "github.com/prebid/prebid-server/openrtb_ext" + "github.com/prebid/prebid-server/privacy" "github.com/prebid/prebid-server/stored_requests/backends/empty_fetcher" ) @@ -210,7 +211,7 @@ func TestAMPPageInfo(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -314,7 +315,7 @@ func TestGDPRConsent(t *testing.T) { GDPR: config.GDPR{Enabled: true}, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -738,7 +739,7 @@ func TestCCPAConsent(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -852,7 +853,7 @@ func TestConsentWarnings(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -951,7 +952,7 @@ func TestNewAndLegacyConsentBothProvided(t *testing.T) { GDPR: config.GDPR{Enabled: true}, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1006,7 +1007,7 @@ func TestAMPSiteExt(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), nil, nil, openrtb_ext.BuildBidderMap(), @@ -1049,7 +1050,7 @@ func TestAmpBadRequests(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1083,7 +1084,7 @@ func TestAmpDebug(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1219,7 +1220,7 @@ func TestQueryParamOverrides(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1377,7 +1378,7 @@ func (s formatOverrideSpec) execute(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1640,25 +1641,25 @@ type mockLogger struct { auctionObject *analytics.AuctionObject } -func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) analytics.PBSAnalyticsModule { +func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) analyticsConf.Runner { return &mockLogger{ ampObject: ao, auctionObject: aucObj, } } -func (logger mockLogger) LogAuctionObject(ao *analytics.AuctionObject) { +func (logger mockLogger) LogAuctionObject(ao *analytics.AuctionObject, _ privacy.ActivityControl) { *logger.auctionObject = *ao } -func (logger mockLogger) LogVideoObject(vo *analytics.VideoObject) { +func (logger mockLogger) LogVideoObject(vo *analytics.VideoObject, _ privacy.ActivityControl) { } func (logger mockLogger) LogCookieSyncObject(cookieObject *analytics.CookieSyncObject) { } func (logger mockLogger) LogSetUIDObject(uuidObj *analytics.SetUIDObject) { } -func (logger mockLogger) LogNotificationEventObject(uuidObj *analytics.NotificationEvent) { +func (logger mockLogger) LogNotificationEventObject(uuidObj *analytics.NotificationEvent, _ privacy.ActivityControl) { } -func (logger mockLogger) LogAmpObject(ao *analytics.AmpObject) { +func (logger mockLogger) LogAmpObject(ao *analytics.AmpObject, _ privacy.ActivityControl) { *logger.ampObject = *ao } @@ -1971,7 +1972,7 @@ func TestAmpAuctionResponseHeaders(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2007,7 +2008,7 @@ func TestRequestWithTargeting(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), nil, nil, openrtb_ext.BuildBidderMap(), diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index f1e22830eca..d86345553b8 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -86,7 +86,7 @@ func NewEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - analyticsRunner config2.AnalyticsRunner, + analyticsRunner config2.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -136,7 +136,7 @@ type endpointDeps struct { accounts stored_requests.AccountFetcher cfg *config.Configuration metricsEngine metrics.MetricsEngine - analytics config2.AnalyticsRunner + analytics config2.Runner disabledBidders map[string]string defaultRequest bool defReqJSON []byte @@ -174,6 +174,13 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http RequestStatus: metrics.RequestStatusOK, } + activityControl := privacy.ActivityControl{} + defer func() { + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogAuctionObject(&ao, activityControl) + }() + w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) req, impExtInfoMap, storedAuctionResponses, storedBidResponses, bidderImpReplaceImp, account, errL := deps.parseRequest(r, &labels, hookExecutor) @@ -189,7 +196,7 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http tcf2Config := gdpr.NewTCF2Config(deps.cfg.GDPR.TCF2, account.GDPR) - activities, activitiesErr := privacy.NewActivityControl(account.Privacy) + activityControl, activitiesErr := privacy.NewActivityControl(account.Privacy) if activitiesErr != nil { errL = append(errL, activitiesErr) if errortypes.ContainsFatalError(errL) { @@ -197,13 +204,6 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http return } } - // pass activities to analytics object here, after activities are evaluated - // request may have an additional account id that can change activity control - defer func() { - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogAuctionObject(&ao, activities) - }() ctx := context.Background() @@ -254,7 +254,7 @@ func (deps *endpointDeps) Auction(w http.ResponseWriter, r *http.Request, _ http PubID: labels.PubID, HookExecutor: hookExecutor, TCF2Config: tcf2Config, - Activities: activities, + Activities: activityControl, TmaxAdjustments: deps.tmaxAdjustments, } auctionResponse, err := deps.ex.HoldAuction(ctx, auctionRequest, nil) diff --git a/endpoints/openrtb2/auction_benchmark_test.go b/endpoints/openrtb2/auction_benchmark_test.go index a3c19ee0b10..d2971691fdb 100644 --- a/endpoints/openrtb2/auction_benchmark_test.go +++ b/endpoints/openrtb2/auction_benchmark_test.go @@ -105,7 +105,7 @@ func BenchmarkOpenrtbEndpoint(b *testing.B) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, nilMetrics, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, nil, diff --git a/endpoints/openrtb2/auction_test.go b/endpoints/openrtb2/auction_test.go index c42209e02ce..c743770ad57 100644 --- a/endpoints/openrtb2/auction_test.go +++ b/endpoints/openrtb2/auction_test.go @@ -449,7 +449,7 @@ func TestExplicitUserId(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -507,7 +507,7 @@ func doBadAliasRequest(t *testing.T, filename string, expectMsg string) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), disabledBidders, aliasJSON, bidderMap, @@ -562,7 +562,7 @@ func TestNilExchange(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), map[string]string{}, + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), empty_fetcher.EmptyFetcher{}, @@ -587,7 +587,7 @@ func TestNilValidator(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -613,7 +613,7 @@ func TestExchangeError(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -740,7 +740,7 @@ func TestImplicitIPsEndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -940,7 +940,7 @@ func TestImplicitDNTEndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1148,7 +1148,7 @@ func TestStoredRequests(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1522,7 +1522,7 @@ func TestValidateRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2241,7 +2241,7 @@ func TestSetIntegrationType(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2307,7 +2307,7 @@ func TestStoredRequestGenerateUuid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2411,7 +2411,7 @@ func TestOversizedRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody) - 1)}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2450,7 +2450,7 @@ func TestRequestSizeEdgeCase(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2487,7 +2487,7 @@ func TestNoEncoding(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2572,7 +2572,7 @@ func TestContentType(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2789,7 +2789,7 @@ func TestValidateImpExt(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(8096)}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{"disabledbidder": "The bidder 'disabledbidder' has been disabled."}, false, []byte{}, @@ -2842,7 +2842,7 @@ func TestCurrencyTrunc(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2890,7 +2890,7 @@ func TestCCPAInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2942,7 +2942,7 @@ func TestNoSaleInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2997,7 +2997,7 @@ func TestValidateSourceTID(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3042,7 +3042,7 @@ func TestSChainInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3538,7 +3538,7 @@ func TestEidPermissionsInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3792,7 +3792,7 @@ func TestIOS14EndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -3855,7 +3855,7 @@ func TestAuctionWarnings(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3901,7 +3901,7 @@ func TestParseRequestParseImpInfoError(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3981,7 +3981,7 @@ func TestParseGzipedRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(50), Compression: config.Compression{Request: config.CompressionInfo{GZIP: false}}}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4480,7 +4480,7 @@ func TestAuctionResponseHeaders(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -4581,7 +4581,7 @@ func TestParseRequestMergeBidderParams(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4684,7 +4684,7 @@ func TestParseRequestStoredResponses(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4772,7 +4772,7 @@ func TestParseRequestStoredBidResponses(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4809,7 +4809,7 @@ func TestValidateStoredResp(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -5622,7 +5622,7 @@ func TestParseRequestMultiBid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, diff --git a/endpoints/openrtb2/test_utils.go b/endpoints/openrtb2/test_utils.go index f740af545f8..ebd949bfc2c 100644 --- a/endpoints/openrtb2/test_utils.go +++ b/endpoints/openrtb2/test_utils.go @@ -1289,7 +1289,7 @@ func buildTestEndpoint(test testCase, cfg *config.Configuration) (httprouter.Han planBuilder = hooks.EmptyPlanBuilder{} } - var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analyticsConf.AnalyticsRunner, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) + var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analyticsConf.Runner, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) switch test.endpointType { case AMP_ENDPOINT: @@ -1306,7 +1306,7 @@ func buildTestEndpoint(test testCase, cfg *config.Configuration) (httprouter.Han accountFetcher, cfg, met, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), disabledBidders, []byte(test.Config.AliasJSON), bidderMap, diff --git a/endpoints/openrtb2/video_auction.go b/endpoints/openrtb2/video_auction.go index 4962b622eb8..942ce93c709 100644 --- a/endpoints/openrtb2/video_auction.go +++ b/endpoints/openrtb2/video_auction.go @@ -5,7 +5,6 @@ import ( "encoding/json" "errors" "fmt" - analyticsConf "github.com/prebid/prebid-server/analytics/config" "io" "net/http" "net/url" @@ -27,6 +26,7 @@ import ( accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" + analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" @@ -53,7 +53,7 @@ func NewVideoEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, met metrics.MetricsEngine, - analyticsRunner analyticsConf.AnalyticsRunner, + analyticsRunner analyticsConf.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -150,6 +150,20 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re } debugLog.DebugEnabledOrOverridden = debugLog.Enabled || debugLog.DebugOverride + activityControl := privacy.ActivityControl{} + + defer func() { + if len(debugLog.CacheKey) > 0 && vo.VideoResponse == nil { + err := debugLog.PutDebugLogError(deps.cache, deps.cfg.CacheURL.ExpectedTimeMillis, vo.Errors) + if err != nil { + vo.Errors = append(vo.Errors, err) + } + } + deps.metricsEngine.RecordRequest(labels) + deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) + deps.analytics.LogVideoObject(&vo, activityControl) + }() + w.Header().Set("X-Prebid", version.BuildXPrebidHeader(version.Ver)) lr := &io.LimitedReader{ @@ -292,7 +306,7 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re return } - activities, activitiesErr := privacy.NewActivityControl(account.Privacy) + activityControl, activitiesErr := privacy.NewActivityControl(account.Privacy) if activitiesErr != nil { errL = append(errL, activitiesErr) if errortypes.ContainsFatalError(errL) { @@ -301,18 +315,6 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re } } - defer func() { - if len(debugLog.CacheKey) > 0 && vo.VideoResponse == nil { - err := debugLog.PutDebugLogError(deps.cache, deps.cfg.CacheURL.ExpectedTimeMillis, vo.Errors) - if err != nil { - vo.Errors = append(vo.Errors, err) - } - } - deps.metricsEngine.RecordRequest(labels) - deps.metricsEngine.RecordRequestTime(labels, time.Since(start)) - deps.analytics.LogVideoObject(&vo, activities) - }() - secGPC := r.Header.Get("Sec-GPC") auctionRequest := &exchange.AuctionRequest{ BidRequestWrapper: bidReqWrapper, @@ -325,7 +327,7 @@ func (deps *endpointDeps) VideoAuctionEndpoint(w http.ResponseWriter, r *http.Re PubID: labels.PubID, HookExecutor: hookexecution.EmptyHookExecutor{}, TmaxAdjustments: deps.tmaxAdjustments, - Activities: activities, + Activities: activityControl, } auctionResponse, err := deps.ex.HoldAuction(ctx, auctionRequest, &debugLog) diff --git a/endpoints/openrtb2/video_auction_test.go b/endpoints/openrtb2/video_auction_test.go index a32afd24907..7423a0165bc 100644 --- a/endpoints/openrtb2/video_auction_test.go +++ b/endpoints/openrtb2/video_auction_test.go @@ -21,6 +21,7 @@ import ( metricsConfig "github.com/prebid/prebid-server/metrics/config" "github.com/prebid/prebid-server/openrtb_ext" "github.com/prebid/prebid-server/prebid_cache_client" + "github.com/prebid/prebid-server/privacy" "github.com/prebid/prebid-server/stored_requests/backends/empty_fetcher" "github.com/prebid/prebid-server/util/ptrutil" @@ -1249,11 +1250,11 @@ type mockAnalyticsModule struct { videoObjects []*analytics.VideoObject } -func (m *mockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject) { +func (m *mockAnalyticsModule) LogAuctionObject(ao *analytics.AuctionObject, _ privacy.ActivityControl) { m.auctionObjects = append(m.auctionObjects, ao) } -func (m *mockAnalyticsModule) LogVideoObject(vo *analytics.VideoObject) { +func (m *mockAnalyticsModule) LogVideoObject(vo *analytics.VideoObject, _ privacy.ActivityControl) { m.videoObjects = append(m.videoObjects, vo) } @@ -1261,9 +1262,10 @@ func (m *mockAnalyticsModule) LogCookieSyncObject(cso *analytics.CookieSyncObjec func (m *mockAnalyticsModule) LogSetUIDObject(so *analytics.SetUIDObject) {} -func (m *mockAnalyticsModule) LogAmpObject(ao *analytics.AmpObject) {} +func (m *mockAnalyticsModule) LogAmpObject(ao *analytics.AmpObject, _ privacy.ActivityControl) {} -func (m *mockAnalyticsModule) LogNotificationEventObject(ne *analytics.NotificationEvent) {} +func (m *mockAnalyticsModule) LogNotificationEventObject(ne *analytics.NotificationEvent, _ privacy.ActivityControl) { +} func mockDeps(t *testing.T, ex *mockExchangeVideo) *endpointDeps { return &endpointDeps{ @@ -1275,7 +1277,7 @@ func mockDeps(t *testing.T, ex *mockExchangeVideo) *endpointDeps { &mockAccountFetcher{data: mockVideoAccountData}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1309,7 +1311,7 @@ func mockDepsInvalidPrivacy(t *testing.T, ex *mockExchangeVideo) *endpointDeps { }, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1333,7 +1335,7 @@ func mockDepsAppendBidderNames(t *testing.T, ex *mockExchangeAppendBidderNames) empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1359,7 +1361,7 @@ func mockDepsNoBids(t *testing.T, ex *mockExchangeVideoNoBids) *endpointDeps { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.NewPBSAnalytics(&config.Analytics{}), + analyticsConf.New(&config.Analytics{}), map[string]string{}, false, []byte{}, diff --git a/endpoints/setuid.go b/endpoints/setuid.go index a42fddc25c2..1b8ed50f42e 100644 --- a/endpoints/setuid.go +++ b/endpoints/setuid.go @@ -37,7 +37,7 @@ const ( const uidCookieName = "uids" -func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, analyticsRunner config2.AnalyticsRunner, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { +func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, analyticsRunner config2.Runner, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { encoder := usersync.Base64Encoder{} decoder := usersync.Base64Decoder{} diff --git a/endpoints/setuid_test.go b/endpoints/setuid_test.go index 05030cc7cf7..8905f26e8db 100644 --- a/endpoints/setuid_test.go +++ b/endpoints/setuid_test.go @@ -21,7 +21,7 @@ import ( "github.com/prebid/prebid-server/usersync" "github.com/stretchr/testify/assert" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsConfig "github.com/prebid/prebid-server/analytics/config" metricsConf "github.com/prebid/prebid-server/metrics/config" ) @@ -308,7 +308,7 @@ func TestSetUIDEndpoint(t *testing.T) { }, } - analytics := analyticsConf.NewPBSAnalytics(&config.Analytics{}) + analytics := analyticsConfig.New(&config.Analytics{}) metrics := &metricsConf.NilMetricsEngine{} for _, test := range testCases { @@ -944,7 +944,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { cfgAccountRequired bool expectedResponseCode int expectedMetrics func(*metrics.MetricsEngineMock) - expectedAnalytics func(*MockAnalytics) + expectedAnalytics func(*MockAnalyticsRunner) }{ { description: "Success - Sync", @@ -957,7 +957,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { m.On("RecordSetUid", metrics.SetUidOK).Once() m.On("RecordSyncerSet", "pubmatic", metrics.SyncerSetUidOK).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 200, Bidder: "pubmatic", @@ -979,7 +979,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { m.On("RecordSetUid", metrics.SetUidOK).Once() m.On("RecordSyncerSet", "pubmatic", metrics.SyncerSetUidCleared).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 200, Bidder: "pubmatic", @@ -1000,7 +1000,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidOptOut).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 401, Bidder: "", @@ -1021,7 +1021,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidSyncerUnknown).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "", @@ -1042,7 +1042,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidBadRequest).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1063,7 +1063,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidBadRequest).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1084,7 +1084,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidGDPRHostCookieBlocked).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 451, Bidder: "pubmatic", @@ -1105,7 +1105,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidAccountBlocked).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1127,7 +1127,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidAccountInvalid).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1149,7 +1149,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidAccountConfigMalformed).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1171,7 +1171,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { expectedMetrics: func(m *metrics.MetricsEngineMock) { m.On("RecordSetUid", metrics.SetUidBadRequest).Once() }, - expectedAnalytics: func(a *MockAnalytics) { + expectedAnalytics: func(a *MockAnalyticsRunner) { expected := analytics.SetUIDObject{ Status: 400, Bidder: "pubmatic", @@ -1185,7 +1185,7 @@ func TestSetUIDEndpointMetrics(t *testing.T) { } for _, test := range testCases { - analyticsEngine := &MockAnalytics{} + analyticsEngine := &MockAnalyticsRunner{} test.expectedAnalytics(analyticsEngine) metricsEngine := &metrics.MetricsEngineMock{} @@ -1209,7 +1209,7 @@ func TestOptedOut(t *testing.T) { cookie.SetOptOut(true) addCookie(request, cookie) syncersBidderNameToKey := map[string]string{"pubmatic": "pubmatic"} - analytics := analyticsConf.NewPBSAnalytics(&config.Analytics{}) + analytics := analyticsConfig.New(&config.Analytics{}) metrics := &metricsConf.NilMetricsEngine{} response := doRequest(request, analytics, metrics, syncersBidderNameToKey, true, false, false, false) @@ -1347,7 +1347,7 @@ func makeRequest(uri string, existingSyncs map[string]string) *http.Request { return request } -func doRequest(req *http.Request, analytics analytics.PBSAnalyticsModule, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool) *httptest.ResponseRecorder { +func doRequest(req *http.Request, analytics analyticsConfig.Runner, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool) *httptest.ResponseRecorder { cfg := config.Configuration{ AccountRequired: cfgAccountRequired, BlacklistedAcctMap: map[string]bool{ diff --git a/router/router.go b/router/router.go index b7ccb9b4767..d701c53a5f1 100644 --- a/router/router.go +++ b/router/router.go @@ -182,7 +182,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R // todo(zachbadgett): better shutdown r.Shutdown = shutdown - analyticsRunner := analyticsConf.NewPBSAnalytics(&cfg.Analytics) + analyticsRunner := analyticsConf.New(&cfg.Analytics) paramsValidator, err := openrtb_ext.NewBidderParamsValidator(schemaDirectory) if err != nil { From 9cd4be63279d0d533b7078359fa19b32c8622e62 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Wed, 30 Aug 2023 13:26:34 -0700 Subject: [PATCH 09/15] Import rename --- endpoints/openrtb2/auction.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index d86345553b8..c66c99662a0 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -25,7 +25,7 @@ import ( nativeRequests "github.com/prebid/openrtb/v19/native1/request" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" - config2 "github.com/prebid/prebid-server/analytics/config" + analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/bidadjustment" "github.com/prebid/prebid-server/hooks" "github.com/prebid/prebid-server/ortb" @@ -86,7 +86,7 @@ func NewEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - analyticsRunner config2.Runner, + analyticsRunner analyticsConf.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -136,7 +136,7 @@ type endpointDeps struct { accounts stored_requests.AccountFetcher cfg *config.Configuration metricsEngine metrics.MetricsEngine - analytics config2.Runner + analytics analyticsConf.Runner disabledBidders map[string]string defaultRequest bool defReqJSON []byte From bdc65694c011f8581149714c4cbc7ee2714cda5b Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Mon, 4 Sep 2023 14:15:16 -0700 Subject: [PATCH 10/15] Moved analytics Runner to the root of analytics package --- analytics/config/config.go | 11 +---------- analytics/config/config_test.go | 2 +- analytics/runner.go | 14 ++++++++++++++ endpoints/cookie_sync.go | 5 ++--- endpoints/events/event.go | 5 ++--- endpoints/openrtb2/amp_auction.go | 3 +-- endpoints/openrtb2/amp_auction_test.go | 2 +- endpoints/openrtb2/auction.go | 5 ++--- endpoints/openrtb2/test_utils.go | 3 ++- endpoints/openrtb2/video_auction.go | 3 +-- endpoints/setuid.go | 3 +-- endpoints/setuid_test.go | 2 +- 12 files changed, 29 insertions(+), 29 deletions(-) create mode 100644 analytics/runner.go diff --git a/analytics/config/config.go b/analytics/config/config.go index 4303c760c5e..cd11ffe93ac 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -11,17 +11,8 @@ import ( "github.com/prebid/prebid-server/privacy" ) -type Runner interface { - LogAuctionObject(*analytics.AuctionObject, privacy.ActivityControl) - LogVideoObject(*analytics.VideoObject, privacy.ActivityControl) - LogCookieSyncObject(*analytics.CookieSyncObject) - LogSetUIDObject(*analytics.SetUIDObject) - LogAmpObject(*analytics.AmpObject, privacy.ActivityControl) - LogNotificationEventObject(*analytics.NotificationEvent, privacy.ActivityControl) -} - // Modules that need to be logged to need to be initialized here -func New(analytics *config.Analytics) Runner { +func New(analytics *config.Analytics) analytics.Runner { modules := make(enabledAnalytics, 0) if len(analytics.File.Filename) > 0 { if mod, err := filesystem.NewFileLogger(analytics.File.Filename); err == nil { diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index dc64d902257..5c7a6aeb37c 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -75,7 +75,7 @@ func (m *sampleModule) LogAmpObject(ao *analytics.AmpObject) { *m.count++ } func (m *sampleModule) LogNotificationEventObject(ne *analytics.NotificationEvent) { *m.count++ } -func initAnalytics(count *int) Runner { +func initAnalytics(count *int) analytics.Runner { modules := make(enabledAnalytics, 0) modules["sampleModule"] = &sampleModule{count} return &modules diff --git a/analytics/runner.go b/analytics/runner.go new file mode 100644 index 00000000000..08f67561f8a --- /dev/null +++ b/analytics/runner.go @@ -0,0 +1,14 @@ +package analytics + +import ( + "github.com/prebid/prebid-server/privacy" +) + +type Runner interface { + LogAuctionObject(*AuctionObject, privacy.ActivityControl) + LogVideoObject(*VideoObject, privacy.ActivityControl) + LogCookieSyncObject(*CookieSyncObject) + LogSetUIDObject(*SetUIDObject) + LogAmpObject(*AmpObject, privacy.ActivityControl) + LogNotificationEventObject(*NotificationEvent, privacy.ActivityControl) +} diff --git a/endpoints/cookie_sync.go b/endpoints/cookie_sync.go index c79e3f27f3e..f529c191735 100644 --- a/endpoints/cookie_sync.go +++ b/endpoints/cookie_sync.go @@ -16,7 +16,6 @@ import ( gppConstants "github.com/prebid/go-gpp/constants" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/gdpr" @@ -50,7 +49,7 @@ func NewCookieSyncEndpoint( gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, metrics metrics.MetricsEngine, - analyticsRunner analyticsConf.Runner, + analyticsRunner analytics.Runner, accountsFetcher stored_requests.AccountFetcher, bidders map[string]openrtb_ext.BidderName) HTTPRouterHandler { @@ -80,7 +79,7 @@ type cookieSyncEndpoint struct { config *config.Configuration privacyConfig usersyncPrivacyConfig metrics metrics.MetricsEngine - pbsAnalytics analyticsConf.Runner + pbsAnalytics analytics.Runner accountsFetcher stored_requests.AccountFetcher } diff --git a/endpoints/events/event.go b/endpoints/events/event.go index 5f9f9de06e8..b7b12506bee 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -13,7 +13,6 @@ import ( "github.com/julienschmidt/httprouter" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" - config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/metrics" @@ -42,13 +41,13 @@ const integrationParamMaxLength = 64 type eventEndpoint struct { Accounts stored_requests.AccountFetcher - Analytics config2.Runner + Analytics analytics.Runner Cfg *config.Configuration TrackingPixel *httputil.Pixel MetricsEngine metrics.MetricsEngine } -func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics config2.Runner, me metrics.MetricsEngine) httprouter.Handle { +func NewEventEndpoint(cfg *config.Configuration, accounts stored_requests.AccountFetcher, analytics analytics.Runner, me metrics.MetricsEngine) httprouter.Handle { ee := &eventEndpoint{ Accounts: accounts, Analytics: analytics, diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index 7f13c6a4fa5..d0533bfea12 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -17,7 +17,6 @@ import ( "github.com/julienschmidt/httprouter" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" - config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/hooks/hookexecution" "github.com/prebid/prebid-server/ortb" "github.com/prebid/prebid-server/util/uuidutil" @@ -64,7 +63,7 @@ func NewAmpEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - analyticsRunner config2.Runner, + analyticsRunner analytics.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 9911f76a56a..44037266e2a 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -1641,7 +1641,7 @@ type mockLogger struct { auctionObject *analytics.AuctionObject } -func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) analyticsConf.Runner { +func newMockLogger(ao *analytics.AmpObject, aucObj *analytics.AuctionObject) analytics.Runner { return &mockLogger{ ampObject: ao, auctionObject: aucObj, diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index c66c99662a0..cb0b233ba27 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -25,7 +25,6 @@ import ( nativeRequests "github.com/prebid/openrtb/v19/native1/request" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" - analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/bidadjustment" "github.com/prebid/prebid-server/hooks" "github.com/prebid/prebid-server/ortb" @@ -86,7 +85,7 @@ func NewEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, metricsEngine metrics.MetricsEngine, - analyticsRunner analyticsConf.Runner, + analyticsRunner analytics.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, @@ -136,7 +135,7 @@ type endpointDeps struct { accounts stored_requests.AccountFetcher cfg *config.Configuration metricsEngine metrics.MetricsEngine - analytics analyticsConf.Runner + analytics analytics.Runner disabledBidders map[string]string defaultRequest bool defReqJSON []byte diff --git a/endpoints/openrtb2/test_utils.go b/endpoints/openrtb2/test_utils.go index ebd949bfc2c..13d9419eee3 100644 --- a/endpoints/openrtb2/test_utils.go +++ b/endpoints/openrtb2/test_utils.go @@ -19,6 +19,7 @@ import ( "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/openrtb/v19/openrtb3" "github.com/prebid/prebid-server/adapters" + "github.com/prebid/prebid-server/analytics" analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/currency" @@ -1289,7 +1290,7 @@ func buildTestEndpoint(test testCase, cfg *config.Configuration) (httprouter.Han planBuilder = hooks.EmptyPlanBuilder{} } - var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analyticsConf.Runner, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) + var endpointBuilder func(uuidutil.UUIDGenerator, exchange.Exchange, openrtb_ext.BidderParamValidator, stored_requests.Fetcher, stored_requests.AccountFetcher, *config.Configuration, metrics.MetricsEngine, analytics.Runner, map[string]string, []byte, map[string]openrtb_ext.BidderName, stored_requests.Fetcher, hooks.ExecutionPlanBuilder, *exchange.TmaxAdjustmentsPreprocessed) (httprouter.Handle, error) switch test.endpointType { case AMP_ENDPOINT: diff --git a/endpoints/openrtb2/video_auction.go b/endpoints/openrtb2/video_auction.go index 942ce93c709..97f1c780721 100644 --- a/endpoints/openrtb2/video_auction.go +++ b/endpoints/openrtb2/video_auction.go @@ -26,7 +26,6 @@ import ( accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" @@ -53,7 +52,7 @@ func NewVideoEndpoint( accounts stored_requests.AccountFetcher, cfg *config.Configuration, met metrics.MetricsEngine, - analyticsRunner analyticsConf.Runner, + analyticsRunner analytics.Runner, disabledBidders map[string]string, defReqJSON []byte, bidderMap map[string]openrtb_ext.BidderName, diff --git a/endpoints/setuid.go b/endpoints/setuid.go index 1b8ed50f42e..4b8cb2c71fa 100644 --- a/endpoints/setuid.go +++ b/endpoints/setuid.go @@ -14,7 +14,6 @@ import ( gppConstants "github.com/prebid/go-gpp/constants" accountService "github.com/prebid/prebid-server/account" "github.com/prebid/prebid-server/analytics" - config2 "github.com/prebid/prebid-server/analytics/config" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/gdpr" @@ -37,7 +36,7 @@ const ( const uidCookieName = "uids" -func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, analyticsRunner config2.Runner, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { +func NewSetUIDEndpoint(cfg *config.Configuration, syncersByBidder map[string]usersync.Syncer, gdprPermsBuilder gdpr.PermissionsBuilder, tcf2CfgBuilder gdpr.TCF2ConfigBuilder, analyticsRunner analytics.Runner, accountsFetcher stored_requests.AccountFetcher, metricsEngine metrics.MetricsEngine) httprouter.Handle { encoder := usersync.Base64Encoder{} decoder := usersync.Base64Decoder{} diff --git a/endpoints/setuid_test.go b/endpoints/setuid_test.go index 8905f26e8db..dcbe40ffcaf 100644 --- a/endpoints/setuid_test.go +++ b/endpoints/setuid_test.go @@ -1347,7 +1347,7 @@ func makeRequest(uri string, existingSyncs map[string]string) *http.Request { return request } -func doRequest(req *http.Request, analytics analyticsConfig.Runner, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool) *httptest.ResponseRecorder { +func doRequest(req *http.Request, analytics analytics.Runner, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool) *httptest.ResponseRecorder { cfg := config.Configuration{ AccountRequired: cfgAccountRequired, BlacklistedAcctMap: map[string]bool{ From 5e1f87aaa3e753082bc0d885008497f13f73ef61 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Mon, 11 Sep 2023 17:53:06 -0700 Subject: [PATCH 11/15] Merge fixes --- analytics/config/config_test.go | 8 +++----- endpoints/events/event.go | 7 +------ endpoints/openrtb2/amp_auction.go | 1 - endpoints/openrtb2/auction.go | 1 - 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/analytics/config/config_test.go b/analytics/config/config_test.go index 5c7a6aeb37c..42fc4344bbc 100644 --- a/analytics/config/config_test.go +++ b/analytics/config/config_test.go @@ -143,8 +143,7 @@ func TestSampleModuleActivitiesAllowed(t *testing.T) { var count int am := initAnalytics(&count) - acAllowed, err := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", true)) - assert.NoError(t, err, "unexpected error returned") + acAllowed := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", true)) ao := &analytics.AuctionObject{ Status: http.StatusOK, @@ -177,8 +176,7 @@ func TestSampleModuleActivitiesDenied(t *testing.T) { var count int am := initAnalytics(&count) - acDenied, err := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", false)) - assert.NoError(t, err, "unexpected error returned") + acDenied := privacy.NewActivityControl(getDefaultActivityConfig("sampleModule", false)) ao := &analytics.AuctionObject{ Status: http.StatusOK, @@ -209,7 +207,7 @@ func TestSampleModuleActivitiesDenied(t *testing.T) { func getDefaultActivityConfig(componentName string, allow bool) *config.AccountPrivacy { return &config.AccountPrivacy{ - AllowActivities: config.AllowActivities{ + AllowActivities: &config.AllowActivities{ ReportAnalytics: config.Activity{ Default: ptrutil.ToPtr(true), Rules: []config.ActivityRule{ diff --git a/endpoints/events/event.go b/endpoints/events/event.go index b7b12506bee..6ee760e44ba 100644 --- a/endpoints/events/event.go +++ b/endpoints/events/event.go @@ -115,12 +115,7 @@ func (e *eventEndpoint) Handle(w http.ResponseWriter, r *http.Request, _ httprou return } - activities, activitiesErr := privacy.NewActivityControl(account.Privacy) - if activitiesErr != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(fmt.Sprintf("Activity evaluation failed: '%s' ", activitiesErr))) - return - } + activities := privacy.NewActivityControl(&account.Privacy) // handle notification event e.Analytics.LogNotificationEventObject(&analytics.NotificationEvent{ diff --git a/endpoints/openrtb2/amp_auction.go b/endpoints/openrtb2/amp_auction.go index 9754fb6e4f8..c3136a5d2fd 100644 --- a/endpoints/openrtb2/amp_auction.go +++ b/endpoints/openrtb2/amp_auction.go @@ -11,7 +11,6 @@ import ( "strings" "time" - "github.com/buger/jsonparser" "github.com/golang/glog" "github.com/julienschmidt/httprouter" diff --git a/endpoints/openrtb2/auction.go b/endpoints/openrtb2/auction.go index fdadc16ca1d..66404ca7277 100644 --- a/endpoints/openrtb2/auction.go +++ b/endpoints/openrtb2/auction.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/prebid/prebid-server/privacy" "io" "net/http" "net/url" From d254ca33c0ba2ed9111ee55fc284f8448e451e38 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Mon, 11 Sep 2023 18:32:45 -0700 Subject: [PATCH 12/15] Package rename --- .../{config/config.go => build/build.go} | 2 +- .../config_test.go => build/build_test.go} | 4 +- endpoints/openrtb2/amp_auction_test.go | 26 ++++---- endpoints/openrtb2/auction_benchmark_test.go | 4 +- endpoints/openrtb2/auction_test.go | 66 +++++++++---------- endpoints/openrtb2/test_utils.go | 4 +- endpoints/openrtb2/video_auction_test.go | 10 +-- endpoints/setuid_test.go | 6 +- router/router.go | 4 +- 9 files changed, 63 insertions(+), 63 deletions(-) rename analytics/{config/config.go => build/build.go} (99%) rename analytics/{config/config_test.go => build/build_test.go} (99%) diff --git a/analytics/config/config.go b/analytics/build/build.go similarity index 99% rename from analytics/config/config.go rename to analytics/build/build.go index cd11ffe93ac..5dd53e8bcf5 100644 --- a/analytics/config/config.go +++ b/analytics/build/build.go @@ -1,4 +1,4 @@ -package config +package build import ( "github.com/benbjohnson/clock" diff --git a/analytics/config/config_test.go b/analytics/build/build_test.go similarity index 99% rename from analytics/config/config_test.go rename to analytics/build/build_test.go index 42fc4344bbc..dbd129a7afd 100644 --- a/analytics/config/config_test.go +++ b/analytics/build/build_test.go @@ -1,12 +1,12 @@ -package config +package build import ( + "github.com/prebid/prebid-server/analytics" "net/http" "os" "testing" "github.com/prebid/openrtb/v19/openrtb2" - "github.com/prebid/prebid-server/analytics" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/privacy" "github.com/prebid/prebid-server/util/ptrutil" diff --git a/endpoints/openrtb2/amp_auction_test.go b/endpoints/openrtb2/amp_auction_test.go index 44037266e2a..1a93315e9b0 100644 --- a/endpoints/openrtb2/amp_auction_test.go +++ b/endpoints/openrtb2/amp_auction_test.go @@ -20,7 +20,7 @@ import ( "github.com/prebid/prebid-server/amp" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" @@ -211,7 +211,7 @@ func TestAMPPageInfo(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -315,7 +315,7 @@ func TestGDPRConsent(t *testing.T) { GDPR: config.GDPR{Enabled: true}, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -739,7 +739,7 @@ func TestCCPAConsent(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -853,7 +853,7 @@ func TestConsentWarnings(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -952,7 +952,7 @@ func TestNewAndLegacyConsentBothProvided(t *testing.T) { GDPR: config.GDPR{Enabled: true}, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1007,7 +1007,7 @@ func TestAMPSiteExt(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), nil, nil, openrtb_ext.BuildBidderMap(), @@ -1050,7 +1050,7 @@ func TestAmpBadRequests(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1084,7 +1084,7 @@ func TestAmpDebug(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1220,7 +1220,7 @@ func TestQueryParamOverrides(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1378,7 +1378,7 @@ func (s formatOverrideSpec) execute(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1972,7 +1972,7 @@ func TestAmpAuctionResponseHeaders(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2008,7 +2008,7 @@ func TestRequestWithTargeting(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), nil, nil, openrtb_ext.BuildBidderMap(), diff --git a/endpoints/openrtb2/auction_benchmark_test.go b/endpoints/openrtb2/auction_benchmark_test.go index d2971691fdb..133b46591eb 100644 --- a/endpoints/openrtb2/auction_benchmark_test.go +++ b/endpoints/openrtb2/auction_benchmark_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/currency" "github.com/prebid/prebid-server/exchange" @@ -105,7 +105,7 @@ func BenchmarkOpenrtbEndpoint(b *testing.B) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, nilMetrics, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, nil, diff --git a/endpoints/openrtb2/auction_test.go b/endpoints/openrtb2/auction_test.go index 9e505074c47..b083be5dc1c 100644 --- a/endpoints/openrtb2/auction_test.go +++ b/endpoints/openrtb2/auction_test.go @@ -23,7 +23,7 @@ import ( nativeRequests "github.com/prebid/openrtb/v19/native1/request" "github.com/prebid/openrtb/v19/openrtb2" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" @@ -449,7 +449,7 @@ func TestExplicitUserId(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -507,7 +507,7 @@ func doBadAliasRequest(t *testing.T, filename string, expectMsg string) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), disabledBidders, aliasJSON, bidderMap, @@ -562,7 +562,7 @@ func TestNilExchange(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), map[string]string{}, + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), empty_fetcher.EmptyFetcher{}, @@ -587,7 +587,7 @@ func TestNilValidator(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -613,7 +613,7 @@ func TestExchangeError(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -740,7 +740,7 @@ func TestImplicitIPsEndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -940,7 +940,7 @@ func TestImplicitDNTEndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -1177,7 +1177,7 @@ func TestStoredRequests(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1551,7 +1551,7 @@ func TestValidateRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2270,7 +2270,7 @@ func TestSetIntegrationType(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2336,7 +2336,7 @@ func TestStoredRequestGenerateUuid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2440,7 +2440,7 @@ func TestOversizedRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody) - 1)}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2479,7 +2479,7 @@ func TestRequestSizeEdgeCase(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2516,7 +2516,7 @@ func TestNoEncoding(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2601,7 +2601,7 @@ func TestContentType(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -2818,7 +2818,7 @@ func TestValidateImpExt(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(8096)}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{"disabledbidder": "The bidder 'disabledbidder' has been disabled."}, false, []byte{}, @@ -2871,7 +2871,7 @@ func TestCurrencyTrunc(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2919,7 +2919,7 @@ func TestCCPAInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -2971,7 +2971,7 @@ func TestNoSaleInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3026,7 +3026,7 @@ func TestValidateSourceTID(t *testing.T) { empty_fetcher.EmptyFetcher{}, cfg, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3071,7 +3071,7 @@ func TestSChainInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3567,7 +3567,7 @@ func TestEidPermissionsInvalid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3821,7 +3821,7 @@ func TestIOS14EndToEnd(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -3884,7 +3884,7 @@ func TestAuctionWarnings(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -3930,7 +3930,7 @@ func TestParseRequestParseImpInfoError(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(reqBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4010,7 +4010,7 @@ func TestParseGzipedRequest(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(50), Compression: config.Compression{Request: config.CompressionInfo{GZIP: false}}}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4509,7 +4509,7 @@ func TestAuctionResponseHeaders(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, []byte{}, openrtb_ext.BuildBidderMap(), @@ -4610,7 +4610,7 @@ func TestParseRequestMergeBidderParams(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4713,7 +4713,7 @@ func TestParseRequestStoredResponses(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4801,7 +4801,7 @@ func TestParseRequestStoredBidResponses(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -4838,7 +4838,7 @@ func TestValidateStoredResp(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -5651,7 +5651,7 @@ func TestParseRequestMultiBid(t *testing.T) { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: int64(len(test.givenRequestBody))}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, diff --git a/endpoints/openrtb2/test_utils.go b/endpoints/openrtb2/test_utils.go index 13d9419eee3..72538ae69b6 100644 --- a/endpoints/openrtb2/test_utils.go +++ b/endpoints/openrtb2/test_utils.go @@ -20,7 +20,7 @@ import ( "github.com/prebid/openrtb/v19/openrtb3" "github.com/prebid/prebid-server/adapters" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/currency" "github.com/prebid/prebid-server/errortypes" @@ -1307,7 +1307,7 @@ func buildTestEndpoint(test testCase, cfg *config.Configuration) (httprouter.Han accountFetcher, cfg, met, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), disabledBidders, []byte(test.Config.AliasJSON), bidderMap, diff --git a/endpoints/openrtb2/video_auction_test.go b/endpoints/openrtb2/video_auction_test.go index bf0829c537a..7d5413c33e9 100644 --- a/endpoints/openrtb2/video_auction_test.go +++ b/endpoints/openrtb2/video_auction_test.go @@ -12,7 +12,7 @@ import ( "testing" "github.com/prebid/prebid-server/analytics" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/exchange" @@ -1263,7 +1263,7 @@ func mockDeps(t *testing.T, ex *mockExchangeVideo) *endpointDeps { &mockAccountFetcher{data: mockVideoAccountData}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1297,7 +1297,7 @@ func mockDepsInvalidPrivacy(t *testing.T, ex *mockExchangeVideo) *endpointDeps { }, }, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1321,7 +1321,7 @@ func mockDepsAppendBidderNames(t *testing.T, ex *mockExchangeAppendBidderNames) empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, @@ -1347,7 +1347,7 @@ func mockDepsNoBids(t *testing.T, ex *mockExchangeVideoNoBids) *endpointDeps { empty_fetcher.EmptyFetcher{}, &config.Configuration{MaxRequestSize: maxSize}, &metricsConfig.NilMetricsEngine{}, - analyticsConf.New(&config.Analytics{}), + analyticsBuild.New(&config.Analytics{}), map[string]string{}, false, []byte{}, diff --git a/endpoints/setuid_test.go b/endpoints/setuid_test.go index dcbe40ffcaf..25297918f82 100644 --- a/endpoints/setuid_test.go +++ b/endpoints/setuid_test.go @@ -12,6 +12,7 @@ import ( "time" "github.com/prebid/prebid-server/analytics" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/errortypes" "github.com/prebid/prebid-server/gdpr" @@ -21,7 +22,6 @@ import ( "github.com/prebid/prebid-server/usersync" "github.com/stretchr/testify/assert" - analyticsConfig "github.com/prebid/prebid-server/analytics/config" metricsConf "github.com/prebid/prebid-server/metrics/config" ) @@ -308,7 +308,7 @@ func TestSetUIDEndpoint(t *testing.T) { }, } - analytics := analyticsConfig.New(&config.Analytics{}) + analytics := analyticsBuild.New(&config.Analytics{}) metrics := &metricsConf.NilMetricsEngine{} for _, test := range testCases { @@ -1209,7 +1209,7 @@ func TestOptedOut(t *testing.T) { cookie.SetOptOut(true) addCookie(request, cookie) syncersBidderNameToKey := map[string]string{"pubmatic": "pubmatic"} - analytics := analyticsConfig.New(&config.Analytics{}) + analytics := analyticsBuild.New(&config.Analytics{}) metrics := &metricsConf.NilMetricsEngine{} response := doRequest(request, analytics, metrics, syncersBidderNameToKey, true, false, false, false) diff --git a/router/router.go b/router/router.go index 3c1ffc5450b..85782721b9e 100644 --- a/router/router.go +++ b/router/router.go @@ -10,7 +10,7 @@ import ( "strings" "time" - analyticsConf "github.com/prebid/prebid-server/analytics/config" + analyticsBuild "github.com/prebid/prebid-server/analytics/build" "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/currency" "github.com/prebid/prebid-server/endpoints" @@ -191,7 +191,7 @@ func New(cfg *config.Configuration, rateConvertor *currency.RateConverter) (r *R // todo(zachbadgett): better shutdown r.Shutdown = shutdown - analyticsRunner := analyticsConf.New(&cfg.Analytics) + analyticsRunner := analyticsBuild.New(&cfg.Analytics) paramsValidator, err := openrtb_ext.NewBidderParamsValidator(schemaDirectory) if err != nil { From dc3daa90854b6b78b9a3ad6d32f56bc340e6303d Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Tue, 12 Sep 2023 11:34:13 -0700 Subject: [PATCH 13/15] Code clean up --- analytics/build/build.go | 20 ++++++++------------ analytics/core.go | 6 ++---- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/analytics/build/build.go b/analytics/build/build.go index 5dd53e8bcf5..5bea5b17192 100644 --- a/analytics/build/build.go +++ b/analytics/build/build.go @@ -46,9 +46,8 @@ type enabledAnalytics map[string]analytics.Module func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject, ac privacy.ActivityControl) { for name, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) - if reportAnalyticsActivityAllowed { + component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + if ac.Allow(privacy.ActivityReportAnalytics, component) { module.LogAuctionObject(ao) } } @@ -56,9 +55,8 @@ func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject, ac priv func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject, ac privacy.ActivityControl) { for name, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) - if reportAnalyticsActivityAllowed { + component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + if ac.Allow(privacy.ActivityReportAnalytics, component) { module.LogVideoObject(vo) } } @@ -78,9 +76,8 @@ func (ea enabledAnalytics) LogSetUIDObject(so *analytics.SetUIDObject) { func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject, ac privacy.ActivityControl) { for name, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) - if reportAnalyticsActivityAllowed { + component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + if ac.Allow(privacy.ActivityReportAnalytics, component) { module.LogAmpObject(ao) } } @@ -88,9 +85,8 @@ func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject, ac privacy.Acti func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent, ac privacy.ActivityControl) { for name, module := range ea { - scopedName := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - reportAnalyticsActivityAllowed := ac.Allow(privacy.ActivityReportAnalytics, scopedName) - if reportAnalyticsActivityAllowed { + component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} + if ac.Allow(privacy.ActivityReportAnalytics, component) { module.LogNotificationEventObject(ne) } } diff --git a/analytics/core.go b/analytics/core.go index 2e58c300492..0279ae83868 100644 --- a/analytics/core.go +++ b/analytics/core.go @@ -7,7 +7,6 @@ import ( "github.com/prebid/prebid-server/config" "github.com/prebid/prebid-server/hooks/hookexecution" "github.com/prebid/prebid-server/openrtb_ext" - "github.com/prebid/prebid-server/privacy" ) // Module must be implemented by analytics modules to extract the required information and logging @@ -89,7 +88,6 @@ type UsersyncInfo struct { // NotificationEvent object of a transaction at /event type NotificationEvent struct { - Request *EventRequest `json:"request"` - Account *config.Account `json:"account"` - ActivityControl privacy.ActivityControl + Request *EventRequest `json:"request"` + Account *config.Account `json:"account"` } From 758033a86dc155467d4509504500650e450fd6ad Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Wed, 13 Sep 2023 11:31:12 -0700 Subject: [PATCH 14/15] Merge fixes --- analytics/build/build.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analytics/build/build.go b/analytics/build/build.go index 5bea5b17192..6fb48705981 100644 --- a/analytics/build/build.go +++ b/analytics/build/build.go @@ -47,7 +47,7 @@ type enabledAnalytics map[string]analytics.Module func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject, ac privacy.ActivityControl) { for name, module := range ea { component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - if ac.Allow(privacy.ActivityReportAnalytics, component) { + if ac.Allow(privacy.ActivityReportAnalytics, component, privacy.ActivityRequest{}) { module.LogAuctionObject(ao) } } @@ -56,7 +56,7 @@ func (ea enabledAnalytics) LogAuctionObject(ao *analytics.AuctionObject, ac priv func (ea enabledAnalytics) LogVideoObject(vo *analytics.VideoObject, ac privacy.ActivityControl) { for name, module := range ea { component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - if ac.Allow(privacy.ActivityReportAnalytics, component) { + if ac.Allow(privacy.ActivityReportAnalytics, component, privacy.ActivityRequest{}) { module.LogVideoObject(vo) } } @@ -77,7 +77,7 @@ func (ea enabledAnalytics) LogSetUIDObject(so *analytics.SetUIDObject) { func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject, ac privacy.ActivityControl) { for name, module := range ea { component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - if ac.Allow(privacy.ActivityReportAnalytics, component) { + if ac.Allow(privacy.ActivityReportAnalytics, component, privacy.ActivityRequest{}) { module.LogAmpObject(ao) } } @@ -86,7 +86,7 @@ func (ea enabledAnalytics) LogAmpObject(ao *analytics.AmpObject, ac privacy.Acti func (ea enabledAnalytics) LogNotificationEventObject(ne *analytics.NotificationEvent, ac privacy.ActivityControl) { for name, module := range ea { component := privacy.Component{Type: privacy.ComponentTypeAnalytics, Name: name} - if ac.Allow(privacy.ActivityReportAnalytics, component) { + if ac.Allow(privacy.ActivityReportAnalytics, component, privacy.ActivityRequest{}) { module.LogNotificationEventObject(ne) } } From c09f523ca7fe88034da36c2ddd26184a5c4cc568 Mon Sep 17 00:00:00 2001 From: VeronikaSolovei9 Date: Sun, 24 Sep 2023 15:50:29 -0700 Subject: [PATCH 15/15] Merge fixes --- endpoints/setuid_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/endpoints/setuid_test.go b/endpoints/setuid_test.go index 58705a1b75b..501b1fa78d2 100644 --- a/endpoints/setuid_test.go +++ b/endpoints/setuid_test.go @@ -362,7 +362,7 @@ func TestSetUIDEndpoint(t *testing.T) { func TestSetUIDPriorityEjection(t *testing.T) { decoder := usersync.Base64Decoder{} - analytics := analyticsConf.NewPBSAnalytics(&config.Analytics{}) + analytics := analyticsBuild.New(&config.Analytics{}) syncersByBidder := map[string]string{ "pubmatic": "pubmatic", "syncer1": "syncer1", @@ -1546,7 +1546,7 @@ func makeRequest(uri string, existingSyncs map[string]string) *http.Request { return request } -func doRequest(req *http.Request, analytics analytics.PBSAnalyticsModule, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool, maxCookieSize int, priorityGroups [][]string) *httptest.ResponseRecorder { +func doRequest(req *http.Request, analytics analytics.Runner, metrics metrics.MetricsEngine, syncersBidderNameToKey map[string]string, gdprAllowsHostCookies, gdprReturnsError, gdprReturnsMalformedError, cfgAccountRequired bool, maxCookieSize int, priorityGroups [][]string) *httptest.ResponseRecorder { cfg := config.Configuration{ AccountRequired: cfgAccountRequired, BlacklistedAcctMap: map[string]bool{