diff --git a/Changes.md b/Changes.md index 66d174fe..7086b496 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,6 @@ HEAD ----------- +- Dynamically update Redis stats on dashboard [brandonhilkert] - Add Sidekiq::Workers API giving programmatic access to the current set of active workers. diff --git a/lib/sidekiq/web.rb b/lib/sidekiq/web.rb index 399015d3..627434d1 100644 --- a/lib/sidekiq/web.rb +++ b/lib/sidekiq/web.rb @@ -99,6 +99,10 @@ module Sidekiq parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{options[:delimiter]}") parts.join(options[:separator]) end + + def redis_keys + ["redis_stats", "uptime_in_days", "connected_clients", "used_memory_human", "used_memory_peak_human"] + end end get "/" do @@ -200,7 +204,7 @@ module Sidekiq end get '/dashboard' do - @redis_info = Sidekiq.redis { |conn| conn.info } + @redis_info = Sidekiq.redis { |conn| conn.info }.select{ |k, v| redis_keys.include? k } stats_history = Sidekiq::Stats::History.new((params[:days] || 30).to_i) @processed_history = stats_history.processed @failed_history = stats_history.failed @@ -208,14 +212,19 @@ module Sidekiq end get '/dashboard/stats' do - stats = Sidekiq::Stats.new + sidekiq_stats = Sidekiq::Stats.new + redis_stats = Sidekiq.redis { |conn| conn.info }.select{ |k, v| redis_keys.include? k } + content_type :json Sidekiq.dump_json({ - processed: stats.processed, - failed: stats.failed, - enqueued: stats.enqueued, - scheduled: stats.scheduled_size, - retries: stats.retry_size, + sidekiq: { + processed: sidekiq_stats.processed, + failed: sidekiq_stats.failed, + enqueued: sidekiq_stats.enqueued, + scheduled: sidekiq_stats.scheduled_size, + retries: sidekiq_stats.retry_size, + }, + redis: redis_stats }) end diff --git a/test/test_web.rb b/test/test_web.rb index e9979637..562a9845 100644 --- a/test/test_web.rb +++ b/test/test_web.rb @@ -199,17 +199,49 @@ class TestWeb < MiniTest::Unit::TestCase assert_equal 200, last_response.status end - it 'can refresh dashboard stats' do - Sidekiq.redis do |conn| - conn.set("stat:processed", 5) - conn.set("stat:failed", 2) + describe 'stats' do + before do + Sidekiq.redis do |conn| + conn.set("stat:processed", 5) + conn.set("stat:failed", 2) + end + 2.times { add_retry } + 3.times { add_scheduled } + get '/dashboard/stats' + @response = Sidekiq.load_json(last_response.body) end - 2.times { add_retry } - 3.times { add_scheduled } - get '/dashboard/stats' - assert_equal 200, last_response.status - assert_equal "{\"processed\":5,\"failed\":2,\"enqueued\":0,\"scheduled\":3,\"retries\":2}", last_response.body + it 'can refresh dashboard stats' do + assert_equal 200, last_response.status + end + + describe "for sidekiq" do + it 'are namespaced' do + assert_includes @response.keys, "sidekiq" + end + + it 'reports processed' do + assert_equal @response["sidekiq"]["processed"], 5 + end + + it 'reports failed' do + assert_equal @response["sidekiq"]["failed"], 2 + end + + it 'reports retries' do + assert_equal @response["sidekiq"]["retries"], 2 + end + + it 'reports scheduled' do + assert_equal @response["sidekiq"]["scheduled"], 3 + end + end + + describe "for redis" do + it 'are namespaced' do + assert_includes @response.keys, "redis" + end + end end def add_scheduled diff --git a/web/assets/javascripts/dashboard.js b/web/assets/javascripts/dashboard.js index 14527bcc..40ad1054 100644 --- a/web/assets/javascripts/dashboard.js +++ b/web/assets/javascripts/dashboard.js @@ -53,7 +53,8 @@ var realtimeGraph = function(updatePath) { Sidekiq.processed = data.processed; Sidekiq.failed = data.failed; - updateStatsSummary(data); + updateStatsSummary(data.sidekiq); + updateRedisStats(data.redis); pulseBeacon(); }); i++; @@ -116,6 +117,14 @@ var updateStatsSummary = function(data) { $('ul.summary li.enqueued span.count').html(data.enqueued.numberWithDelimiter()) } +var updateRedisStats = function(data) { + $('.stat h3.redis_version').html(data.redis_version) + $('.stat h3.uptime_in_days').html(data.uptime_in_days) + $('.stat h3.connected_clients').html(data.connected_clients) + $('.stat h3.used_memory_human').html(data.used_memory_human) + $('.stat h3.used_memory_peak_human').html(data.used_memory_peak_human) +} + var pulseBeacon = function(){ $beacon = $('.beacon') $beacon.find('.dot').addClass('pulse').delay(1000).queue(function(){ diff --git a/web/views/dashboard.slim b/web/views/dashboard.slim index 17d1ab9a..4f86b89c 100644 --- a/web/views/dashboard.slim +++ b/web/views/dashboard.slim @@ -22,25 +22,25 @@ h5 Redis - if @redis_info.fetch("redis_version", nil) .stat - h3= @redis_info.fetch("redis_version") + h3.redis_version= @redis_info.fetch("redis_version") p Version - if @redis_info.fetch("uptime_in_days", nil) .stat - h3= @redis_info.fetch("uptime_in_days") + h3.uptime_in_days= @redis_info.fetch("uptime_in_days") p Uptime (days) - if @redis_info.fetch("connected_clients", nil) .stat - h3= @redis_info.fetch("connected_clients") + h3.connected_clients= @redis_info.fetch("connected_clients") p Connections - if @redis_info.fetch("used_memory_human", nil) .stat - h3= @redis_info.fetch("used_memory_human") + h3.used_memory_human= @redis_info.fetch("used_memory_human") p Memory Usage - if @redis_info.fetch("used_memory_peak_human", nil) .stat - h3= @redis_info.fetch("used_memory_peak_human") + h3.used_memory_peak_human= @redis_info.fetch("used_memory_peak_human") p Peak Memory Usage \ No newline at end of file