sidekiq-instrument 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []