redmon 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "redmon/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "redmon"
7
+ s.version = Redmon::VERSION
8
+ s.authors = ["Sean McDaniel"]
9
+ s.email = ["sean.mcdaniel@me.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Redis monitor}
12
+ s.description = %q{Redis Admin interface and monitor.}
13
+
14
+ s.rubyforge_project = "redmon"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = ["redmon"]
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency "bson_ext", ">= 1.4.0"
22
+ s.add_dependency "sinatra", ">= 1.2.6"
23
+ s.add_dependency "hiredis", "~> 0.4.0"
24
+ s.add_dependency "redis", ">= 2.2.2"
25
+ s.add_dependency "eventmachine"
26
+ s.add_dependency "i18n"
27
+ s.add_dependency "haml"
28
+ s.add_dependency "rack"
29
+ s.add_dependency "thin"
30
+ s.add_dependency "activesupport"
31
+ s.add_dependency "mixlib-cli"
32
+
33
+ s.add_development_dependency "sinatra-contrib", "~> 1.3.1"
34
+ s.add_development_dependency "rack-test"
35
+ s.add_development_dependency "rake"
36
+ s.add_development_dependency "rspec", "~> 2.8.0"
37
+ s.add_development_dependency "shoulda", ">= 0"
38
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+ require 'sinatra/contrib'
3
+
4
+ describe "app" do
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ Redmon::App.new
9
+ end
10
+
11
+ def stub_redis_cmd(cmd, *args)
12
+ mock_redis.should_receive(cmd).with(*args).and_return({})
13
+ end
14
+
15
+ let(:json) {"application/json;charset=utf-8"}
16
+
17
+ describe "GET /" do
18
+ it "should render app" do
19
+ stub_redis_cmd :config, :get, '*'
20
+ get "/"
21
+ last_response.should be_ok
22
+ last_response.body.include?('Redmon')
23
+ end
24
+ end
25
+
26
+ describe "POST /config" do
27
+ it "should call redis#config set value" do
28
+ stub_redis_cmd :config, :set, :param, 'value'
29
+ post "/config?param=param&value=value"
30
+ last_response.should be_ok
31
+ end
32
+ end
33
+
34
+ describe "GET /cli" do
35
+ let(:command) { URI.encode("keys *") }
36
+
37
+ it "should execute the passed command" do
38
+ stub_redis_cmd :keys, '*'
39
+ get URI.encode("/cli?command=keys *")
40
+ last_response.should be_ok
41
+ end
42
+
43
+ it "should render an empty list result" do
44
+ redis = mock_redis
45
+ redis.stub(:send).and_return([])
46
+
47
+ get "/cli?command=#{command}"
48
+ last_response.should be_ok
49
+ last_response.body.include? Redmon::Redis.empty_result
50
+ end
51
+
52
+ it "should render the wrong arguments result" do
53
+ redis = mock_redis
54
+ redis.stub(:send).and_raise(ArgumentError)
55
+
56
+ get "/cli?command=#{command}"
57
+ last_response.should be_ok
58
+ last_response.body.include? Redmon::Redis.wrong_number_of_arguments_for(:keys)
59
+ end
60
+
61
+ it "should return an unknown result" do
62
+ redis = mock_redis
63
+ redis.stub(:send).and_raise(RuntimeError)
64
+
65
+ get "/cli?command=#{command}"
66
+ last_response.should be_ok
67
+ last_response.body.include? Redmon::Redis.unknown(:keys)
68
+ end
69
+
70
+ it "should return a connection refused result" do
71
+ redis = mock_redis
72
+ redis.stub(:send).and_raise(Errno::ECONNREFUSED)
73
+
74
+ get "/cli?command=#{command}"
75
+ last_response.should be_ok
76
+ last_response.body.include? Redmon::Redis.connection_refused
77
+ end
78
+ end
79
+
80
+ describe "GET /stats" do
81
+ it "should render a single json result" do
82
+ stub_redis_cmd :zrange, Redmon::Redis.stats_key, -1, -1
83
+ get "/stats"
84
+ last_response.should be_ok
85
+ last_response.headers["Content-Type"].should == json
86
+ end
87
+
88
+ it "should request the correct # of historical info entries" do
89
+ stub_redis_cmd :zrange, Redmon::Redis.stats_key, -666, -1
90
+ get "/stats?count=666"
91
+ last_response.should be_ok
92
+ end
93
+ end
94
+
95
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Helpers" do
4
+
5
+ describe "redis" do
6
+ it "should call Redis.connect" do
7
+ Redis.should_receive(:connect).with({:url => Redmon[:redis_url]})
8
+ Redmon::Redis.redis
9
+ end
10
+ end
11
+
12
+ def redis
13
+ @redis ||= ::Redis.connect(:url => redis_url)
14
+ end
15
+
16
+ def em_redis
17
+ @em_redis ||= ::EM::Hiredis.connect(redis_url)
18
+ end
19
+
20
+ describe "#ns" do
21
+ it "should return the configured namespace" do
22
+ Redmon[:namespace].should == Redmon::Redis.ns
23
+ end
24
+ end
25
+
26
+ describe "#redis_url" do
27
+ it "should return the configured redis url" do
28
+ Redmon[:redis_url].should == Redmon::Redis.redis_url
29
+ end
30
+ end
31
+
32
+ describe "#redis_host" do
33
+ it "should return the configured redis host" do
34
+ Redmon[:redis_url].gsub('redis://', '').should == Redmon::Redis.redis_host
35
+ end
36
+ end
37
+
38
+ describe "#unquoted" do
39
+ it "should return the configured redis host" do
40
+ (%w{string OK} << '(empty list or set)').should == Redmon::Redis.unquoted
41
+ end
42
+ end
43
+
44
+ describe "#supported?" do
45
+ it "should return true for supported redis commands" do
46
+ Redmon::Redis.supported?(:keys).should be_true
47
+ end
48
+
49
+ it "should return false for unsupported redis commands" do
50
+ Redmon::Redis.supported?(:eval).should be_false
51
+ end
52
+ end
53
+
54
+ describe "#empty_result" do
55
+ it "should return the empty list message" do
56
+ '(empty list or set)'.should == Redmon::Redis.empty_result
57
+ end
58
+ end
59
+
60
+ describe "#unknown" do
61
+ it "should return the unknown command message" do
62
+ "(error) ERR unknown command 'unknown'".should == Redmon::Redis.unknown('unknown')
63
+ end
64
+ end
65
+
66
+ describe "#wrong_number_of_arguments_for" do
67
+ it "" do
68
+ "(error) ERR wrong number of arguments for 'unknown' command".should ==
69
+ Redmon::Redis.wrong_number_of_arguments_for('unknown')
70
+ end
71
+ end
72
+
73
+ describe "#connection_refused" do
74
+ it "should return the connection refused message" do
75
+ "Could not connect to Redis at 127.0.0.1:6379: Connection refused".should ==
76
+ Redmon::Redis.connection_refused
77
+ end
78
+ end
79
+
80
+ describe "#stats_key" do
81
+ it "should return the namespaced scoped stats key" do
82
+ "redmon:redis:127.0.0.1:6379:stats".should == Redmon::Redis.stats_key
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,8 @@
1
+ require 'redmon'
2
+ require 'rack/test'
3
+
4
+ def mock_redis
5
+ redis = double :redis
6
+ Redis.stub(:connect).and_return(redis)
7
+ redis
8
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe "worker" do
4
+
5
+ before(:all) do
6
+ @worker = Redmon::Worker.new
7
+ end
8
+
9
+ def mock_timer
10
+ double EM::PeriodicTimer
11
+ end
12
+
13
+ describe "#run!" do
14
+ it "should poll and record stats"
15
+ end
16
+
17
+ describe "#record_stats" do
18
+ it "should record a new stats entry in a redis sorted set" do
19
+ redis = mock_redis
20
+ redis.should_receive(:zadd).with(Redmon::Redis.stats_key, 'ts', 'stats')
21
+
22
+ @worker.stub(:stats).and_return(['ts', 'stats'])
23
+ @worker.record_stats
24
+ end
25
+ end
26
+
27
+ describe "#stats" do
28
+ it "should fetch info, dbsize and slowlog from redis" do
29
+ pending
30
+ redis = mock_redis
31
+ redis.should_receive(:info).with(no_args()).and_return({})
32
+ redis.should_receive(:dbsize).with(no_args()).and_return(0)
33
+ redis.should_receive(:slowlog).with(:get).and_return({})
34
+
35
+ @worker.stub(:entires).and_return([{}])
36
+ @worker.stats
37
+ end
38
+ end
39
+
40
+ describe "#entries" do
41
+ let (:slowlog) { [[1, 2, 3, ['cmd', 'args']]] }
42
+
43
+ it "should parse the sortlog into hashes" do
44
+ entries = @worker.entries slowlog
45
+ entries.length.should == 1
46
+ entry = entries.shift
47
+ entry.should == {
48
+ :id => 1,
49
+ :timestamp => 2000,
50
+ :process_time => 3,
51
+ :command => 'cmd args'
52
+ }
53
+ end
54
+ end
55
+
56
+ describe "#interval" do
57
+ it "should return the configured poll interval" do
58
+ @worker.interval.should == Redmon[:poll_interval]
59
+ end
60
+ end
61
+
62
+ end
metadata ADDED
@@ -0,0 +1,262 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redmon
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean McDaniel
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bson_ext
16
+ requirement: &70313199295360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.4.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70313199295360
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ requirement: &70313199293780 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.6
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70313199293780
36
+ - !ruby/object:Gem::Dependency
37
+ name: hiredis
38
+ requirement: &70313199292200 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.4.0
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70313199292200
47
+ - !ruby/object:Gem::Dependency
48
+ name: redis
49
+ requirement: &70313199291320 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.2.2
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70313199291320
58
+ - !ruby/object:Gem::Dependency
59
+ name: eventmachine
60
+ requirement: &70313199290780 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70313199290780
69
+ - !ruby/object:Gem::Dependency
70
+ name: i18n
71
+ requirement: &70313199290080 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70313199290080
80
+ - !ruby/object:Gem::Dependency
81
+ name: haml
82
+ requirement: &70313199289500 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70313199289500
91
+ - !ruby/object:Gem::Dependency
92
+ name: rack
93
+ requirement: &70313199288880 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70313199288880
102
+ - !ruby/object:Gem::Dependency
103
+ name: thin
104
+ requirement: &70313199288340 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *70313199288340
113
+ - !ruby/object:Gem::Dependency
114
+ name: activesupport
115
+ requirement: &70313199287780 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: *70313199287780
124
+ - !ruby/object:Gem::Dependency
125
+ name: mixlib-cli
126
+ requirement: &70313199455600 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: *70313199455600
135
+ - !ruby/object:Gem::Dependency
136
+ name: sinatra-contrib
137
+ requirement: &70313199454840 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ~>
141
+ - !ruby/object:Gem::Version
142
+ version: 1.3.1
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *70313199454840
146
+ - !ruby/object:Gem::Dependency
147
+ name: rack-test
148
+ requirement: &70313199454160 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *70313199454160
157
+ - !ruby/object:Gem::Dependency
158
+ name: rake
159
+ requirement: &70313199453640 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *70313199453640
168
+ - !ruby/object:Gem::Dependency
169
+ name: rspec
170
+ requirement: &70313199452900 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: 2.8.0
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *70313199452900
179
+ - !ruby/object:Gem::Dependency
180
+ name: shoulda
181
+ requirement: &70313199452180 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: *70313199452180
190
+ description: Redis Admin interface and monitor.
191
+ email:
192
+ - sean.mcdaniel@me.com
193
+ executables:
194
+ - redmon
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - .gitignore
199
+ - .rspec
200
+ - .travis.yml
201
+ - Gemfile
202
+ - README.md
203
+ - Rakefile
204
+ - bin/redmon
205
+ - lib/redmon.rb
206
+ - lib/redmon/app.rb
207
+ - lib/redmon/helpers.rb
208
+ - lib/redmon/public/redmon.css
209
+ - lib/redmon/public/redmon.js
210
+ - lib/redmon/public/vendor/bootstrap-modal.js
211
+ - lib/redmon/public/vendor/bootstrap.min.css
212
+ - lib/redmon/public/vendor/jquery-1.7.1.min.js
213
+ - lib/redmon/public/vendor/jquery-effects-core.min.js
214
+ - lib/redmon/public/vendor/jquery.editinplace.js
215
+ - lib/redmon/public/vendor/jquery.flot.js
216
+ - lib/redmon/public/vendor/terminal.js
217
+ - lib/redmon/redis.rb
218
+ - lib/redmon/version.rb
219
+ - lib/redmon/views/app.haml
220
+ - lib/redmon/views/cli.haml
221
+ - lib/redmon/worker.rb
222
+ - load_sim.rb
223
+ - redmon.gemspec
224
+ - spec/app_spec.rb
225
+ - spec/helpers_spec.rb
226
+ - spec/spec_helper.rb
227
+ - spec/worker_spec.rb
228
+ homepage: ''
229
+ licenses: []
230
+ post_install_message:
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ none: false
236
+ requirements:
237
+ - - ! '>='
238
+ - !ruby/object:Gem::Version
239
+ version: '0'
240
+ segments:
241
+ - 0
242
+ hash: 2558862497589874286
243
+ required_rubygems_version: !ruby/object:Gem::Requirement
244
+ none: false
245
+ requirements:
246
+ - - ! '>='
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ segments:
250
+ - 0
251
+ hash: 2558862497589874286
252
+ requirements: []
253
+ rubyforge_project: redmon
254
+ rubygems_version: 1.8.15
255
+ signing_key:
256
+ specification_version: 3
257
+ summary: Redis monitor
258
+ test_files:
259
+ - spec/app_spec.rb
260
+ - spec/helpers_spec.rb
261
+ - spec/spec_helper.rb
262
+ - spec/worker_spec.rb