fnordmetric 1.0.1 → 1.2.0

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.
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
-