fnordmetric 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,223 +1,229 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: fnordmetric
3
- version: !ruby/object:Gem::Version
4
- version: 0.5.5
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.5.6
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Paul Asmuth
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-28 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2012-01-03 00:00:00 +01:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
15
17
  name: bson_ext
16
- requirement: &81646210 !ruby/object:Gem::Requirement
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
17
20
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
21
24
  version: 1.4.0
22
25
  type: :runtime
23
- prerelease: false
24
- version_requirements: *81646210
25
- - !ruby/object:Gem::Dependency
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
26
28
  name: sinatra
27
- requirement: &81645630 !ruby/object:Gem::Requirement
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
28
31
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
32
35
  version: 1.2.6
33
36
  type: :runtime
34
- prerelease: false
35
- version_requirements: *81645630
36
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
37
39
  name: redis
38
- requirement: &81645130 !ruby/object:Gem::Requirement
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
39
42
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
43
46
  version: 2.2.2
44
47
  type: :runtime
45
- prerelease: false
46
- version_requirements: *81645130
47
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
48
50
  name: eventmachine
49
- requirement: &81644700 !ruby/object:Gem::Requirement
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
50
53
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
55
58
  type: :runtime
56
- prerelease: false
57
- version_requirements: *81644700
58
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
59
61
  name: em-hiredis
60
- requirement: &81644350 !ruby/object:Gem::Requirement
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
61
64
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
66
69
  type: :runtime
67
- prerelease: false
68
- version_requirements: *81644350
69
- - !ruby/object:Gem::Dependency
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
70
72
  name: json
71
- requirement: &81643990 !ruby/object:Gem::Requirement
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
72
75
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
77
80
  type: :runtime
78
- prerelease: false
79
- version_requirements: *81643990
80
- - !ruby/object:Gem::Dependency
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
81
83
  name: i18n
82
- requirement: &82478780 !ruby/object:Gem::Requirement
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
83
86
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
88
91
  type: :runtime
89
- prerelease: false
90
- version_requirements: *82478780
91
- - !ruby/object:Gem::Dependency
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
92
94
  name: haml
93
- requirement: &82478540 !ruby/object:Gem::Requirement
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
94
97
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
98
- version: '0'
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
99
102
  type: :runtime
100
- prerelease: false
101
- version_requirements: *82478540
102
- - !ruby/object:Gem::Dependency
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
103
105
  name: rack
104
- requirement: &82478300 !ruby/object:Gem::Requirement
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
105
108
  none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: "0"
110
113
  type: :runtime
111
- prerelease: false
112
- version_requirements: *82478300
113
- - !ruby/object:Gem::Dependency
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
114
116
  name: rack-test
115
- requirement: &82478060 !ruby/object:Gem::Requirement
117
+ prerelease: false
118
+ requirement: &id010 !ruby/object:Gem::Requirement
116
119
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: "0"
121
124
  type: :runtime
122
- prerelease: false
123
- version_requirements: *82478060
124
- - !ruby/object:Gem::Dependency
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
125
127
  name: yajl-ruby
126
- requirement: &82477820 !ruby/object:Gem::Requirement
128
+ prerelease: false
129
+ requirement: &id011 !ruby/object:Gem::Requirement
127
130
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: "0"
132
135
  type: :runtime
133
- prerelease: false
134
- version_requirements: *82477820
135
- - !ruby/object:Gem::Dependency
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
136
138
  name: thin
137
- requirement: &82477580 !ruby/object:Gem::Requirement
139
+ prerelease: false
140
+ requirement: &id012 !ruby/object:Gem::Requirement
138
141
  none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: "0"
143
146
  type: :runtime
144
- prerelease: false
145
- version_requirements: *82477580
146
- - !ruby/object:Gem::Dependency
147
+ version_requirements: *id012
148
+ - !ruby/object:Gem::Dependency
147
149
  name: activesupport
148
- requirement: &82477340 !ruby/object:Gem::Requirement
150
+ prerelease: false
151
+ requirement: &id013 !ruby/object:Gem::Requirement
149
152
  none: false
150
- requirements:
151
- - - ! '>='
152
- - !ruby/object:Gem::Version
153
- version: '0'
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: "0"
154
157
  type: :runtime
155
- prerelease: false
156
- version_requirements: *82477340
157
- - !ruby/object:Gem::Dependency
158
+ version_requirements: *id013
159
+ - !ruby/object:Gem::Dependency
158
160
  name: delorean
159
- requirement: &82477100 !ruby/object:Gem::Requirement
161
+ prerelease: false
162
+ requirement: &id014 !ruby/object:Gem::Requirement
160
163
  none: false
161
- requirements:
162
- - - ! '>='
163
- - !ruby/object:Gem::Version
164
- version: '0'
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: "0"
165
168
  type: :development
166
- prerelease: false
167
- version_requirements: *82477100
168
- - !ruby/object:Gem::Dependency
169
+ version_requirements: *id014
170
+ - !ruby/object:Gem::Dependency
169
171
  name: rspec
170
- requirement: &82476860 !ruby/object:Gem::Requirement
172
+ prerelease: false
173
+ requirement: &id015 !ruby/object:Gem::Requirement
171
174
  none: false
172
- requirements:
175
+ requirements:
173
176
  - - ~>
174
- - !ruby/object:Gem::Version
177
+ - !ruby/object:Gem::Version
175
178
  version: 2.6.0
176
179
  type: :development
177
- prerelease: false
178
- version_requirements: *82476860
179
- - !ruby/object:Gem::Dependency
180
+ version_requirements: *id015
181
+ - !ruby/object:Gem::Dependency
180
182
  name: shoulda
181
- requirement: &82476620 !ruby/object:Gem::Requirement
183
+ prerelease: false
184
+ requirement: &id016 !ruby/object:Gem::Requirement
182
185
  none: false
183
- requirements:
184
- - - ! '>='
185
- - !ruby/object:Gem::Version
186
- version: '0'
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: "0"
187
190
  type: :development
188
- prerelease: false
189
- version_requirements: *82476620
190
- - !ruby/object:Gem::Dependency
191
+ version_requirements: *id016
192
+ - !ruby/object:Gem::Dependency
191
193
  name: bundler
192
- requirement: &82476380 !ruby/object:Gem::Requirement
194
+ prerelease: false
195
+ requirement: &id017 !ruby/object:Gem::Requirement
193
196
  none: false
194
- requirements:
197
+ requirements:
195
198
  - - ~>
196
- - !ruby/object:Gem::Version
199
+ - !ruby/object:Gem::Version
197
200
  version: 1.0.0
198
201
  type: :development
199
- prerelease: false
200
- version_requirements: *82476380
201
- - !ruby/object:Gem::Dependency
202
+ version_requirements: *id017
203
+ - !ruby/object:Gem::Dependency
202
204
  name: jeweler
203
- requirement: &82476140 !ruby/object:Gem::Requirement
205
+ prerelease: false
206
+ requirement: &id018 !ruby/object:Gem::Requirement
204
207
  none: false
205
- requirements:
208
+ requirements:
206
209
  - - ~>
207
- - !ruby/object:Gem::Version
210
+ - !ruby/object:Gem::Version
208
211
  version: 1.5.2
209
212
  type: :development
210
- prerelease: false
211
- version_requirements: *82476140
213
+ version_requirements: *id018
212
214
  description: FnordMetric is a Ruby Event-Tracking gem on steroids
213
215
  email: paul@paulasmuth.com
214
216
  executables: []
217
+
215
218
  extensions: []
216
- extra_rdoc_files: []
217
- files:
219
+
220
+ extra_rdoc_files:
221
+ - README.md
222
+ files:
218
223
  - .travis.yml
219
224
  - Gemfile
220
225
  - Gemfile.lock
226
+ - README.md
221
227
  - Rakefile
222
228
  - VERSION
223
229
  - doc/preview1.png
@@ -262,7 +268,6 @@ files:
262
268
  - pub/sprite.png
263
269
  - pub/vendor/highcharts.js
264
270
  - pub/vendor/jquery-1.6.1.min.js
265
- - readme.rdoc
266
271
  - spec/app_spec.rb
267
272
  - spec/context_spec.rb
268
273
  - spec/dashboard_spec.rb
@@ -274,32 +279,35 @@ files:
274
279
  - spec/spec_helper.rb
275
280
  - spec/widget_spec.rb
276
281
  - spec/worker_spec.rb
282
+ has_rdoc: true
277
283
  homepage: http://github.com/paulasmuth/fnordmetric
278
- licenses:
284
+ licenses:
279
285
  - MIT
280
286
  post_install_message:
281
287
  rdoc_options: []
282
- require_paths:
288
+
289
+ require_paths:
283
290
  - lib
284
- required_ruby_version: !ruby/object:Gem::Requirement
291
+ required_ruby_version: !ruby/object:Gem::Requirement
285
292
  none: false
286
- requirements:
287
- - - ! '>='
288
- - !ruby/object:Gem::Version
289
- version: '0'
290
- required_rubygems_version: !ruby/object:Gem::Requirement
293
+ requirements:
294
+ - - ">="
295
+ - !ruby/object:Gem::Version
296
+ version: "0"
297
+ required_rubygems_version: !ruby/object:Gem::Requirement
291
298
  none: false
292
- requirements:
293
- - - ! '>='
294
- - !ruby/object:Gem::Version
295
- version: '0'
299
+ requirements:
300
+ - - ">="
301
+ - !ruby/object:Gem::Version
302
+ version: "0"
296
303
  requirements: []
304
+
297
305
  rubyforge_project:
298
- rubygems_version: 1.8.11
306
+ rubygems_version: 1.5.2
299
307
  signing_key:
300
308
  specification_version: 3
301
309
  summary: FnordMetric is a Ruby Event-Tracking gem on steroids
302
- test_files:
310
+ test_files:
303
311
  - spec/app_spec.rb
304
312
  - spec/context_spec.rb
305
313
  - spec/dashboard_spec.rb
data/readme.rdoc DELETED
@@ -1,337 +0,0 @@
1
- = FnordMetric
2
-
3
- FnordMetric is a highly configurable (and pretty fast) realtime app/event tracking thing based on ruby eventmachine and redis. You define your own plotting and counting functions as ruby blocks!
4
-
5
- {<img src="https://secure.travis-ci.org/paulasmuth/fnordmetric.png" />}[http://travis-ci.org/paulasmuth/fnordmetric]
6
-
7
- SCREENCAST: http://www.screenr.com/KiJs - the FnordMetric-instance we use to track our social dating app
8
-
9
- ---
10
-
11
- FnordMetric keeps track of your data and draws nice timeline plots.
12
-
13
- {<img src="https://raw.github.com/paulasmuth/fnordmetric/master/doc/preview1.png" />}[https://raw.github.com/paulasmuth/fnordmetric/master/doc/preview1.png]
14
-
15
- FnordMetric gives you a live dashboard, that shows who is using your app in realtime. You can select a single user and follow them step by step.
16
-
17
- {<img src="https://raw.github.com/paulasmuth/fnordmetric/master/doc/preview2.png" />}[https://raw.github.com/paulasmuth/fnordmetric/master/doc/preview1.png]
18
-
19
-
20
- == Getting Started
21
-
22
- Copy doc/ulm_stats.rb (that's the configuration from the screenshots and screencast) or the simple example from below to 'my_stats_app.rb'
23
-
24
- Simple Example: This will listen for json-events with type=unicorn_seen and render a timeline-plot showing the number of received events per hour.
25
-
26
- require "fnordmetric"
27
-
28
- FnordMetric.namespace :myapp do
29
-
30
- # numeric (delta) gauge, 1-hour tick
31
- gauge :unicorns_seen_per_hour,
32
- :tick => 1.hour.to_i,
33
- :title => "Unicorns seenper Hour"
34
-
35
- # on every event like { _type: 'unicorn_seen' }
36
- event(:unicorn_seen) do
37
- # increment the unicorns_seen_per_hour gauge by 1
38
- incr :unicorns_seen_per_hour
39
- end
40
-
41
- # draw a timeline showing the gauges value, auto-refresh every 30s
42
- widget 'Overview', {
43
- :title => "Unicorn-Sightings per Hour",
44
- :type => :timeline,
45
- :gauges => :unicorns_seen_per_hour,
46
- :include_current => true,
47
- :autoupdate => 2
48
- }
49
-
50
- end
51
-
52
- FnordMetric.standalone
53
-
54
- Start the app (requires ruby >= 1.9.2):
55
-
56
- $ ruby my_stats_app.rb run
57
-
58
- Log all incoming events:
59
-
60
- $ ruby my_stats_app.rb log DUMP_FILE=/tmp/foo.json
61
-
62
- This is the easiest way to submit an event:
63
-
64
- echo "{\"_type\": \"unicorn_seen\"}" | nc localhost 1337
65
-
66
-
67
- == Installation
68
-
69
- gem install fnordmetric
70
-
71
- or in your Gemfile:
72
-
73
- gem 'fnordmetric', '>= 0.5.1'
74
-
75
-
76
- == Documentation
77
-
78
-
79
- === Sending Events
80
-
81
- The slow way: HTTP-Post the json event to the fnordmetric webinterface
82
-
83
- POST http://localhost:2323/events _type=unicorn_seen
84
-
85
- curl -X POST -d "_type=unicorn_seen" http://localhost:4242/events
86
-
87
- The easy way: Stream one ore more newline-seperated json encoded events through a tcp connection.
88
-
89
- echo "\{\"_type\": \"unicorn_seen\"\}\n" | nc localhost 2323
90
-
91
- The fast way: Add your event directly to the redis-based queue:
92
-
93
- uuid = (8**32).to_s(36)
94
- event = { :_type => "unicorn_seen" }.to_json
95
-
96
- redis.lpush("fnordmetric-queue", uuid)
97
- redis.set("fnordmetric-event-#{my_uuid}", event)
98
- redis.expire("fnordmetric-event-#{my_uuid}", 60)
99
-
100
- ---
101
-
102
- === Special Events
103
-
104
- // track a pageview
105
- { "_type": "_pageview", "url": "/blob/my_super_seo_article", "_session": "mysessiontoken" }
106
-
107
- // set the user name
108
- { "_type": "_set_name", "name": "Tingle Tangle Bob", "_session": "mysessiontoken" }
109
-
110
- // set the user picture
111
- { "_type": "_set_picture", "url": "http://myhost/123.jpg", "_session": "mysessiontoken" }
112
-
113
-
114
- ---
115
-
116
- === DSL Methods
117
-
118
- gauge
119
-
120
- widget
121
-
122
- event
123
-
124
-
125
- ---
126
-
127
- === Event Handlers
128
-
129
- call these methods from the event-handler block
130
-
131
- incr(gauge_name, value=1):
132
- Increment the given (two-dimensional) gauge by value at the tick specified by event-time
133
-
134
- incr_field(gauge_name, field_name, value=1):
135
- Increment the given field on a three-dimensional gauge by value at the tick specified by event-time
136
-
137
- set_value(gauge_name, value)
138
- Set the given (two-dimensional) to value at the tick specified by event-time (overwrite existing value)
139
-
140
- set_field(gauge_name, field_name, value)
141
- Set the given field on a three-dimensional gauge to value at the tick specified by event-time (overwrite existing value)
142
-
143
-
144
- ---
145
-
146
- === Gauges
147
-
148
- ---
149
-
150
- === Widgets
151
-
152
- [autoupdate] auto-refresh the timeline every n secs (0 turns autoupdate off)
153
-
154
- ==== Widget-Options: TimelineWidget
155
-
156
- [plot_style] one of: line, areaspline
157
- [include_current] show the current tick?
158
- [ticks] number of ticks to show (defaults to 24/30)
159
-
160
- ==== Widget-Options: BarsWidget
161
-
162
- [plot_style] one of: vertical, horizontal
163
- [order_by]: order bars/columns by: value, field
164
-
165
- ==== Widget-Options: Numbers-Widget
166
-
167
- ==== Widget-Options: ToplistWidget
168
-
169
-
170
- ---
171
-
172
- === JSON API
173
-
174
-
175
-
176
- == Examples
177
-
178
- (link1), (link2), (link3), (link4)
179
-
180
-
181
-
182
- == Full Example
183
-
184
- require "fnordmetric"
185
-
186
- FnordMetric.namespace :myapp do
187
-
188
- # numeric (delta) gauge, 1-hour tick
189
- gauge :messages_sent,
190
- :tick => 1.hour.to_i,
191
- :title => "Messages (sent) per Hour"
192
-
193
- # numeric (delta) gauge, 1-hour tick
194
- gauge :messages_read,
195
- :tick => 1.hour.to_i,
196
- :title => "Messages (read) per Hour"
197
-
198
- # numeric (progressive) gauge, 1-hour tick
199
- gauge :events_total,
200
- :tick => 1.day.to_i,
201
- :progressive => true,
202
- :title => "Events (total)"
203
-
204
- # numeric (delta) gauge, increments uniquely by session_key
205
- gauge :pageviews_daily_unique,
206
- :tick => 1.day.to_i,
207
- :unique => true,
208
- :title => "Unique Visits (Daily)"
209
-
210
- # numeric (delta) gauge, increments uniquely by session_key, returns average
211
- gauge :avg_age_per_session,
212
- :tick => 1.day.to_i,
213
- :unique => true,
214
- :average => true,
215
- :title => "Avg. User Age"
216
-
217
- # three-dimensional (delta) gauge (time->key->value)
218
- gauge :pageviews_per_url_daily,
219
- :tick => 1.day.to_i,
220
- :title => "Daily Pageviews per URL",
221
- :three_dimensional => true
222
-
223
-
224
- # on every event like { _type: 'message_sent' }
225
- event(:message_sent) do
226
- # increment the messages_sent gauge by 1
227
- incr :messages_sent
228
- end
229
-
230
- # on every event like { _type: 'message_read' }
231
- event(:message_read) do
232
- # increment the messages_read gauge by 1
233
- incr :messages_read
234
- end
235
-
236
- # on _every_ event
237
- event :"*" do
238
- # increment the events_total gauge by 1
239
- incr :events_total
240
- end
241
-
242
- # on every event like { _type: '_pageview', _session: 'sbz7jset', _url: '/page2' }
243
- event :_pageview do
244
- # increment the daily_uniques gauge by 1 if session_key hasn't been seen in this tick yet
245
- incr :pageviews_daily_unique
246
- # increment the pageviews_per_url_daily gauge by 1 where key = 'page2'
247
- incr_field :pageviews_per_url_daily, data[:url]
248
- end
249
-
250
- # on every event like { _type: '_pageview', my_set_age: '23' }
251
- event(:my_set_age) do
252
- # add the value of my_set_age to the avg_age_per_session gauge if session_key
253
- # hasn't been seen in this tick yet
254
- incr :avg_age_per_session, data[:my_age_field]
255
- end
256
-
257
- # draw a timeline showing the pageviews_daily_unique, auto-refresh every 30s
258
- widget 'Overview', {
259
- :title => "Unique Visits per Day",
260
- :type => :timeline,
261
- :width => 70,
262
- :gauges => :pageviews_daily_unique,
263
- :include_current => true,
264
- :autoupdate => 30
265
- }
266
-
267
- # draw the values of the messages_sent and messages_read gauge at the current tick, three ticks ago, and
268
- # the sum of the last 10 ticks, auto-refresh every 20s
269
- widget 'Overview', {
270
- :title => "Messages Sent / Read",
271
- :type => :numbers,
272
- :width => 30,
273
- :autoupdate => 20,
274
- :offsets => [0,3,"10s"]
275
- :gauges => [ :messages_sent, :messages_read ]
276
- }
277
-
278
- # draw a list of the most visited urls (url, visits + percentage), auto-refresh every 20s
279
- widget 'Overview', {
280
- :title => "Top Pages",
281
- :type => :toplist,
282
- :autoupdate => 20,
283
- :gauges => [ :pageviews_per_url_daily ]
284
- }
285
-
286
- end
287
-
288
- FnordMetric.standalone
289
-
290
-
291
- == License
292
-
293
- Copyright (c) 2011 Paul Asmuth
294
-
295
- Permission is hereby granted, free of charge, to any person obtaining
296
- a copy of this software and associated documentation files (the
297
- "Software"), to use, copy and modify copies of the Software, subject
298
- to the following conditions:
299
-
300
- The above copyright notice and this permission notice shall be
301
- included in all copies or substantial portions of the Software.
302
-
303
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
304
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
305
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
306
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
307
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
308
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
309
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
310
-
311
-
312
- == Todos
313
-
314
- -> funnel-widget
315
- -> combine/calculation gauges via opts_gauge({}, &block) (+calculate ctr)
316
- -> timeline_widget: 'compare mode': compate gauge to yesterday
317
- -> fix include_current
318
- -> numbers_widget: handle decreasing vals
319
- -> make redis-addr and redis-prefix + listen-ports configurable
320
- -> referal tracking fu (parse googlequeries)
321
- -> trend detection
322
- -> opt_event options: :increment => gauge_name
323
- -> preconfigured default-dashboard (like google analytics)
324
- -> pagview+ref-tracking via js-tracking-pixel
325
- -> table/gauge-list-widget (with mini-stats!)
326
- -> prune the namespace-sessions-timline (remove event_ids older than x)
327
- -> prune the namespace-event-types-list (trim to max items)
328
- -> timelinewidget + numberswidget => should use redis hmget
329
- -> get multiple metrics in a single http get
330
- -> { _namespace: myns } field (!!!)
331
-
332
-
333
- -> demo / example: chatroom;
334
- -> events: msg_read, msg_sent, {reg_start, reg_register, reg_active}, login (+demog.data+lang), referall
335
- -> widgets: msgs sent/read (timeline), user-demog. (bars), reg-funnel (funnel), male vs. female users (pie), top langs (list), kpi list (toplist - regs, msg/user, conversion rate, etc), top referrers
336
-
337
-