sessioncolumns

package
v0.18.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 8, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Overview

Package sessioncolumns provides column implementations for session data tracking.

Package sessioncolumns provides column implementations for session data tracking.

Index

Constants

This section is empty.

Variables

View Source
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

View Source
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

View Source
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

View Source
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

View Source
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

View Source
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

View Source
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.

View Source
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

View Source
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

View Source
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

type SessionSourceMediumTerm struct {
	Source string
	Medium string
	Term   string
}

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL