sidekiq-instrument 0.5.5 → 0.6.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: f9a0f783ab0e59fc566b949266b79f362a76d7c99cd15886e5d09b01b26f08f0
4
- data.tar.gz: b7d615af7a4884543ef3e7a5a585186fa0f93f1627fe9f5eac0576835b449136
3
+ metadata.gz: 06c38373f208fd6ec2ed7d3ab01f8cd763d71cc5c44a1684eeaebc824eed489d
4
+ data.tar.gz: 5207e4868b8190e4a1501977a1736265c501b179fdb66bc0945da9128f3aff66
5
5
  SHA512:
6
- metadata.gz: 95343856da7a9cad0f41dbcfe4731a4837782ac13bf9f4b515579f45f4326b7f25e4d7c85c5e1ea7ef519f271cd1b6aa7f16c62c89e9c02acb412b1b321e57f8
7
- data.tar.gz: dfd0394b47aba69c43e58feabd778dc38091f8e0e61a4c75086c23bf7504fcb294881f3102bbe4de8dbd85223ecf024bdc27721a615bfa6f46df298153a7c186
6
+ metadata.gz: '0380968a8a88a122fea11c487126ce03094a02db41749c663966a2317aa0892a96fd966d373160477a9855e52421bb7d7c2892dcc42ea78f27ed1a7c42704fd1'
7
+ data.tar.gz: a89416da29a199afdb5930a62ad2bb479bdccac9b4a4af378094e53d3139d41a867f0af69920a03096d43e7ed7f2e6d9145c70c9a1fc4a34e9836506dcfa0656
@@ -15,7 +15,7 @@ jobs:
15
15
  strategy:
16
16
  matrix:
17
17
  ruby-version: [2.6, 2.7, 3.0]
18
- redis-version: [4, 5, 6]
18
+ redis-version: [4, 5, 6, 7]
19
19
 
20
20
  steps:
21
21
  - name: Checkout project
@@ -28,7 +28,7 @@ jobs:
28
28
  bundler-cache: true # runs 'bundle install' and caches installed gems automatically
29
29
 
30
30
  - name: Start Redis
31
- uses: supercharge/redis-github-action@1.4.0
31
+ uses: supercharge/redis-github-action@1.5.0
32
32
  with:
33
33
  redis-version: ${{ matrix.redis-version }}
34
34
 
data/README.md CHANGED
@@ -67,6 +67,9 @@ Sidekiq.configure_client do |config|
67
67
  chain.add Sidekiq::Instrument::ClientMiddleware
68
68
  end
69
69
  end
70
+
71
+ Sidekiq::Instrument::WorkerMetrics.enabled = true # Set true to enable worker metrics
72
+ Sidekiq::Instrument::WorkerMetrics.namespace = <APP_NAME>
70
73
  ```
71
74
 
72
75
  ## StatsD Keys
@@ -78,7 +81,7 @@ For each job, the following metrics will be reported:
78
81
  worker begins performing a job.
79
82
  3. **shared.sidekiq._queue_._job_.runtime**: timer of the total time spent
80
83
  in `perform`, in milliseconds.
81
- 3. **shared.sidekiq._queue_._job_.error**: counter incremented each time a
84
+ 4. **shared.sidekiq._queue_._job_.error**: counter incremented each time a
82
85
  job fails.
83
86
 
84
87
  The metric names can be changed by overriding the `statsd_metric_name`
@@ -86,7 +89,10 @@ method in your worker classes.
86
89
 
87
90
  For each queue, the following metrics will be reported:
88
91
  1. **shared.sidekiq._queue_.size**: gauge of how many jobs are in the queue
89
- 1. **shared.sidekiq._queue_.latency**: gauge of how long the oldest job has been in the queue
92
+ 2. **shared.sidekiq._queue_.latency**: gauge of how long the oldest job has been in the queue
93
+
94
+ For each worker, the following metrics and tags will be reported:
95
+ 1. **sidekiq.worker_metrics.inqueue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement
90
96
 
91
97
  ## DogStatsD Keys
92
98
  For each job, the following metrics and tags will be reported:
@@ -97,12 +103,15 @@ For each job, the following metrics and tags will be reported:
97
103
  worker begins performing a job.
98
104
  3. **sidekiq.runtime (tags: {queue: _queue_, worker: _job_})**: timer of the total time spent
99
105
  in `perform`, in milliseconds.
100
- 3. **sidekiq.error (tags: {queue: _queue_, worker: _job_})**: counter incremented each time a
106
+ 4. **sidekiq.error (tags: {queue: _queue_, worker: _job_})**: counter incremented each time a
101
107
  job fails.
102
108
 
103
109
  For each queue, the following metrics and tags will be reported:
104
110
  1. **sidekiq.queue.size (tags: {queue: _queue_})**: gauge of how many jobs are in the queue
105
- 1. **sidekiq.queue.latency (tags: {queue: _queue_})**: gauge of how long the oldest job has been in the queue
111
+ 2. **sidekiq.queue.latency (tags: {queue: _queue_})**: gauge of how long the oldest job has been in the queue
112
+
113
+ For each worker, the following metrics and tags will be reported:
114
+ 1. **sidekiq.worker_metrics.inqueue.#{key}**: number of jobs "in queue" per worker, uses redis to track increment/decrement
106
115
 
107
116
  ## Worker
108
117
  There is a worker, `Sidekiq::Instrument::Worker`, that submits gauges
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sidekiq/instrument/mixin'
4
+ require 'active_support/core_ext/string/inflections'
2
5
 
3
6
  module Sidekiq::Instrument
4
7
  class ClientMiddleware
@@ -10,6 +13,7 @@ module Sidekiq::Instrument
10
13
  class_instance = klass.new
11
14
  Statter.statsd.increment(metric_name(class_instance, 'enqueue'))
12
15
  Statter.dogstatsd&.increment('sidekiq.enqueue', worker_dog_options(class_instance))
16
+ WorkerMetrics.trace_workers_increment_counter(klass.name.underscore, redis_pool)
13
17
  result = yield
14
18
  Statter.dogstatsd&.flush(sync: true)
15
19
  result
@@ -0,0 +1,14 @@
1
+ require "active_support/core_ext/class/attribute"
2
+ require "statsd/instrument"
3
+
4
+ require "sidekiq/instrument/statter"
5
+ require "sidekiq/instrument/version"
6
+ require "sidekiq/instrument/worker"
7
+ require "sidekiq/instrument/middleware/client"
8
+ require "sidekiq/instrument/middleware/server"
9
+ require "sidekiq/instrument/worker_metrics"
10
+
11
+ module Sidekiq
12
+ module Instrument
13
+ end
14
+ end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sidekiq/instrument/mixin'
4
+ require 'active_support/core_ext/string/inflections'
2
5
 
3
6
  module Sidekiq::Instrument
4
7
  class ServerMiddleware
@@ -9,6 +12,7 @@ module Sidekiq::Instrument
9
12
  Statter.dogstatsd&.increment('sidekiq.dequeue', worker_dog_options(worker))
10
13
 
11
14
  start_time = Time.now
15
+ WorkerMetrics.trace_workers_decrement_counter(worker.class.to_s.underscore)
12
16
  yield block
13
17
  execution_time_ms = (Time.now - start_time) * 1000
14
18
  Statter.statsd.measure(metric_name(worker, 'runtime'), execution_time_ms)
@@ -22,4 +26,3 @@ module Sidekiq::Instrument
22
26
  end
23
27
  end
24
28
  end
25
-
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Instrument
3
- VERSION = '0.5.5'
3
+ VERSION = '0.6.0'
4
4
  end
5
5
  end
@@ -28,7 +28,7 @@ module Sidekiq::Instrument
28
28
  working = Sidekiq::Workers.new.count
29
29
  Statter.statsd.gauge('shared.sidekiq.stats.working', working)
30
30
  Statter.dogstatsd&.gauge('sidekiq.working', working)
31
-
31
+ send_worker_metrics
32
32
  Sidekiq::Queue.all.each do |queue|
33
33
  Statter.statsd.gauge("shared.sidekiq.#{queue.name}.size", queue.size)
34
34
  Statter.dogstatsd&.gauge('sidekiq.queue.size', queue.size, tags: dd_tags(queue))
@@ -59,5 +59,14 @@ module Sidekiq::Instrument
59
59
  def dd_tags(queue)
60
60
  ["queue:#{queue.name}"]
61
61
  end
62
+
63
+ def send_worker_metrics
64
+ return unless WorkerMetrics.enabled
65
+
66
+ WorkerMetrics.workers_in_queue.each do |key, value|
67
+ Statter.statsd.gauge("shared.sidekiq.worker_metrics.inqueue.#{key}", value)
68
+ Statter.dogstatsd&.gauge("shared.sidekiq.worker_metrics.inqueue.#{key}", value)
69
+ end
70
+ end
62
71
  end
63
72
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'redis'
4
+ require 'redis-client'
5
+ module Sidekiq
6
+ module Instrument
7
+ # Stores worker count with a key sidekiq_instrument_trace_workers:#{namespace}:in_queue
8
+ # Values are hash having keys as worker names.
9
+ class WorkerMetrics
10
+ class_attribute :enabled, :namespace
11
+
12
+ class << self
13
+ def trace_workers_increment_counter(klass_name, sidekiq_redis_pool_user)
14
+ return unless enabled?
15
+
16
+ Sidekiq.redis do |redis|
17
+ redis.hincrby(worker_metric_name, klass_name, 1)
18
+ end
19
+ end
20
+
21
+ def trace_workers_decrement_counter(klass_name)
22
+ return unless enabled?
23
+
24
+ Sidekiq.redis do |redis|
25
+ redis.hincrby(worker_metric_name, klass_name, -1)
26
+ end
27
+ end
28
+
29
+ def reset_counters
30
+ return unless enabled?
31
+
32
+ Sidekiq.redis do |redis|
33
+ all_keys = redis.hgetall(worker_metric_name)
34
+ redis.hdel(worker_metric_name, all_keys.keys)
35
+ end
36
+ end
37
+
38
+ def reset_counter(key)
39
+ return unless enabled?
40
+
41
+ Sidekiq.redis do |redis|
42
+ redis.hdel(worker_metric_name, key)
43
+ end
44
+ end
45
+
46
+ def workers_in_queue
47
+ return unless enabled?
48
+ Sidekiq.redis do |redis|
49
+ redis.hgetall(worker_metric_name)
50
+ end
51
+ end
52
+
53
+ def worker_metric_name
54
+ "sidekiq_instrument_trace_workers:#{namespace}:in_queue"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -6,6 +6,7 @@ require "sidekiq/instrument/version"
6
6
  require "sidekiq/instrument/worker"
7
7
  require "sidekiq/instrument/middleware/client"
8
8
  require "sidekiq/instrument/middleware/server"
9
+ require "sidekiq/instrument/worker_metrics"
9
10
 
10
11
  module Sidekiq
11
12
  module Instrument
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_dependency 'statsd-instrument', '>= 2.0.4'
21
21
  spec.add_dependency 'dogstatsd-ruby', '~> 5.5'
22
22
  spec.add_dependency 'activesupport', '>= 5.1', '< 7'
23
+ spec.add_dependency "redis-client", ">= 0.14.1"
23
24
 
24
25
  spec.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.2'
25
26
  spec.add_development_dependency 'rake', '~> 12.0'
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.5.5
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Loan Application Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-03 00:00:00.000000000 Z
11
+ date: 2023-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -78,6 +78,20 @@ dependencies:
78
78
  - - "<"
79
79
  - !ruby/object:Gem::Version
80
80
  version: '7'
81
+ - !ruby/object:Gem::Dependency
82
+ name: redis-client
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 0.14.1
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.14.1
81
95
  - !ruby/object:Gem::Dependency
82
96
  name: bundler
83
97
  requirement: !ruby/object:Gem::Requirement
@@ -187,11 +201,13 @@ files:
187
201
  - bin/setup
188
202
  - lib/sidekiq/instrument.rb
189
203
  - lib/sidekiq/instrument/middleware/client.rb
204
+ - lib/sidekiq/instrument/middleware/instrument.rb
190
205
  - lib/sidekiq/instrument/middleware/server.rb
191
206
  - lib/sidekiq/instrument/mixin.rb
192
207
  - lib/sidekiq/instrument/statter.rb
193
208
  - lib/sidekiq/instrument/version.rb
194
209
  - lib/sidekiq/instrument/worker.rb
210
+ - lib/sidekiq/instrument/worker_metrics.rb
195
211
  - sidekiq-instrument.gemspec
196
212
  homepage: https://github.com/enova/sidekiq-instrument
197
213
  licenses:
@@ -212,7 +228,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
228
  - !ruby/object:Gem::Version
213
229
  version: '0'
214
230
  requirements: []
215
- rubygems_version: 3.1.6
231
+ rubygems_version: 3.0.3
216
232
  signing_key:
217
233
  specification_version: 4
218
234
  summary: StatsD & DogStatsD Instrumentation for Sidekiq