mirror of
https://github.com/mperham/sidekiq.git
synced 2022-11-09 13:52:34 -05:00
Merge pull request #652 from mperham/update-dashboard-stats
Dynamically update redis stats on dashboard
This commit is contained in:
commit
0a60721114
5 changed files with 73 additions and 22 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue