Documentation
¶
Overview ¶
Package sessioncolumns provides column implementations for session data tracking.
Package sessioncolumns provides column implementations for session data tracking.
Index ¶
- Variables
- func IfHasQueryParam(param string, smt SessionSourceMediumTerm) func(qp url.Values) (SessionSourceMediumTerm, bool)
- func IfQueryParamEquals(param, value string, smt SessionSourceMediumTerm) func(qp url.Values) (SessionSourceMediumTerm, bool)
- func NewFromRefererExactMatchCondition(exactMatch string, smt func(qp url.Values) SessionSourceMediumTerm) refererCondition
- func NewFromRefererRegexCondition(regex *regexp.Regexp, smt func(qp url.Values) SessionSourceMediumTerm) refererCondition
- func WriteSessionSourceMediumTerm(event *schema.Event, sourceMediumTerm SessionSourceMediumTerm)
- type SessionSourceMediumTerm
- type SourceMediumTermDetector
- func NewAISourceMediumTermDetector() (SourceMediumTermDetector, error)
- func NewCompositeSourceMediumTermDetector(detectors ...SourceMediumTermDetector) SourceMediumTermDetector
- func NewDirectSourceMediumTermDetector() SourceMediumTermDetector
- func NewEmailSourceMediumTermDetector() (SourceMediumTermDetector, error)
- func NewGenericReferralSourceMediumTermDetector() SourceMediumTermDetector
- func NewMailRefererSourceMediumTermDetector() SourceMediumTermDetector
- func NewPageLocationParamsSourceMediumTermDetector(conditions ...func(qp url.Values) (SessionSourceMediumTerm, bool)) SourceMediumTermDetector
- func NewSearchEngineSourceMediumTermDetector() (SourceMediumTermDetector, error)
- func NewSocialsSourceMediumTermDetector() (SourceMediumTermDetector, error)
- func NewVideoSourceMediumTermDetector() (SourceMediumTermDetector, error)
Constants ¶
This section is empty.
Variables ¶
var DurationColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionDuration.ID, columns.CoreInterfaces.SessionDuration.Field, func(session *schema.Session) (any, error) { lastEventTime, ok := session.Values[columns.CoreInterfaces.SessionLastEventTime.Field.Name] if !ok { return nil, columns.NewBrokenSessionError("session last event time not found") } firstEventTime, ok := session.Values[columns.CoreInterfaces.SessionFirstEventTime.Field.Name] if !ok { return nil, columns.NewBrokenSessionError("session first event time not found") } lastEventTimeInt, ok := lastEventTime.(int64) if !ok { return nil, columns.NewBrokenSessionError("session last event time is not an int64") } firstEventTimeInt, ok := firstEventTime.(int64) if !ok { return nil, columns.NewBrokenSessionError("session first event time is not an int64") } if lastEventTimeInt < firstEventTimeInt { return nil, columns.NewBrokenSessionError("session last event time is earlier than session first event time") } return lastEventTimeInt - firstEventTimeInt, nil }, columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.SessionLastEventTime.ID, GreaterOrEqualTo: "1.0.0", }, schema.DependsOnEntry{ Interface: columns.CoreInterfaces.SessionFirstEventTime.ID, GreaterOrEqualTo: "1.0.0", }), columns.WithSessionColumnDocs( "Session Duration", "The duration of the session in seconds, calculated as the difference between the last event time and the first event time. Zero for single-event sessions.", ), )
DurationColumn is the column for the duration of a session
var FirstEventTimeColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionFirstEventTime.ID, columns.CoreInterfaces.SessionFirstEventTime.Field, func(session *schema.Session) (any, error) { if len(session.Events) == 0 { return nil, columns.NewBrokenSessionError("session has no events") } return session.Events[0].BoundHit.MustParsedRequest().ServerReceivedTime.Unix(), nil }, columns.WithSessionColumnDocs( "Session First Event Time", "The timestamp of the first event in the session. Marks the beginning of the user's session and is used as the baseline for calculating session duration.", ), )
FirstEventTimeColumn is the column for the first event time of a session
var LastEventTimeColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionLastEventTime.ID, columns.CoreInterfaces.SessionLastEventTime.Field, func(session *schema.Session) (any, error) { if len(session.Events) == 0 { return nil, columns.NewBrokenSessionError("session has no events") } return session.Events[len(session.Events)-1].BoundHit.MustParsedRequest().ServerReceivedTime.Unix(), nil }, columns.WithSessionColumnDocs( "Session Last Event Time", "The timestamp of the last event in the session. Marks the end of the user's session and is used along with first_event_time to calculate session duration.", ), )
LastEventTimeColumn is the column for the last event time of a session
var ReferrerColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionReferrer.ID, columns.CoreInterfaces.SessionReferrer.Field, func(session *schema.Session) (any, error) { if len(session.Events) == 0 { return nil, nil } firstEventReferrer, ok := session.Events[0].Values[columns.CoreInterfaces.EventPageReferrer.Field.Name] if !ok { return nil, nil } return firstEventReferrer, nil }, columns.WithSessionColumnDocs( "Session Referrer", "The referrer of the session. Collected from the first event in the session.", ), columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventPageReferrer.ID, GreaterOrEqualTo: "1.0.0", }, ), )
ReferrerColumn is the column for the referrer of a whole session
var SessionIDColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionID.ID, columns.CoreInterfaces.SessionID.Field, func(session *schema.Session) (any, error) { if len(session.Events) == 0 { return nil, fmt.Errorf("session has no events") } firstEventID, ok := session.Events[0].Values[columns.CoreInterfaces.EventID.Field.Name] if !ok { return nil, errors.New("first event doesn't have ID") } return firstEventID, nil }, columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventID.ID, GreaterOrEqualTo: "1.0.0", }, ), columns.WithSessionColumnDocs( "Session ID", "A unique identifier for the session, derived from the first event's ID in the session, used to group all events that belong to the same user session.", ), )
SessionIDColumn is the column for the session ID
var SessionMediumColumn = columns.NthEventMatchingPredicateValueColumn( columns.CoreInterfaces.SessionMedium.ID, columns.CoreInterfaces.SessionMedium.Field, 0, func(e *schema.Event) (any, error) { return ReadSessionSourceMediumTerm(e).Medium, nil }, func(e *schema.Event) bool { return true }, columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.SessionSource.ID, GreaterOrEqualTo: "1.0.0", }, ), columns.WithSessionColumnDocs( "Session Medium", "Marketing channel (e.g., organic, cpc, social, email, referral) classifying how traffic arrived. For details, see the D8A documentation on traffic attribution.", ), )
SessionMediumColumn only loads cached value computed from SessionSourceColumn, the logic is there
var SessionSourceColumn = columns.NthEventMatchingPredicateValueColumn( columns.CoreInterfaces.SessionSource.ID, columns.CoreInterfaces.SessionSource.Field, 0, func(e *schema.Event) (any, error) { sourceMediumTerm, ok := sessionSourceMediumTermDetector.Detect(e) if !ok { return nil, nil } WriteSessionSourceMediumTerm(e, sourceMediumTerm) return sourceMediumTerm.Source, nil }, func(e *schema.Event) bool { return true }, columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventPageLocation.ID, GreaterOrEqualTo: "1.0.0", }, schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventUtmSource.ID, GreaterOrEqualTo: "1.0.0", }, schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventUtmMedium.ID, GreaterOrEqualTo: "1.0.0", }, schema.DependsOnEntry{ Interface: columns.CoreInterfaces.EventUtmTerm.ID, GreaterOrEqualTo: "1.0.0", }, ), columns.WithSessionColumnDocs( "Session Source", "Traffic origin (e.g., google, facebook, direct) detected from referrer, click IDs, or UTM parameters. For details, see the D8A documentation on traffic attribution.", ), )
SessionSourceColumn is our guess on the source of the session.
var SessionTermColumn = columns.NthEventMatchingPredicateValueColumn( columns.CoreInterfaces.SessionTerm.ID, columns.CoreInterfaces.SessionTerm.Field, 0, func(e *schema.Event) (any, error) { return ReadSessionSourceMediumTerm(e).Term, nil }, func(e *schema.Event) bool { return true }, columns.WithSessionColumnDependsOn( schema.DependsOnEntry{ Interface: columns.CoreInterfaces.SessionSource.ID, GreaterOrEqualTo: "1.0.0", }, ), columns.WithSessionColumnDocs( "Session Term", "Search keyword or campaign term extracted from referrer query parameters or UTM tags. For details, see the D8A documentation on traffic attribution.", ), )
SessionTermColumn only loads cached value computed from SessionSourceColumn, the logic is there
var SplitCauseColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionSplitCause.ID, columns.CoreInterfaces.SessionSplitCause.Field, func(session *schema.Session) (any, error) { if len(session.Events) == 0 { return nil, nil } v, ok := session.Events[0].Metadata["session_split_cause"] if !ok { return nil, nil } splitCause, ok := v.(splitter.SplitCause) if !ok { logrus.Warnf("session split cause is not a splitter.SplitCause: %v", v) return nil, nil } return string(splitCause), nil }, columns.WithSessionColumnDocs( "Session Split Cause", fmt.Sprintf("The cause of the split of the session. If the session was not split, this will be null. Possible values: null, %s.", strings.Join(func() []string { values := make([]string, len(splitter.AllCauses)) for i, cause := range splitter.AllCauses { values[i] = string(cause) } return values }(), ", ")), ), )
SplitCauseColumn is the column for the split cause of a session
var TotalEventsColumn = columns.NewSimpleSessionColumn( columns.CoreInterfaces.SessionTotalEvents.ID, columns.CoreInterfaces.SessionTotalEvents.Field, func(session *schema.Session) (any, error) { return len(session.Events), nil }, columns.WithSessionColumnDocs( "Session Total Events", "The total number of events that occurred during this session. Includes all event types (page views, clicks, custom events, etc.).", ), )
TotalEventsColumn is the column for the total events of a session
Functions ¶
func IfHasQueryParam ¶ added in v0.17.0
func IfHasQueryParam(param string, smt SessionSourceMediumTerm) func(qp url.Values) (SessionSourceMediumTerm, bool)
IfHasQueryParam returns a function that checks if a query parameter is present.
func IfQueryParamEquals ¶ added in v0.17.0
func IfQueryParamEquals( param, value string, smt SessionSourceMediumTerm, ) func(qp url.Values) (SessionSourceMediumTerm, bool)
IfQueryParamEquals returns a function that checks if a query parameter equals a given value.
func NewFromRefererExactMatchCondition ¶ added in v0.17.0
func NewFromRefererExactMatchCondition( exactMatch string, smt func(qp url.Values) SessionSourceMediumTerm, ) refererCondition
NewFromRefererExactMatchCondition returns a function that checks if a referer matches a given exact match.
func NewFromRefererRegexCondition ¶ added in v0.17.0
func NewFromRefererRegexCondition( regex *regexp.Regexp, smt func(qp url.Values) SessionSourceMediumTerm, ) refererCondition
NewFromRefererRegexCondition returns a function that checks if a referer matches a given regex.
func WriteSessionSourceMediumTerm ¶ added in v0.17.0
func WriteSessionSourceMediumTerm(event *schema.Event, sourceMediumTerm SessionSourceMediumTerm)
WriteSessionSourceMediumTerm stores the session source, medium, and term in the event metadata.
Types ¶
type SessionSourceMediumTerm ¶ added in v0.17.0
SessionSourceMediumTerm is a struct that contains the source, medium, and term of a session.
func ReadSessionSourceMediumTerm ¶ added in v0.17.0
func ReadSessionSourceMediumTerm(event *schema.Event) SessionSourceMediumTerm
ReadSessionSourceMediumTerm retrieves the session source, medium, and term from event metadata.
type SourceMediumTermDetector ¶ added in v0.17.0
type SourceMediumTermDetector interface {
Detect(event *schema.Event) (SessionSourceMediumTerm, bool)
}
SourceMediumTermDetector is an interface for detecting the source, medium, and term of an event.
func NewAISourceMediumTermDetector ¶ added in v0.17.0
func NewAISourceMediumTermDetector() (SourceMediumTermDetector, error)
NewAISourceMediumTermDetector returns a new source medium term detector for ai.yaml
func NewCompositeSourceMediumTermDetector ¶ added in v0.17.0
func NewCompositeSourceMediumTermDetector(detectors ...SourceMediumTermDetector) SourceMediumTermDetector
func NewDirectSourceMediumTermDetector ¶ added in v0.17.0
func NewDirectSourceMediumTermDetector() SourceMediumTermDetector
func NewEmailSourceMediumTermDetector ¶ added in v0.17.0
func NewEmailSourceMediumTermDetector() (SourceMediumTermDetector, error)
NewEmailSourceMediumTermDetector returns a new source medium term detector for emails.yaml
func NewGenericReferralSourceMediumTermDetector ¶ added in v0.17.0
func NewGenericReferralSourceMediumTermDetector() SourceMediumTermDetector
NewGenericReferralSourceMediumTermDetector returns a new source medium term detector for generic referral.
func NewMailRefererSourceMediumTermDetector ¶ added in v0.17.0
func NewMailRefererSourceMediumTermDetector() SourceMediumTermDetector
NewMailRefererSourceMediumTermDetector returns a new source medium term detector for mail referer.
func NewPageLocationParamsSourceMediumTermDetector ¶ added in v0.17.0
func NewPageLocationParamsSourceMediumTermDetector( conditions ...func(qp url.Values) (SessionSourceMediumTerm, bool), ) SourceMediumTermDetector
func NewSearchEngineSourceMediumTermDetector ¶ added in v0.17.0
func NewSearchEngineSourceMediumTermDetector() (SourceMediumTermDetector, error)
NewSearchEngineSourceMediumTermDetector returns a new source medium term detector for search engines.
func NewSocialsSourceMediumTermDetector ¶ added in v0.17.0
func NewSocialsSourceMediumTermDetector() (SourceMediumTermDetector, error)
NewSocialsSourceMediumTermDetector returns a new source medium term detector for socials.yaml
func NewVideoSourceMediumTermDetector ¶ added in v0.17.0
func NewVideoSourceMediumTermDetector() (SourceMediumTermDetector, error)
NewVideoSourceMediumTermDetector returns a new source medium term detector for video.yaml