redmon 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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