fnordmetric 0.3.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -0
- data/Gemfile.lock +21 -0
- data/Procfile +1 -2
- data/VERSION +1 -1
- data/_spec/app_spec.rb +178 -0
- data/{spec → _spec}/cache_spec.rb +0 -0
- data/{spec → _spec}/combine_metric_spec.rb +0 -0
- data/{spec → _spec}/core_spec.rb +0 -0
- data/{spec → _spec}/count_metric_spec.rb +0 -0
- data/_spec/dashboard_spec.rb +67 -0
- data/_spec/event_spec.rb +46 -0
- data/{spec → _spec}/metric_spec.rb +0 -0
- data/{spec → _spec}/report_spec.rb +0 -0
- data/{spec → _spec}/sum_metric_spec.rb +0 -0
- data/_spec/widget_spec.rb +107 -0
- data/doc/import_dump.rb +26 -0
- data/em_runner.rb +33 -0
- data/fnordmetric.gemspec +59 -20
- data/haml/app.haml +26 -12
- data/lib/fnordmetric.rb +150 -15
- data/lib/fnordmetric/app.rb +70 -11
- data/lib/fnordmetric/cache.rb +4 -4
- data/lib/fnordmetric/context.rb +65 -0
- data/lib/fnordmetric/dashboard.rb +16 -12
- data/lib/fnordmetric/event.rb +65 -15
- data/lib/fnordmetric/gauge.rb +46 -0
- data/lib/fnordmetric/gauge_calculations.rb +43 -0
- data/lib/fnordmetric/gauge_modifiers.rb +43 -0
- data/lib/fnordmetric/inbound_stream.rb +66 -0
- data/lib/fnordmetric/logger.rb +38 -0
- data/lib/fnordmetric/namespace.rb +120 -0
- data/lib/fnordmetric/numbers_widget.rb +29 -11
- data/lib/fnordmetric/session.rb +131 -0
- data/lib/fnordmetric/standalone.rb +31 -0
- data/lib/fnordmetric/timeline_widget.rb +29 -9
- data/lib/fnordmetric/widget.rb +50 -45
- data/lib/fnordmetric/worker.rb +80 -0
- data/pub/fnordmetric/fnordmetric.css +76 -9
- data/pub/fnordmetric/fnordmetric.js +541 -42
- data/pub/raphael-min.js +8 -0
- data/pub/raphael-utils.js +221 -0
- data/readme.rdoc +172 -27
- data/server.rb +22 -0
- data/spec/app_spec.rb +359 -117
- data/spec/context_spec.rb +42 -0
- data/spec/dashboard_spec.rb +7 -47
- data/spec/event_spec.rb +114 -33
- data/spec/gauge_modifiers_spec.rb +276 -0
- data/spec/gauge_spec.rb +128 -0
- data/spec/namespace_spec.rb +104 -0
- data/spec/session_spec.rb +231 -0
- data/spec/spec_helper.rb +27 -4
- data/spec/widget_spec.rb +81 -75
- data/spec/worker_spec.rb +37 -0
- data/test_stream.sh +187 -0
- data/ulm_stats.rb +198 -0
- metadata +114 -35
- data/lib/fnordmetric/core.rb +0 -66
- data/lib/fnordmetric/engine.rb +0 -3
@@ -0,0 +1,42 @@
|
|
1
|
+
require ::File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe FnordMetric::Context do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@redis = Redis.new
|
7
|
+
@redis_wrap = RedisWrap.new(@redis)
|
8
|
+
end
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
@redis.keys("fnordmetrictest*").each { |k| @redis.del(k) }
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should fetch a gauge by key"
|
15
|
+
it "should fetch a gauge by gauge"
|
16
|
+
it "should raise an error if unable to fetch a gauge"
|
17
|
+
|
18
|
+
it "should expose the current session_key" do
|
19
|
+
ns = FnordMetric::Namespace.new(
|
20
|
+
:myns_253,
|
21
|
+
:redis_prefix => "fnordmetrictest"
|
22
|
+
)
|
23
|
+
ns.opt_event(:fnordbar, {}) do
|
24
|
+
session_key.should == "145d3f6dee1a770e3a3c550b3993dc81"
|
25
|
+
end
|
26
|
+
ns.ready!(@redis_wrap).announce(
|
27
|
+
:_eid => "35r2423",
|
28
|
+
:_time => Time.now.to_i,
|
29
|
+
:_type => "fnordbar",
|
30
|
+
:_session => "sess213"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should instance-eval the handler on call" do
|
35
|
+
Thread.current["fnord_123"] = false
|
36
|
+
my_block = proc{ Thread.current["fnord_123"] = "35r25" }
|
37
|
+
context = FnordMetric::Context.new({}, my_block)
|
38
|
+
context.call({}, nil)
|
39
|
+
Thread.current["fnord_123"].should == "35r25"
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/dashboard_spec.rb
CHANGED
@@ -3,12 +3,10 @@ require ::File.expand_path('../spec_helper.rb', __FILE__)
|
|
3
3
|
describe FnordMetric::Dashboard do
|
4
4
|
|
5
5
|
before(:each) do
|
6
|
-
FnordMetric::Event.destroy_all
|
7
|
-
FnordMetric.reset_metrics
|
8
6
|
end
|
9
7
|
|
10
8
|
it "should remember it's title" do
|
11
|
-
dashboard = FnordMetric::Dashboard.new(:title => 'My Foobar Dashboard')
|
9
|
+
dashboard = FnordMetric::Dashboard.new(:title => 'My Foobar Dashboard')
|
12
10
|
dashboard.title.should == 'My Foobar Dashboard'
|
13
11
|
end
|
14
12
|
|
@@ -18,50 +16,12 @@ describe FnordMetric::Dashboard do
|
|
18
16
|
end
|
19
17
|
|
20
18
|
it "should add a widget" do
|
21
|
-
|
22
|
-
FnordMetric.
|
23
|
-
|
24
|
-
|
25
|
-
dashboard.
|
26
|
-
|
27
|
-
|
28
|
-
it "should add a widget by name" do
|
29
|
-
dashboard = FnordMetric::Dashboard.new(:title => 'My!F00bar-.Dash_board'){ |dash| }
|
30
|
-
FnordMetric.metric(:my_metric, :sum => :my_field)
|
31
|
-
widget = FnordMetric.widget(:my_widget, :metrics => :my_metric, :title => "My Widget", :type => :timeline)
|
32
|
-
dashboard.add_widget(:my_widget)
|
33
|
-
dashboard.widgets.first.should == widget
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should add the report on init (and to all widgets)" do
|
37
|
-
FnordMetric.metric(:my_metric, :sum => :my_field)
|
38
|
-
report = FnordMetric.report(:range => (4.days.ago..Time.now))
|
39
|
-
dashboard = FnordMetric::Dashboard.new(:title => 'My Foobar Dashboard', :report => report){ |dash|
|
40
|
-
dash.add_widget FnordMetric.widget(:my_widget, :metrics => :my_metric, :title => "My Widget", :type => :timeline)
|
41
|
-
}
|
42
|
-
dashboard.report.should == report
|
43
|
-
dashboard.widgets.last.report.should == report
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should add the report after init (and to all widgets)" do
|
47
|
-
FnordMetric.metric(:my_metric, :sum => :my_field)
|
48
|
-
report = FnordMetric.report(:range => (4.days.ago..Time.now))
|
49
|
-
dashboard = FnordMetric::Dashboard.new(:title => 'My Foobar Dashboard'){ |dash|
|
50
|
-
dash.add_widget FnordMetric.widget(:my_widget, :metrics => :my_metric, :title => "My Widget", :type => :timeline)
|
51
|
-
}
|
52
|
-
dashboard.report.should == nil
|
53
|
-
dashboard.add_report(report)
|
54
|
-
dashboard.report.should == report
|
55
|
-
dashboard.widgets.last.report.should == report
|
56
|
-
end
|
57
|
-
|
58
|
-
it "should call the config block" do
|
59
|
-
block_called = false
|
60
|
-
FnordMetric::Dashboard.new(:title => 'My Dashboard') do |dash|
|
61
|
-
block_called = true
|
62
|
-
dash.should be_a(FnordMetric::Dashboard)
|
63
|
-
end
|
64
|
-
block_called.should be_true
|
19
|
+
pending("fix this")
|
20
|
+
#dashboard = FnordMetric::Dashboard.new(:title => 'My!F00bar-.Dash_board'){ |dash| }
|
21
|
+
#FnordMetric.metric(:my_metric, :sum => :my_field)
|
22
|
+
#idget = FnordMetric.widget(:my_widget, :metrics => :my_metric, :title => "My Widget", :type => :timeline)
|
23
|
+
#dashboard.add_widget(widget)
|
24
|
+
#dashboard.widgets.first.should == widget
|
65
25
|
end
|
66
26
|
|
67
27
|
end
|
data/spec/event_spec.rb
CHANGED
@@ -1,46 +1,127 @@
|
|
1
1
|
require ::File.expand_path('../spec_helper.rb', __FILE__)
|
2
2
|
|
3
|
-
|
3
|
+
describe FnordMetric::Event do
|
4
4
|
|
5
|
-
|
5
|
+
include FnordMetric
|
6
6
|
|
7
|
-
before(:
|
8
|
-
|
9
|
-
|
7
|
+
before(:all) do
|
8
|
+
@now = Time.utc(1992,01,13,5,23,23).to_i
|
9
|
+
@redis = Redis.new
|
10
|
+
@redis_wrap = RedisWrap.new(@redis)
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
Event.last[:type].should == "_referral"
|
14
|
-
Event.last[:foobar].should == "fnord"
|
15
|
-
end
|
12
|
+
@namespace = "fnordmetric-test-ns123"
|
13
|
+
@timeline = "#{@namespace}-timeline"
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
@opts = {
|
16
|
+
:namespace_prefix => "#{@namespace}",
|
17
|
+
:redis_prefix => "fnordmetric-test",
|
18
|
+
:redis => @redis
|
19
|
+
}
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
event = Event.track!('_referral', :foobar => "fnord")
|
24
|
-
Event.last.type.should == "_referral"
|
25
|
-
Event.last.foobar.should == "fnord"
|
26
|
-
end
|
22
|
+
describe "finding events" do
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
Event.last[:type].should == "_referral"
|
32
|
-
Event.last[:foobar].should == "fnord"
|
33
|
-
Event.last[:time].should == my_time.to_i
|
34
|
-
end
|
24
|
+
before(:each) do
|
25
|
+
@redis.keys("fnordmetric-test-*").each { |k| @redis.del(k) }
|
26
|
+
end
|
35
27
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
28
|
+
it "should find all events" do
|
29
|
+
create_event("242342", {:_type => "foo", :_time => @now})
|
30
|
+
create_event("453484", {:_type => "foo", :_time => @now})
|
31
|
+
Event.all(@opts).length.should == 2
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should find all events and return event objects" do
|
35
|
+
create_event("434454", {:_type => "foo", :_time => @now})
|
36
|
+
Event.all(@opts).first.should be_a(FnordMetric::Event)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should find all events and returnevent objects with time" do
|
40
|
+
create_event("352234", {:_type => "Fn0rd", :blah => :blubb, :_time => @now})
|
41
|
+
events = Event.all(@opts)
|
42
|
+
events.first.time.to_i.should == @now
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should find an event and return a event object" do
|
46
|
+
create_event("756753", {:_type => "Fn0rd", :_time => @now})
|
47
|
+
event = Event.find("756753", @opts)
|
48
|
+
event.should be_a(FnordMetric::Event)
|
49
|
+
event.type.should == "Fn0rd"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should find an event and return a event object with data" do
|
53
|
+
create_event("53454", {:_type => "Fn0rd", :blah => :blubb, :_time => @now})
|
54
|
+
event = Event.find("53454", @opts)
|
55
|
+
event.data(:blah).should == "blubb"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should find an event and return a event object with id" do
|
59
|
+
create_event("5262435", {:_type => "Fn0rd", :blah => :blubb, :_time => @now})
|
60
|
+
event = Event.find("5262435", @opts)
|
61
|
+
event.id.should == "5262435"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should find all in the correct order" do
|
65
|
+
create_event("5645642", {:_type => "foo", :_time => @now-17})
|
66
|
+
create_event("2342366", {:_type => "foo", :_time => @now-23})
|
67
|
+
create_event("3452345", {:_type => "foo", :_time => @now-42})
|
68
|
+
create_event("6345345", {:_type => "foo", :_time => @now-5})
|
69
|
+
Event.all(@opts).length.should == 4
|
70
|
+
Event.all(@opts)[0].id.should == "6345345"
|
71
|
+
Event.all(@opts)[1].id.should == "5645642"
|
72
|
+
Event.all(@opts)[2].id.should == "2342366"
|
73
|
+
Event.all(@opts)[3].id.should == "3452345"
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should find all events since a given time, including that exact time" do
|
77
|
+
create_event("3452345", {:_type => "foo", :_time => @now-42})
|
78
|
+
create_event("2342366", {:_type => "foo", :_time => @now-23})
|
79
|
+
create_event("5645642", {:_type => "foo", :_time => @now-17})
|
80
|
+
create_event("6345345", {:_type => "foo", :_time => @now-5})
|
81
|
+
Event.all(@opts).length.should == 4
|
82
|
+
Event.all(@opts.merge(:since => @now-42)).length.should == 4
|
83
|
+
Event.all(@opts.merge(:since => @now-23)).length.should == 3
|
84
|
+
Event.all(@opts.merge(:since => @now-22)).length.should == 2
|
85
|
+
Event.all(@opts.merge(:since => @now-17)).length.should == 2
|
86
|
+
Event.all(@opts.merge(:since => @now-16)).length.should == 1
|
87
|
+
Event.all(@opts.merge(:since => @now-5)).length.should == 1
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should find a maximum number of events" do
|
91
|
+
create_event("3452345", {:_type => "foo", :_time => @now-42})
|
92
|
+
create_event("2342366", {:_type => "foo", :_time => @now-23})
|
93
|
+
create_event("5645642", {:_type => "foo", :_time => @now-17})
|
94
|
+
create_event("6345345", {:_type => "foo", :_time => @now-5})
|
95
|
+
Event.all(@opts).length.should == 4
|
96
|
+
Event.all(@opts.merge(:limit => 2)).length.should == 2
|
97
|
+
Event.all(@opts.merge(:limit => 2)).first.id.should == "6345345"
|
98
|
+
Event.all(@opts.merge(:limit => 2)).last.id.should == "5645642"
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should find all events by type" do
|
102
|
+
namespace = Namespace.new(:ns123, :redis_prefix => "fnordmetric-test")
|
103
|
+
namespace.ready!(@redis_wrap).announce(
|
104
|
+
:_type => "fn0rd",
|
105
|
+
:_time => @now
|
106
|
+
)
|
107
|
+
namespace.ready!(@redis_wrap).announce(
|
108
|
+
:_type => "f00bar",
|
109
|
+
:_time => @now
|
110
|
+
)
|
111
|
+
namespace.ready!(@redis_wrap).announce(
|
112
|
+
:_type => "fn0rd",
|
113
|
+
:_time => @now
|
114
|
+
)
|
115
|
+
Event.by_type('fn0rd', @opts).length.should == 2
|
116
|
+
Event.by_type('f00bar', @opts).length.should == 1
|
117
|
+
end
|
118
|
+
|
119
|
+
def create_event(event_id, event_data)
|
120
|
+
@redis_wrap.zadd(@timeline, event_data.delete(:_time), event_id)
|
121
|
+
@redis.set("fnordmetric-test-event-#{event_id}", event_data.to_json)
|
122
|
+
end
|
40
123
|
|
41
|
-
it "should save float data" do
|
42
|
-
event = Event.track!('_test', :num => 42.5)
|
43
|
-
Event.last.num.should == 42.5
|
44
124
|
end
|
45
|
-
|
125
|
+
|
126
|
+
|
46
127
|
end
|
@@ -0,0 +1,276 @@
|
|
1
|
+
require ::File.expand_path('../spec_helper.rb', __FILE__)
|
2
|
+
|
3
|
+
describe FnordMetric::GaugeModifiers do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@now = Time.utc(1992,01,13,5,23,23).to_i
|
7
|
+
@redis = Redis.new
|
8
|
+
@redis_wrap = RedisWrap.new(@redis)
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@redis.keys("fnordmetrics-myns*").each { |k| @redis.del(k) }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "increment non-progressive gauges" do
|
16
|
+
|
17
|
+
it "should increment a non-progressive gauge by 1" do
|
18
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_234-10"
|
19
|
+
@redis.hset(gauge_key, "695280200", "12")
|
20
|
+
create_gauge_context({
|
21
|
+
:key => "mygauge_234",
|
22
|
+
:tick => 10,
|
23
|
+
}, proc{
|
24
|
+
incr(:mygauge_234, 1)
|
25
|
+
}).tap do |context|
|
26
|
+
event = { :_time => @now }
|
27
|
+
context.call(event, @redis_wrap)
|
28
|
+
end
|
29
|
+
@redis.hget(gauge_key, "695280200").should == "13"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should increment a non-progressive gauge by 5" do
|
33
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_224-10"
|
34
|
+
@redis.hset(gauge_key, "695280200", "18")
|
35
|
+
create_gauge_context({
|
36
|
+
:key => "mygauge_224",
|
37
|
+
:tick => 10,
|
38
|
+
}, proc{
|
39
|
+
incr(:mygauge_224, 5)
|
40
|
+
}).tap do |context|
|
41
|
+
event = { :_time => @now }
|
42
|
+
context.call(event, @redis_wrap)
|
43
|
+
end
|
44
|
+
@redis.hget(gauge_key, "695280200").should == "23"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should increment a non-progressive gauge by event_value" do
|
48
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_253-10"
|
49
|
+
@redis.hset(gauge_key, "695280200", "11")
|
50
|
+
create_gauge_context({
|
51
|
+
:key => "mygauge_253",
|
52
|
+
:tick => 10,
|
53
|
+
}, proc{
|
54
|
+
incr(:mygauge_253, data[:myval].to_i)
|
55
|
+
}).tap do |context|
|
56
|
+
event = { :_time => @now, :myval => "25" }
|
57
|
+
context.call(event, @redis_wrap)
|
58
|
+
end
|
59
|
+
@redis.hget(gauge_key, "695280200").should == "36"
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
describe "increment progressive gauges" do
|
66
|
+
|
67
|
+
it "should increment a progressive gauge by 1" do
|
68
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_123-10"
|
69
|
+
@redis.hset(gauge_key, "695280200", "23")
|
70
|
+
@redis.set(gauge_key+"-head", "23")
|
71
|
+
create_gauge_context({
|
72
|
+
:key => "mygauge_123",
|
73
|
+
:tick => 10,
|
74
|
+
:progressive => true
|
75
|
+
}, proc{
|
76
|
+
incr(:mygauge_123, 1)
|
77
|
+
}).tap do |context|
|
78
|
+
event = { :_time => @now }
|
79
|
+
context.call(event, @redis_wrap)
|
80
|
+
end
|
81
|
+
@redis.hget(gauge_key, "695280200").should == "24"
|
82
|
+
@redis.get(gauge_key+"-head").should == "24"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should increment a progressive gauge by 5" do
|
86
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_125-10"
|
87
|
+
@redis.hset(gauge_key, "695280200", "22")
|
88
|
+
@redis.set(gauge_key+"-head", "22")
|
89
|
+
create_gauge_context({
|
90
|
+
:key => "mygauge_125",
|
91
|
+
:tick => 10,
|
92
|
+
:progressive => true
|
93
|
+
}, proc{
|
94
|
+
incr(:mygauge_125, 5)
|
95
|
+
}).tap do |context|
|
96
|
+
event = { :_time => @now }
|
97
|
+
context.call(event, @redis_wrap)
|
98
|
+
end
|
99
|
+
@redis.hget(gauge_key, "695280200").should == "27"
|
100
|
+
@redis.get(gauge_key+"-head").should == "27"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should increment a progressive gauge by 1 and copy head" do
|
104
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_128-10"
|
105
|
+
@redis.hdel(gauge_key, "695280200")
|
106
|
+
@redis.set(gauge_key+"-head", "17")
|
107
|
+
create_gauge_context({
|
108
|
+
:key => "mygauge_128",
|
109
|
+
:tick => 10,
|
110
|
+
:progressive => true
|
111
|
+
}, proc{
|
112
|
+
incr(:mygauge_128, 3)
|
113
|
+
}).tap do |context|
|
114
|
+
event = { :_time => @now }
|
115
|
+
context.call(event, @redis_wrap)
|
116
|
+
end
|
117
|
+
@redis.hget(gauge_key, "695280200").should == "20"
|
118
|
+
@redis.get(gauge_key+"-head").should == "20"
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should increment a progressive gauge by 5 and copy head" do
|
122
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_121-10"
|
123
|
+
@redis.hdel(gauge_key, "695280200")
|
124
|
+
@redis.set(gauge_key+"-head", "19")
|
125
|
+
create_gauge_context({
|
126
|
+
:key => "mygauge_121",
|
127
|
+
:tick => 10,
|
128
|
+
:progressive => true
|
129
|
+
}, proc{
|
130
|
+
incr(:mygauge_121, 6)
|
131
|
+
}).tap do |context|
|
132
|
+
event = { :_time => @now }
|
133
|
+
context.call(event, @redis_wrap)
|
134
|
+
end
|
135
|
+
@redis.hget(gauge_key, "695280200").should == "25"
|
136
|
+
@redis.get(gauge_key+"-head").should == "25"
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should raise an error if incr is called on a 3d gauge" do
|
140
|
+
create_gauge_context({
|
141
|
+
:key => "mygauge_167",
|
142
|
+
:tick => 10,
|
143
|
+
:three_dimensional => true
|
144
|
+
}, proc{
|
145
|
+
incr(:mygauge_167, 1)
|
146
|
+
}).tap do |context|
|
147
|
+
event = { :_time => @now }
|
148
|
+
lambda{
|
149
|
+
context.call(event, @redis_wrap)
|
150
|
+
}.should raise_error(RuntimeError)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "increment uniquely by session_key" do
|
157
|
+
|
158
|
+
it "should increment_unique a non-progressive gauge" do
|
159
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_963-10"
|
160
|
+
@redis.hset(gauge_key, "695280200", "54")
|
161
|
+
@redis.set(gauge_key+"-695280200-sessions-count", 5)
|
162
|
+
create_gauge_context({
|
163
|
+
:key => "mygauge_963",
|
164
|
+
:unique => true,
|
165
|
+
:tick => 10
|
166
|
+
}, proc{
|
167
|
+
incr(:mygauge_963, 30)
|
168
|
+
}).tap do |context|
|
169
|
+
event = { :_time => @now, :_session_key => "mysesskey" }
|
170
|
+
context.call(event, @redis_wrap)
|
171
|
+
end
|
172
|
+
@redis.hget(gauge_key, "695280200").should == "84"
|
173
|
+
@redis.get(gauge_key+"-695280200-sessions-count").should == "6"
|
174
|
+
@redis.smembers(gauge_key+"-695280200-sessions").should == ["mysesskey"]
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should not increment_unique a non-progressive gauge if session is known" do
|
178
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_966"
|
179
|
+
@redis.hset(gauge_key, "695280200", "54")
|
180
|
+
@redis.set(gauge_key+"-695280200-sessions-count", 5)
|
181
|
+
@redis.sadd(gauge_key+"-695280200-sessions", "mysesskey")
|
182
|
+
create_gauge_context({
|
183
|
+
:key => "mygauge_966",
|
184
|
+
:unique => true,
|
185
|
+
:tick => 10
|
186
|
+
}, proc{
|
187
|
+
incr(:mygauge_966, 30)
|
188
|
+
}).tap do |context|
|
189
|
+
event = { :_time => @now, :_session_key => "mysesskey" }
|
190
|
+
context.call(event, @redis_wrap)
|
191
|
+
end
|
192
|
+
@redis.hget(gauge_key, "695280200").should == "54"
|
193
|
+
@redis.get(gauge_key+"-695280200-sessions-count").should == "5"
|
194
|
+
@redis.smembers(gauge_key+"-695280200-sessions").should == ["mysesskey"]
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should not increment_unique a non-progressive gauge w/o session" do
|
198
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_966"
|
199
|
+
@redis.hset(gauge_key, "695280200", "54")
|
200
|
+
@redis.set(gauge_key+"-695280200-sessions-count", 5)
|
201
|
+
create_gauge_context({
|
202
|
+
:key => "mygauge_966",
|
203
|
+
:unique => true,
|
204
|
+
:tick => 10
|
205
|
+
}, proc{
|
206
|
+
incr(:mygauge_966, 30)
|
207
|
+
}).tap do |context|
|
208
|
+
event = { :_time => @now }
|
209
|
+
context.call(event, @redis_wrap)
|
210
|
+
end
|
211
|
+
@redis.hget(gauge_key, "695280200").should == "54"
|
212
|
+
@redis.get(gauge_key+"-695280200-sessions-count").should == "5"
|
213
|
+
@redis.smembers(gauge_key+"-695280200-sessions").should == []
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
it "should increment_unique a non-progressive gauge" do
|
218
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_963-10"
|
219
|
+
@redis.hset(gauge_key, "695280200", "54")
|
220
|
+
@redis.set(gauge_key+"-progressive-sessions-count", 5)
|
221
|
+
create_gauge_context({
|
222
|
+
:key => "mygauge_963",
|
223
|
+
:tick => 10,
|
224
|
+
:unique => true,
|
225
|
+
:progressive => true
|
226
|
+
}, proc{
|
227
|
+
incr(:mygauge_963, 30)
|
228
|
+
}).tap do |context|
|
229
|
+
event = { :_time => @now, :_session_key => "mysesskey" }
|
230
|
+
context.call(event, @redis_wrap)
|
231
|
+
end
|
232
|
+
@redis.hget(gauge_key, "695280200").should == "84"
|
233
|
+
@redis.get(gauge_key+"-progressive-sessions-count").should == "6"
|
234
|
+
@redis.smembers(gauge_key+"-progressive-sessions").should == ["mysesskey"]
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should not increment_unique a non-progressive gauge if session is known" do
|
238
|
+
gauge_key = "fnordmetrics-myns-gauge-mygauge_966"
|
239
|
+
@redis.hset(gauge_key, "695280200", "54")
|
240
|
+
@redis.set(gauge_key+"-progressive-sessions-count", 5)
|
241
|
+
@redis.sadd(gauge_key+"-progressive-sessions", "mysesskey")
|
242
|
+
create_gauge_context({
|
243
|
+
:key => "mygauge_966",
|
244
|
+
:tick => 10,
|
245
|
+
:unique => true,
|
246
|
+
:progressive => true
|
247
|
+
}, proc{
|
248
|
+
incr(:mygauge_966, 30)
|
249
|
+
}).tap do |context|
|
250
|
+
event = { :_time => @now, :_session_key => "mysesskey" }
|
251
|
+
context.call(event, @redis_wrap)
|
252
|
+
end
|
253
|
+
@redis.hget(gauge_key, "695280200").should == "54"
|
254
|
+
@redis.get(gauge_key+"-progressive-sessions-count").should == "5"
|
255
|
+
@redis.smembers(gauge_key+"-progressive-sessions").should == ["mysesskey"]
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should increment a field on a three-dimensional gauge by 1"
|
261
|
+
it "should increment a field on a three-dimensional gauge by 5"
|
262
|
+
it "should raise an error if incr_field is called on a 2d gauge"
|
263
|
+
|
264
|
+
private
|
265
|
+
|
266
|
+
def create_gauge_context(opts, block)
|
267
|
+
gauge = FnordMetric::Gauge.new({
|
268
|
+
:key_prefix => "fnordmetrics-myns"
|
269
|
+
}.merge(opts))
|
270
|
+
FnordMetric::Context.new({
|
271
|
+
:gauges => { opts[:key].intern => gauge }
|
272
|
+
}, block)
|
273
|
+
end
|
274
|
+
|
275
|
+
|
276
|
+
end
|