From a451bdcf0f9ed8771d4410e390b6cefb20aa0dcd Mon Sep 17 00:00:00 2001 From: Jake Mack Date: Thu, 26 Jul 2012 16:08:15 -0700 Subject: [PATCH] Added a poll action that is meant to be hit with an ajax request, added polling link to index page --- lib/sidekiq/web.rb | 4 ++++ test/test_web.rb | 16 ++++++++++---- web/assets/javascripts/application.js | 29 +++++++++++++++++++++++++ web/assets/stylesheets/layout.css | 4 ++++ web/views/_summary.slim | 8 +++++++ web/views/_workers.slim | 14 ++++++++++++ web/views/index.slim | 31 +++++++-------------------- web/views/layout.slim | 2 +- web/views/poll.slim | 3 +++ 9 files changed, 83 insertions(+), 28 deletions(-) create mode 100644 web/views/_summary.slim create mode 100644 web/views/_workers.slim create mode 100644 web/views/poll.slim diff --git a/lib/sidekiq/web.rb b/lib/sidekiq/web.rb index 5f33cbd5..9735c0d8 100644 --- a/lib/sidekiq/web.rb +++ b/lib/sidekiq/web.rb @@ -117,6 +117,10 @@ module Sidekiq slim :index end + get "/poll" do + slim :poll, layout: false + end + get "/queues" do @queues = queues slim :queues diff --git a/test/test_web.rb b/test/test_web.rb index 3cdcad27..daa8684d 100644 --- a/test/test_web.rb +++ b/test/test_web.rb @@ -31,6 +31,14 @@ class TestWeb < MiniTest::Unit::TestCase refute_match /default/, last_response.body end + it 'can display poll' do + get '/poll' + assert_equal 200, last_response.status + assert_match /hero-unit/, last_response.body + assert_match /workers/, last_response.body + refute_match /navbar/, last_response.body + end + it 'can display queues' do assert Sidekiq::Client.push('queue' => :foo, 'class' => WebWorker, 'args' => [1, 3]) @@ -115,26 +123,26 @@ class TestWeb < MiniTest::Unit::TestCase assert_equal 200, last_response.status assert_match /HardWorker/, last_response.body end - + it 'can delete a single retry' do _, score = add_retry post "/retries/#{score}", 'delete' => 'Delete' assert_equal 302, last_response.status assert_equal 'http://example.org/retries', last_response.header['Location'] - + get "/retries" assert_equal 200, last_response.status refute_match /#{score}/, last_response.body end - + it 'can retry a single retry now' do msg, score = add_retry post "/retries/#{score}", 'retry' => 'Retry' assert_equal 302, last_response.status assert_equal 'http://example.org/retries', last_response.header['Location'] - + get '/queues/default' assert_equal 200, last_response.status assert_match /#{msg['args'][2]}/, last_response.body diff --git a/web/assets/javascripts/application.js b/web/assets/javascripts/application.js index dfffaf75..1a362546 100644 --- a/web/assets/javascripts/application.js +++ b/web/assets/javascripts/application.js @@ -18,3 +18,32 @@ $(function() { } }); }); + +$(function() { + $('a[name=poll]').data('polling', false); + + $('a[name=poll]').on('click', function(e) { + e.preventDefault(); + var pollLink = $(this); + if (pollLink.data('polling')) { + clearInterval(pollLink.data('interval')); + pollLink.text('Live Poll'); + $('.poll-status').text(''); + } + else { + var href = pollLink.attr('href'); + pollLink.data('interval', setInterval(function() { + $.get(href, function(data) { + var responseHtml = $(data); + $('.hero-unit').replaceWith(responseHtml.find('.hero-unit')); + $('.workers').replaceWith(responseHtml.find('.workers')); + }); + var currentTime = new Date(); + $('.poll-status').text('Last polled at: ' + currentTime.getHours() + ':' + currentTime.getMinutes() + ':' + currentTime.getSeconds()); + }, 2000)); + $('.poll-status').text('Starting to poll...'); + pollLink.text('Stop Polling'); + } + pollLink.data('polling', !pollLink.data('polling')); + }) +}); diff --git a/web/assets/stylesheets/layout.css b/web/assets/stylesheets/layout.css index c97bcdab..b0e3bf13 100644 --- a/web/assets/stylesheets/layout.css +++ b/web/assets/stylesheets/layout.css @@ -20,3 +20,7 @@ code { .hero-unit { padding: 30px; } + +.poll-status { + padding-left: 10px; +} diff --git a/web/views/_summary.slim b/web/views/_summary.slim new file mode 100644 index 00000000..96b281de --- /dev/null +++ b/web/views/_summary.slim @@ -0,0 +1,8 @@ +.hero-unit + h1 Sidekiq is #{current_status} + p Processed: #{processed} + p Failed: #{failed} + p Busy Workers: #{workers.size} + p Scheduled: #{zcard('schedule')} + p Retries Pending: #{zcard('retry')} + p Queue Backlog: #{backlog} diff --git a/web/views/_workers.slim b/web/views/_workers.slim new file mode 100644 index 00000000..0be082dd --- /dev/null +++ b/web/views/_workers.slim @@ -0,0 +1,14 @@ +table class="table table-striped table-bordered workers" + tr + th Worker + th Queue + th Class + th Arguments + th Started + - workers.each do |(worker, msg)| + tr + td= worker + td= msg['queue'] + td= msg['payload']['class'] + td= msg['payload']['args'].inspect[0..100] + td== relative_time(Time.parse(msg['run_at'])) diff --git a/web/views/index.slim b/web/views/index.slim index 57e90005..1525d568 100644 --- a/web/views/index.slim +++ b/web/views/index.slim @@ -1,25 +1,10 @@ -.hero-unit - h1 Sidekiq is #{current_status} - p Processed: #{processed} - p Failed: #{failed} - p Busy Workers: #{workers.size} - p Scheduled: #{zcard('schedule')} - p Retries Pending: #{zcard('retry')} - p Queue Backlog: #{backlog} +== slim :_summary + +.poll + a*{name: 'poll'} href='#{{root_path}}poll' Live Poll + span class="poll-status" + +== slim :_workers -table class="table table-striped table-bordered" - tr - th Worker - th Queue - th Class - th Arguments - th Started - - workers.each do |(worker, msg)| - tr - td= worker - td= msg['queue'] - td= msg['payload']['class'] - td= msg['payload']['args'].inspect[0..100] - td== relative_time(Time.parse(msg['run_at'])) form action="#{root_path}reset" method="post" - button.btn type="submit" title="If you kill -9 Sidekiq, this table can fill up with old data." Clear worker list + button.btn type="submit" title="If you kill -9 Sidekiq, this table can fill up with old data." Clear worker list diff --git a/web/views/layout.slim b/web/views/layout.slim index c54731d6..e2bb079f 100644 --- a/web/views/layout.slim +++ b/web/views/layout.slim @@ -13,7 +13,7 @@ html span.icon-bar a.brand href='#{{root_path}}' | Sidekiq - div.nav-collapse + div.nav-collapse ul.nav li a href='#{{root_path}}' Home diff --git a/web/views/poll.slim b/web/views/poll.slim new file mode 100644 index 00000000..827c96ed --- /dev/null +++ b/web/views/poll.slim @@ -0,0 +1,3 @@ +div + == slim :_summary + == slim :_workers