km-db 0.2.1 → 0.3.2
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 +7 -0
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -4
- data/Gemfile.lock +179 -20
- data/Procfile +2 -0
- data/Procfile.work +1 -0
- data/README.md +186 -0
- data/Rakefile +1 -0
- data/bin/kmdb-flush +13 -0
- data/bin/kmdb-import +13 -0
- data/bin/kmdb-partition +15 -0
- data/bin/kmdb-pool +8 -0
- data/bin/kmdb-realias +12 -0
- data/bin/kmdb-ui +6 -0
- data/bin/kmdb-work +17 -0
- data/config/amazon-rds-ca-cert.pem +260 -0
- data/config.ru +8 -0
- data/km-db.gemspec +17 -17
- data/lib/kmdb/{belongs_to_user.rb → concerns/belongs_to_user.rb} +3 -3
- data/lib/kmdb/concerns/has_properties.rb +35 -0
- data/lib/kmdb/jobs/find_files.rb +32 -0
- data/lib/kmdb/jobs/list_files.rb +37 -0
- data/lib/kmdb/jobs/locked.rb +10 -0
- data/lib/kmdb/jobs/parse_file.rb +109 -0
- data/lib/kmdb/jobs/record_batch.rb +65 -0
- data/lib/kmdb/jobs/redo_unaliasing.rb +31 -0
- data/lib/kmdb/jobs/unalias_user.rb +32 -0
- data/lib/kmdb/migrations/01_kmdb_initial.rb +78 -0
- data/lib/kmdb/migrations/02_kmdb_partitions.rb +28 -0
- data/lib/kmdb/migrations/03_kmdb_blacklist.rb +20 -0
- data/lib/kmdb/models/alias.rb +36 -0
- data/lib/kmdb/models/blacklisted_property.rb +20 -0
- data/lib/kmdb/models/custom_record.rb +53 -0
- data/lib/kmdb/models/dumpfile.rb +33 -0
- data/lib/kmdb/models/event.rb +56 -0
- data/lib/kmdb/models/event_batch.rb +72 -0
- data/lib/kmdb/models/global_uid.rb +42 -0
- data/lib/kmdb/models/ignored_user.rb +20 -0
- data/lib/kmdb/models/json_file.rb +56 -0
- data/lib/kmdb/models/key.rb +28 -0
- data/lib/kmdb/models/property.rb +44 -0
- data/lib/kmdb/models/s3_object.rb +54 -0
- data/lib/kmdb/models/user.rb +53 -0
- data/lib/kmdb/models/whitelisted_event.rb +20 -0
- data/lib/kmdb/parser.rb +4 -4
- data/lib/kmdb/redis.rb +17 -0
- data/lib/kmdb/resque.rb +38 -0
- data/lib/kmdb/s3_bucket.rb +33 -0
- data/lib/kmdb/services/partitioner.rb +65 -0
- data/lib/kmdb/version.rb +1 -1
- data/lib/kmdb.rb +31 -6
- metadata +236 -186
- data/README.markdown +0 -91
- data/bin/km_db_import +0 -36
- data/lib/kmdb/custom_record.rb +0 -54
- data/lib/kmdb/dumpfile.rb +0 -23
- data/lib/kmdb/event.rb +0 -39
- data/lib/kmdb/has_properties.rb +0 -33
- data/lib/kmdb/key.rb +0 -56
- data/lib/kmdb/migration.rb +0 -63
- data/lib/kmdb/parallel_parser.rb +0 -85
- data/lib/kmdb/property.rb +0 -33
- data/lib/kmdb/user.rb +0 -83
metadata
CHANGED
@@ -1,234 +1,284 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: km-db
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 1
|
10
|
-
version: 0.2.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.2
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
6
|
+
authors:
|
7
|
+
- Julien Letessier
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
-
none: false
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
hash: 23
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 0
|
31
|
-
- 0
|
32
|
-
version: 1.0.0
|
33
|
-
prerelease: false
|
11
|
+
date: 2015-06-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
34
14
|
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
35
20
|
type: :development
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
hash: 31
|
44
|
-
segments:
|
45
|
-
- 2
|
46
|
-
- 4
|
47
|
-
- 0
|
48
|
-
version: 2.4.0
|
49
21
|
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
50
28
|
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.4.0
|
51
34
|
type: :development
|
52
|
-
version_requirements: *id002
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 3
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
63
35
|
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.4.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
64
42
|
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
65
48
|
type: :development
|
66
|
-
version_requirements: *id003
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
|
-
requirements:
|
71
|
-
- - ">="
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
version: "0"
|
77
|
-
prerelease: false
|
78
|
-
name: json
|
79
|
-
type: :development
|
80
|
-
version_requirements: *id004
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
|
-
requirements:
|
85
|
-
- - ">="
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
hash: 3
|
88
|
-
segments:
|
89
|
-
- 0
|
90
|
-
version: "0"
|
91
49
|
prerelease: false
|
92
|
-
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
93
62
|
type: :development
|
94
|
-
version_requirements: *id005
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ">="
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
hash: 3
|
102
|
-
segments:
|
103
|
-
- 0
|
104
|
-
version: "0"
|
105
63
|
prerelease: false
|
106
|
-
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: oj
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
107
76
|
type: :runtime
|
108
|
-
version_requirements: *id006
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
|
-
requirements:
|
113
|
-
- - ">="
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
hash: 3
|
116
|
-
segments:
|
117
|
-
- 0
|
118
|
-
version: "0"
|
119
77
|
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
120
84
|
name: progressbar
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
121
90
|
type: :runtime
|
122
|
-
version_requirements: *id007
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
requirement: &id008 !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
|
-
requirements:
|
127
|
-
- - ">="
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
hash: 3
|
130
|
-
segments:
|
131
|
-
- 0
|
132
|
-
version: "0"
|
133
|
-
prerelease: false
|
134
|
-
name: parallel
|
135
|
-
type: :runtime
|
136
|
-
version_requirements: *id008
|
137
|
-
- !ruby/object:Gem::Dependency
|
138
|
-
requirement: &id009 !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
|
-
requirements:
|
141
|
-
- - ">="
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
hash: 3
|
144
|
-
segments:
|
145
|
-
- 0
|
146
|
-
version: "0"
|
147
91
|
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
148
98
|
name: andand
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
149
104
|
type: :runtime
|
150
|
-
version_requirements: *id009
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- - ~>
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
hash: 27
|
158
|
-
segments:
|
159
|
-
- 2
|
160
|
-
- 3
|
161
|
-
- 12
|
162
|
-
version: 2.3.12
|
163
105
|
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
164
112
|
name: activerecord
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '4.1'
|
165
118
|
type: :runtime
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
-
|
170
|
-
|
171
|
-
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '4.1'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: resque
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: resque-lock
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: foreman
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: fog
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: mysql2
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description:
|
196
|
+
email:
|
197
|
+
- julien.letessier@gmail.com
|
198
|
+
executables:
|
199
|
+
- kmdb-flush
|
200
|
+
- kmdb-import
|
201
|
+
- kmdb-partition
|
202
|
+
- kmdb-pool
|
203
|
+
- kmdb-realias
|
204
|
+
- kmdb-ui
|
205
|
+
- kmdb-work
|
172
206
|
extensions: []
|
173
|
-
|
174
207
|
extra_rdoc_files: []
|
175
|
-
|
176
|
-
|
208
|
+
files:
|
209
|
+
- ".gitignore"
|
210
|
+
- ".ruby-version"
|
177
211
|
- Gemfile
|
178
212
|
- Gemfile.lock
|
179
|
-
-
|
213
|
+
- Procfile
|
214
|
+
- Procfile.work
|
215
|
+
- README.md
|
180
216
|
- Rakefile
|
181
|
-
- bin/
|
217
|
+
- bin/kmdb-flush
|
218
|
+
- bin/kmdb-import
|
219
|
+
- bin/kmdb-partition
|
220
|
+
- bin/kmdb-pool
|
221
|
+
- bin/kmdb-realias
|
222
|
+
- bin/kmdb-ui
|
223
|
+
- bin/kmdb-work
|
224
|
+
- config.ru
|
225
|
+
- config/amazon-rds-ca-cert.pem
|
182
226
|
- km-db.gemspec
|
183
227
|
- lib/kmdb.rb
|
184
|
-
- lib/kmdb/belongs_to_user.rb
|
185
|
-
- lib/kmdb/
|
186
|
-
- lib/kmdb/
|
187
|
-
- lib/kmdb/
|
188
|
-
- lib/kmdb/
|
189
|
-
- lib/kmdb/
|
190
|
-
- lib/kmdb/
|
191
|
-
- lib/kmdb/
|
228
|
+
- lib/kmdb/concerns/belongs_to_user.rb
|
229
|
+
- lib/kmdb/concerns/has_properties.rb
|
230
|
+
- lib/kmdb/jobs/find_files.rb
|
231
|
+
- lib/kmdb/jobs/list_files.rb
|
232
|
+
- lib/kmdb/jobs/locked.rb
|
233
|
+
- lib/kmdb/jobs/parse_file.rb
|
234
|
+
- lib/kmdb/jobs/record_batch.rb
|
235
|
+
- lib/kmdb/jobs/redo_unaliasing.rb
|
236
|
+
- lib/kmdb/jobs/unalias_user.rb
|
237
|
+
- lib/kmdb/migrations/01_kmdb_initial.rb
|
238
|
+
- lib/kmdb/migrations/02_kmdb_partitions.rb
|
239
|
+
- lib/kmdb/migrations/03_kmdb_blacklist.rb
|
240
|
+
- lib/kmdb/models/alias.rb
|
241
|
+
- lib/kmdb/models/blacklisted_property.rb
|
242
|
+
- lib/kmdb/models/custom_record.rb
|
243
|
+
- lib/kmdb/models/dumpfile.rb
|
244
|
+
- lib/kmdb/models/event.rb
|
245
|
+
- lib/kmdb/models/event_batch.rb
|
246
|
+
- lib/kmdb/models/global_uid.rb
|
247
|
+
- lib/kmdb/models/ignored_user.rb
|
248
|
+
- lib/kmdb/models/json_file.rb
|
249
|
+
- lib/kmdb/models/key.rb
|
250
|
+
- lib/kmdb/models/property.rb
|
251
|
+
- lib/kmdb/models/s3_object.rb
|
252
|
+
- lib/kmdb/models/user.rb
|
253
|
+
- lib/kmdb/models/whitelisted_event.rb
|
192
254
|
- lib/kmdb/parser.rb
|
193
|
-
- lib/kmdb/
|
194
|
-
- lib/kmdb/
|
255
|
+
- lib/kmdb/redis.rb
|
256
|
+
- lib/kmdb/resque.rb
|
257
|
+
- lib/kmdb/s3_bucket.rb
|
258
|
+
- lib/kmdb/services/partitioner.rb
|
195
259
|
- lib/kmdb/user_error.rb
|
196
260
|
- lib/kmdb/version.rb
|
197
|
-
has_rdoc: true
|
198
261
|
homepage: https://github.com/housetrip/km-db
|
199
262
|
licenses: []
|
200
|
-
|
263
|
+
metadata: {}
|
201
264
|
post_install_message:
|
202
265
|
rdoc_options: []
|
203
|
-
|
204
|
-
require_paths:
|
266
|
+
require_paths:
|
205
267
|
- lib
|
206
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
207
|
-
|
208
|
-
requirements:
|
268
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
269
|
+
requirements:
|
209
270
|
- - ">="
|
210
|
-
- !ruby/object:Gem::Version
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
version: "0"
|
215
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
-
none: false
|
217
|
-
requirements:
|
271
|
+
- !ruby/object:Gem::Version
|
272
|
+
version: '0'
|
273
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
274
|
+
requirements:
|
218
275
|
- - ">="
|
219
|
-
- !ruby/object:Gem::Version
|
220
|
-
|
221
|
-
segments:
|
222
|
-
- 1
|
223
|
-
- 3
|
224
|
-
- 6
|
225
|
-
version: 1.3.6
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
226
278
|
requirements: []
|
227
|
-
|
228
279
|
rubyforge_project:
|
229
|
-
rubygems_version:
|
280
|
+
rubygems_version: 2.2.2
|
230
281
|
signing_key:
|
231
|
-
specification_version:
|
282
|
+
specification_version: 4
|
232
283
|
summary: Process KISSmetrics data dumps
|
233
284
|
test_files: []
|
234
|
-
|
data/README.markdown
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
The `km-db` gem should be useful to KissMetrics (KM) users.
|
2
|
-
Its aim is to efficiently process data obtained with KM's "Data Export" feature.
|
3
|
-
|
4
|
-
It is meant to :
|
5
|
-
|
6
|
-
* import KM event dumps into a SQL database (preferably MySQL / PostgreSQL)
|
7
|
-
* quickly process KM event dumps
|
8
|
-
|
9
|
-
Once imported, you can run complex queries against your visit history, for instance run multivariate analysis.
|
10
|
-
|
11
|
-
Beware though, KM data can be huge, and processing it is taxing !
|
12
|
-
|
13
|
-
|
14
|
-
Installing
|
15
|
-
----------
|
16
|
-
|
17
|
-
Add this to your Gemfile if you're using Bundler:
|
18
|
-
|
19
|
-
gem 'km-db', :git => 'git://github.com/HouseTrip/km-db.git'
|
20
|
-
|
21
|
-
|
22
|
-
Importing data
|
23
|
-
--------------
|
24
|
-
|
25
|
-
Running reports on raw logs can be less effective than running against a (relational) database.
|
26
|
-
`km-db` provides a `km_db_import` executable. Run it with:
|
27
|
-
|
28
|
-
$ bundle exec km_db_import <data-dump-directory>…
|
29
|
-
|
30
|
-
By default, you events will be imported in `test.db`, a SQLite database.
|
31
|
-
|
32
|
-
You can create `km_db.yml` or `config/km_db.yml` to have it import using another adapter, for instance:
|
33
|
-
|
34
|
-
---- km_db.yml ----
|
35
|
-
adapter: mysql2
|
36
|
-
database: km_events
|
37
|
-
user: root
|
38
|
-
|
39
|
-
Remember to add `sqlite3-ruby` or `mysql2` to your Gemfile.
|
40
|
-
|
41
|
-
|
42
|
-
Using imported data
|
43
|
-
-------------------
|
44
|
-
|
45
|
-
The `KMDB` module exposes four `ActiveRecord` classes:
|
46
|
-
`Event`, `Property`, `User` are the main domain objects.
|
47
|
-
`Key` is used to intern strings (event and property names) for performance.
|
48
|
-
|
49
|
-
### Finding events and properties
|
50
|
-
|
51
|
-
All visits during Jan. 2012:
|
52
|
-
|
53
|
-
KMDB::Event.before('2012-02-1').after('2012-01-01').named('visited site').by_date
|
54
|
-
|
55
|
-
All of a user's visit:
|
56
|
-
|
57
|
-
KMDB::User.last.events.named('visited site')
|
58
|
-
|
59
|
-
A user's referers:
|
60
|
-
|
61
|
-
KMDB::User.last.properties.named('referer').map(&:value)
|
62
|
-
|
63
|
-
Load some properties with events (uses a left join by default):
|
64
|
-
|
65
|
-
KMDB::User.last.events.with_properties('a prop', 'another prop').map(&:another_prop)
|
66
|
-
|
67
|
-
Note that many more complex queries will require building SQL queries directly.
|
68
|
-
|
69
|
-
|
70
|
-
Processing data
|
71
|
-
---------------
|
72
|
-
|
73
|
-
You don't have to import to filter your data.
|
74
|
-
|
75
|
-
The two classes you're looking for are `KMDB::Parser` and `KMDB::ParallelParser`.
|
76
|
-
The latter runs your filter task on all available CPUs, using the `parallel` gem.
|
77
|
-
|
78
|
-
The following example counts the number of *aliasing* events in all JSON files under `dumps/`:
|
79
|
-
|
80
|
-
require 'rubygems'
|
81
|
-
require 'kmdb'
|
82
|
-
|
83
|
-
counter = 0
|
84
|
-
parser = KMDB::Parser.new
|
85
|
-
parser.add_filter do |text,event|
|
86
|
-
counter += 1 if event['_p2']
|
87
|
-
end
|
88
|
-
parser.run('dumps/')
|
89
|
-
puts counter
|
90
|
-
|
91
|
-
Note that it will not work with `ParallelParser`, as the `counter` variable will be different for each process.
|
data/bin/km_db_import
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
=begin
|
3
|
-
|
4
|
-
Import KM events from the raw dumps.
|
5
|
-
|
6
|
-
=end
|
7
|
-
|
8
|
-
require 'rubygems'
|
9
|
-
require 'kmdb'
|
10
|
-
|
11
|
-
if KMDB::Event.connection.class.to_s =~ /(mysql|pgsql)/i
|
12
|
-
parser_class = KMDB::ParallelParser
|
13
|
-
else
|
14
|
-
parser_class = KMDB::Parser
|
15
|
-
end
|
16
|
-
|
17
|
-
parser = parser_class.new(:resume => 'import',
|
18
|
-
:verbose => true)
|
19
|
-
|
20
|
-
# import events by category
|
21
|
-
parser.add_filter { |text, event|
|
22
|
-
if event['_p2']
|
23
|
-
KMDB::User.alias! event['_p'], event['_p2']
|
24
|
-
elsif event['_n']
|
25
|
-
KMDB::Event.record event
|
26
|
-
else
|
27
|
-
KMDB::Property.set event
|
28
|
-
end
|
29
|
-
|
30
|
-
event
|
31
|
-
}
|
32
|
-
|
33
|
-
parser.run(ARGV) # heavy lifting here
|
34
|
-
KMDB::Event.connection.reconnect! # reconnect to database (breaks because of processes forking off)
|
35
|
-
KMDB::User.resolve_alias_chains! # detect and filter alias chains
|
36
|
-
KMDB::Key.fix_duplicates! # remove key duplicates
|
data/lib/kmdb/custom_record.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
|
3
|
-
Base class for KM data.
|
4
|
-
Connect to a secondary database to store events, users, & properties.
|
5
|
-
|
6
|
-
FIXME: the database connection is hard-coded for now.
|
7
|
-
|
8
|
-
=end
|
9
|
-
|
10
|
-
require 'active_record'
|
11
|
-
require 'erb'
|
12
|
-
require 'yaml'
|
13
|
-
require 'kmdb/migration'
|
14
|
-
|
15
|
-
|
16
|
-
module KMDB
|
17
|
-
class CustomRecord < ActiveRecord::Base
|
18
|
-
DefaultConfig = {
|
19
|
-
'adapter' => 'sqlite3',
|
20
|
-
'database' => "test.db"
|
21
|
-
}
|
22
|
-
|
23
|
-
def self.disable_index
|
24
|
-
connection.execute %Q{
|
25
|
-
ALTER TABLE `#{table_name}` DISABLE KEYS;
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.enable_index
|
30
|
-
connection.execute %Q{
|
31
|
-
ALTER TABLE `#{table_name}` ENABLE KEYS;
|
32
|
-
}
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.find_or_create(options)
|
36
|
-
find(:first, :conditions => options) || create(options)
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.connect_to_km_db!
|
40
|
-
config = DefaultConfig.dup
|
41
|
-
['km_db.yml', 'config/km_db.yml'].each do |config_path|
|
42
|
-
next unless File.exist?(config_path)
|
43
|
-
config.merge! YAML.load(ERB.new(File.open(config_path).read).result)
|
44
|
-
break
|
45
|
-
end
|
46
|
-
establish_connection(config)
|
47
|
-
|
48
|
-
unless connection.table_exists?('events')
|
49
|
-
SetupEventsDatabase.up
|
50
|
-
self.reset_column_information
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/lib/kmdb/dumpfile.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'kmdb/custom_record'
|
2
|
-
|
3
|
-
module KMDB
|
4
|
-
class Dumpfile < CustomRecord
|
5
|
-
set_table_name "dumpfiles"
|
6
|
-
|
7
|
-
validates_presence_of :offset
|
8
|
-
validates_presence_of :path
|
9
|
-
|
10
|
-
def set(offset)
|
11
|
-
update_attributes!(:offset => offset)
|
12
|
-
end
|
13
|
-
|
14
|
-
def offset
|
15
|
-
attributes['offset'] || 0
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.get(pathname, job = nil)
|
19
|
-
job ||= 'nil'
|
20
|
-
find_or_create(:path => pathname.cleanpath.to_s, :job => job)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|