sidekiq-instrument 0.5.5 → 0.5.6

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: f9a0f783ab0e59fc566b949266b79f362a76d7c99cd15886e5d09b01b26f08f0
4
- data.tar.gz: b7d615af7a4884543ef3e7a5a585186fa0f93f1627fe9f5eac0576835b449136
3
+ metadata.gz: 72c5cdbcff6df0e0af5fafd832a738c94ca639713fe370c3543c9b01907270c6
4
+ data.tar.gz: 7a785e4013569f3857f404fcf6cf38656c7c0eae57e20d8154d7d9c322ddb27b
5
5
  SHA512:
6
- metadata.gz: 95343856da7a9cad0f41dbcfe4731a4837782ac13bf9f4b515579f45f4326b7f25e4d7c85c5e1ea7ef519f271cd1b6aa7f16c62c89e9c02acb412b1b321e57f8
7
- data.tar.gz: dfd0394b47aba69c43e58feabd778dc38091f8e0e61a4c75086c23bf7504fcb294881f3102bbe4de8dbd85223ecf024bdc27721a615bfa6f46df298153a7c186
6
+ metadata.gz: b671f7aee1e48345c8e8eda768aef308782c37bc3990075a0e027fc2c3d2eb0ef9b216df928813c592db3d9d0a32c49062c145a9aff35321cd4e4e1bb6fea337
7
+ data.tar.gz: 6906d370408c343e8cc283fcc61a4cf5315b6ead830108a88d27608da8c244315a790248f5301d7d448664625b02325d741ecd340d861d7cef0935066aad13d8
@@ -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: [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
 
@@ -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.5.6'
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.trace.inqueue.#{key}", value)
68
+ Statter.dogstatsd&.gauge("shared.sidekiq.trace.inqueue.#{key}", value)
69
+ end
70
+ end
62
71
  end
63
72
  end
@@ -0,0 +1,106 @@
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, :redis_config
11
+
12
+ class_attribute :redis_password
13
+
14
+ class << self
15
+ def redis_pool_user
16
+ @redis_pool_user ||= begin
17
+ redis_client_config = RedisClient.config(**redis_config)
18
+ @redis = redis_client_config.new_pool(
19
+ timeout: 0.5, size: Integer(ENV.fetch('RAILS_MAX_THREADS', 5))
20
+ )
21
+ end
22
+ end
23
+
24
+ def reset_redis
25
+ @redis = nil
26
+ end
27
+
28
+ def trace_workers_increment_counter(klass_name, sidekiq_redis_pool_user)
29
+ return unless enabled?
30
+
31
+ if redis_config?
32
+ redis_pool_user.with do |redis|
33
+ redis.call 'HINCRBY', worker_metric_name, klass_name, 1
34
+ end
35
+ else
36
+ sidekiq_redis_pool_user.with do |redis|
37
+ redis.hincrby worker_metric_name, klass_name, 1
38
+ end
39
+ end
40
+ end
41
+
42
+ def trace_workers_decrement_counter(klass_name)
43
+ return unless enabled?
44
+
45
+ if redis_config?
46
+ redis_pool_user.with do |redis|
47
+ redis.call 'HINCRBY', worker_metric_name, klass_name, -1
48
+ end
49
+ else
50
+ Sidekiq.redis do |redis|
51
+ redis.hincrby worker_metric_name, klass_name, -1
52
+ end
53
+ end
54
+ end
55
+
56
+ def reset_counters
57
+ return unless enabled?
58
+
59
+ if redis_config?
60
+ redis_pool_user.with do |redis|
61
+ all_keys = redis.call 'HGETALL', worker_metric_name
62
+ redis.call 'HDEL', worker_metric_name, all_keys.keys
63
+ end
64
+ else
65
+ Sidekiq.redis do |redis|
66
+ all_keys = redis.hgetall worker_metric_name
67
+ redis.hdel worker_metric_name, all_keys.keys
68
+ end
69
+ end
70
+ end
71
+
72
+ def reset_counter(key)
73
+ return unless enabled?
74
+
75
+ if redis_config?
76
+ redis_pool_user.with do |redis|
77
+ redis.call 'HDEL', worker_metric_name, key
78
+ end
79
+ else
80
+ Sidekiq.redis do |redis|
81
+ redis.hdel worker_metric_name, key
82
+ end
83
+ end
84
+ end
85
+
86
+ def workers_in_queue
87
+ return unless enabled?
88
+
89
+ if redis_config?
90
+ redis_pool_user.with do |redis|
91
+ redis.call 'HGETALL', worker_metric_name
92
+ end
93
+ else
94
+ Sidekiq.redis do |redis|
95
+ redis.hgetall worker_metric_name
96
+ end
97
+ end
98
+ end
99
+
100
+ def worker_metric_name
101
+ "sidekiq_instrument_trace_workers:#{namespace}:in_queue"
102
+ end
103
+ end
104
+ end
105
+ end
106
+ 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.11.0"
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.5.6
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-04-04 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.11.0
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.11.0
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