sidekiq 5.2.8 → 6.1.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  3. data/.github/workflows/ci.yml +41 -0
  4. data/.gitignore +0 -2
  5. data/.standard.yml +20 -0
  6. data/5.0-Upgrade.md +1 -1
  7. data/6.0-Upgrade.md +72 -0
  8. data/Changes.md +196 -0
  9. data/Ent-2.0-Upgrade.md +37 -0
  10. data/Ent-Changes.md +72 -1
  11. data/Gemfile +12 -11
  12. data/Gemfile.lock +193 -0
  13. data/Pro-5.0-Upgrade.md +25 -0
  14. data/Pro-Changes.md +56 -2
  15. data/README.md +18 -34
  16. data/Rakefile +5 -4
  17. data/bin/sidekiq +26 -2
  18. data/bin/sidekiqload +32 -24
  19. data/bin/sidekiqmon +8 -0
  20. data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
  21. data/lib/generators/sidekiq/worker_generator.rb +21 -13
  22. data/lib/sidekiq/api.rb +245 -219
  23. data/lib/sidekiq/cli.rb +144 -180
  24. data/lib/sidekiq/client.rb +68 -48
  25. data/lib/sidekiq/delay.rb +5 -6
  26. data/lib/sidekiq/exception_handler.rb +10 -12
  27. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  28. data/lib/sidekiq/extensions/active_record.rb +13 -10
  29. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  30. data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
  31. data/lib/sidekiq/fetch.rb +29 -30
  32. data/lib/sidekiq/job_logger.rb +45 -7
  33. data/lib/sidekiq/job_retry.rb +62 -61
  34. data/lib/sidekiq/launcher.rb +112 -54
  35. data/lib/sidekiq/logger.rb +166 -0
  36. data/lib/sidekiq/manager.rb +11 -13
  37. data/lib/sidekiq/middleware/chain.rb +15 -5
  38. data/lib/sidekiq/middleware/i18n.rb +5 -7
  39. data/lib/sidekiq/monitor.rb +133 -0
  40. data/lib/sidekiq/paginator.rb +18 -14
  41. data/lib/sidekiq/processor.rb +71 -70
  42. data/lib/sidekiq/rails.rb +29 -37
  43. data/lib/sidekiq/redis_connection.rb +50 -48
  44. data/lib/sidekiq/scheduled.rb +28 -29
  45. data/lib/sidekiq/sd_notify.rb +149 -0
  46. data/lib/sidekiq/systemd.rb +24 -0
  47. data/lib/sidekiq/testing/inline.rb +2 -1
  48. data/lib/sidekiq/testing.rb +35 -24
  49. data/lib/sidekiq/util.rb +17 -16
  50. data/lib/sidekiq/version.rb +2 -1
  51. data/lib/sidekiq/web/action.rb +14 -10
  52. data/lib/sidekiq/web/application.rb +74 -72
  53. data/lib/sidekiq/web/csrf_protection.rb +156 -0
  54. data/lib/sidekiq/web/helpers.rb +97 -77
  55. data/lib/sidekiq/web/router.rb +18 -17
  56. data/lib/sidekiq/web.rb +53 -53
  57. data/lib/sidekiq/worker.rb +126 -102
  58. data/lib/sidekiq.rb +69 -44
  59. data/sidekiq.gemspec +15 -16
  60. data/web/assets/javascripts/application.js +25 -27
  61. data/web/assets/javascripts/dashboard.js +4 -23
  62. data/web/assets/stylesheets/application-dark.css +149 -0
  63. data/web/assets/stylesheets/application.css +28 -6
  64. data/web/locales/de.yml +14 -2
  65. data/web/locales/en.yml +2 -0
  66. data/web/locales/fr.yml +3 -3
  67. data/web/locales/ja.yml +4 -1
  68. data/web/locales/lt.yml +83 -0
  69. data/web/locales/pl.yml +4 -4
  70. data/web/locales/ru.yml +4 -0
  71. data/web/locales/vi.yml +83 -0
  72. data/web/views/_job_info.erb +2 -1
  73. data/web/views/busy.erb +8 -3
  74. data/web/views/dead.erb +2 -2
  75. data/web/views/layout.erb +1 -0
  76. data/web/views/morgue.erb +5 -2
  77. data/web/views/queue.erb +10 -1
  78. data/web/views/queues.erb +9 -1
  79. data/web/views/retries.erb +5 -2
  80. data/web/views/retry.erb +2 -2
  81. data/web/views/scheduled.erb +5 -2
  82. metadata +31 -49
  83. data/.circleci/config.yml +0 -61
  84. data/.github/issue_template.md +0 -11
  85. data/.travis.yml +0 -11
  86. data/bin/sidekiqctl +0 -20
  87. data/lib/sidekiq/core_ext.rb +0 -1
  88. data/lib/sidekiq/ctl.rb +0 -221
  89. data/lib/sidekiq/logging.rb +0 -122
  90. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
@@ -16,10 +16,8 @@ var gridSize=(this.orientation=="right"?1:-1)*this.graph.width;this.graph.vis.ap
16
16
  var nodes=vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:rect").attr("x",function(d){return graph.x(d.x)+barXOffset}).attr("y",function(d){return graph.y(d.y0+Math.abs(d.y))*(d.y<0?-1:1)}).attr("width",seriesBarWidth).attr("height",function(d){return graph.y.magnitude(Math.abs(d.y))}).attr("opacity",series.opacity).attr("transform",transform);Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)});if(this.unstack)barXOffset+=seriesBarWidth},this)},_frequentInterval:function(data){var intervalCounts={};for(var i=0;i<data.length-1;i++){var interval=data[i+1].x-data[i].x;intervalCounts[interval]=intervalCounts[interval]||0;intervalCounts[interval]++}var frequentInterval={count:0,magnitude:1};var keysSorted=Rickshaw.keys(intervalCounts).sort(function asc(a,b){return Number(a)-Number(b)});keysSorted.forEach(function(i){if(frequentInterval.count<intervalCounts[i]){frequentInterval={count:intervalCounts[i],magnitude:i}}});return frequentInterval}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Area");Rickshaw.Graph.Renderer.Area=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"area",defaults:function($super){return Rickshaw.extend($super(),{unstack:false,fill:false,stroke:false})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.area().x(function(d){return graph.x(d.x)}).y0(function(d){return graph.y(d.y0)}).y1(function(d){return graph.y(d.y+d.y0)}).interpolate(graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory},seriesStrokeFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y+d.y0)}).interpolate(graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;vis.selectAll("*").remove();var method=this.unstack?"append":"insert";var data=series.filter(function(s){return!s.disabled}).map(function(s){return s.stack});var nodes=vis.selectAll("path").data(data).enter()[method]("svg:g","g");nodes.append("svg:path").attr("d",this.seriesPathFactory()).attr("class","area");if(this.stroke){nodes.append("svg:path").attr("d",this.seriesStrokeFactory()).attr("class","line")}var i=0;series.forEach(function(series){if(series.disabled)return;series.path=nodes[0][i++];this._styleSeries(series)},this)},_styleSeries:function(series){if(!series.path)return;d3.select(series.path).select(".area").attr("fill",series.color);if(this.stroke){d3.select(series.path).select(".line").attr("fill","none").attr("stroke",series.stroke||d3.interpolateRgb(series.color,"black")(.125)).attr("stroke-width",this.strokeWidth)}if(series.className){series.path.setAttribute("class",series.className)}}});Rickshaw.namespace("Rickshaw.Graph.Renderer.ScatterPlot");Rickshaw.Graph.Renderer.ScatterPlot=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"scatterplot",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:true,stroke:false,padding:{top:.01,right:.01,bottom:.01,left:.01},dotSize:4})},initialize:function($super,args){$super(args)},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;var dotSize=this.dotSize;vis.selectAll("*").remove();series.forEach(function(series){if(series.disabled)return;var opacity=series.opacity?series.opacity:1;var nodes=vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:circle").attr("cx",function(d){return graph.x(d.x)}).attr("cy",function(d){return graph.y(d.y)}).attr("r",function(d){return"r"in d?d.r:dotSize}).attr("opacity",function(d){return"opacity"in d?d.opacity:opacity});if(series.className){nodes.classed(series.className,true)}Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)})},this)}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Multi");Rickshaw.Graph.Renderer.Multi=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"multi",initialize:function($super,args){$super(args)},defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:false,stroke:true})},configure:function($super,args){args=args||{};this.config=args;$super(args)},domain:function($super){this.graph.stackData();var domains=[];var groups=this._groups();this._stack(groups);groups.forEach(function(group){var data=group.series.filter(function(s){return!s.disabled}).map(function(s){return s.stack});if(!data.length)return;var domain=null;if(group.renderer&&group.renderer.domain){domain=group.renderer.domain(data)}else{domain=$super(data)}domains.push(domain)});var xMin=d3.min(domains.map(function(d){return d.x[0]}));var xMax=d3.max(domains.map(function(d){return d.x[1]}));var yMin=d3.min(domains.map(function(d){return d.y[0]}));var yMax=d3.max(domains.map(function(d){return d.y[1]}));return{x:[xMin,xMax],y:[yMin,yMax]}},_groups:function(){var graph=this.graph;var renderGroups={};graph.series.forEach(function(series){if(series.disabled)return;if(!renderGroups[series.renderer]){var ns="http://www.w3.org/2000/svg";var vis=document.createElementNS(ns,"g");graph.vis[0][0].appendChild(vis);var renderer=graph._renderers[series.renderer];var config={};var defaults=[this.defaults(),renderer.defaults(),this.config,this.graph];defaults.forEach(function(d){Rickshaw.extend(config,d)});renderer.configure(config);renderGroups[series.renderer]={renderer:renderer,series:[],vis:d3.select(vis)}}renderGroups[series.renderer].series.push(series)},this);var groups=[];Object.keys(renderGroups).forEach(function(key){var group=renderGroups[key];groups.push(group)});return groups},_stack:function(groups){groups.forEach(function(group){var series=group.series.filter(function(series){return!series.disabled});var data=series.map(function(series){return series.stack});if(!group.renderer.unstack){var layout=d3.layout.stack();var stackedData=Rickshaw.clone(layout(data));series.forEach(function(series,index){series._stack=Rickshaw.clone(stackedData[index])})}},this);return groups},render:function(){this.graph.series.forEach(function(series){if(!series.renderer){throw new Error("Each series needs a renderer for graph 'multi' renderer")}});this.graph.vis.selectAll("*").remove();var groups=this._groups();groups=this._stack(groups);groups.forEach(function(group){var series=group.series.filter(function(series){return!series.disabled});series.active=function(){return series};group.renderer.render({series:series,vis:group.vis});series.forEach(function(s){s.stack=s._stack||s.stack||s.data})})}});Rickshaw.namespace("Rickshaw.Graph.Renderer.LinePlot");Rickshaw.Graph.Renderer.LinePlot=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"lineplot",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:false,stroke:true,padding:{top:.01,right:.01,bottom:.01,left:.01},dotSize:3,strokeWidth:2})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;var dotSize=this.dotSize;vis.selectAll("*").remove();var data=series.filter(function(s){return!s.disabled}).map(function(s){return s.stack});var nodes=vis.selectAll("path").data(data).enter().append("svg:path").attr("d",this.seriesPathFactory());var i=0;series.forEach(function(series){if(series.disabled)return;series.path=nodes[0][i++];this._styleSeries(series)},this);series.forEach(function(series){if(series.disabled)return;var nodes=vis.selectAll("x").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:circle").attr("cx",function(d){return graph.x(d.x)}).attr("cy",function(d){return graph.y(d.y)}).attr("r",function(d){return"r"in d?d.r:dotSize});Array.prototype.forEach.call(nodes[0],function(n){if(!n)return;n.setAttribute("data-color",series.color);n.setAttribute("fill","white");n.setAttribute("stroke",series.color);n.setAttribute("stroke-width",this.strokeWidth)}.bind(this))},this)}});Rickshaw.namespace("Rickshaw.Graph.Smoother");Rickshaw.Graph.Smoother=Rickshaw.Class.create({initialize:function(args){this.graph=args.graph;this.element=args.element;this.aggregationScale=1;this.build();this.graph.stackData.hooks.data.push({name:"smoother",orderPosition:50,f:this.transformer.bind(this)})},build:function(){var self=this;var $=jQuery;if(this.element){$(function(){$(self.element).slider({min:1,max:100,slide:function(event,ui){self.setScale(ui.value)}})})}},setScale:function(scale){if(scale<1){throw"scale out of range: "+scale}this.aggregationScale=scale;this.graph.update()},transformer:function(data){if(this.aggregationScale==1)return data;var aggregatedData=[];data.forEach(function(seriesData){var aggregatedSeriesData=[];while(seriesData.length){var avgX=0,avgY=0;var slice=seriesData.splice(0,this.aggregationScale);slice.forEach(function(d){avgX+=d.x/slice.length;avgY+=d.y/slice.length});aggregatedSeriesData.push({x:avgX,y:avgY})}aggregatedData.push(aggregatedSeriesData)}.bind(this));return aggregatedData}});Rickshaw.namespace("Rickshaw.Graph.Socketio");Rickshaw.Graph.Socketio=Rickshaw.Class.create(Rickshaw.Graph.Ajax,{request:function(){var socket=io.connect(this.dataURL);var self=this;socket.on("rickshaw",function(data){self.success(data)})}});Rickshaw.namespace("Rickshaw.Series");Rickshaw.Series=Rickshaw.Class.create(Array,{initialize:function(data,palette,options){options=options||{};this.palette=new Rickshaw.Color.Palette(palette);this.timeBase=typeof options.timeBase==="undefined"?Math.floor((new Date).getTime()/1e3):options.timeBase;var timeInterval=typeof options.timeInterval=="undefined"?1e3:options.timeInterval;this.setTimeInterval(timeInterval);if(data&&typeof data=="object"&&Array.isArray(data)){data.forEach(function(item){this.addItem(item)},this)}},addItem:function(item){if(typeof item.name==="undefined"){throw"addItem() needs a name"}item.color=item.color||this.palette.color(item.name);item.data=item.data||[];if(item.data.length===0&&this.length&&this.getIndex()>0){this[0].data.forEach(function(plot){item.data.push({x:plot.x,y:0})})}else if(item.data.length===0){item.data.push({x:this.timeBase-(this.timeInterval||0),y:0})}this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},addData:function(data,x){var index=this.getIndex();Rickshaw.keys(data).forEach(function(name){if(!this.itemByName(name)){this.addItem({name:name})}},this);this.forEach(function(item){item.data.push({x:x||(index*this.timeInterval||1)+this.timeBase,y:data[item.name]||0})},this)},getIndex:function(){return this[0]&&this[0].data&&this[0].data.length?this[0].data.length:0},itemByName:function(name){for(var i=0;i<this.length;i++){if(this[i].name==name)return this[i]}},setTimeInterval:function(iv){this.timeInterval=iv/1e3},setTimeBase:function(t){this.timeBase=t},dump:function(){var data={timeBase:this.timeBase,timeInterval:this.timeInterval,items:[]};this.forEach(function(item){var newItem={color:item.color,name:item.name,data:[]};item.data.forEach(function(plot){newItem.data.push({x:plot.x,y:plot.y})});data.items.push(newItem)});return data},load:function(data){if(data.timeInterval){this.timeInterval=data.timeInterval}if(data.timeBase){this.timeBase=data.timeBase}if(data.items){data.items.forEach(function(item){this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},this)}}});Rickshaw.Series.zeroFill=function(series){Rickshaw.Series.fill(series,0)};Rickshaw.Series.fill=function(series,fill){var x;var i=0;var data=series.map(function(s){return s.data});while(i<Math.max.apply(null,data.map(function(d){return d.length}))){x=Math.min.apply(null,data.filter(function(d){return d[i]}).map(function(d){return d[i].x}));data.forEach(function(d){if(!d[i]||d[i].x!=x){d.splice(i,0,{x:x,y:fill})}});i++}};Rickshaw.namespace("Rickshaw.Series.FixedDuration");Rickshaw.Series.FixedDuration=Rickshaw.Class.create(Rickshaw.Series,{initialize:function(data,palette,options){options=options||{};if(typeof options.timeInterval==="undefined"){throw new Error("FixedDuration series requires timeInterval")}if(typeof options.maxDataPoints==="undefined"){throw new Error("FixedDuration series requires maxDataPoints")}this.palette=new Rickshaw.Color.Palette(palette);this.timeBase=typeof options.timeBase==="undefined"?Math.floor((new Date).getTime()/1e3):options.timeBase;this.setTimeInterval(options.timeInterval);if(this[0]&&this[0].data&&this[0].data.length){this.currentSize=this[0].data.length;this.currentIndex=this[0].data.length}else{this.currentSize=0;this.currentIndex=0}this.maxDataPoints=options.maxDataPoints;if(data&&typeof data=="object"&&Array.isArray(data)){data.forEach(function(item){this.addItem(item)},this);this.currentSize+=1;this.currentIndex+=1}this.timeBase-=(this.maxDataPoints-this.currentSize)*this.timeInterval;if(typeof this.maxDataPoints!=="undefined"&&this.currentSize<this.maxDataPoints){for(var i=this.maxDataPoints-this.currentSize-1;i>1;i--){this.currentSize+=1;this.currentIndex+=1;this.forEach(function(item){item.data.unshift({x:((i-1)*this.timeInterval||1)+this.timeBase,y:0,i:i})},this)}}},addData:function($super,data,x){$super(data,x);this.currentSize+=1;this.currentIndex+=1;if(this.maxDataPoints!==undefined){while(this.currentSize>this.maxDataPoints){this.dropData()}}},dropData:function(){this.forEach(function(item){item.data.splice(0,1)});this.currentSize-=1},getIndex:function(){return this.currentIndex}});return Rickshaw});
17
17
 
18
18
  var poller;
19
-
20
19
  var realtimeGraph = function(updatePath) {
21
20
  var timeInterval = parseInt(localStorage.timeInterval || '5000');
22
-
23
21
  var graphElement = document.getElementById("realtime");
24
22
 
25
23
  var graph = new Rickshaw.Graph( {
@@ -29,9 +27,9 @@ var realtimeGraph = function(updatePath) {
29
27
  renderer: 'line',
30
28
  interpolation: 'linear',
31
29
 
32
- series: new Rickshaw.Series.FixedDuration([{ name: graphElement.dataset.failedLabel, color: '#B1003E' }, { name: graphElement.dataset.processedLabel, color: '#006f68' }], undefined, {
33
- timeInterval: timeInterval,
34
- maxDataPoints: 100,
30
+ series: new Rickshaw.Series.FixedDuration([{ name: graphElement.dataset.failedLabel, color: '#af0014' }, { name: graphElement.dataset.processedLabel, color: '#006f68' }], undefined, {
31
+ timeInterval: timeInterval,
32
+ maxDataPoints: 100,
35
33
  })
36
34
  });
37
35
 
@@ -46,7 +44,6 @@ var realtimeGraph = function(updatePath) {
46
44
  var legend = document.querySelector('#realtime-legend');
47
45
  var Hover = Rickshaw.Class.create(Rickshaw.Graph.HoverDetail, {
48
46
  render: function(args) {
49
-
50
47
  legend.innerHTML = "";
51
48
 
52
49
  var timestamp = document.createElement('div');
@@ -68,7 +65,6 @@ var realtimeGraph = function(updatePath) {
68
65
 
69
66
  line.appendChild(swatch);
70
67
  line.appendChild(label);
71
-
72
68
  legend.appendChild(line);
73
69
 
74
70
  var dot = document.createElement('div');
@@ -77,11 +73,8 @@ var realtimeGraph = function(updatePath) {
77
73
  dot.style.borderColor = d.series.color;
78
74
 
79
75
  this.element.appendChild(dot);
80
-
81
76
  dot.className = 'dot active';
82
-
83
77
  this.show();
84
-
85
78
  }, this );
86
79
  }
87
80
  });
@@ -90,7 +83,6 @@ var realtimeGraph = function(updatePath) {
90
83
  var i = 0;
91
84
  poller = setInterval(function() {
92
85
  $.getJSON($("#history").data("update-url"), function(data) {
93
-
94
86
  if (i === 0) {
95
87
  var processed = data.sidekiq.processed;
96
88
  var failed = data.sidekiq.failed;
@@ -133,7 +125,7 @@ var historyGraph = function() {
133
125
  interpolation: 'linear',
134
126
  series: [
135
127
  {
136
- color: "#B1003E",
128
+ color: "#af0014",
137
129
  data: failed,
138
130
  name: graphElement.dataset.failedLabel
139
131
  }, {
@@ -144,7 +136,6 @@ var historyGraph = function() {
144
136
  ]
145
137
  } );
146
138
  var x_axis = new Rickshaw.Graph.Axis.Time( { graph: graph } );
147
-
148
139
  var y_axis = new Rickshaw.Graph.Axis.Y({
149
140
  graph: graph,
150
141
  tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
@@ -156,7 +147,6 @@ var historyGraph = function() {
156
147
  var legend = document.querySelector('#history-legend');
157
148
  var Hover = Rickshaw.Class.create(Rickshaw.Graph.HoverDetail, {
158
149
  render: function(args) {
159
-
160
150
  legend.innerHTML = "";
161
151
 
162
152
  var timestamp = document.createElement('div');
@@ -178,7 +168,6 @@ var historyGraph = function() {
178
168
 
179
169
  line.appendChild(swatch);
180
170
  line.appendChild(label);
181
-
182
171
  legend.appendChild(line);
183
172
 
184
173
  var dot = document.createElement('div');
@@ -187,11 +176,8 @@ var historyGraph = function() {
187
176
  dot.style.borderColor = d.series.color;
188
177
 
189
178
  this.element.appendChild(dot);
190
-
191
179
  dot.className = 'dot active';
192
-
193
180
  this.show();
194
-
195
181
  }, this );
196
182
  }
197
183
  });
@@ -216,7 +202,6 @@ var updateStatsSummary = function(data) {
216
202
  $('ul.summary li.retries span.count').html(data.retries.numberWithDelimiter())
217
203
  $('ul.summary li.enqueued span.count').html(data.enqueued.numberWithDelimiter())
218
204
  $('ul.summary li.dead span.count').html(data.dead.numberWithDelimiter())
219
-
220
205
  }
221
206
 
222
207
  var updateRedisStats = function(data) {
@@ -277,7 +262,6 @@ $(function(){
277
262
  $(document).on('mousemove', 'div.interval-slider input', function(){
278
263
  setSliderLabel($(this).val());
279
264
  });
280
-
281
265
  });
282
266
 
283
267
  // Reset graphs
@@ -300,13 +284,10 @@ var debounce = function(fn, timeout)
300
284
 
301
285
  window.onresize = function() {
302
286
  var prevWidth = window.innerWidth;
303
-
304
287
  return debounce(function () {
305
288
  var currWidth = window.innerWidth;
306
-
307
289
  if (prevWidth !== currWidth) {
308
290
  prevWidth = currWidth;
309
-
310
291
  clearInterval(poller);
311
292
  resetGraphs();
312
293
  renderGraphs();
@@ -0,0 +1,149 @@
1
+ html, body {
2
+ background-color: #333 !important;
3
+ color: #ddd;
4
+ }
5
+
6
+ a,
7
+ .title,
8
+ .summary_bar ul .count,
9
+ span.current-interval,
10
+ .navbar .navbar-brand {
11
+ color: #c04;
12
+ }
13
+
14
+ .history-graph + .active,
15
+ .beacon .dot {
16
+ background-color: #c04;
17
+ }
18
+
19
+ .navbar .navbar-brand:hover {
20
+ color: #ddd;
21
+ }
22
+
23
+ .navbar .navbar-brand .status {
24
+ color: #ddd;
25
+ }
26
+
27
+ .navbar-default .navbar-nav > li > a {
28
+ color: #ddd;
29
+ }
30
+
31
+ .navbar-inverse {
32
+ background-color: #222;
33
+ border-color: #555;
34
+ }
35
+
36
+ table {
37
+ background-color: #282828;
38
+ }
39
+
40
+ .table-striped > tbody > tr:nth-of-type(odd) {
41
+ background-color: #333;
42
+ }
43
+
44
+ .table-bordered,
45
+ .table-bordered > tbody > tr > td,
46
+ .table-bordered > tbody > tr > th,
47
+ .table-bordered > tfoot > tr > td,
48
+ .table-bordered > tfoot > tr > th,
49
+ .table-bordered > thead > tr > td,
50
+ .table-bordered > thead > tr > th {
51
+ border: 1px solid #555;
52
+ }
53
+
54
+ .table-hover > tbody > tr:hover {
55
+ background-color: #444;
56
+ }
57
+
58
+ .alert {
59
+ border: none;
60
+ color: #ddd;
61
+ }
62
+
63
+ .alert-success {
64
+ background-color: #484;
65
+ }
66
+
67
+ a:link,
68
+ a:active,
69
+ a:hover,
70
+ a:visited {
71
+ color: #ddd;
72
+ }
73
+
74
+ a.btn {
75
+ color: #000;
76
+ }
77
+
78
+ input {
79
+ background-color: #444;
80
+ color: #ccc;
81
+ padding: 3px;
82
+ }
83
+
84
+ .summary_bar .summary {
85
+ background-color: #222;
86
+ border: 1px solid #555;
87
+
88
+ -webkit-box-shadow: 0 0 5px rgba(255, 255, 255, 0.1);
89
+ -moz-box-shadow: 0 0 5px rgba(255, 255, 255, 0.1);
90
+ box-shadow: 0 0 5px rgba(255, 255, 255, 0.1);
91
+ }
92
+
93
+ .navbar-default {
94
+ background-color: #222;
95
+ border-color: #555;
96
+ }
97
+
98
+ .navbar-default .navbar-nav > .active > a,
99
+ .navbar-default .navbar-nav > .active > a:focus,
100
+ .navbar-default .navbar-nav > .active > a:hover {
101
+ color: #ddd;
102
+ background-color: #333;
103
+ }
104
+
105
+ .navbar-default .navbar-nav > li > a:hover {
106
+ color: #ddd;
107
+ }
108
+
109
+ .pagination > li > a,
110
+ .pagination > li > a:hover,
111
+ .pagination > li > span {
112
+ color: #ddd;
113
+ background-color: #333;
114
+ border-color: #555;
115
+ }
116
+ .pagination > .disabled > a,
117
+ .pagination > .disabled > a:focus,
118
+ .pagination > .disabled > a:hover,
119
+ .pagination > .disabled > span,
120
+ .pagination > .disabled > span:focus,
121
+ .pagination > .disabled > span:hover {
122
+ color: #ddd;
123
+ background-color: #333;
124
+ border-color: #555;
125
+ }
126
+
127
+ .stat {
128
+ border: 1px solid rgba(255, 255, 255, 0.1);
129
+ }
130
+
131
+ #live-poll {
132
+ color: #ddd;
133
+ }
134
+
135
+ .btn-warn {
136
+ color: #444;
137
+ }
138
+
139
+ .rickshaw_graph .detail {
140
+ background: rgba(255, 255, 255, .1)
141
+ }
142
+ .rickshaw_graph .x_tick {
143
+ border-color: rgba(255, 255, 255, .2);
144
+ }
145
+
146
+ .rickshaw_graph .y_ticks.glow text {
147
+ fill: #ddd;
148
+ color: #ddd;
149
+ }
@@ -177,10 +177,6 @@ header.row .pagination {
177
177
  overflow: overlay;
178
178
  }
179
179
 
180
- table.table-white {
181
- background-color: #fff;
182
- }
183
-
184
180
  .queues form {
185
181
  margin: 0;
186
182
  }
@@ -201,6 +197,15 @@ td form {
201
197
  padding: 0;
202
198
  }
203
199
 
200
+ .jobtag a {
201
+ color: white;
202
+ }
203
+
204
+ .jobtag a:hover {
205
+ color: white;
206
+ text-decoration: underline;
207
+ }
208
+
204
209
  table .table-checkbox label {
205
210
  height: 100%;
206
211
  width: 100%;
@@ -460,6 +465,11 @@ span.current-interval {
460
465
 
461
466
  div.interval-slider input {
462
467
  width: 160px;
468
+ -webkit-appearance: none;
469
+ height: 3px;
470
+ margin-top: 5px;
471
+ border-radius: 2px;
472
+ background: currentcolor;
463
473
  }
464
474
 
465
475
  #realtime-legend,
@@ -748,7 +758,7 @@ div.interval-slider input {
748
758
  font-family: Arial, sans-serif;
749
759
  border-radius: 3px;
750
760
  padding: 6px;
751
- opacity: .5;
761
+ opacity: .7;
752
762
  border: 1px solid #e0e0e0;
753
763
  font-size: 12px;
754
764
  position: absolute;
@@ -963,7 +973,7 @@ div.interval-slider input {
963
973
  }
964
974
  .rickshaw_graph .y_ticks text,
965
975
  .rickshaw_graph .x_ticks_d3 text {
966
- opacity: .5;
976
+ opacity: .7;
967
977
  font-size: 12px;
968
978
  pointer-events: none
969
979
  }
@@ -1142,3 +1152,15 @@ div.interval-slider input {
1142
1152
  .delete-confirm {
1143
1153
  width: 20%;
1144
1154
  }
1155
+
1156
+ .circled {
1157
+ border-color: #333;
1158
+ color: #eee;
1159
+ background-color: #b1003e;
1160
+ border-radius: 50%;
1161
+ text-align: center;
1162
+ vertical-align: middle;
1163
+ padding: 3px 7px;
1164
+ font-size: 0.7em;
1165
+ margin-left: 5px;
1166
+ }
data/web/locales/de.yml CHANGED
@@ -13,7 +13,7 @@ de:
13
13
  Retries: Versuche
14
14
  Enqueued: In der Warteschlange
15
15
  Worker: Arbeiter
16
- LivePoll: Live Poll
16
+ LivePoll: Echtzeitabfrage
17
17
  StopPolling: Abfrage stoppen
18
18
  Queue: Warteschlange
19
19
  Class: Klasse
@@ -33,12 +33,13 @@ de:
33
33
  NextRetry: Nächster Versuch
34
34
  RetryCount: Anzahl der Versuche
35
35
  RetryNow: Jetzt erneut versuchen
36
- Kill: Töten
36
+ Kill: Vernichten
37
37
  LastRetry: Letzter Versuch
38
38
  OriginallyFailed: Ursprünglich fehlgeschlagen
39
39
  AreYouSure: Bist du sicher?
40
40
  DeleteAll: Alle löschen
41
41
  RetryAll: Alle erneut versuchen
42
+ KillAll: Alle vernichten
42
43
  NoRetriesFound: Keine erneuten Versuche gefunden
43
44
  Error: Fehler
44
45
  ErrorClass: Fehlerklasse
@@ -67,3 +68,14 @@ de:
67
68
  Thread: Thread
68
69
  Threads: Threads
69
70
  Jobs: Jobs
71
+ Paused: Pausiert
72
+ Stop: Stopp
73
+ Quiet: Leise
74
+ StopAll: Alle stoppen
75
+ QuietAll: Alle leise
76
+ PollingInterval: Abfrageintervall
77
+ Plugins: Erweiterungen
78
+ NotYetEnqueued: Noch nicht in der Warteschlange
79
+ CreatedAt: Erstellt
80
+ BackToApp: Zurück zur Anwendung
81
+ Latency: Latenz
data/web/locales/en.yml CHANGED
@@ -79,3 +79,5 @@ en: # <---- change this to your locale code
79
79
  CreatedAt: Created At
80
80
  BackToApp: Back to App
81
81
  Latency: Latency
82
+ Pause: Pause
83
+ Unpause: Unpause
data/web/locales/fr.yml CHANGED
@@ -69,10 +69,10 @@ fr:
69
69
  Jobs: Tâches
70
70
  Paused: Mise en pause
71
71
  Stop: Arrêter
72
- Quiet: Clôturer
72
+ Quiet: Clore
73
73
  StopAll: Tout arrêter
74
- QuietAll: Tout clôturer
75
- PollingInterval: Interval de rafraîchissement
74
+ QuietAll: Tout clore
75
+ PollingInterval: Intervalle de rafraîchissement
76
76
  Plugins: Plugins
77
77
  NotYetEnqueued: Pas encore en file d'attente
78
78
  CreatedAt: Créée le
data/web/locales/ja.yml CHANGED
@@ -33,11 +33,13 @@ ja:
33
33
  NextRetry: 再試行
34
34
  RetryCount: 再試行
35
35
  RetryNow: 今すぐ再試行
36
+ Kill: 強制終了
36
37
  LastRetry: 再試行履歴
37
38
  OriginallyFailed: 失敗
38
39
  AreYouSure: よろしいですか?
39
40
  DeleteAll: 全て削除
40
41
  RetryAll: 全て再試行
42
+ KillAll: 全て強制終了
41
43
  NoRetriesFound: 再試行するジョブはありません
42
44
  Error: エラー
43
45
  ErrorClass: エラークラス
@@ -58,7 +60,6 @@ ja:
58
60
  OneMonth: 1 ヶ月
59
61
  ThreeMonths: 3 ヶ月
60
62
  SixMonths: 6 ヶ月
61
- Batches: バッチ
62
63
  Failures: 失敗
63
64
  DeadJobs: デッドジョブ
64
65
  NoDeadJobsFound: デッドジョブはありません
@@ -78,3 +79,5 @@ ja:
78
79
  CreatedAt: 作成日時
79
80
  BackToApp: アプリに戻る
80
81
  Latency: レイテンシ
82
+ Pause: 一時停止
83
+ Unpause: 一時停止を解除
@@ -0,0 +1,83 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ lt:
3
+ Dashboard: Valdymo skydas
4
+ Status: Būsena
5
+ Time: Laikas
6
+ Namespace: Vardų erdvė
7
+ Realtime: Realiu laiku
8
+ History: Istorija
9
+ Busy: Užimti
10
+ Processed: Įvykdyti
11
+ Failed: Nepavykę
12
+ Scheduled: Suplanuoti
13
+ Retries: Kartojami
14
+ Enqueued: Eilėje
15
+ Worker: Darbuotojas
16
+ LivePoll: Užklausti gyvai
17
+ StopPolling: Stabdyti užklausas
18
+ Queue: Eilė
19
+ Class: Klasė
20
+ Job: Darbas
21
+ Arguments: Parametrai
22
+ Extras: Papildomi
23
+ Started: Pradėti
24
+ ShowAll: Rodyti Visus
25
+ CurrentMessagesInQueue: Esami darbai eilėje <span class='title'>%{queue}</span>
26
+ Delete: Pašalinti
27
+ AddToQueue: Pridėti į eilę
28
+ AreYouSureDeleteJob: Ar tikrai norite pašalinti šį darbą?
29
+ AreYouSureDeleteQueue: Ar tikrai norite pašalinti šią eilę %{queue}?
30
+ Queues: Eilės
31
+ Size: Dydis
32
+ Actions: Veiksmai
33
+ NextRetry: Sekantis Kartojimas
34
+ RetryCount: Kartojimų Skaičius
35
+ RetryNow: Kartoti Dabar
36
+ Kill: Priverstinai Nutraukti
37
+ LastRetry: Paskutinis Kartojimas
38
+ OriginallyFailed: Iš pradžių Nepavykę
39
+ AreYouSure: Ar jūs įsitikinę?
40
+ DeleteAll: Pašalinti Visus
41
+ RetryAll: Kartoti Visus
42
+ KillAll: Priverstinai Nutraukti Visus
43
+ NoRetriesFound: Nerasta kartojimų
44
+ Error: Klaida
45
+ ErrorClass: Klaidos Klasė
46
+ ErrorMessage: Klaidos Žinutė
47
+ ErrorBacktrace: Klaidos Pėdsakai
48
+ GoBack: ← Atgal
49
+ NoScheduledFound: Planuojamų darbų nerasta
50
+ When: Kada
51
+ ScheduledJobs: Planuojami Darbai
52
+ idle: neveiksnus
53
+ active: aktyvus
54
+ Version: Versija
55
+ Connections: Ryšiai
56
+ MemoryUsage: Atminties Vartojimas
57
+ PeakMemoryUsage: Atminties Vartojimo Pikas
58
+ Uptime: Gyvavimo laikas (dienomis)
59
+ OneWeek: 1 savaitė
60
+ OneMonth: 1 mėnuo
61
+ ThreeMonths: 3 mėnesiai
62
+ SixMonths: 6 mėnesiai
63
+ Failures: Nesėkmingi vykdymai
64
+ DeadJobs: Negyvi Darbai
65
+ NoDeadJobsFound: Negyvų darbų nerasta
66
+ Dead: Negyvi
67
+ Processes: Procesai
68
+ Thread: Gija
69
+ Threads: Gijos
70
+ Jobs: Darbai
71
+ Paused: Pristabdytas
72
+ Stop: Sustabdyti
73
+ Quiet: Nutildyti
74
+ StopAll: Sustbadyti Visus
75
+ QuietAll: Nutildyti Visus
76
+ PollingInterval: Užklausimų intervalas
77
+ Plugins: Įskiepiai
78
+ NotYetEnqueued: Dar neįtraukti į eilę
79
+ CreatedAt: Sukurta
80
+ BackToApp: Atgal į Aplikaciją
81
+ Latency: Vėlavimas
82
+ Pause: Pristabdyti
83
+ Unpause: Pratęsti
data/web/locales/pl.yml CHANGED
@@ -10,7 +10,7 @@ pl:
10
10
  Processed: Ukończone
11
11
  Failed: Nieudane
12
12
  Scheduled: Zaplanowane
13
- Retries: Prób
13
+ Retries: Do ponowienia
14
14
  Enqueued: Zakolejkowane
15
15
  Worker: Worker
16
16
  LivePoll: Wczytuj na żywo
@@ -29,15 +29,15 @@ pl:
29
29
  Queues: Kolejki
30
30
  Size: Rozmiar
31
31
  Actions: Akcje
32
- NextRetry: Kolejna próba
33
- RetryCount: Liczba prób
32
+ NextRetry: Następne ponowienie
33
+ RetryCount: Ilość ponowień
34
34
  RetryNow: Ponów teraz
35
35
  LastRetry: Ostatnie ponowienie
36
36
  OriginallyFailed: Ostatnio nieudane
37
37
  AreYouSure: Na pewno?
38
38
  DeleteAll: Usuń wszystko
39
39
  RetryAll: Powtórz wszystko
40
- NoRetriesFound: Brak powtórzeń
40
+ NoRetriesFound: Brak zadań do ponowienia
41
41
  Error: Błąd
42
42
  ErrorClass: Klasa błędu
43
43
  ErrorMessage: Wiadomosć błędu
data/web/locales/ru.yml CHANGED
@@ -38,6 +38,7 @@ ru:
38
38
  AreYouSure: Вы уверены?
39
39
  DeleteAll: Удалить все
40
40
  RetryAll: Повторить все
41
+ KillAll: Убить всё
41
42
  NoRetriesFound: Нет попыток
42
43
  Error: Ошибка
43
44
  ErrorClass: Класс ошибки
@@ -76,3 +77,6 @@ ru:
76
77
  NotYetEnqueued: Пока не в очереди
77
78
  CreatedAt: Создан
78
79
  BackToApp: Назад
80
+ Latency: Задержка
81
+ Pause: Пауза
82
+ Unpause: Возобновить
@@ -0,0 +1,83 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ vi: # <---- change this to your locale code
3
+ Dashboard: Bảng điều khiển
4
+ Status: Trạng thái
5
+ Time: Thời gian
6
+ Namespace: Không gian tên
7
+ Realtime: Thời gian thực
8
+ History: Lịch sử
9
+ Busy: Bận rộn
10
+ Processed: Đã xử lí
11
+ Failed: Đã thất bại
12
+ Scheduled: Đã lên lịch
13
+ Retries: Số lần thử
14
+ Enqueued: Đã xếp hàng đợi
15
+ Worker: Máy xử lí
16
+ LivePoll: Thăm dò trực tiếp
17
+ StopPolling: Ngừng thăm dò
18
+ Queue: Hàng đợi
19
+ Class: Lớp
20
+ Job: Tác vụ
21
+ Arguments: Tham số
22
+ Extras: Thêm
23
+ Started: Đã bắt đầu
24
+ ShowAll: Hiện tất cả
25
+ CurrentMessagesInQueue: Số lượng công việc trong <span class='title'>%{queue}</span>
26
+ Delete: Xóa
27
+ AddToQueue: Thêm vào hàng đợi
28
+ AreYouSureDeleteJob: Bạn có chắc là muốn xóa tác vụ này?
29
+ AreYouSureDeleteQueue: Bạn có chắc là muốn xóa %{queue} này?
30
+ Queues: Các hàng đợi
31
+ Size: Kích thước
32
+ Actions: Những hành động
33
+ NextRetry: Lần thử lại tiếp theo
34
+ RetryCount: Số lần thử lại
35
+ RetryNow: Thử lại ngay bây giờ
36
+ Kill: Giết
37
+ LastRetry: Lần thử cuối
38
+ OriginallyFailed: Đã thất bại từ đầu
39
+ AreYouSure: Bạn chắc chứ?
40
+ DeleteAll: Xóa hết
41
+ RetryAll: Thử lại tất cả
42
+ KillAll: Giết hết
43
+ NoRetriesFound: Không có lần thử nào được tìm thấy
44
+ Error: Lỗi
45
+ ErrorClass: Lớp lỗi
46
+ ErrorMessage: Tin nhắn lỗi
47
+ ErrorBacktrace: Dấu vết của lỗi
48
+ GoBack: ← Trở lại
49
+ NoScheduledFound: Không có tác vụ đã lên lịch nào được tìm thấy
50
+ When: Khi nào
51
+ ScheduledJobs: Những Tác Vụ Được Hẹn
52
+ idle: Đang chờ
53
+ active: Đang hoạt động
54
+ Version: Phiên bản
55
+ Connections: Các kết nối
56
+ MemoryUsage: Lượng bộ nhớ sử dụng
57
+ PeakMemoryUsage: Lượng bộ nhớ sử dụng đỉnh điểm
58
+ Uptime: Thời gian hệ thống đã online (days)
59
+ OneWeek: 1 tuần
60
+ OneMonth: 1 tháng
61
+ ThreeMonths: 3 tháng
62
+ SixMonths: 6 tháng
63
+ Failures: Các thất bại
64
+ DeadJobs: Những tác vụ đã chết
65
+ NoDeadJobsFound: Không có tác vụ đã chết nào được tìm thấy
66
+ Dead: Chết
67
+ Processes: Tiến trình xử lí
68
+ Thread: Luồng xử lí
69
+ Threads: Những luồng xử lí
70
+ Jobs: Các tác vụ
71
+ Paused: Đã tạm dừng
72
+ Stop: Dừng Lại
73
+ Quiet: Im lặng
74
+ StopAll: Dừng lại tất cả
75
+ QuietAll: Làm cho tất cả im lặng
76
+ PollingInterval: Khoảng thời gian giữa các lần thăm dò
77
+ Plugins: Hệ thống đính kèm
78
+ NotYetEnqueued: Chưa được bỏ vào hàng đợi
79
+ CreatedAt: Được tạo vào lúc
80
+ BackToApp: Trở về ứng dụng
81
+ Latency: Độ trễ
82
+ Pause: Tạm dừng
83
+ Unpause: Hủy tạm dừng
@@ -14,7 +14,8 @@
14
14
  <tr>
15
15
  <th><%= t('Job') %></th>
16
16
  <td>
17
- <code><%= job.display_class %></code>
17
+ <%= job.display_class %>
18
+ <%= display_tags(job) %>
18
19
  </td>
19
20
  </tr>
20
21
  <tr>