fnordmetric 1.0.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/Rakefile +1 -1
  2. data/fnordmetric.gemspec +1 -0
  3. data/lib/fnordmetric.rb +6 -13
  4. data/lib/fnordmetric/acceptors/acceptor.rb +20 -7
  5. data/lib/fnordmetric/acceptors/amqp_acceptor.rb +56 -0
  6. data/lib/fnordmetric/acceptors/fyrehose_acceptor.rb +43 -0
  7. data/lib/fnordmetric/acceptors/stomp_acceptor.rb +71 -0
  8. data/lib/fnordmetric/acceptors/tcp_acceptor.rb +1 -0
  9. data/lib/fnordmetric/acceptors/udp_acceptor.rb +2 -1
  10. data/lib/fnordmetric/context.rb +21 -9
  11. data/lib/fnordmetric/defaults.rb +16 -3
  12. data/lib/fnordmetric/gauge.rb +8 -3
  13. data/lib/fnordmetric/gauge_calculations.rb +8 -2
  14. data/lib/fnordmetric/gauge_modifiers.rb +5 -4
  15. data/lib/fnordmetric/gauges/server_health_gauge.rb +13 -0
  16. data/lib/fnordmetric/namespace.rb +53 -17
  17. data/lib/fnordmetric/util.rb +25 -0
  18. data/lib/fnordmetric/version.rb +1 -1
  19. data/lib/fnordmetric/web/app.rb +7 -66
  20. data/lib/fnordmetric/web/reactor.rb +32 -2
  21. data/lib/fnordmetric/web/websocket.rb +1 -1
  22. data/lib/fnordmetric/widgets/bars_widget.rb +1 -1
  23. data/lib/fnordmetric/widgets/numbers_widget.rb +28 -4
  24. data/lib/fnordmetric/widgets/timeseries_widget.rb +19 -9
  25. data/lib/fnordmetric/widgets/toplist_widget.rb +8 -4
  26. data/lib/fnordmetric/worker.rb +5 -1
  27. data/lib/fnordmetric/zero_config_gauge.rb +138 -0
  28. data/spec/context_spec.rb +4 -4
  29. data/spec/event_spec.rb +11 -11
  30. data/spec/gauge_modifiers_spec.rb +135 -29
  31. data/spec/gauge_spec.rb +7 -2
  32. data/spec/namespace_spec.rb +8 -19
  33. data/spec/util_spec.rb +46 -0
  34. data/web/.gitignore +4 -0
  35. data/web/build.sh +34 -0
  36. data/web/{fnordmetric.css → css/fnordmetric.core.css} +121 -58
  37. data/web/haml/app.haml +4 -22
  38. data/web/{loader.gif → img/loader.gif} +0 -0
  39. data/web/js/fnordmetric.bars_widget.js +3 -3
  40. data/web/js/fnordmetric.dashboard_view.js +1 -1
  41. data/web/js/fnordmetric.gauge_explorer.js +173 -0
  42. data/web/js/fnordmetric.js +93 -33
  43. data/web/js/fnordmetric.numbers_widget.js +15 -14
  44. data/web/js/fnordmetric.session_view.js +0 -1
  45. data/web/js/fnordmetric.timeline_widget.js +3 -3
  46. data/web/js/fnordmetric.timeseries_widget.js +46 -29
  47. data/web/js/fnordmetric.toplist_widget.js +23 -16
  48. data/web/js/fnordmetric.util.js +12 -8
  49. data/web/vendor/font-awesome/css/font-awesome-ie7.min.css +22 -0
  50. data/web/vendor/font-awesome/css/font-awesome.css +522 -221
  51. data/web/vendor/font-awesome/css/font-awesome.min.css +33 -0
  52. data/web/vendor/font-awesome/font/FontAwesome.otf +0 -0
  53. data/web/vendor/font-awesome/font/fontawesome-webfont.eot +0 -0
  54. data/web/vendor/font-awesome/font/fontawesome-webfont.svg +278 -169
  55. data/web/vendor/font-awesome/font/fontawesome-webfont.ttf +0 -0
  56. data/web/vendor/font-awesome/font/fontawesome-webfont.woff +0 -0
  57. data/web/vendor/jquery-ui.min.js +6 -413
  58. data/web/vendor/jquery.combobox.js +129 -0
  59. metadata +55 -48
  60. data/doc/V1.0-ROADMAP +0 -97
  61. data/doc/full_example.rb +0 -224
  62. data/doc/legacy_example.rb +0 -640
  63. data/doc/minimal_example.rb +0 -26
  64. data/doc/preview1.png +0 -0
  65. data/doc/preview2.png +0 -0
  66. data/doc/preview3.png +0 -0
  67. data/readme.md +0 -365
  68. data/web/vendor/d3.v2.js +0 -9382
  69. data/web/vendor/font-awesome/font/fontawesome-webfont.svgz +0 -0
  70. data/web/vendor/rickshaw.css +0 -286
  71. data/web/vendor/rickshaw.fnordmetric.js +0 -2700
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fnordmetric
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-08 00:00:00.000000000 Z
12
+ date: 2013-02-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &21192660 !ruby/object:Gem::Requirement
16
+ requirement: &12630080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.2.6
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *21192660
24
+ version_requirements: *12630080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis
27
- requirement: &21190360 !ruby/object:Gem::Requirement
27
+ requirement: &12629360 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.2.2
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *21190360
35
+ version_requirements: *12629360
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: eventmachine
38
- requirement: &21188420 !ruby/object:Gem::Requirement
38
+ requirement: &12628500 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *21188420
46
+ version_requirements: *12628500
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: websocket-rack
49
- requirement: &21185340 !ruby/object:Gem::Requirement
49
+ requirement: &12642320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.4.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *21185340
57
+ version_requirements: *12642320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: em-hiredis
60
- requirement: &21196680 !ruby/object:Gem::Requirement
60
+ requirement: &12636300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.1.1
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *21196680
68
+ version_requirements: *12636300
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json
71
- requirement: &21195740 !ruby/object:Gem::Requirement
71
+ requirement: &12635380 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *21195740
79
+ version_requirements: *12635380
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: i18n
82
- requirement: &21193800 !ruby/object:Gem::Requirement
82
+ requirement: &12744500 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *21193800
90
+ version_requirements: *12744500
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: haml
93
- requirement: &21208740 !ruby/object:Gem::Requirement
93
+ requirement: &12744080 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *21208740
101
+ version_requirements: *12744080
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rack
104
- requirement: &21207680 !ruby/object:Gem::Requirement
104
+ requirement: &12743660 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *21207680
112
+ version_requirements: *12743660
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rack-test
115
- requirement: &21205940 !ruby/object:Gem::Requirement
115
+ requirement: &12743200 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *21205940
123
+ version_requirements: *12743200
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: yajl-ruby
126
- requirement: &21217620 !ruby/object:Gem::Requirement
126
+ requirement: &12742760 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *21217620
134
+ version_requirements: *12742760
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: thin
137
- requirement: &21216440 !ruby/object:Gem::Requirement
137
+ requirement: &12742260 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.3.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *21216440
145
+ version_requirements: *12742260
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: activesupport
148
- requirement: &21215840 !ruby/object:Gem::Requirement
148
+ requirement: &12741840 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *21215840
156
+ version_requirements: *12741840
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: delorean
159
- requirement: &21215020 !ruby/object:Gem::Requirement
159
+ requirement: &12741380 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *21215020
167
+ version_requirements: *12741380
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: rspec
170
- requirement: &21214160 !ruby/object:Gem::Requirement
170
+ requirement: &12740880 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 2.8.0
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *21214160
178
+ version_requirements: *12740880
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: shoulda
181
- requirement: &21213400 !ruby/object:Gem::Requirement
181
+ requirement: &12740440 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,7 +186,7 @@ dependencies:
186
186
  version: '0'
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *21213400
189
+ version_requirements: *12740440
190
190
  description: FnordMetric is a Ruby Event-Tracking gem on steroids
191
191
  email:
192
192
  - paul@paulasmuth.com
@@ -196,16 +196,12 @@ extra_rdoc_files: []
196
196
  files:
197
197
  - Gemfile
198
198
  - Rakefile
199
- - doc/V1.0-ROADMAP
200
- - doc/full_example.rb
201
- - doc/legacy_example.rb
202
- - doc/minimal_example.rb
203
- - doc/preview1.png
204
- - doc/preview2.png
205
- - doc/preview3.png
206
199
  - fnordmetric.gemspec
207
200
  - lib/fnordmetric.rb
208
201
  - lib/fnordmetric/acceptors/acceptor.rb
202
+ - lib/fnordmetric/acceptors/amqp_acceptor.rb
203
+ - lib/fnordmetric/acceptors/fyrehose_acceptor.rb
204
+ - lib/fnordmetric/acceptors/stomp_acceptor.rb
209
205
  - lib/fnordmetric/acceptors/tcp_acceptor.rb
210
206
  - lib/fnordmetric/acceptors/udp_acceptor.rb
211
207
  - lib/fnordmetric/api.rb
@@ -219,6 +215,7 @@ files:
219
215
  - lib/fnordmetric/gauge_rendering.rb
220
216
  - lib/fnordmetric/gauge_validations.rb
221
217
  - lib/fnordmetric/gauges/distribution_gauge.rb
218
+ - lib/fnordmetric/gauges/server_health_gauge.rb
222
219
  - lib/fnordmetric/gauges/timeseries_gauge.rb
223
220
  - lib/fnordmetric/gauges/toplist_gauge.rb
224
221
  - lib/fnordmetric/histogram.rb
@@ -229,6 +226,7 @@ files:
229
226
  - lib/fnordmetric/timeseries.rb
230
227
  - lib/fnordmetric/toplist.rb
231
228
  - lib/fnordmetric/udp_client.rb
229
+ - lib/fnordmetric/util.rb
232
230
  - lib/fnordmetric/version.rb
233
231
  - lib/fnordmetric/web/app.rb
234
232
  - lib/fnordmetric/web/app_helpers.rb
@@ -245,7 +243,7 @@ files:
245
243
  - lib/fnordmetric/widgets/timeseries_widget.rb
246
244
  - lib/fnordmetric/widgets/toplist_widget.rb
247
245
  - lib/fnordmetric/worker.rb
248
- - readme.md
246
+ - lib/fnordmetric/zero_config_gauge.rb
249
247
  - spec/api_spec.rb
250
248
  - spec/context_spec.rb
251
249
  - spec/dashboard_spec.rb
@@ -261,9 +259,12 @@ files:
261
259
  - spec/tcp_acceptor_spec.rb
262
260
  - spec/timeseries_gauge_spec.rb
263
261
  - spec/udp_acceptor_spec.rb
262
+ - spec/util_spec.rb
264
263
  - spec/widget_spec.rb
265
264
  - spec/worker_spec.rb
266
- - web/fnordmetric.css
265
+ - web/.gitignore
266
+ - web/build.sh
267
+ - web/css/fnordmetric.core.css
267
268
  - web/haml/app.haml
268
269
  - web/haml/distribution_gauge.haml
269
270
  - web/haml/timeseries_gauge.haml
@@ -272,12 +273,14 @@ files:
272
273
  - web/img/list.png
273
274
  - web/img/list_active.png
274
275
  - web/img/list_hover.png
276
+ - web/img/loader.gif
275
277
  - web/img/loader_white.gif
276
278
  - web/img/navbar.png
277
279
  - web/img/navbar_btn.png
278
280
  - web/img/picto_gauge.png
279
281
  - web/js/fnordmetric.bars_widget.js
280
282
  - web/js/fnordmetric.dashboard_view.js
283
+ - web/js/fnordmetric.gauge_explorer.js
281
284
  - web/js/fnordmetric.gauge_view.js
282
285
  - web/js/fnordmetric.html_widget.js
283
286
  - web/js/fnordmetric.js
@@ -291,19 +294,22 @@ files:
291
294
  - web/js/fnordmetric.toplist_widget.js
292
295
  - web/js/fnordmetric.ui.js
293
296
  - web/js/fnordmetric.util.js
294
- - web/loader.gif
295
- - web/vendor/d3.v2.js
297
+ - web/vendor/font-awesome/css/font-awesome-ie7.min.css
296
298
  - web/vendor/font-awesome/css/font-awesome.css
299
+ - web/vendor/font-awesome/css/font-awesome.min.css
300
+ - web/vendor/font-awesome/font/FontAwesome.otf
297
301
  - web/vendor/font-awesome/font/fontawesome-webfont.eot
298
302
  - web/vendor/font-awesome/font/fontawesome-webfont.svg
299
- - web/vendor/font-awesome/font/fontawesome-webfont.svgz
300
303
  - web/vendor/font-awesome/font/fontawesome-webfont.ttf
301
304
  - web/vendor/font-awesome/font/fontawesome-webfont.woff
302
305
  - web/vendor/jquery-1.6.2.min.js
303
306
  - web/vendor/jquery-ui.min.js
307
+ - web/vendor/jquery.combobox.js
304
308
  - web/vendor/jquery.maskedinput.js
305
- - web/vendor/rickshaw.css
306
- - web/vendor/rickshaw.fnordmetric.js
309
+ - web/fnordmetric-ui.js
310
+ - web/fnordmetric-ui.css
311
+ - web/fnordmetric-core.js
312
+ - web/fnordmetric-core.css
307
313
  homepage: http://github.com/paulasmuth/fnordmetric
308
314
  licenses:
309
315
  - MIT
@@ -345,5 +351,6 @@ test_files:
345
351
  - spec/tcp_acceptor_spec.rb
346
352
  - spec/timeseries_gauge_spec.rb
347
353
  - spec/udp_acceptor_spec.rb
354
+ - spec/util_spec.rb
348
355
  - spec/widget_spec.rb
349
356
  - spec/worker_spec.rb
data/doc/V1.0-ROADMAP DELETED
@@ -1,97 +0,0 @@
1
- FnordMetric v1.0
2
- ================
3
-
4
-
5
- TODO
6
- ----
7
-
8
- - timeseries-widget: cardinal on/off should be skeuomorph
9
- - proper cmdline output (status?)
10
- - caching
11
- - fix specs
12
- - namespace picker in sidebar
13
- - split up fnordmetric.namespace block into multiple files
14
- - pie widget (+ fix for old first)
15
- - distgauge: render std. deviation
16
- - timeseries-gauge: overview series weights
17
- - timeseries-gauge: punchcards
18
- - incr_fraction: implement progressive
19
- - timeseries gauge: restrict to max resolution
20
- - formatter: num, time, currency, percent, time_of_day
21
- - minimize/pack js + css
22
- - put images into one sprite
23
- - nice empty states
24
- - favicon (F)
25
-
26
-
27
- WIKI
28
- ----
29
-
30
- > fnordmetric
31
- > sending data
32
- - _type, _time field mandatory
33
- - tcp, udp, redis, http
34
- - events containing user data (_session, _name)
35
- - _namespace
36
- > running fnordmetric
37
- - standalone
38
- - standalone w/ multiple workers
39
- - configuration options
40
-
41
- > event handlers
42
- - data, time, session etc methods
43
- - storing data in the session
44
- - end-of-session callback
45
-
46
- > gauges
47
- > timeseries gauge
48
- - calculate-option: count, sum, progressive_sum, avg
49
- - incr / incr_counter / incr_denominator
50
- > toplist gauge
51
- > distribution gauge
52
-
53
- > custom dashboards
54
- - here be dragons
55
-
56
- > examples
57
- - full_example.rb
58
-
59
- > hacking
60
- - here be dragons
61
-
62
-
63
-
64
-
65
-
66
- IDEAS
67
- -----
68
-
69
- > overview view: gauge list (a'la github graphs landing)
70
- > overview view: num active users, system stats (realtime widget)
71
- > special events (incr, observe etc)
72
- > distgauge: histograms tab
73
- > toplgauge: tabs: compare
74
- > timeseries-gauge: cmp. w/yesterday option
75
- > geo_distribution_gauge
76
- > value correlation / scatter plot (2d) gauge
77
-
78
-
79
-
80
-
81
- CHANGELOG
82
- ---------
83
-
84
- > improved ui
85
- > highcharts is dead, long live d3.js :)
86
- > websockets instead of ajax
87
- > new gauges are variable interval!
88
- > new gauges: timeseries, toplist, distribution (anti-repetition!)
89
- > timeseries gauge: fraction api
90
- > new things: trends, punchards, stdeviation etc
91
- > splitted up code into acceptor, web, worker etc.
92
- > splitted up javascript code
93
- > refactorings, no server-side rendering
94
- > less ram usage / garbage collection / single tick
95
- > fnordmetric:announce redis pusub event-data instead of event_id
96
- > config in multiple files
97
-
data/doc/full_example.rb DELETED
@@ -1,224 +0,0 @@
1
- $: << ::File.expand_path("../../../fnordmetric/lib/", __FILE__)
2
- require "fnordmetric"
3
-
4
- FnordMetric.namespace :myapp do
5
-
6
- # hide_overview
7
- # hide_active_users
8
-
9
-
10
- # NEW DSL (v1.0 upwards)
11
-
12
- timeseries_gauge :number_of_signups,
13
- :group => "My Group",
14
- :title => "Number of Signups",
15
- :key_nouns => ["Singup", "Signups"],
16
- :series => [:via_twitter, :via_facebook],
17
- :resolution => 2.minutes
18
-
19
-
20
- distribution_gauge :user_age_distribution,
21
- :title => "User Age Distribution",
22
- :value_ranges => [(10..16), (16..20), (20..24), (24..28), (28..32), (32..36), (40..44), (44..48),
23
- (48..52), (52..56), (60..64), (64..68), (68..72), (72..76), (70..74), (74..78)],
24
- :value_scale => 1,
25
- :resolution => 2.minutes
26
-
27
-
28
- toplist_gauge :popular_keywords,
29
- :title => "Popular Keywords",
30
- :resolution => 2.minutes
31
-
32
-
33
- event :search do
34
- observe :popular_keywords, data[:keyword]
35
- end
36
-
37
- event :signup do
38
- if data[:referrer] == "facebook"
39
- incr :number_of_signups, :via_facebook, 1
40
- elsif data[:referrer] == "twitter"
41
- incr :number_of_signups, :via_twitter, 1
42
- end
43
- end
44
-
45
- # OLD DSL (will be supported forever, allows finer-grained control)
46
-
47
- gauge :events_per_hour, :tick => 1.hour
48
- gauge :events_per_second, :tick => 1.second
49
- gauge :events_per_minute, :tick => 1.minute
50
-
51
- event :"*" do
52
- incr :events_per_hour
53
- incr :events_per_minute
54
- incr :events_per_second
55
- end
56
-
57
-
58
- gauge :pageviews_daily_unique, :tick => 1.day.to_i, :unique => true, :title => "Unique Visits (Daily)"
59
- gauge :pageviews_hourly_unique, :tick => 1.hour.to_i, :unique => true, :title => "Unique Visits (Hourly)"
60
- gauge :pageviews_monthly_unique, :tick => 40.days.to_i, :unique => true, :title => "Unique Visits (Month)"
61
-
62
- gauge :messages_sent, :tick => 1.day.to_i, :title => "Messages (sent)"
63
- gauge :messages_read, :tick => 1.day.to_i, :title => "Messages (read)"
64
- gauge :winks_sent, :tick => 1.day.to_i, :title => "Winks sent"
65
-
66
- gauge :pageviews_per_url_daily,
67
- :tick => 1.day.to_i,
68
- :title => "Daily Pageviews per URL",
69
- :three_dimensional => true
70
-
71
- gauge :pageviews_per_url_monthly,
72
- :tick => 30.days.to_i,
73
- :title => "Monthly Pageviews per URL",
74
- :three_dimensional => true
75
-
76
- event :_pageview do
77
- incr :pageviews_daily_unique
78
- incr :pageviews_hourly_unique
79
- incr :pageviews_monthly_unique
80
- incr_field :pageviews_per_url_daily, data[:url]
81
- incr_field :pageviews_per_url_monthly, data[:url]
82
- end
83
-
84
-
85
- widget 'TechStats', {
86
- :title => "Events per Minute",
87
- :type => :timeline,
88
- :width => 100,
89
- :gauges => :events_per_minute,
90
- :include_current => true,
91
- :autoupdate => 30
92
- }
93
-
94
- widget 'TechStats', {
95
- :title => "Events per Hour",
96
- :type => :timeline,
97
- :width => 50,
98
- :gauges => :events_per_hour,
99
- :include_current => true,
100
- :autoupdate => 30
101
- }
102
-
103
-
104
- widget 'TechStats', {
105
- :title => "Events/Second",
106
- :type => :timeline,
107
- :width => 50,
108
- :gauges => :events_per_second,
109
- :include_current => true,
110
- :plot_style => :areaspline,
111
- :autoupdate => 1
112
- }
113
-
114
- widget 'TechStats', {
115
- :title => "Events Numbers",
116
- :type => :numbers,
117
- :width => 100,
118
- :gauges => [:events_per_second, :events_per_minute, :events_per_hour],
119
- :offsets => [1,3,5,10],
120
- :autoupdate => 1
121
- }
122
-
123
-
124
- gauge :age_distribution_female_monthly,
125
- :tick => 1.month.to_i,
126
- :three_dimensional => true,
127
- :title => "Age Distribution (female) monthly"
128
-
129
- gauge :age_distribution_male_monthly,
130
- :tick => 1.month.to_i,
131
- :three_dimensional => true,
132
- :title => "Age Distribution (male) monthly"
133
-
134
- gauge :age_distribution_female_daily,
135
- :tick => 1.day.to_i,
136
- :three_dimensional => true,
137
- :title => "Age Distribution (female) daily"
138
-
139
- gauge :age_distribution_male_daily,
140
- :tick => 1.day.to_i,
141
- :three_dimensional => true,
142
- :title => "Age Distribution (male) daily"
143
-
144
-
145
- widget 'Demography', {
146
- :title => "Age Distribution: Female Users (Monthly)",
147
- :type => :bars,
148
- :width => 50,
149
- :autoupdate => 5,
150
- :order_by => :field,
151
- :gauges => [ :age_distribution_female_monthly ]
152
- }
153
-
154
- widget 'Demography', {
155
- :title => "Age Distribution: Male Users (Monthly)",
156
- :type => :bars,
157
- :width => 50,
158
- :autoupdate => 5,
159
- :order_by => :field,
160
- :gauges => [ :age_distribution_male_monthly ]
161
- }
162
-
163
-
164
- widget 'Demography', {
165
- :title => "Age Distribution: Female Users",
166
- :type => :toplist,
167
- :width => 50,
168
- :autoupdate => 5,
169
- :gauges => [ :age_distribution_female_monthly, :age_distribution_female_daily ]
170
- }
171
-
172
- widget 'Demography', {
173
- :title => "Age Distribution: Male Users",
174
- :type => :toplist,
175
- :width => 50,
176
- :autoupdate => 5,
177
- :gauges => [ :age_distribution_male_monthly, :age_distribution_male_daily ]
178
- }
179
-
180
- event "user_demography" do
181
- if data[:gender] == "female"
182
- incr_field(:age_distribution_female_monthly, data[:age], 1)
183
- incr_field(:age_distribution_female_daily, data[:age], 1)
184
- end
185
- if data[:gender] == "male"
186
- incr_field(:age_distribution_male_monthly, data[:age], 1)
187
- incr_field(:age_distribution_male_daily, data[:age], 1)
188
- end
189
- observe :user_age_distribution, data[:age]
190
- end
191
-
192
-
193
- end
194
-
195
- FnordMetric.options = {
196
- :event_queue_ttl => 10, # all data that isn't processed within 10s is discarded to prevent memory overruns
197
- :event_data_ttl => 3600, # event data is stored for one hour (needed for the active users view)
198
- :session_data_ttl => 3600, # session data is stored for one hour (needed for the active users view)
199
- :redis_prefix => "fnordmetric"
200
- }
201
-
202
- def start_example_data_generator
203
-
204
- api = FnordMetric::API.new
205
- Thread.new do
206
- loop do
207
- api.event(:_type => :signup, :referrer => (rand(3) == 1 ? :twitter : :facebook))
208
- api.event(:_type => :search, :keyword => (%w(Donau Dampf Schiff Fahrts Kaptitaens Muetzen Staender).shuffle[0..2] * ""))
209
- api.event(:_type => :user_demography, :age => rand(15..55), :gender => (rand(2)==1 ? :female : :male) )
210
- sleep (rand(10)/10.to_f)
211
- end
212
- end
213
-
214
- end
215
-
216
- start_example_data_generator
217
-
218
- FnordMetric::Web.new(:port => 4242)
219
- FnordMetric::Acceptor.new(:protocol => :tcp, :port => 2323)
220
- FnordMetric::Worker.new
221
- FnordMetric.run
222
-
223
-
224
-