rstatsd 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,13 +1,15 @@
1
1
  # rstatsd
2
2
 
3
- rstatsd is a ruby based daemon for capturing data from statsd clients.
3
+ rstatsd is a ruby based daemon for capturing data from statsd clients and
4
+ displaying graphs. It stores graph data in fixed-length data structures
5
+ in redis.
4
6
 
5
- rstatsd is inspired by the work at etsy to measure everything, measure
6
- anything. They use a combination of node.js and graphite to capture and
7
- graph this data.
7
+ rstatsd is inspired by the work at etsy to measure anything, measure
8
+ everything. They use a combination of node.js and graphite to capture
9
+ and graph this data.
8
10
 
9
- The goal of this project was to replicate this light-weight approach and
10
- reduce the number of dependencies to do this to two: redis and ruby.
11
+ The goal of this project was to replicate this approach in a very light-weight
12
+ way by reducing the number of dependencies to do this to two: redis and ruby.
11
13
 
12
14
  ## Installation
13
15
 
@@ -25,25 +27,21 @@ Start the collection daemon and server
25
27
 
26
28
  $ rstatsd
27
29
 
28
- Add some data (you'll need a statsd compatible client like statsd-ruby)
30
+ Open the web server in a browser and follow the directions:
29
31
 
30
- $ irb
31
- irb> require 'statsd'
32
- => true
33
- irb> s = Statsd.new('localhost')
34
- => #<Statsd:0x007fee419866d8 @host="localhost", @port=8125>
35
- irb(main):004:0> s.increment('grebulons')
36
- => 10
37
- irb> s.increment('grebulons')
38
- => 10
39
- irb> s.increment('grebulons')
40
- => 10
41
- irb> s.increment('grebulons')
42
- => 10
32
+ $ open http://localhost:8126/
43
33
 
34
+ ## URL Schema
44
35
 
45
- Then view the result in a web browser
36
+ You can request multiple data points to be graphed simultaneously by specifying multiple targets:
46
37
 
47
- irb> `open http://localhost:8126/?target=grebulons`
38
+ http://localhost:8126/stats?target=foo&target=bar
48
39
 
49
- Bask in the something of something-something.
40
+ ## Supported data types
41
+
42
+ * counters (statsd.increment, statsd.decrement)
43
+
44
+ ## Todo
45
+
46
+ * statsd data types other than counters
47
+ * time window graphing
@@ -1,3 +1,4 @@
1
+ require 'uri'
1
2
  require 'json'
2
3
 
3
4
  module Rstatsd
@@ -1,4 +1,3 @@
1
- require 'em-hiredis'
2
1
  require_relative './helpers'
3
2
 
4
3
  module Rstatsd
@@ -7,7 +6,6 @@ module Rstatsd
7
6
 
8
7
  def initialize
9
8
  super
10
- @redis = EM::Hiredis.connect
11
9
  end
12
10
 
13
11
  def post_init
@@ -21,19 +19,17 @@ module Rstatsd
21
19
  case fields[1]
22
20
  when 'c'
23
21
  if fields[0] == '1'
24
- @redis.incr(key).callback do |value|
25
- @redis.rpush(counter_key_name(key), "#{value}:#{Time.now.to_i}")
26
- end
22
+ value = redis.incr(key)
23
+ redis.rpush(counter_key_name(key), "#{value}:#{Time.now.to_i}")
27
24
  elsif fields[0] == '-1'
28
- @redis.decr(key).callback do |value|
29
- @redis.rpush(counter_key_name(key), "#{value}:#{Time.now.to_i}")
30
- end
25
+ value = redis.decr(key)
26
+ redis.rpush(counter_key_name(key), "#{value}:#{Time.now.to_i}")
31
27
  end
32
- @redis.ltrim(counter_key_name(key), 10000)
28
+ redis.ltrim(counter_key_name(key), -10000, -1)
33
29
  when 'ms'
34
30
  #update timer
35
- @redis.rpush(timer_key_name(key), "#{fields[0]}:#{Time.now.to_i}")
36
- @redis.ltrim(timer_key_name(key), 10000)
31
+ redis.rpush(timer_key_name(key), "#{fields[0]}:#{Time.now.to_i}")
32
+ redis.ltrim(timer_key_name(key), -10000, -1)
37
33
  else
38
34
  # invalid update
39
35
  end
@@ -1,4 +1,4 @@
1
- require 'em-hiredis'
1
+ require 'eventmachine'
2
2
  require 'eventmachine_httpserver'
3
3
  require 'evma_httpserver/response'
4
4
  require 'erb'
@@ -26,8 +26,8 @@ module Rstatsd
26
26
  when '/stats'
27
27
  Rstatsd::Chart.new(@http_query_string).draw_chart do |chart|
28
28
  @chart = chart
29
- google_chart = ERB.new(File.open('templates/google_chart.erb').read).result(binding)
30
-
29
+ google_chart = ERB.new(File.open('templates/google_chart.erb').read).
30
+ result(binding)
31
31
  response.content_type 'text/html'
32
32
  response.content = google_chart
33
33
  response.send_response
@@ -1,3 +1,3 @@
1
1
  module Rstatsd
2
- VERSION = 0.2
2
+ VERSION = 0.3
3
3
  end
@@ -1,22 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Rstatsd::Collector do
4
- let(:hiredis) {
4
+ let(:redis) {
5
5
  stub.as_null_object
6
6
  }
7
7
 
8
- let(:redis_result) {
9
- redis_result = stub
10
- }
11
-
12
8
  before do
13
- EM::Hiredis.stub(:connect).and_return(hiredis)
9
+ Redis.stub(:new).and_return(redis)
14
10
  end
15
11
 
16
12
  context "receiving an increment packet 'crumdingler:1|c'" do
17
13
  it "should increment the counter stored at the keyname" do
18
14
  with_em_connection do
19
- hiredis.should_receive(:incr).with('crumdingler').and_return(stub.as_null_object)
15
+ redis.should_receive(:incr).with('crumdingler').and_return(stub.as_null_object)
20
16
  Rstatsd::Collector.new(stub).receive_data('crumdingler:1|c')
21
17
  end
22
18
  end
@@ -24,9 +20,10 @@ describe Rstatsd::Collector do
24
20
  it "should rpush the counter value into redis" do
25
21
  with_em_connection do
26
22
  Timecop.freeze(Time.now) do
27
- hiredis.should_receive(:incr).with('crumdingler').and_return(redis_result)
28
- redis_result.should_receive(:callback).and_yield('1')
29
- hiredis.should_receive(:rpush).with('counter:crumdingler', "1:#{Time.now.to_i}").and_return(stub.as_null_object)
23
+ redis.should_receive(:incr).with('crumdingler').and_return('1')
24
+ redis.should_receive(:rpush).
25
+ with('counter:crumdingler', "1:#{Time.now.to_i}").
26
+ and_return(stub.as_null_object)
30
27
  Rstatsd::Collector.new(stub).receive_data('crumdingler:1|c')
31
28
  end
32
29
  end
@@ -34,17 +31,15 @@ describe Rstatsd::Collector do
34
31
 
35
32
  it "should trim the overall size of the counter list to 10000 entries" do
36
33
  with_em_connection do
37
- hiredis.should_receive(:ltrim).with('counter:crumdingler', 10000)
34
+ redis.should_receive(:ltrim).with('counter:crumdingler', -10000, -1)
38
35
  Rstatsd::Collector.new(stub).receive_data('crumdingler:1|c')
39
36
  end
40
37
  end
41
38
 
42
39
  it "should rpush the incremented value onto a list in the format counter:keyname" do
43
40
  with_em_connection do
44
- redis_result.should_receive(:callback).and_yield('1')
45
- hiredis.stub(:incr).and_return(redis_result)
46
-
47
- hiredis.should_receive(:rpush).with('counter:crumdingler', anything)
41
+ redis.stub(:incr)
42
+ redis.should_receive(:rpush).with('counter:crumdingler', anything)
48
43
  Rstatsd::Collector.new(stub).receive_data('crumdingler:1|c')
49
44
  end
50
45
  end
@@ -56,17 +51,17 @@ describe Rstatsd::Collector do
56
51
  context "decrementing a value" do
57
52
  it "should decrement the counter stored at the keyname" do
58
53
  with_em_connection do
59
- hiredis.should_receive(:incr).with('crumdingler').and_return(stub.as_null_object)
60
- Rstatsd::Collector.new(stub).receive_data('crumdingler:1|c')
54
+ redis.should_receive(:decr).with('crumdingler')
55
+ Rstatsd::Collector.new(stub).receive_data('crumdingler:-1|c')
61
56
  end
62
57
  end
63
58
 
64
59
  it "should rpush the returned counter value into redis" do
65
60
  with_em_connection do
66
61
  Timecop.freeze(Time.now) do
67
- hiredis.should_receive(:decr).with('crumdingler').and_return(redis_result)
68
- redis_result.should_receive(:callback).and_yield('-1')
69
- hiredis.should_receive(:rpush).with('counter:crumdingler', "-1:#{Time.now.to_i}").and_return(stub.as_null_object)
62
+ redis.stub(:decr).and_return('-1')
63
+ redis.should_receive(:rpush).
64
+ with('counter:crumdingler', "-1:#{Time.now.to_i}")
70
65
  Rstatsd::Collector.new(stub).receive_data('crumdingler:-1|c')
71
66
  end
72
67
  end
@@ -74,7 +69,7 @@ describe Rstatsd::Collector do
74
69
 
75
70
  it "should trim the overall size of the counter list to 10000 entries" do
76
71
  with_em_connection do
77
- hiredis.should_receive(:ltrim).with('counter:crumdingler', 10000)
72
+ redis.should_receive(:ltrim).with('counter:crumdingler', -10000, -1)
78
73
  Rstatsd::Collector.new(stub).receive_data('crumdingler:-1|c')
79
74
  end
80
75
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rstatsd
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
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: 2012-02-21 00:00:00.000000000Z
12
+ date: 2012-02-22 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70137063792700 !ruby/object:Gem::Requirement
16
+ requirement: &70359047813080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70137063792700
24
+ version_requirements: *70359047813080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hiredis
27
- requirement: &70137063792260 !ruby/object:Gem::Requirement
27
+ requirement: &70359047812660 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70137063792260
35
+ version_requirements: *70359047812660
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: eventmachine
38
- requirement: &70137063791840 !ruby/object:Gem::Requirement
38
+ requirement: &70359047812240 !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: *70137063791840
46
+ version_requirements: *70359047812240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: eventmachine_httpserver
49
- requirement: &70137063791400 !ruby/object:Gem::Requirement
49
+ requirement: &70359047811820 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70137063791400
57
+ version_requirements: *70359047811820
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70137063790980 !ruby/object:Gem::Requirement
60
+ requirement: &70359047811400 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70137063790980
68
+ version_requirements: *70359047811400
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: timecop
71
- requirement: &70137063790560 !ruby/object:Gem::Requirement
71
+ requirement: &70359047810980 !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: :development
78
78
  prerelease: false
79
- version_requirements: *70137063790560
79
+ version_requirements: *70359047810980
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: statsd-ruby
82
- requirement: &70137063790140 !ruby/object:Gem::Requirement
82
+ requirement: &70359047810560 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70137063790140
90
+ version_requirements: *70359047810560
91
91
  description: a stats daemon that stores data in redis
92
92
  email:
93
93
  - whoahbot@gmail.com
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  version: '0'
145
145
  requirements: []
146
146
  rubyforge_project:
147
- rubygems_version: 1.8.10
147
+ rubygems_version: 1.8.16
148
148
  signing_key:
149
149
  specification_version: 3
150
150
  summary: rstatsd is a simpler ruby implementaiton of statsd, storing the data in redis