sojourn 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +29 -17
- data/lib/sojourn/request.rb +2 -1
- data/lib/sojourn/version.rb +1 -1
- data/spec/mocks/request.rb +1 -1
- data/spec/tracker_spec.rb +15 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f2ae69a242be094ed09f87d8721b0b12c7369a4
|
4
|
+
data.tar.gz: 16deb25d1a1598c08cd96162a59ec25a344fde88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99a18bf20addc6f178c68b9fc96a990c512ef6c1839c54755dc523327c77984dafedff591a122da996e536e030de6e247800f3643f00b9425c937c22770d7788
|
7
|
+
data.tar.gz: dc459a98a2a177b53aacebfd400b37853ad61c6da727ed48713884d1f7960c90146e7c362211391a551472aed00389038204920da5724ce5f9f2cc7d0ad7618b
|
data/README.md
CHANGED
@@ -11,16 +11,22 @@ Simple source & event tracking for Rails. This gem automatically tracks *sojourn
|
|
11
11
|
|
12
12
|
## How It Works
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
Whenever a new visitor ("sojourner") arrives to the site, an event is tracked containing
|
15
|
+
basic data about their browser and where they came from. Similar events are also tracked
|
16
|
+
whenever a user logs in, logs out, or visits again from an external site. In addition,
|
17
|
+
you can track a custom event anytime a visitor does something of interest to you.
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
+
Ultimately, rather than storing parts of the data in separate tables, **all data is
|
20
|
+
tracked in the form of events.** Yep, events all the way down. (See 'Why Events?' below
|
21
|
+
for the reasoning behind this.)
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
Sojourn assigns each "sojourner" a UUID, which is tracked across requests. All events are
|
24
|
+
associated with this UUID and with the current user's ID (if logged-in). The current
|
25
|
+
request is also assigned a UUID (which defaults to the `X-Request-ID` header).
|
23
26
|
|
27
|
+
Events consist of an event name (defining a collection of events), a session UUID,
|
28
|
+
and a set of properties (key-value data) which includes information about the request.
|
29
|
+
In the PostgreSQL implementation, we use a `JSONB` column to store the key-value data.
|
24
30
|
|
25
31
|
## Usage
|
26
32
|
|
@@ -28,17 +34,16 @@ be queried separately and may have many events. See 'Usage' below for the detail
|
|
28
34
|
# Track a custom event (highly encouraged!):
|
29
35
|
sojourn.track! 'clicked call-to-action', plan_choice: 'enterprise'
|
30
36
|
|
31
|
-
# If you don't have access to a controller context (i.e. the event is not occurring during a web
|
32
|
-
# request), you can still track a raw event like this:
|
33
|
-
|
34
|
-
Sojourn.track_raw_event! 'subscription expired', plan: 'enterprise', customer_id: 'xyb123'
|
35
|
-
|
36
37
|
# Read events using ActiveRecord
|
37
38
|
e = Sojourn::Event.last
|
38
39
|
e.name # event name (e.g. 'clicked call-to-action')
|
39
40
|
e.sojourner_uuid # uuid tracked across requests, stored in cookie
|
40
41
|
e.user # User or nil
|
41
42
|
e.properties # key-value hash (e.g. "{ plan_choice: 'enterprise' }")
|
43
|
+
|
44
|
+
# If you don't have access to a controller context (i.e. the event is not occurring during a web
|
45
|
+
# request), you can still track a raw event like this:
|
46
|
+
Sojourn.track_raw_event! 'subscription expired', plan: 'enterprise', customer_id: 'xyb123'
|
42
47
|
```
|
43
48
|
|
44
49
|
## Default Events
|
@@ -51,7 +56,7 @@ The three built-in events are as follows:
|
|
51
56
|
'!logged_out' # The sojourner has logged-out.
|
52
57
|
```
|
53
58
|
|
54
|
-
A `'!sojourning'` event takes place whenever any of the following is
|
59
|
+
A `'!sojourning'` event takes place whenever any of the following conditions is met:
|
55
60
|
|
56
61
|
* The sojourner has never been seen before (i.e. direct traffic of some kind)
|
57
62
|
* The referer is from an external source (i.e. not the current `request.host`)
|
@@ -116,10 +121,17 @@ To install migrations and the `sojourn.rb` initializer, execute:
|
|
116
121
|
The idea is that, at a certain scale, this kind of tracking should be dumped directly into
|
117
122
|
append-only logs (or an event bus / messaging queue) for asynchronous processing.
|
118
123
|
|
119
|
-
This is made easier when everything can be represented, at a basic level, as discrete
|
120
|
-
In theory, it works with just about any data store, and makes for easy time series and
|
121
|
-
analysis. I'd like to move away from ActiveRecord at some point and open up the door for
|
122
|
-
|
124
|
+
This is made easier when everything can be represented, at a basic level, as a set of discrete
|
125
|
+
events. In theory, it works with just about any data store, and makes for easy time series and
|
126
|
+
funnel analysis. I'd like to move away from ActiveRecord at some point and open up the door for
|
127
|
+
other, more horizontally scalable data backends, ideally with a focus on streaming data (e.g.
|
128
|
+
Kafka combined with Samza or Storm).
|
129
|
+
|
130
|
+
An added benfit of storing the start of each visit as its own event in the series (i.e. the
|
131
|
+
built-in `!sojourning` event) is that you can change the length of your visit window after
|
132
|
+
the fact and re-run your analysis. The more traditional approach is to tag each event with
|
133
|
+
some kind of incrementing visit ID, which forces you into defining what a "unique visit"
|
134
|
+
means for your product before you've even collected any data.
|
123
135
|
|
124
136
|
## Current Limitations (i.e. the 'todo' list)
|
125
137
|
|
data/lib/sojourn/request.rb
CHANGED
data/lib/sojourn/version.rb
CHANGED
data/spec/mocks/request.rb
CHANGED
data/spec/tracker_spec.rb
CHANGED
@@ -21,17 +21,12 @@ module Sojourn
|
|
21
21
|
its(:user_id) { is_expected.to eq(user.id) }
|
22
22
|
its(:name) { is_expected.to eq(event_name) }
|
23
23
|
|
24
|
-
describe 'request' do
|
25
|
-
subject { Event.last.properties[:request] }
|
26
|
-
|
27
|
-
its([:params]) { is_expected.to eq('filtered' => true) }
|
28
|
-
its([:method]) { is_expected.to eq('get') }
|
29
|
-
end
|
30
|
-
|
31
24
|
describe 'properties' do
|
32
25
|
subject { Event.last.properties }
|
33
26
|
|
34
27
|
its(:keys) { is_expected.to eq(%w(request browser bar)) }
|
28
|
+
its([:request, :params]) { is_expected.to eq('filtered' => true) }
|
29
|
+
its([:request, :method]) { is_expected.to eq('get') }
|
35
30
|
its([:browser, :name]) { is_expected.to eq('Chrome') }
|
36
31
|
end
|
37
32
|
end
|
@@ -73,6 +68,19 @@ module Sojourn
|
|
73
68
|
|
74
69
|
its(:name) { is_expected.to eq('!logged_out') }
|
75
70
|
end
|
71
|
+
|
72
|
+
context 'when user agent not present' do
|
73
|
+
let(:request) { Mocks::Request.new(user_agent: nil) }
|
74
|
+
|
75
|
+
its(:name) { is_expected.to eq('!sojourning') }
|
76
|
+
|
77
|
+
describe 'properties' do
|
78
|
+
subject { Event.last.properties }
|
79
|
+
|
80
|
+
its([:browser, :known]) { is_expected.to be(false) }
|
81
|
+
its([:browser, :name]) { is_expected.to be_nil }
|
82
|
+
end
|
83
|
+
end
|
76
84
|
end
|
77
85
|
|
78
86
|
describe 'update_session!' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sojourn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Smudge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|