sidekiq-redislog 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,17 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - jruby-19mode
5
+ - rbx-19mode
6
+ - 2.0.0
7
+ branches:
8
+ only:
9
+ - master
10
+ notifications:
11
+ email:
12
+ recipients:
13
+ - rpocklin@gmail.com
14
+ matrix:
15
+ allow_failures:
16
+ services:
17
+ - redis-server
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ ## 0.0.1
2
+ * Integrated redis telnet monitor log to sidekiq web UI
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sidekiq-redislog.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,55 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sidekiq-redislog (0.0.1)
5
+ sidekiq (>= 2.2.1)
6
+ sinatra
7
+ slim
8
+ sprockets
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ celluloid (0.14.0)
14
+ timers (>= 1.0.0)
15
+ connection_pool (1.0.0)
16
+ hike (1.2.2)
17
+ multi_json (1.7.3)
18
+ rack (1.4.5)
19
+ rack-protection (1.5.0)
20
+ rack
21
+ rack-test (0.6.2)
22
+ rack (>= 1.0)
23
+ rake (10.0.4)
24
+ redis (3.0.4)
25
+ redis-namespace (1.3.0)
26
+ redis (~> 3.0.0)
27
+ sidekiq (2.11.2)
28
+ celluloid (>= 0.13.0)
29
+ connection_pool (>= 1.0.0)
30
+ multi_json
31
+ redis (>= 3.0)
32
+ redis-namespace
33
+ sinatra (1.3.6)
34
+ rack (~> 1.4)
35
+ rack-protection (~> 1.3)
36
+ tilt (~> 1.3, >= 1.3.3)
37
+ slim (1.3.8)
38
+ temple (~> 0.6.3)
39
+ tilt (~> 1.3.3)
40
+ sprockets (2.2.2)
41
+ hike (~> 1.2)
42
+ multi_json (~> 1.0)
43
+ rack (~> 1.0)
44
+ tilt (~> 1.1, != 1.3.0)
45
+ temple (0.6.4)
46
+ tilt (1.3.7)
47
+ timers (1.1.0)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ rack-test
54
+ rake
55
+ sidekiq-redislog!
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Marcelo Silveira
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Sidekiq::RedisLog [![Build Status](https://secure.travis-ci.org/rpocklin/sidekiq-redislog.png)](http://travis-ci.org/rpocklin/sidekiq-redislog)
2
+
3
+ Displays a monitor window which echos the telnet status log of redis for sidekiq. Autoscrolls.
4
+
5
+ ## Installation
6
+
7
+ NOTE: Doesn't work with Webrick because it uses SSE (server-sent events) and Webrick is single-threaded.
8
+ Works with Phusion Passenger / Thin / Puma / Rainbows and probably Unicorn.
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'sidekiq-redislog'
14
+ ```
15
+
16
+ 1. Start up your rails stack
17
+ 2. Navigate to '/sidekiq' (or your custom remapped route)
18
+ 3. Click 'redis' tab
19
+ 4. You will see activity (at the very least 'OK' should appear in the text area.)
20
+
21
+ ## Dependencies
22
+
23
+ Depends on Sidekiq >= 2.2.1
24
+
25
+ ## Usage and Modes
26
+
27
+ - When you run your app you will now see an additional tab 'Redis' in the sidekiq web console.
28
+ - You can create activity by opening the other Sidekiq tabs (Dashboard/Workers/etc) in new browser tabs.
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
37
+
38
+ ## License
39
+
40
+ Released under the MIT License. See the [LICENSE][license] file for further details.
41
+
42
+ [license]: https://github.com/rpocklin/sidekiq-redislog/blob/master/LICENSE
43
+
44
+
45
+ ## TODO
46
+
47
+ - XHR polling (< IE8 etc.)
48
+ - Connect/Disconnect buttons since it consumes a thread for the poller.
49
+
50
+
51
+ ## Notes
52
+
53
+ If you mount sidekiq to a non-standard route ie. mount Sidekiq::Web => '/admin/sidekiq' then you'll have to
54
+ redirect the stream url (which javascript hits via SSE):
55
+ ```match '/sidekiq/redis_log_stream' => redirect('/admin/sidekiq/redis_log_stream')```
56
+ in ```routes.rb```
57
+
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << "lib"
9
+ t.libs << "test"
10
+ t.test_files = FileList["test/**/*_test.rb"]
11
+ t.verbose = true
12
+ end
@@ -0,0 +1,39 @@
1
+ module Sinatra
2
+ module RedisLogHelper
3
+ def set_sse_headers response
4
+
5
+ response.headers.delete('Content-Length') # no content length
6
+ response.headers['X-Accel-Buffering'] = 'no' # for nginx
7
+ response.headers["Connection"] = "keepalive" #optimisation
8
+ response.headers["Cache-Control"] = "no-cache, no-store" #important for browsers
9
+ response.headers['Last-Modified'] = Time.now.to_s # #fixes buffering
10
+
11
+ end
12
+
13
+ def capture_redis stream, host = 'localhost', port = 6379, timeout = 30, command = 'MONITOR'
14
+
15
+ telnet_session = Net::Telnet::new("Host" => host,
16
+ "Port" => port,
17
+ "Timeout" => timeout)
18
+
19
+ telnet_session.cmd(command) do |data|
20
+ yield data if block_given?
21
+ end
22
+
23
+ telnet_session.close
24
+ end
25
+
26
+ def get_redis_config
27
+
28
+ config = {:host => 'localhost', :port => 6379}
29
+
30
+ Sidekiq.redis do |redis|
31
+ config[:host] = redis.client.host
32
+ config[:port] = redis.client.port
33
+ end
34
+
35
+ config
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ module Sidekiq
2
+ module RedisLog
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ header.row
2
+ .span2
3
+ h3 Redis Log
4
+ .span10
5
+ textarea id="logger" style='width: 100%;' rows="20" cols='50' readonly="true"
6
+
7
+ javascript:
8
+ var show_logs_for = function(event_channel, event_id, log_id) {
9
+
10
+ if (!!window.EventSource) {
11
+ source = new EventSource(event_channel); // match routes.rb
12
+
13
+ element = document.getElementById(log_id); // match template
14
+
15
+ source.addEventListener(event_id, function(e) {
16
+ //firefox has no 'data'
17
+ if (e.data) data = e.data; else data = e;
18
+
19
+ element.innerHTML += data + "\n";
20
+ element.scrollTop = element.scrollHeight;
21
+ });
22
+ }
23
+ else {
24
+ // Result to xhr polling :( TODO
25
+ }
26
+ };
27
+
28
+ $(function() {
29
+ show_logs_for('/sidekiq/redis_log_stream', 'redis_log', 'logger')
30
+ });
31
+
@@ -0,0 +1,29 @@
1
+ module Sidekiq
2
+ module RedisLog
3
+ module WebExtension
4
+
5
+ def self.registered(app)
6
+
7
+ app.helpers Sinatra::RedisLogHelper
8
+
9
+ app.get "/redis" do
10
+ view_path = File.join(File.expand_path("..", __FILE__), "views")
11
+ render(:slim, File.read(File.join(view_path, "sidekiq_redis_log.slim")))
12
+ end
13
+
14
+ app.get "/redis_log_stream", provides: 'text/event-stream' do
15
+
16
+ set_sse_headers response
17
+ config = get_redis_config
18
+
19
+ stream :keep_open do |stream|
20
+ capture_redis stream, config[:host], config[:port] do |data|
21
+ stream << "event: redis_log\n"
22
+ stream << "data: #{data}\n\n"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ require "sidekiq/web"
2
+ require "sidekiq/redislog/version"
3
+ require "sidekiq/redislog/redis_log_helper"
4
+ require "sidekiq/redislog/web_extension"
5
+
6
+ module Sidekiq
7
+ module RedisLog
8
+ end
9
+ end
10
+
11
+ Sidekiq::Web.register Sidekiq::RedisLog::WebExtension
12
+
13
+ if Sidekiq::Web.tabs.is_a?(Array)
14
+ # For sidekiq < 2.5
15
+ Sidekiq::Web.tabs << "redis"
16
+ else
17
+ Sidekiq::Web.tabs["Redis"] = "redis"
18
+ end
19
+
20
+ Sidekiq.configure_server do |config|
21
+ config.server_middleware do |chain|
22
+ chain.add Sidekiq::RedisLog::Middleware
23
+ end
24
+ end
@@ -0,0 +1 @@
1
+ require "sidekiq/redislog"
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/sidekiq/redislog/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Robert Pocklington"]
6
+ gem.email = ["rpocklin@gmail.com"]
7
+ gem.description = %q{View redis log for sidekiq on the web}
8
+ gem.summary = %q{Allows you to monitor the redis log of sidekiq to track what is happening under the covers.}
9
+ gem.homepage = "https://github.com/rpocklin/sidekiq-redislog/"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "sidekiq-redislog"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Sidekiq::RedisLog::VERSION
17
+
18
+ gem.add_dependency "sidekiq", ">= 2.2.1"
19
+ gem.add_dependency "slim"
20
+ gem.add_dependency "sinatra"
21
+ gem.add_dependency "sprockets"
22
+
23
+ gem.add_development_dependency "rake"
24
+ gem.add_development_dependency "rack-test"
25
+
26
+ end
@@ -0,0 +1,14 @@
1
+ Encoding.default_external = Encoding::UTF_8
2
+ Encoding.default_internal = Encoding::UTF_8
3
+
4
+ require "minitest/autorun"
5
+ require "minitest/spec"
6
+ require "minitest/mock"
7
+
8
+ require "rack/test"
9
+ require "sidekiq"
10
+ require "sidekiq-redislog"
11
+
12
+ Sidekiq.logger.level = Logger::ERROR
13
+
14
+ REDIS = Sidekiq::RedisConnection.create(:url => "redis://localhost/15", :namespace => 'sidekiq_redis_log')
@@ -0,0 +1,37 @@
1
+ require "test_helper"
2
+ require "net/telnet"
3
+
4
+ module Sidekiq
5
+ describe "RedisLog" do
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ Sidekiq::Web
10
+ end
11
+
12
+ before do
13
+ Sidekiq.redis = REDIS
14
+ Sidekiq.redis {|c| c.flushdb }
15
+ end
16
+
17
+ it 'can display home with redis log tab' do
18
+ get '/redis'
19
+
20
+ last_response.status.must_equal 200
21
+ last_response.body.must_match /Sidekiq/
22
+ last_response.body.must_match /Redis/
23
+ end
24
+
25
+ ## NOTE: requires redis localhost:6379 running
26
+ it 'can capture redis log via telnet' do
27
+
28
+ null_stream = File.open(File::NULL, "w")
29
+
30
+ class RedisMonitor
31
+ include Sinatra::RedisLogHelper
32
+ end
33
+
34
+ RedisMonitor.new.capture_redis null_stream, 'localhost', 6379, 30, 'QUIT'
35
+ end
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq-redislog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Pocklington
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sidekiq
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.2.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.2.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: slim
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sinatra
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: sprockets
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rake
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rack-test
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: View redis log for sidekiq on the web
111
+ email:
112
+ - rpocklin@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .travis.yml
118
+ - CHANGELOG.md
119
+ - Gemfile
120
+ - Gemfile.lock
121
+ - LICENSE
122
+ - README.md
123
+ - Rakefile
124
+ - lib/sidekiq-redislog.rb
125
+ - lib/sidekiq/redislog.rb
126
+ - lib/sidekiq/redislog/redis_log_helper.rb
127
+ - lib/sidekiq/redislog/version.rb
128
+ - lib/sidekiq/redislog/views/sidekiq_redis_log.slim
129
+ - lib/sidekiq/redislog/web_extension.rb
130
+ - sidekiq-redis-log.gemspec
131
+ - test/test_helper.rb
132
+ - test/web_extension_test.rb
133
+ homepage: https://github.com/rpocklin/sidekiq-redislog/
134
+ licenses: []
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ segments:
146
+ - 0
147
+ hash: 1305450152839076812
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ segments:
155
+ - 0
156
+ hash: 1305450152839076812
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 1.8.25
160
+ signing_key:
161
+ specification_version: 3
162
+ summary: Allows you to monitor the redis log of sidekiq to track what is happening
163
+ under the covers.
164
+ test_files:
165
+ - test/test_helper.rb
166
+ - test/web_extension_test.rb