Source code for eventtracking.backends.segment
"""Event tracking backend that sends events to segment.com"""
from six.moves.urllib.parse import urlunsplit
try:
import analytics
except ImportError:
analytics = None
[docs]class SegmentBackend:
"""
Send events to segment.com
It is assumed that other code elsewhere initializes the segment.com API and makes calls to analytics.identify.
Requires all emitted events to have the following structure (at a minimum)::
{
'name': 'something',
'context': {
'user_id': 10,
}
}
Additionally, the following fields can optionally be defined::
{
'context': {
'agent': "your user-agent string",
'client_id': "your google analytics client id",
'host': "your hostname",
'ip': "your IP address",
'page': "your page",
'path': "your path",
'referer': "your referrer",
}
}
The 'page', 'path' and 'referer' are sent to Segment as "page" information. If the 'page' is absent but the 'host'
and 'path' are present, these are used to create a URL value to substitute for the 'page' value.
Note that although some parts of the event are lifted out to pass explicitly into the Segment.com API, the entire
event is sent as the payload to segment.com, which includes all context, data and other fields in the event.
"""
[docs] def send(self, event):
"""Use the segment.com python API to send the event to segment.com"""
if analytics is None:
return
context = event.get('context', {})
user_id = context.get('user_id')
name = event.get('name')
if name is None or user_id is None:
return
segment_context = {}
ga_client_id = context.get('client_id')
if ga_client_id is not None:
segment_context['Google Analytics'] = {
'clientId': ga_client_id
}
ip_address = context.get('ip')
if ip_address is not None:
segment_context['ip'] = ip_address
user_agent = context.get('agent')
if user_agent is not None:
segment_context['userAgent'] = user_agent
path = context.get('path')
referer = context.get('referer')
page = context.get('page')
if path and not page:
# Try to put together a url from host and path, hardcoding the schema.
# (Segment doesn't care about the schema for GA, but will extract the host and path from the url.)
host = context.get('host')
if host:
parts = ("https", host, path, "", "")
page = urlunsplit(parts)
if path is not None or referer is not None or page is not None:
segment_context['page'] = {}
if path is not None:
segment_context['page']['path'] = path
if referer is not None:
segment_context['page']['referrer'] = referer
if page is not None:
segment_context['page']['url'] = page
analytics.track(
user_id,
name,
event,
context=segment_context
)