fnordmetric 1.0.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/fnordmetric.gemspec +1 -0
- data/lib/fnordmetric.rb +6 -13
- data/lib/fnordmetric/acceptors/acceptor.rb +20 -7
- data/lib/fnordmetric/acceptors/amqp_acceptor.rb +56 -0
- data/lib/fnordmetric/acceptors/fyrehose_acceptor.rb +43 -0
- data/lib/fnordmetric/acceptors/stomp_acceptor.rb +71 -0
- data/lib/fnordmetric/acceptors/tcp_acceptor.rb +1 -0
- data/lib/fnordmetric/acceptors/udp_acceptor.rb +2 -1
- data/lib/fnordmetric/context.rb +21 -9
- data/lib/fnordmetric/defaults.rb +16 -3
- data/lib/fnordmetric/gauge.rb +8 -3
- data/lib/fnordmetric/gauge_calculations.rb +8 -2
- data/lib/fnordmetric/gauge_modifiers.rb +5 -4
- data/lib/fnordmetric/gauges/server_health_gauge.rb +13 -0
- data/lib/fnordmetric/namespace.rb +53 -17
- data/lib/fnordmetric/util.rb +25 -0
- data/lib/fnordmetric/version.rb +1 -1
- data/lib/fnordmetric/web/app.rb +7 -66
- data/lib/fnordmetric/web/reactor.rb +32 -2
- data/lib/fnordmetric/web/websocket.rb +1 -1
- data/lib/fnordmetric/widgets/bars_widget.rb +1 -1
- data/lib/fnordmetric/widgets/numbers_widget.rb +28 -4
- data/lib/fnordmetric/widgets/timeseries_widget.rb +19 -9
- data/lib/fnordmetric/widgets/toplist_widget.rb +8 -4
- data/lib/fnordmetric/worker.rb +5 -1
- data/lib/fnordmetric/zero_config_gauge.rb +138 -0
- data/spec/context_spec.rb +4 -4
- data/spec/event_spec.rb +11 -11
- data/spec/gauge_modifiers_spec.rb +135 -29
- data/spec/gauge_spec.rb +7 -2
- data/spec/namespace_spec.rb +8 -19
- data/spec/util_spec.rb +46 -0
- data/web/.gitignore +4 -0
- data/web/build.sh +34 -0
- data/web/{fnordmetric.css → css/fnordmetric.core.css} +121 -58
- data/web/haml/app.haml +4 -22
- data/web/{loader.gif → img/loader.gif} +0 -0
- data/web/js/fnordmetric.bars_widget.js +3 -3
- data/web/js/fnordmetric.dashboard_view.js +1 -1
- data/web/js/fnordmetric.gauge_explorer.js +173 -0
- data/web/js/fnordmetric.js +93 -33
- data/web/js/fnordmetric.numbers_widget.js +15 -14
- data/web/js/fnordmetric.session_view.js +0 -1
- data/web/js/fnordmetric.timeline_widget.js +3 -3
- data/web/js/fnordmetric.timeseries_widget.js +46 -29
- data/web/js/fnordmetric.toplist_widget.js +23 -16
- data/web/js/fnordmetric.util.js +12 -8
- data/web/vendor/font-awesome/css/font-awesome-ie7.min.css +22 -0
- data/web/vendor/font-awesome/css/font-awesome.css +522 -221
- data/web/vendor/font-awesome/css/font-awesome.min.css +33 -0
- data/web/vendor/font-awesome/font/FontAwesome.otf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.eot +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.svg +278 -169
- data/web/vendor/font-awesome/font/fontawesome-webfont.ttf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.woff +0 -0
- data/web/vendor/jquery-ui.min.js +6 -413
- data/web/vendor/jquery.combobox.js +129 -0
- metadata +55 -48
- data/doc/V1.0-ROADMAP +0 -97
- data/doc/full_example.rb +0 -224
- data/doc/legacy_example.rb +0 -640
- data/doc/minimal_example.rb +0 -26
- data/doc/preview1.png +0 -0
- data/doc/preview2.png +0 -0
- data/doc/preview3.png +0 -0
- data/readme.md +0 -365
- data/web/vendor/d3.v2.js +0 -9382
- data/web/vendor/font-awesome/font/fontawesome-webfont.svgz +0 -0
- data/web/vendor/rickshaw.css +0 -286
- 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
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *12630080
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: redis
|
27
|
-
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: *
|
35
|
+
version_requirements: *12629360
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: eventmachine
|
38
|
-
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: *
|
46
|
+
version_requirements: *12628500
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: websocket-rack
|
49
|
-
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: *
|
57
|
+
version_requirements: *12642320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: em-hiredis
|
60
|
-
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: *
|
68
|
+
version_requirements: *12636300
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: json
|
71
|
-
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: *
|
79
|
+
version_requirements: *12635380
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: i18n
|
82
|
-
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: *
|
90
|
+
version_requirements: *12744500
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: haml
|
93
|
-
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: *
|
101
|
+
version_requirements: *12744080
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rack
|
104
|
-
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: *
|
112
|
+
version_requirements: *12743660
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: rack-test
|
115
|
-
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: *
|
123
|
+
version_requirements: *12743200
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: yajl-ruby
|
126
|
-
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: *
|
134
|
+
version_requirements: *12742760
|
135
135
|
- !ruby/object:Gem::Dependency
|
136
136
|
name: thin
|
137
|
-
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: *
|
145
|
+
version_requirements: *12742260
|
146
146
|
- !ruby/object:Gem::Dependency
|
147
147
|
name: activesupport
|
148
|
-
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: *
|
156
|
+
version_requirements: *12741840
|
157
157
|
- !ruby/object:Gem::Dependency
|
158
158
|
name: delorean
|
159
|
-
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: *
|
167
|
+
version_requirements: *12741380
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
169
|
name: rspec
|
170
|
-
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: *
|
178
|
+
version_requirements: *12740880
|
179
179
|
- !ruby/object:Gem::Dependency
|
180
180
|
name: shoulda
|
181
|
-
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: *
|
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
|
-
-
|
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
|
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/
|
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/
|
306
|
-
- web/
|
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
|
-
|