appstats 0.12.2 → 0.12.4
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.
- data/Gemfile.lock +1 -1
- data/lib/appstats/entry.rb +11 -4
- data/lib/appstats/log_collector.rb +11 -0
- data/lib/appstats/logger.rb +12 -1
- data/lib/appstats/version.rb +1 -1
- data/spec/entry_spec.rb +32 -4
- data/spec/log_collector_spec.rb +73 -0
- data/spec/logger_spec.rb +36 -18
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/lib/appstats/entry.rb
CHANGED
@@ -51,13 +51,20 @@ module Appstats
|
|
51
51
|
def self.create_from_logger_string(action_and_contexts)
|
52
52
|
return false if action_and_contexts.nil? || action_and_contexts == ''
|
53
53
|
hash = Logger.entry_to_hash(action_and_contexts)
|
54
|
-
|
54
|
+
|
55
|
+
action_name = hash[:action].kind_of?(Array) ? hash[:action][0] : hash[:action]
|
56
|
+
entry = Appstats::Entry.new(:action => action_name, :raw_entry => action_and_contexts)
|
55
57
|
entry.occurred_at = Time.parse(hash[:timestamp]) unless hash[:timestamp].nil?
|
56
58
|
hash.each do |key,value|
|
57
|
-
next if key == :action
|
58
59
|
next if key == :timestamp
|
59
|
-
|
60
|
-
|
60
|
+
all_values = value.kind_of?(Array) ? value : [value]
|
61
|
+
if key == :action
|
62
|
+
all_values = all_values[1..-1]
|
63
|
+
end
|
64
|
+
all_values.each do |value|
|
65
|
+
context = Appstats::Context.create(:context_key => key, :context_value => value)
|
66
|
+
entry.contexts<< context
|
67
|
+
end
|
61
68
|
end
|
62
69
|
entry.save
|
63
70
|
entry
|
@@ -6,6 +6,7 @@ module Appstats
|
|
6
6
|
set_table_name "appstats_log_collectors"
|
7
7
|
|
8
8
|
attr_accessible :host, :filename, :status
|
9
|
+
has_many :entries, :table_name => 'appstats_entries', :foreign_key => 'appstats_log_collector_id', :order => 'action'
|
9
10
|
|
10
11
|
def local_filename
|
11
12
|
File.expand_path("#{File.dirname(__FILE__)}/../../log/appstats_remote_log_#{id}.log")
|
@@ -19,6 +20,16 @@ module Appstats
|
|
19
20
|
"#{m[1]}#{prefix}#{m[2]}"
|
20
21
|
end
|
21
22
|
|
23
|
+
def unprocess_entries
|
24
|
+
return false unless ["processed","destroyed"].include?(status)
|
25
|
+
entries.each do |entry|
|
26
|
+
entry.destroy
|
27
|
+
end
|
28
|
+
status = "downloaded"
|
29
|
+
save
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
22
33
|
def self.should_process(last_time)
|
23
34
|
return true if last_time.nil?
|
24
35
|
Time.now.day > last_time.day
|
data/lib/appstats/logger.rb
CHANGED
@@ -50,14 +50,25 @@ module Appstats
|
|
50
50
|
return hash if action_and_contexts.nil?
|
51
51
|
setup = action_and_contexts.match(/(.*?) setup\[(.*?),(.*?),(.*?)\] (.*? .*?) (.*)/)
|
52
52
|
return hash if setup.nil?
|
53
|
+
hash.delete(:action)
|
53
54
|
hash.delete(:raw_input)
|
54
55
|
full, version, section_delimiter, assign_delimiter, newline_delimiter, timestamp, input = setup.to_a
|
55
56
|
|
56
57
|
hash[:timestamp] = timestamp
|
57
58
|
input.split(section_delimiter).each do |pair|
|
58
59
|
key,value = pair.strip.split(assign_delimiter)
|
59
|
-
|
60
|
+
key_symbol = key.to_sym
|
61
|
+
if hash[key_symbol].nil?
|
62
|
+
hash[key.to_sym] = value
|
63
|
+
elsif hash[key_symbol].kind_of?(String)
|
64
|
+
hash[key.to_sym] = [ hash[key_symbol], value ]
|
65
|
+
else
|
66
|
+
all_values = hash[key_symbol]
|
67
|
+
all_values<< value
|
68
|
+
hash[key.to_sym] = all_values
|
69
|
+
end
|
60
70
|
end
|
71
|
+
hash[:action] = "UNKNOWN_ACTION" if hash[:action].nil?
|
61
72
|
hash
|
62
73
|
end
|
63
74
|
|
data/lib/appstats/version.rb
CHANGED
data/spec/entry_spec.rb
CHANGED
@@ -193,18 +193,18 @@ module Appstats
|
|
193
193
|
end
|
194
194
|
|
195
195
|
it "should understand an entry without contexts" do
|
196
|
-
entry = Entry.create_from_logger_string("0.12.
|
196
|
+
entry = Entry.create_from_logger_string("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
|
197
197
|
Entry.count.should == @before_count + 1
|
198
198
|
entry.action.should == "address_search"
|
199
|
-
entry.raw_entry.should == "0.12.
|
199
|
+
entry.raw_entry.should == "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
|
200
200
|
entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
|
201
201
|
end
|
202
202
|
|
203
203
|
it "should understand contexts" do
|
204
|
-
entry = Entry.create_from_logger_string("0.12.
|
204
|
+
entry = Entry.create_from_logger_string("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
|
205
205
|
Entry.count.should == @before_count + 1
|
206
206
|
entry.action.should == "address_filter"
|
207
|
-
entry.raw_entry.should == "0.12.
|
207
|
+
entry.raw_entry.should == "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
|
208
208
|
entry.occurred_at.should == Time.parse("2010-09-21 23:15:20")
|
209
209
|
entry.contexts.size.should == 2
|
210
210
|
entry.contexts[0].context_key = "app_name"
|
@@ -213,6 +213,34 @@ module Appstats
|
|
213
213
|
entry.contexts[1].context_value = "Live"
|
214
214
|
end
|
215
215
|
|
216
|
+
it "should handle 'action' as a context" do
|
217
|
+
entry = Entry.create_from_logger_string('0.12.4 setup[:,=,-n] 2011-02-24 12:59:57 action=page-view : action=save_ovcen : app_name=cdb')
|
218
|
+
Entry.count.should == @before_count + 1
|
219
|
+
entry.action.should == "page-view"
|
220
|
+
entry.raw_entry.should == "0.12.4 setup[:,=,-n] 2011-02-24 12:59:57 action=page-view : action=save_ovcen : app_name=cdb"
|
221
|
+
entry.occurred_at.should == Time.parse("2011-02-24 12:59:57")
|
222
|
+
entry.contexts.size.should == 2
|
223
|
+
entry.contexts[0].context_key = "action"
|
224
|
+
entry.contexts[0].context_value = "save_ovcen"
|
225
|
+
entry.contexts[1].context_key = "app_name"
|
226
|
+
entry.contexts[1].context_value = "cdb"
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should handle multiple of the same 'context'" do
|
231
|
+
entry = Entry.create_from_logger_string('0.12.4 setup[:,=,-n] 2011-02-24 12:59:57 action=page-view : app_name=market : app_name=cdb')
|
232
|
+
Entry.count.should == @before_count + 1
|
233
|
+
entry.action.should == "page-view"
|
234
|
+
entry.raw_entry.should == "0.12.4 setup[:,=,-n] 2011-02-24 12:59:57 action=page-view : app_name=market : app_name=cdb"
|
235
|
+
entry.occurred_at.should == Time.parse("2011-02-24 12:59:57")
|
236
|
+
entry.contexts.size.should == 2
|
237
|
+
entry.contexts[0].context_key = "app_name"
|
238
|
+
entry.contexts[0].context_value = "market"
|
239
|
+
entry.contexts[1].context_key = "app_name"
|
240
|
+
entry.contexts[1].context_value = "cdb"
|
241
|
+
|
242
|
+
end
|
243
|
+
|
216
244
|
end
|
217
245
|
|
218
246
|
describe "#create_from_logger" do
|
data/spec/log_collector_spec.rb
CHANGED
@@ -380,6 +380,79 @@ module Appstats
|
|
380
380
|
end
|
381
381
|
end
|
382
382
|
|
383
|
+
describe "#entries" do
|
384
|
+
|
385
|
+
it "should return 0 for new log_collectors" do
|
386
|
+
@log_collector.entries.empty?.should == true
|
387
|
+
end
|
388
|
+
|
389
|
+
it "should return entries" do
|
390
|
+
@log_collector.status = "processed"
|
391
|
+
entry = Entry.new
|
392
|
+
entry.log_collector = @log_collector
|
393
|
+
entry.save
|
394
|
+
|
395
|
+
@log_collector.reload
|
396
|
+
@log_collector.entries.size.should == 1
|
397
|
+
|
398
|
+
entry = Entry.new
|
399
|
+
entry.log_collector = @log_collector
|
400
|
+
entry.save
|
401
|
+
|
402
|
+
@log_collector.reload
|
403
|
+
@log_collector.entries.size.should == 2
|
404
|
+
end
|
405
|
+
|
406
|
+
end
|
407
|
+
|
408
|
+
describe "#unprocess_entries" do
|
409
|
+
|
410
|
+
before(:each) do
|
411
|
+
@log_collector.save.should == true
|
412
|
+
end
|
413
|
+
|
414
|
+
it "should ignore if not processed or destroyed" do
|
415
|
+
@log_collector.status = "blah"
|
416
|
+
@log_collector.unprocess_entries.should == false
|
417
|
+
end
|
418
|
+
|
419
|
+
it "should reset status back to downloaded" do
|
420
|
+
@log_collector.status = "processed"
|
421
|
+
@log_collector.unprocess_entries.should == true
|
422
|
+
@log_collector.reload
|
423
|
+
@log_collector.status = "downloaded"
|
424
|
+
end
|
425
|
+
|
426
|
+
it "should delete all entries" do
|
427
|
+
@log_collector.status = "processed"
|
428
|
+
entry = Entry.new
|
429
|
+
entry.log_collector = @log_collector
|
430
|
+
entry.save
|
431
|
+
entry_id = entry.id
|
432
|
+
|
433
|
+
@log_collector.unprocess_entries.should == true
|
434
|
+
@log_collector.reload
|
435
|
+
Entry.exists?(entry_id).should == false
|
436
|
+
end
|
437
|
+
|
438
|
+
it "should delete all contexts" do
|
439
|
+
@log_collector.status = "processed"
|
440
|
+
entry = Entry.new
|
441
|
+
entry.log_collector = @log_collector
|
442
|
+
entry.save
|
443
|
+
|
444
|
+
context = Context.new
|
445
|
+
context.entry = entry
|
446
|
+
context.save
|
447
|
+
context_id = context.id
|
448
|
+
|
449
|
+
@log_collector.unprocess_entries.should == true
|
450
|
+
@log_collector.reload
|
451
|
+
Context.exists?(context_id).should == false
|
452
|
+
end
|
453
|
+
|
454
|
+
end
|
455
|
+
|
383
456
|
|
384
457
|
end
|
385
458
|
end
|
data/spec/logger_spec.rb
CHANGED
@@ -115,7 +115,7 @@ module Appstats
|
|
115
115
|
|
116
116
|
it "should accept numbers" do
|
117
117
|
Appstats::Logger.entry(5, :blah => 6)
|
118
|
-
Appstats::Logger.raw_read.should == ["0.12.
|
118
|
+
Appstats::Logger.raw_read.should == ["0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=5 : blah=6"]
|
119
119
|
end
|
120
120
|
|
121
121
|
end
|
@@ -124,7 +124,7 @@ module Appstats
|
|
124
124
|
|
125
125
|
it "should look similar to regular entry" do
|
126
126
|
Appstats::Logger.exception_entry(RuntimeError.new("blah"),:on => "login")
|
127
|
-
Appstats::Logger.raw_read.should == ["0.12.
|
127
|
+
Appstats::Logger.raw_read.should == ["0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=appstats-exception : error=blah : on=login"]
|
128
128
|
end
|
129
129
|
|
130
130
|
end
|
@@ -141,29 +141,47 @@ module Appstats
|
|
141
141
|
|
142
142
|
it "should handle a statistics entry" do
|
143
143
|
expected = { :action => "address_search", :timestamp => "2010-09-21 23:15:20" }
|
144
|
-
actual = Appstats::Logger.entry_to_hash("0.12.
|
144
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search")
|
145
145
|
actual.should == expected
|
146
146
|
end
|
147
147
|
|
148
148
|
it "should handle contexts" do
|
149
149
|
expected = { :action => "address_filter", :timestamp => "2010-09-21 23:15:20", :server => "Live", :app_name => 'Market' }
|
150
|
-
actual = Appstats::Logger.entry_to_hash("0.12.
|
150
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live")
|
151
|
+
actual.should == expected
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should handle multiple actions" do
|
155
|
+
expected = { :action => ["address_filter", "blah"], :timestamp => "2010-09-21 23:15:20", :server => "Live", :app_name => 'Market' }
|
156
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : action=blah : app_name=Market : server=Live")
|
157
|
+
actual.should == expected
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should handle multiple of same context" do
|
161
|
+
expected = { :action => "address_filter", :timestamp => "2010-09-21 23:15:20", :server => "Live", :app_name => ['Sin','Market'] }
|
162
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Sin : app_name=Market : server=Live")
|
163
|
+
actual.should == expected
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should handle no actions" do
|
167
|
+
expected = { :action => "UNKNOWN_ACTION", :timestamp => "2010-09-21 23:15:20", :server => "Live", :app_name => 'Market' }
|
168
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 app_name=Market : server=Live")
|
151
169
|
actual.should == expected
|
152
170
|
end
|
153
171
|
|
154
172
|
it "should handle actions with the delimiter (and change the delimiter)" do
|
155
173
|
expected = { :action => "address:=search-n", :timestamp => "2010-09-21 23:15:20" }
|
156
|
-
actual = Appstats::Logger.entry_to_hash("0.12.
|
174
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n")
|
157
175
|
actual.should == expected
|
158
176
|
|
159
177
|
expected = { :action => "address::search==--n", :timestamp => "2010-09-21 23:15:20" }
|
160
|
-
actual = Appstats::Logger.entry_to_hash("0.12.
|
178
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n")
|
161
179
|
actual.should == expected
|
162
180
|
end
|
163
181
|
|
164
182
|
it "should handle contexts with the delimiter (and change the delimiter)" do
|
165
183
|
expected = { :action => "address", :timestamp => "2010-09-21 23:15:20", :server => "market:eval=-n" }
|
166
|
-
actual = Appstats::Logger.entry_to_hash("0.12.
|
184
|
+
actual = Appstats::Logger.entry_to_hash("0.12.4 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n")
|
167
185
|
actual.should == expected
|
168
186
|
end
|
169
187
|
|
@@ -172,66 +190,66 @@ module Appstats
|
|
172
190
|
describe "#entry_to_s" do
|
173
191
|
|
174
192
|
it "should handle a statistics entry" do
|
175
|
-
expected = "0.12.
|
193
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search"
|
176
194
|
actual = Appstats::Logger.entry_to_s("address_search")
|
177
195
|
actual.should == expected
|
178
196
|
end
|
179
197
|
|
180
198
|
it "should handle numbers" do
|
181
|
-
expected = "0.12.
|
199
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=1 : note=2.2"
|
182
200
|
actual = Appstats::Logger.entry_to_s(1,:note => 2.2)
|
183
201
|
actual.should == expected
|
184
202
|
end
|
185
203
|
|
186
204
|
it "should handle default contexts" do
|
187
205
|
Appstats::Logger.default_contexts[:app_name] = "market"
|
188
|
-
expected = "0.12.
|
206
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : app_name=market"
|
189
207
|
actual = Appstats::Logger.entry_to_s("address_search")
|
190
208
|
actual.should == expected
|
191
209
|
end
|
192
210
|
|
193
211
|
it "should handle contexts (and sort them by symbol)" do
|
194
|
-
expected = "0.12.
|
212
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_filter : app_name=Market : server=Live"
|
195
213
|
actual = Appstats::Logger.entry_to_s("address_filter", { :server => "Live", :app_name => 'Market' })
|
196
214
|
actual.should == expected
|
197
215
|
end
|
198
216
|
|
199
217
|
it "should handle actions with the delimiter (and change the delimiter)" do
|
200
|
-
expected = "0.12.
|
218
|
+
expected = "0.12.4 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=search-n"
|
201
219
|
actual = Appstats::Logger.entry_to_s("address:=search-n")
|
202
220
|
actual.should == expected
|
203
221
|
|
204
|
-
expected = "0.12.
|
222
|
+
expected = "0.12.4 setup[:::,===,---n] 2010-09-21 23:15:20 action===address::search==--n"
|
205
223
|
actual = Appstats::Logger.entry_to_s("address::search==--n")
|
206
224
|
actual.should == expected
|
207
225
|
end
|
208
226
|
|
209
227
|
it "should handle contexts with the delimiter (and change the delimiter)" do
|
210
|
-
expected = "0.12.
|
228
|
+
expected = "0.12.4 setup[::,==,--n] 2010-09-21 23:15:20 action==address :: server==market:eval=-n"
|
211
229
|
actual = Appstats::Logger.entry_to_s("address", :server => 'market:eval=-n')
|
212
230
|
actual.should == expected
|
213
231
|
end
|
214
232
|
|
215
233
|
it "should ignore spaces" do
|
216
|
-
expected = "0.12.
|
234
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address search"
|
217
235
|
actual = Appstats::Logger.entry_to_s("address search")
|
218
236
|
actual.should == expected
|
219
237
|
end
|
220
238
|
|
221
239
|
it "should convert newlines in action" do
|
222
|
-
expected = "0.12.
|
240
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_-nsearch"
|
223
241
|
actual = Appstats::Logger.entry_to_s("address_\nsearch")
|
224
242
|
actual.should == expected
|
225
243
|
end
|
226
244
|
|
227
245
|
it "should convert newlines in context" do
|
228
|
-
expected = "0.12.
|
246
|
+
expected = "0.12.4 setup[:,=,-n] 2010-09-21 23:15:20 action=address_search : blah=some-nlong-nstatement"
|
229
247
|
actual = Appstats::Logger.entry_to_s("address_search",:blah => "some\nlong\nstatement")
|
230
248
|
actual.should == expected
|
231
249
|
end
|
232
250
|
|
233
251
|
it "should convert newlines based on the delimiter" do
|
234
|
-
expected = "0.12.
|
252
|
+
expected = "0.12.4 setup[::,==,--n] 2010-09-21 23:15:20 action==address:=--nsearch-n"
|
235
253
|
actual = Appstats::Logger.entry_to_s("address:=\nsearch-n")
|
236
254
|
actual.should == expected
|
237
255
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appstats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 39
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 12
|
9
|
-
-
|
10
|
-
version: 0.12.
|
9
|
+
- 4
|
10
|
+
version: 0.12.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Forward
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-25 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|