sidekiq_queue_status 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc5fd855d926709a368cc99a1da6e19b2e7979f9
4
- data.tar.gz: da788b27a27e1fd9572dfe06cdb50a99aa08329f
3
+ metadata.gz: 983038f3f4671d60805223bdb2490356060e61a5
4
+ data.tar.gz: 3db19c930aa5afa3c5dea0001c876ce81aa8f02d
5
5
  SHA512:
6
- metadata.gz: f6f4775f9183af9637b917b8f0fe843473f40af3a6d1b43edecf60858c25ea4f961973b9b76b60d070cce45e94c560637de945d4d17642b88cfc98e69b57dbbc
7
- data.tar.gz: c9244adf2de5e48c57da03f6bf5d75a4436e352681068edd9f3c4ef76a11df557b5f32f23535460b93398bd35b244a4ced098d0e40dcbf5196e567bf4ff8d588
6
+ metadata.gz: f2d4563c2520de2c560e1691004bea63985b5fedce16f5d42ab76d63cf629d1b0b4fa425ca7179580a568a1d3a8fe6fd71ce6540e6b123802ed410bc638ae81d
7
+ data.tar.gz: 1407ab64ea2393f3630275a37befe7d5a41e16b15f8c3fe88c0b0e9b672b73d0ffd642db9b04986b4654f81b77c18601740c022a1980f4ce9c7dcda6c78184d5
@@ -0,0 +1,21 @@
1
+ module SidekiqQueueStatus
2
+ class FailureRate < Metric
3
+ DEFAULT_FAILURE_RATE_PERC = 10
4
+ def monitor
5
+ calculate_failure_rate.tap do |failure_rate|
6
+ error("Failure rate above #{max_failure_rate}%") if failure_rate > max_failure_rate
7
+ end
8
+ end
9
+
10
+ def calculate_failure_rate
11
+ stats = Sidekiq::Stats::History.new(1)
12
+ processed, failed = [stats.processed, stats.failed].map { |h| h.values.last }
13
+ val = (failed.to_f / processed.to_f) * 100.0
14
+ val > 0 ? val.to_i : 0
15
+ end
16
+
17
+ def max_failure_rate
18
+ Metric.config['queue_failure_rate'] || DEFAULT_FAILURE_RATE_PERC
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ module SidekiqQueueStatus
2
+ class Metric
3
+ Result = Struct.new :latencies, :failure_rate, :errors
4
+
5
+ class << self
6
+ attr_accessor :config
7
+ def all
8
+ metrics = QueueLatency.new, FailureRate.new
9
+ errors = metrics.map(&:errors).flatten
10
+ Result.new(*metrics.map(&:result), errors)
11
+ end
12
+ end
13
+
14
+ attr_reader :errors, :result
15
+ def initialize
16
+ @errors = []
17
+ @result = monitor
18
+ end
19
+
20
+ def error(message)
21
+ @errors << message
22
+ end
23
+ end
24
+ end
@@ -2,45 +2,25 @@ require 'sidekiq/api'
2
2
 
3
3
  module SidekiqQueueStatus
4
4
  class Middleware
5
- DEFAULT_TRESHOLD = 30
6
- DEFAULT_FAILURE_RATE_PERC = 10
7
5
  HEADERS = {
8
6
  'Content-Type' => 'application/json',
9
7
  'Cache-Control' => 'no-cache'
10
8
  }
11
9
 
12
- def initialize(app, configured_tresholds, failure_rate)
10
+ def initialize(app)
13
11
  @app = app
14
- @latency_treshold = Hash.new(DEFAULT_TRESHOLD).merge(configured_tresholds)
15
- @max_failure_rate = failure_rate || DEFAULT_FAILURE_RATE_PERC
16
12
  end
17
13
 
18
14
  def call(env)
19
15
  if env["PATH_INFO"] =~ %r{\A/queue-status\Z}
20
- errors = []
21
- queues.each do |name, latency|
22
- max_latency = @latency_treshold[name]
23
- errors << "Queue #{name} above threshold of #{max_latency}s" if latency > max_latency
24
- end
25
- failure_rate = calculate_failure_rate
26
- errors << "Failure rate above #{@max_failure_rate}%" if failure_rate > @max_failure_rate
27
- body = { latencies: queues, failure_percentage: failure_rate, errors: errors }.to_json
28
- status = errors.any? ? 503 : 200
16
+ metrics = Metric.all
17
+ body = { latencies: metrics.latencies, failure_percentage: metrics.failure_rate, errors: metrics.errors }.to_json
18
+ status = metrics.errors.any? ? 503 : 200
29
19
  [status, HEADERS, [body]]
30
20
  else
31
21
  @app.call(env)
32
22
  end
33
23
  end
34
24
 
35
- def queues
36
- Sidekiq::Queue.all.map { |q| [q.name, q.latency.to_i] }.to_h
37
- end
38
-
39
- def calculate_failure_rate
40
- stats = Sidekiq::Stats::History.new(1)
41
- processed, failed = [stats.processed, stats.failed].map { |h| h.values.last }
42
- val = (failed.to_f / processed.to_f) * 100.0
43
- val > 0 ? val.to_i : 0
44
- end
45
25
  end
46
26
  end
@@ -0,0 +1,18 @@
1
+ module SidekiqQueueStatus
2
+ class QueueLatency < Metric
3
+ DEFAULT_TRESHOLD = 30
4
+ def monitor
5
+ queues_with_latency.each do |name, latency|
6
+ error("Queue #{name} above threshold of #{max_latency(name)}s") if latency > max_latency(name)
7
+ end
8
+ end
9
+
10
+ def queues_with_latency
11
+ Sidekiq::Queue.all.map { |q| [q.name, q.latency.to_i] }.to_h
12
+ end
13
+
14
+ def max_latency(name)
15
+ Hash.new(DEFAULT_TRESHOLD).merge(Metric.config['queue_tresholds'])[name]
16
+ end
17
+ end
18
+ end
@@ -5,7 +5,10 @@ module SidekiqQueueStatus
5
5
  config.queue_tresholds = {}
6
6
  config.queue_failure_rate = nil
7
7
  initializer "sidekiq_queue_status.configure_rails_initialization" do |app|
8
- app.middleware.use SidekiqQueueStatus::Middleware, app.config.queue_tresholds, app.config.queue_failure_rate
8
+ Metric.config = {}
9
+ Metric.config['queue_tresholds'] = app.config.queue_tresholds
10
+ Metric.config['queue_failure_rate'] = app.config.queue_failure_rate
11
+ app.middleware.use SidekiqQueueStatus::Middleware
9
12
  end
10
13
  end
11
14
  end
@@ -1,3 +1,3 @@
1
1
  module SidekiqQueueStatus
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,3 +1,6 @@
1
1
  require 'sidekiq_queue_status/version'
2
+ require 'sidekiq_queue_status/metric'
3
+ require 'sidekiq_queue_status/queue_latency'
4
+ require 'sidekiq_queue_status/failure_rate'
2
5
  require 'sidekiq_queue_status/middleware'
3
6
  require 'sidekiq_queue_status/railtie'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_queue_status
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthijs Langenberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-02 00:00:00.000000000 Z
11
+ date: 2014-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -83,7 +83,10 @@ files:
83
83
  - README.md
84
84
  - Rakefile
85
85
  - lib/sidekiq_queue_status.rb
86
+ - lib/sidekiq_queue_status/failure_rate.rb
87
+ - lib/sidekiq_queue_status/metric.rb
86
88
  - lib/sidekiq_queue_status/middleware.rb
89
+ - lib/sidekiq_queue_status/queue_latency.rb
87
90
  - lib/sidekiq_queue_status/railtie.rb
88
91
  - lib/sidekiq_queue_status/version.rb
89
92
  - sidekiq_queue_status.gemspec