sidekiq-instrument 0.6.2 → 0.7.0

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
  SHA256:
3
- metadata.gz: 5ba4e03d629681c781677f3c5341dca1092adb402ca7164d2da5ef04c8114fe4
4
- data.tar.gz: dbc5292dca650333a15cf309537876ef3862aa772f7741e215cf60daa0c429be
3
+ metadata.gz: c7de17bf15cf561935e482b332b89974f84409e0c1bfa00a544503ce95bcfd8d
4
+ data.tar.gz: 1732bbfc31fc7c04fe066613845f9e81917873f2fc25ae93ec960aba611c347d
5
5
  SHA512:
6
- metadata.gz: 45ab4c7fbfa1cbb84b0bc09fcd7bd582238e8d6e57a3670de78d5c6213687b1619af1a8ad114853dccbf5633235fe8fc86dfe9755839de62e4939eca2766ccf9
7
- data.tar.gz: 5b2f9fdbdac1d6128fb4fdef2e7da3f17be2b665721d968f7efd7feb4e54448bfbc43e7d31251f9f051a64fd721c8538df05f2731d69f1b9a10d94b4282227ed
6
+ metadata.gz: 65c1f85a4c9a13b4cd2c3585712af41b07a8979f2a736c44d971fc5175d737f7a7cb6104d6383af714d94273a41e017bae361e29f7381587294d463432bf7551
7
+ data.tar.gz: b1f25cab5729fe6bcb76a81556fc18583ab800b3dd2a66c50c9fea3834abcf1a422aabb06bc6d5ef39b69be4675ab35e1dab9c53e43920e377888fd91aa79b2d
data/README.md CHANGED
@@ -84,6 +84,12 @@ For each job, the following metrics will be reported:
84
84
  4. **shared.sidekiq._queue_._job_.error**: counter incremented each time a
85
85
  job fails.
86
86
 
87
+ For job retry attempts, the above 4 metrics will still be reported but the enqueue/dequeue metrics
88
+ will have a `.retry` appended:
89
+
90
+ 1. **shared.sidekiq._queue_._job_.enqueue.retry**
91
+ 2. **shared.sidekiq._queue_._job_.dequeue.retry**
92
+
87
93
  The metric names can be changed by overriding the `statsd_metric_name`
88
94
  method in your worker classes.
89
95
 
@@ -92,7 +98,7 @@ For each queue, the following metrics will be reported:
92
98
  2. **shared.sidekiq._queue_.latency**: gauge of how long the oldest job has been in the queue
93
99
 
94
100
  For each worker, the following metrics and tags will be reported:
95
- 1. **sidekiq.worker_metrics.in_queue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement
101
+ 1. **sidekiq.worker_metrics.in_queue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement (**this metric is currently inaccurate**)
96
102
 
97
103
  ## DogStatsD Keys
98
104
  For each job, the following metrics and tags will be reported:
@@ -106,14 +112,23 @@ For each job, the following metrics and tags will be reported:
106
112
  4. **sidekiq.error (tags: {queue: _queue_, worker: _job_})**: counter incremented each time a
107
113
  job fails.
108
114
 
115
+ For job retry attempts, the above 4 metrics will still be reported but the enqueue/dequeue metrics
116
+ will have a `.retry` appended:
117
+
118
+ 1. **sidekiq.enqueue.retry (tags: {queue: _queue_, worker: _job_})**
119
+ 2. **sidekiq.dequeue.retry (tags: {queue: _queue_, worker: _job_})**
120
+
109
121
  For each queue, the following metrics and tags will be reported:
110
122
  1. **sidekiq.queue.size (tags: {queue: _queue_})**: gauge of how many jobs are in the queue
111
123
  2. **sidekiq.queue.latency (tags: {queue: _queue_})**: gauge of how long the oldest job has been in the queue
112
124
 
113
125
  For each worker, the following metrics and tags will be reported:
114
- 1. **sidekiq.worker_metrics.in_queue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement
126
+ 1. **sidekiq.worker_metrics.in_queue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement (**this metric is currently inaccurate**)
115
127
 
116
128
  ## Worker
129
+
130
+ **WARNING: The metrics reported by this Worker are currently inaccurate.**
131
+
117
132
  There is a worker, `Sidekiq::Instrument::Worker`, that submits gauges
118
133
  for various interesting statistics; namely, the bulk of the information in `Sidekiq::Stats`
119
134
  and the sizes of each individual queue. While the worker class is a fully valid Sidekiq worker,
@@ -7,16 +7,24 @@ module Sidekiq::Instrument
7
7
  class ClientMiddleware
8
8
  include Sidekiq::Instrument::MetricNames
9
9
 
10
- def call(worker_class, job, queue, redis_pool)
10
+ def call(worker_class, job, queue, _redis_pool)
11
11
  # worker_class is a const in sidekiq >= 6.x
12
12
  klass = Object.const_get(worker_class.to_s)
13
13
  class_instance = klass.new
14
- Statter.statsd.increment(metric_name(class_instance, 'enqueue'))
15
- Statter.dogstatsd&.increment('sidekiq.enqueue', worker_dog_options(class_instance))
16
- WorkerMetrics.trace_workers_increment_counter(klass.name.underscore, redis_pool)
17
- result = yield
14
+
15
+ # This is needed because the ClientMiddleware is called twice for scheduled jobs
16
+ # - Once when it gets scheduled
17
+ # - Once when it gets dequeued for processing
18
+ # We only want to increment the enqueue metric when the job is scheduled and
19
+ # Sidekiq::Context.current[:class] is only ever set when the job is scheduled
20
+ if Sidekiq::Context.current[:class].present?
21
+ WorkerMetrics.trace_workers_increment_counter(klass.name.underscore)
22
+ Statter.statsd.increment(metric_name(class_instance, 'enqueue'))
23
+ Statter.dogstatsd&.increment('sidekiq.enqueue', worker_dog_options(class_instance))
24
+ end
25
+
18
26
  Statter.dogstatsd&.flush(sync: true)
19
- result
27
+ yield
20
28
  end
21
29
  end
22
30
  end
@@ -7,9 +7,10 @@ module Sidekiq::Instrument
7
7
  class ServerMiddleware
8
8
  include Sidekiq::Instrument::MetricNames
9
9
 
10
- def call(worker, _job, _queue, &block)
11
- Statter.statsd.increment(metric_name(worker, 'dequeue'))
12
- Statter.dogstatsd&.increment('sidekiq.dequeue', worker_dog_options(worker))
10
+ def call(worker, job, _queue, &block)
11
+ dequeue_string = is_retry(job) ? 'dequeue.retry' : 'dequeue'
12
+ Statter.dogstatsd&.increment("sidekiq.#{dequeue_string}", worker_dog_options(worker))
13
+ Statter.statsd.increment(metric_name(worker, dequeue_string))
13
14
 
14
15
  start_time = Time.now
15
16
  yield block
@@ -17,6 +18,12 @@ module Sidekiq::Instrument
17
18
  Statter.statsd.measure(metric_name(worker, 'runtime'), execution_time_ms)
18
19
  Statter.dogstatsd&.timing('sidekiq.runtime', execution_time_ms, worker_dog_options(worker))
19
20
  rescue StandardError => e
21
+ # if we have retries left, increment the enqueue.retry counter to indicate the job is going back on the queue
22
+ if max_retries(worker) > current_retries(job) + 1
23
+ WorkerMetrics.trace_workers_increment_counter(worker.class.to_s.underscore)
24
+ Statter.dogstatsd&.increment('sidekiq.enqueue.retry', worker_dog_options(worker))
25
+ end
26
+
20
27
  Statter.statsd.increment(metric_name(worker, 'error'))
21
28
  Statter.dogstatsd&.increment('sidekiq.error', worker_dog_options(worker))
22
29
  raise e
@@ -24,5 +31,16 @@ module Sidekiq::Instrument
24
31
  WorkerMetrics.trace_workers_decrement_counter(worker.class.to_s.underscore)
25
32
  Statter.dogstatsd&.flush(sync: true)
26
33
  end
34
+
35
+ private
36
+
37
+ # returns -1 if no retries have been attempted
38
+ def current_retries(job)
39
+ job["retry_count"] || -1
40
+ end
41
+
42
+ def is_retry(job)
43
+ current_retries(job) >= 0
44
+ end
27
45
  end
28
46
  end
@@ -12,6 +12,13 @@ module Sidekiq::Instrument
12
12
  { tags: ["queue:#{queue_name(worker)}", "worker:#{underscore(class_name(worker))}"] }
13
13
  end
14
14
 
15
+ def max_retries(worker)
16
+ retries = worker.class.get_sidekiq_options['retry'] || Sidekiq[:max_retries]
17
+ return Sidekiq[:max_retries] if retries.to_s.eql?("true")
18
+ return 0 if retries.eql?("false")
19
+ retries
20
+ end
21
+
15
22
  private
16
23
 
17
24
  def queue_name(worker)
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Instrument
3
- VERSION = '0.6.2'
3
+ VERSION = '0.7.0'
4
4
  end
5
5
  end
@@ -10,7 +10,7 @@ module Sidekiq
10
10
  class_attribute :enabled, :namespace
11
11
 
12
12
  class << self
13
- def trace_workers_increment_counter(klass_name, sidekiq_redis_pool_user)
13
+ def trace_workers_increment_counter(klass_name)
14
14
  return unless enabled?
15
15
 
16
16
  Sidekiq.redis do |redis|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-instrument
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Loan Application Services
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-26 00:00:00.000000000 Z
11
+ date: 2024-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -196,7 +196,7 @@ dependencies:
196
196
  - - ">="
197
197
  - !ruby/object:Gem::Version
198
198
  version: '0'
199
- description:
199
+ description:
200
200
  email:
201
201
  - application_services@enova.com
202
202
  executables: []
@@ -227,7 +227,7 @@ homepage: https://github.com/enova/sidekiq-instrument
227
227
  licenses:
228
228
  - MIT
229
229
  metadata: {}
230
- post_install_message:
230
+ post_install_message:
231
231
  rdoc_options: []
232
232
  require_paths:
233
233
  - lib
@@ -242,8 +242,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
242
  - !ruby/object:Gem::Version
243
243
  version: '0'
244
244
  requirements: []
245
- rubygems_version: 3.1.6
246
- signing_key:
245
+ rubygems_version: 3.0.3.1
246
+ signing_key:
247
247
  specification_version: 4
248
248
  summary: StatsD & DogStatsD Instrumentation for Sidekiq
249
249
  test_files: []