fnordmetric 0.6.6 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,7 +5,7 @@ FnordMetric is a highly configurable (and pretty fast) realtime app/event
5
5
  tracking thing based on ruby eventmachine and redis. You define your own
6
6
  plotting and counting functions as ruby blocks!
7
7
 
8
- [ ![Build status - Travis-ci](https://secure.travis-ci.org/paulasmuth/fnordmetric.png) ](http://travis-ci.org/paulasmuth/fnordmetric) [ ![Dependency status - Gemnasium](https://gemnasium.com/paulasmuth/fnordmetric.png) ](https://gemnasium.com/paulasmuth/fnordmetric)
8
+ [ ![Build status - Travis-ci](https://secure.travis-ci.org/paulasmuth/fnordmetric.png) ](http://travis-ci.org/paulasmuth/fnordmetric)
9
9
 
10
10
  [SCREENCAST][2]: the FnordMetric-instance we use to track our social dating app.
11
11
 
@@ -105,8 +105,8 @@ The fast way: Add your event directly to the redis-based queue.
105
105
  uuid = (8**32).to_s(36)
106
106
  event = { :_type => "unicorn_seen" }.to_json
107
107
 
108
- redis.set("fnordmetric-event-#{my_uuid}", event)
109
- redis.expire("fnordmetric-event-#{my_uuid}", 60)
108
+ redis.set("fnordmetric-event-#{uuid}", event)
109
+ redis.expire("fnordmetric-event-#{uuid}", 60)
110
110
  redis.lpush("fnordmetric-queue", uuid)
111
111
  ```
112
112
 
@@ -163,10 +163,6 @@ Call these methods from the event-handler block
163
163
 
164
164
  ----
165
165
 
166
- ### Options: Gauges ###
167
-
168
- ----
169
-
170
166
  ### Options: Widgets ###
171
167
 
172
168
  + `[autoupdate]` auto-refresh the timeline every n secs (0 turns autoupdate off)
@@ -185,7 +181,15 @@ BarsWidget
185
181
 
186
182
  ----
187
183
 
188
- ### JSON API ###
184
+
185
+ Resources
186
+ ----------
187
+
188
+ + [PHP API for FnordMetric (github.com/leemachin/fnordmetric-php-api)](https://github.com/leemachin/fnordmetric-php-api)
189
+ + [Python API for FnordMetric (github.com/sholiday/pyfnordmetric)](https://github.com/sholiday/pyfnordmetric)
190
+ + [FnordMetric and C (Blog/Howto)](http://johnmurray.io/log/2012/01/19/FnordMetrics-and-C%23.md)
191
+
192
+ + [The "fnordmetric" google group](http://groups.google.com/group/fnordmetric)
189
193
 
190
194
 
191
195
  Examples
@@ -343,6 +347,8 @@ Contributors
343
347
  + Kacper Bielecki (http://github.com/kazjote)
344
348
  + John Murray (http://github.com/JohnMurray)
345
349
  + Lars Gierth (http://github.com/lgierth)
350
+ + Ross Kaffenberger (http://github.com/rossta)
351
+ + Kunal Modi (http://github.com/kunalmodi)
346
352
 
347
353
  To contribute, please fork this repository, make your changes and run the
348
354
  specs, commit them to your github repository and send me a pull request.
@@ -1,4 +1,4 @@
1
- !!!
1
+ !!!
2
2
  %html
3
3
 
4
4
  %head
@@ -18,7 +18,7 @@
18
18
  %ul
19
19
  -namespaces.each do |key,namespace|
20
20
  %li{:class => namespace.token == current_namespace.token ? 'active' : nil}
21
- %a{:href=>"/#{namespace.token}"}=h namespace.title
21
+ %a{:href=> "#{path_prefix}/#{namespace.token}"}=h namespace.title
22
22
 
23
23
  #wrap
24
24
  #tabs
@@ -35,7 +35,7 @@
35
35
 
36
36
  #viewport
37
37
  .viewport_inner.clearfix
38
-
38
+
39
39
 
40
40
  :javascript
41
41
  $(document).ready(function(){
@@ -56,9 +56,9 @@
56
56
  $(this).addClass('active').siblings().removeClass('active');
57
57
  });
58
58
 
59
- function resizeViewport(){
59
+ function resizeViewport(){
60
60
  var viewport_width = window.innerWidth-220
61
- $('#viewport').width(viewport_width);
61
+ $('#viewport').width(viewport_width);
62
62
  FnordMetric.resizeView();
63
63
  }
64
64
 
@@ -68,7 +68,7 @@
68
68
  if(!#{current_namespace.active_users_available.to_s}) {
69
69
  $('#tabs li:first').trigger('click');
70
70
  }
71
-
71
+
72
72
  if(window.location.hash){
73
73
  $('#tabs li.dashboard[rel="'+window.location.hash.slice(1)+'"]').trigger('click');
74
74
  }
@@ -20,37 +20,33 @@ module FnordMetric
20
20
  def self.server_configuration=(configuration)
21
21
  @@server_configuration = configuration
22
22
  end
23
-
24
- def self.default_options(opts)
25
23
 
26
- opts[:redis_url] ||= "redis://localhost:6379"
27
- opts[:redis_prefix] ||= "fnordmetric"
28
-
29
- opts[:inbound_stream] ||= ["0.0.0.0", "1337"]
30
- opts[:web_interface] ||= ["0.0.0.0", "4242"]
31
- opts[:web_interface_server] ||= "thin"
32
-
33
- opts[:start_worker] ||= true
34
- opts[:print_stats] ||= 3
35
-
36
- # events that aren't processed after 2 min get dropped
37
- opts[:event_queue_ttl] ||= 120
38
-
39
- # event data is kept for one month
40
- opts[:event_data_ttl] ||= 3600*24*30
41
-
42
- # session data is kept for one month
43
- opts[:session_data_ttl] ||= 3600*24*30
24
+ def self.default_options(opts = {})
25
+ {
26
+ :redis_url => "redis://localhost:6379",
27
+ :redis_prefix => "fnordmetric",
28
+ :inbound_stream => ["0.0.0.0", "1337"],
29
+ :web_interface => ["0.0.0.0", "4242"],
30
+ :web_interface_server => "thin",
31
+ :start_worker => true,
32
+ :print_stats => 3,
33
+ :event_queue_ttl => 120,
34
+ :event_data_ttl => 3600*24*30,
35
+ :session_data_ttl => 3600*24*30
36
+ }.merge(opts)
37
+ end
44
38
 
45
- opts
39
+ def self.options(opts = {})
40
+ default_options(@@server_configuration || {}).merge(opts)
46
41
  end
47
42
 
48
- def self.start_em(opts)
43
+ def self.start_em(opts = {})
49
44
  EM.run do
50
45
 
51
46
  trap("TERM", &method(:shutdown))
52
47
  trap("INT", &method(:shutdown))
53
48
 
49
+ opts = options(opts)
54
50
  app = embedded(opts)
55
51
 
56
52
  if opts[:web_interface]
@@ -77,11 +73,10 @@ module FnordMetric
77
73
  end
78
74
 
79
75
  def self.run
80
- opts = (defined?(@@server_configuration) && @@server_configuration) || {}
81
- start_em(opts)
76
+ start_em
82
77
  rescue Exception => e
83
78
  log "!!! eventmachine died, restarting... #{e.message}"
84
- sleep(1); run
79
+ sleep(1); run
85
80
  end
86
81
 
87
82
  def self.shutdown
@@ -113,7 +108,7 @@ module FnordMetric
113
108
  # `:inbound_stream` starts the TCP interface
114
109
  # `:print_stats` periodicaly prints worker stats
115
110
  def self.embedded(opts={})
116
- opts = default_options(opts)
111
+ opts = options(opts)
117
112
  app = nil
118
113
 
119
114
  if opts[:rack_app] or opts[:web_interface]
@@ -157,6 +152,7 @@ require "fnordmetric/numbers_widget"
157
152
  require "fnordmetric/bars_widget"
158
153
  require "fnordmetric/toplist_widget"
159
154
  require "fnordmetric/pie_widget"
155
+ require "fnordmetric/html_widget"
160
156
  require "fnordmetric/namespace"
161
157
  require "fnordmetric/gauge_modifiers"
162
158
  require "fnordmetric/gauge_calculations"
@@ -1,19 +1,20 @@
1
1
  require 'securerandom'
2
2
  class FnordMetric::API
3
3
  @@opts = nil
4
+
4
5
  def initialize opts
5
6
  @@opts = FnordMetric.default_options(opts)
6
7
  connect
7
8
  end
8
-
9
+
9
10
  def connect
10
11
  @redis = Redis.connect(:url => @@opts[:redis_url])
11
12
  end
12
-
13
+
13
14
  def event(event_data)
14
15
  begin
15
16
  if event_data.is_a?(Hash)
16
- event_data = event_data.to_json
17
+ event_data = event_data.to_json
17
18
  else
18
19
  JSON.parse(event_data) # void ;)
19
20
  end
@@ -27,19 +28,19 @@ class FnordMetric::API
27
28
  def disconnect
28
29
  @redis.quit
29
30
  end
30
-
31
- private
32
-
33
- def push_event(event_id, event_data)
34
- prefix = @@opts[:redis_prefix]
31
+
32
+ private
33
+
34
+ def push_event(event_id, event_data)
35
+ prefix = @@opts[:redis_prefix]
35
36
  @redis.hincrby "#{prefix}-testdata", "events_received", 1
36
37
  @redis.hincrby "#{prefix}-stats", "events_received", 1
37
38
  @redis.set "#{prefix}-event-#{event_id}", event_data
38
- @redis.lpush "#{prefix}-queue", event_id
39
+ @redis.lpush "#{prefix}-queue", event_id
39
40
  @redis.expire "#{prefix}-event-#{event_id}", @@opts[:event_queue_ttl]
40
41
  event_id
41
42
  end
42
-
43
+
43
44
  def get_next_uuid
44
45
  SecureRandom.uuid
45
46
  end
@@ -17,7 +17,9 @@ class FnordMetric::Dashboard
17
17
  end
18
18
 
19
19
  def token
20
- title.to_s.gsub(/[\W]/, '')
20
+ token = title.to_s.gsub(/[\W]/, '')
21
+ token = Digest::SHA1.hexdigest(title.to_s) if token.empty?
22
+ token
21
23
  end
22
24
 
23
25
  def to_json
@@ -0,0 +1,28 @@
1
+ class FnordMetric::HtmlWidget < FnordMetric::Widget
2
+ def data
3
+ super.merge(
4
+ :html => @opts[:html]
5
+ )
6
+ end
7
+
8
+ def add_gauges(gauges)
9
+ @gauges = []
10
+ @tick = 0
11
+
12
+ if !gauges.blank?
13
+ error! "initializing a html widget with gauges is void"
14
+ end
15
+ end
16
+
17
+ def data_gauges
18
+ {}
19
+ end
20
+
21
+ def default_range(now=Time.now)
22
+ 0..0
23
+ end
24
+
25
+ def has_tick?
26
+ false
27
+ end
28
+ end
@@ -1,3 +1,3 @@
1
1
  module FnordMetric
2
- VERSION = "0.6.6"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -17,7 +17,9 @@ class FnordMetric::Widget
17
17
  end
18
18
 
19
19
  def token
20
- title.to_s.gsub(/[\W]/, '').downcase
20
+ token = title.to_s.gsub(/[\W]/, '').downcase
21
+ token = Digest::SHA1.hexdigest(title.to_s) if token.empty?
22
+ token
21
23
  end
22
24
 
23
25
  def add_gauges(gauges)
@@ -178,6 +178,31 @@ var FnordMetric = (function(){
178
178
 
179
179
  };
180
180
 
181
+ var htmlWidget = function(){
182
+ function render(opts){
183
+
184
+ opts.elem.append(
185
+ $('<div class="headbar small"></div>').html(opts.title)
186
+ ).css({
187
+ 'marginBottom': 20,
188
+ 'overflow': 'hidden'
189
+ });
190
+
191
+ var container = $('<div></div>')
192
+ .addClass('html_container')
193
+ .html(opts.html);
194
+
195
+ opts.elem.append(container);
196
+ }
197
+
198
+ function updateValues(opts){}
199
+ function updatedisplay(opts, diff_factor){}
200
+
201
+ return {
202
+ render: render
203
+ };
204
+ }
205
+
181
206
  var numbersWidget = function(){
182
207
 
183
208
 
@@ -604,7 +629,6 @@ var FnordMetric = (function(){
604
629
 
605
630
  };
606
631
 
607
-
608
632
  var pieWidget = function(){
609
633
 
610
634
  function render(opts){
@@ -1078,6 +1102,7 @@ var FnordMetric = (function(){
1078
1102
  if(widget.klass=='NumbersWidget'){ numbersWidget().render(widget); }
1079
1103
  if(widget.klass=='ToplistWidget'){ toplistWidget().render(widget); }
1080
1104
  if(widget.klass=='PieWidget'){ pieWidget().render(widget); }
1105
+ if(widget.klass=="HtmlWidget") { htmlWidget().render(widget); }
1081
1106
  };
1082
1107
 
1083
1108
  function resizeWidget(wkey){
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require ::File.expand_path('../spec_helper.rb', __FILE__)
2
3
 
3
4
  describe FnordMetric::Dashboard do
@@ -20,6 +21,11 @@ describe FnordMetric::Dashboard do
20
21
  dashboard.token.should == 'MyF00barDash_board'
21
22
  end
22
23
 
24
+ it "should build the correct token if the dashboard name contains non-english characters" do
25
+ dashboard = FnordMetric::Dashboard.new(:title => 'Новая статистика!'){ |dash| }
26
+ dashboard.token.should_not be_empty
27
+ end
28
+
23
29
  it "should add a widget" do
24
30
  pending("fix this")
25
31
  #dashboard = FnordMetric::Dashboard.new(:title => 'My!F00bar-.Dash_board'){ |dash| }
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe FnordMetric do
4
+ after { FnordMetric.server_configuration = nil }
5
+
6
+ it "has default_options" do
7
+ opts = FnordMetric.default_options
8
+ opts[:redis_url].should eq("redis://localhost:6379")
9
+ opts[:redis_prefix].should eq("fnordmetric")
10
+ opts[:inbound_stream].should eq(["0.0.0.0", "1337"])
11
+ opts[:web_interface].should eq(["0.0.0.0", "4242"])
12
+ opts[:web_interface_server].should eq("thin")
13
+ opts[:start_worker].should be_true
14
+ opts[:print_stats].should == 3
15
+ opts[:event_queue_ttl].should == 120
16
+ opts[:event_data_ttl].should == 3600*24*30
17
+ opts[:session_data_ttl].should == 3600*24*30
18
+ end
19
+
20
+ it "default_options can be overriden" do
21
+ opts = FnordMetric.default_options({
22
+ :redis_url => "redis://example.com:6379",
23
+ :redis_prefix => "foobar",
24
+ :inbound_stream => ["0.0.0.0", "7331"],
25
+ :web_interface => ["0.0.0.0", "2424"],
26
+ :web_interface_server => "hatetepe",
27
+ :start_worker => false,
28
+ :print_stats => false,
29
+ :event_queue_ttl => 10,
30
+ :event_data_ttl => 20,
31
+ :session_data_ttl => 30,
32
+ })
33
+ opts[:redis_url].should eq("redis://example.com:6379")
34
+ opts[:redis_prefix].should eq("foobar")
35
+ opts[:inbound_stream].should eq(["0.0.0.0", "7331"])
36
+ opts[:web_interface].should eq(["0.0.0.0", "2424"])
37
+ opts[:web_interface_server].should eq("hatetepe")
38
+ opts[:start_worker].should be_false
39
+ opts[:print_stats].should be_false
40
+ opts[:event_queue_ttl].should == 10
41
+ opts[:event_data_ttl].should == 20
42
+ opts[:session_data_ttl].should == 30
43
+ end
44
+
45
+ it "merges default, server configuration, and given opts as options" do
46
+ FnordMetric.server_configuration = { :web_interface_server => "hatetepe", :print_stats => true }
47
+ opts = FnordMetric.options(:redis_url => "redis://example.com:6379", :print_stats => false)
48
+
49
+ opts[:redis_url].should eq("redis://example.com:6379")
50
+ opts[:redis_prefix].should eq("fnordmetric")
51
+ opts[:web_interface_server].should eq("hatetepe")
52
+ opts[:print_stats].should be_false
53
+ end
54
+
55
+
56
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: fnordmetric
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.6
5
+ version: 0.7.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paul Asmuth
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-01-21 00:00:00 +01:00
13
+ date: 2012-04-21 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -224,6 +224,7 @@ files:
224
224
  - lib/fnordmetric/gauge.rb
225
225
  - lib/fnordmetric/gauge_calculations.rb
226
226
  - lib/fnordmetric/gauge_modifiers.rb
227
+ - lib/fnordmetric/html_widget.rb
227
228
  - lib/fnordmetric/inbound_stream.rb
228
229
  - lib/fnordmetric/logger.rb
229
230
  - lib/fnordmetric/metric.rb
@@ -250,6 +251,7 @@ files:
250
251
  - spec/context_spec.rb
251
252
  - spec/dashboard_spec.rb
252
253
  - spec/event_spec.rb
254
+ - spec/fnordmetric_spec.rb
253
255
  - spec/gauge_modifiers_spec.rb
254
256
  - spec/gauge_spec.rb
255
257
  - spec/inbound_stream_spec.rb
@@ -292,6 +294,7 @@ test_files:
292
294
  - spec/context_spec.rb
293
295
  - spec/dashboard_spec.rb
294
296
  - spec/event_spec.rb
297
+ - spec/fnordmetric_spec.rb
295
298
  - spec/gauge_modifiers_spec.rb
296
299
  - spec/gauge_spec.rb
297
300
  - spec/inbound_stream_spec.rb