sidekiq-instrument 0.4.1 → 0.5.1

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: 55f5707e3e987499dee665c604a5d7453a643f91573fd0f1bec37287bef38309
4
- data.tar.gz: '095f5c3bb1dff919143ba4a7a798a00f9a3ed78e467a3165a7942267d75864f4'
3
+ metadata.gz: dba857b68ec105ba55cf962fac3549c2b0c3949859bcebbb2363087ce2965241
4
+ data.tar.gz: 99d18adae251771f64a2b1e0f9088c2bf3c1863f9a8a0ec8ebfc40caa3052a0d
5
5
  SHA512:
6
- metadata.gz: 55f8eab12d63ce0d4dc37ec3323f3126d6026aa1be42c101cd300195275ca94625b706b9beefada7a8764860b1a8c7ab0a02c7ced1d4bd2b02a9ccc5932181e1
7
- data.tar.gz: 9ba846d4af8f326c83157fa605b1982068baac4ed4cf07b05fa31cf06cafd5d95a484c60e29e9860462762ab401b041034272b5d87aedb187a3788d17d410dde
6
+ metadata.gz: e34e0ebf291cf1a869013b042613936c367f84116a2a582ea463dbd9b8bf00b7a11e4fed8dbc87d8ac5946e8d590dbcce769e87394ca75a0906b234440ac746c
7
+ data.tar.gz: a9af77fa66acd59ba2552481ede5c24ce308befd307dcd86f7b79552a1d8e8a7665b8c9a6a2e97bdb49edc8f890dc862fcadd3b8d4c41ac38021da3ff852f621
@@ -0,0 +1,36 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ubuntu-latest
15
+ strategy:
16
+ matrix:
17
+ ruby-version: [2.6, 2.7, 3.0]
18
+ redis-version: [4, 5, 6]
19
+
20
+ steps:
21
+ - name: Checkout project
22
+ uses: actions/checkout@v3
23
+
24
+ - name: Set up Ruby
25
+ uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby-version }}
28
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
29
+
30
+ - name: Start Redis
31
+ uses: supercharge/redis-github-action@1.4.0
32
+ with:
33
+ redis-version: ${{ matrix.redis-version }}
34
+
35
+ - name: Run tests
36
+ run: bundle exec rake
data/.simplecov CHANGED
@@ -1,8 +1,11 @@
1
- require 'coveralls'
1
+ require 'simplecov'
2
+ require 'simplecov-cobertura'
2
3
 
3
4
  SimpleCov.formatters = [
4
5
  SimpleCov::Formatter::HTMLFormatter,
5
- Coveralls::SimpleCov::Formatter
6
+ SimpleCov::Formatter::CoberturaFormatter
6
7
  ]
7
8
 
8
- SimpleCov.start
9
+ SimpleCov.start do
10
+ add_filter "/spec/"
11
+ end
data/README.md CHANGED
@@ -1,30 +1,33 @@
1
1
  # Sidekiq::Instrument
2
- [![Build Status](https://travis-ci.org/enova/sidekiq-instrument.svg?branch=master)](https://travis-ci.org/enova/sidekiq-instrument)
3
- [![Coverage Status](https://coveralls.io/repos/github/enova/sidekiq-instrument/badge.svg?branch=master)](https://coveralls.io/github/enova/sidekiq-instrument?branch=master)
4
2
 
5
- Reports job metrics using Shopify's [statsd-instrument][statsd-instrument] library, incrementing a counter for each enqueue and dequeue per job type, and timing the full runtime of your perform method.
3
+ Reports job metrics using Shopify's [statsd-instrument][statsd-instrument] library and \[optionally\] DataDog's [dogstatsd-ruby](https://github.com/DataDog/dogstatsd-ruby), incrementing a counter for each enqueue and dequeue per job type, and timing the full runtime of your perform method.
6
4
 
7
5
  ## Installation
8
6
 
9
- Add this line to your application's Gemfile:
7
+ Add the following to your application's Gemfile:
10
8
 
11
9
  ```ruby
12
10
  gem 'sidekiq-instrument'
11
+ gem 'dogstatsd-ruby' # optional
13
12
  ```
14
13
 
15
14
  And then execute:
16
15
 
17
16
  $ bundle
18
17
 
19
- Or install it yourself as:
18
+ Or install the gem(s) yourself as:
20
19
 
21
20
  $ gem install sidekiq-instrument
21
+ $ gem install dogstatsd-ruby # again, optional
22
22
 
23
23
  ## Usage
24
24
 
25
25
  For now, this library assumes you have already initialized `StatsD` on your own;
26
26
  the `statsd-instrument` gem may have chosen reasonable defaults for you already. If not,
27
- a typical Rails app would just use an initializer:
27
+ a typical Rails app would just use an initializer and set the `StatsD` and optional `DogStatsD`
28
+ clients via this gem's `Statter` class:
29
+
30
+ ### StatsD
28
31
 
29
32
  ```ruby
30
33
  # config/initializers/statsd.rb
@@ -33,11 +36,22 @@ StatsD.prefix = 'my-app'
33
36
  StatsD.backend = StatsD::Instrument::Backends::UDPBackend.new('some-server:8125')
34
37
  ```
35
38
 
39
+ ### DogStatsD
40
+
41
+ ```ruby
42
+ # config/initializers/dogstatsd.rb
43
+ require 'datadog/statsd'
44
+ DogStatsD = Datadog::Statsd.new('localhost', 8125, tags: {app_name: 'my_app', env: 'production'})
45
+ ```
46
+
36
47
  Then add the client and server middlewares in your Sidekiq initializer:
37
48
 
38
49
  ```ruby
39
50
  require 'sidekiq/instrument'
40
51
 
52
+ Sidekiq::Instrument::Statter.statsd = StatsD # optional, Statter will fall back to a global StatsD
53
+ Sidekiq::Instrument::Statter.dogstatsd = DogStatsD # optional, dogstatsd can be nil if not desired
54
+
41
55
  Sidekiq.configure_server do |config|
42
56
  config.server_middleware do |chain|
43
57
  chain.add Sidekiq::Instrument::ServerMiddleware
@@ -74,6 +88,22 @@ For each queue, the following metrics will be reported:
74
88
  1. **shared.sidekiq._queue_.size**: gauge of how many jobs are in the queue
75
89
  1. **shared.sidekiq._queue_.latency**: gauge of how long the oldest job has been in the queue
76
90
 
91
+ ## DogStatsD Keys
92
+ For each job, the following metrics and tags will be reported:
93
+
94
+ 1. **sidekiq.enqueue (tags: {queue: _queue_, worker: _job_})**: counter incremented each time a
95
+ job is pushed onto the queue.
96
+ 2. **sidekiq.dequeue (tags: {queue: _queue_, worker: _job_})**: counter incremented just before
97
+ worker begins performing a job.
98
+ 3. **sidekiq.runtime (tags: {queue: _queue_, worker: _job_})**: timer of the total time spent
99
+ in `perform`, in milliseconds.
100
+ 3. **sidekiq.error (tags: {queue: _queue_, worker: _job_})**: counter incremented each time a
101
+ job fails.
102
+
103
+ For each queue, the following metrics and tags will be reported:
104
+ 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
106
+
77
107
  ## Worker
78
108
  There is a worker, `Sidekiq::Instrument::Worker`, that submits gauges
79
109
  for various interesting statistics; namely, the bulk of the information in `Sidekiq::Stats`
data/bin/console CHANGED
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "sidekiq/instrument"
3
+ require 'bundler/setup'
4
+ require 'sidekiq/instrument'
5
+ require 'datadog/statsd'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
8
9
 
9
10
  # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
+ # require 'pry'
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start
@@ -7,9 +7,12 @@ module Sidekiq::Instrument
7
7
  def call(worker_class, job, queue, redis_pool)
8
8
  # worker_class is a const in sidekiq >= 6.x
9
9
  klass = Object.const_get(worker_class.to_s)
10
- StatsD.increment metric_name(klass.new, 'enqueue')
11
-
12
- yield
10
+ class_instance = klass.new
11
+ Statter.statsd.increment(metric_name(class_instance, 'enqueue'))
12
+ Statter.dogstatsd&.increment('sidekiq.enqueue', worker_dog_options(class_instance))
13
+ result = yield
14
+ Statter.dogstatsd&.flush(sync: true)
15
+ result
13
16
  end
14
17
  end
15
18
  end
@@ -5,12 +5,21 @@ module Sidekiq::Instrument
5
5
  include Sidekiq::Instrument::MetricNames
6
6
 
7
7
  def call(worker, job, queue, &block)
8
- StatsD.increment(metric_name(worker, 'dequeue'))
8
+ Statter.statsd.increment(metric_name(worker, 'dequeue'))
9
+ Statter.dogstatsd&.increment('sidekiq.dequeue', worker_dog_options(worker))
9
10
 
10
- StatsD.measure(metric_name(worker,'runtime'), &block)
11
+ start_time = Time.now
12
+ yield block
13
+ execution_time_ms = (Time.now - start_time) * 1000
14
+ Statter.statsd.measure(metric_name(worker, 'runtime'), execution_time_ms)
15
+ Statter.dogstatsd&.timing('sidekiq.runtime', execution_time_ms, worker_dog_options(worker))
11
16
  rescue StandardError => e
12
- StatsD.increment(metric_name(worker, 'error'))
17
+ Statter.statsd.increment(metric_name(worker, 'error'))
18
+ Statter.dogstatsd&.increment('sidekiq.error', worker_dog_options(worker))
13
19
  raise e
20
+ ensure
21
+ Statter.dogstatsd&.flush(sync: true)
14
22
  end
15
23
  end
16
24
  end
25
+
@@ -4,11 +4,22 @@ module Sidekiq::Instrument
4
4
  if worker.respond_to?(:statsd_metric_name)
5
5
  worker.send(:statsd_metric_name, event)
6
6
  else
7
- queue = worker.class.get_sidekiq_options['queue']
8
- name = worker.class.name.gsub('::', '_')
9
-
10
- "shared.sidekiq.#{queue}.#{name}.#{event}"
7
+ "shared.sidekiq.#{queue_name(worker)}.#{class_name(worker)}.#{event}"
11
8
  end
12
9
  end
10
+
11
+ def worker_dog_options(worker)
12
+ { tags: ["queue:#{queue_name(worker)}", "worker:#{class_name(worker)}"] }
13
+ end
14
+
15
+ private
16
+
17
+ def queue_name(worker)
18
+ worker.class.get_sidekiq_options['queue']
19
+ end
20
+
21
+ def class_name(worker)
22
+ worker.class.name.gsub('::', '_')
23
+ end
13
24
  end
14
25
  end
@@ -0,0 +1,15 @@
1
+ module Sidekiq::Instrument
2
+ class Statter
3
+ # @!scope class
4
+ # @!attribute [rw]
5
+ # StatsD client for emitting metrics related to Sidekiq queue operations.
6
+ class_attribute :statsd
7
+
8
+ # @!scope class
9
+ # @!attribute [rw]
10
+ # Optional DogStatsD client for emitting metrics related to Sidekiq queue operations.
11
+ class_attribute :dogstatsd
12
+
13
+ self.statsd ||= StatsD
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Instrument
3
- VERSION = "0.4.1"
3
+ VERSION = "0.5.1"
4
4
  end
5
5
  end
@@ -21,19 +21,25 @@ module Sidekiq::Instrument
21
21
  self.class::METRIC_NAMES.each do |method, stat|
22
22
  stat ||= method
23
23
 
24
- StatsD.gauge "shared.sidekiq.stats.#{stat}", info.send(method)
24
+ Statter.statsd.gauge("shared.sidekiq.stats.#{stat}", info.send(method))
25
+ Statter.dogstatsd&.gauge("sidekiq.#{stat}", info.send(method))
25
26
  end
26
27
 
27
28
  working = Sidekiq::ProcessSet.new.select { |p| p[:busy] == 1 }.count
28
- StatsD.gauge "shared.sidekiq.stats.working", working
29
+ Statter.statsd.gauge('shared.sidekiq.stats.working', working)
30
+ Statter.dogstatsd&.gauge('sidekiq.working', working)
29
31
 
30
32
  info.queues.each do |name, size|
31
- StatsD.gauge "shared.sidekiq.#{name}.size", size
33
+ Statter.statsd.gauge("shared.sidekiq.#{name}.size", size)
34
+ Statter.dogstatsd&.gauge('sidekiq.queue.size', size, tags: ["queue:#{name}"])
32
35
  end
33
36
 
34
37
  Sidekiq::Queue.all.each do |queue|
35
- StatsD.gauge "shared.sidekiq.#{queue.name}.latency", queue.latency
38
+ Statter.statsd.gauge("shared.sidekiq.#{queue.name}.latency", queue.latency)
39
+ Statter.dogstatsd&.gauge('sidekiq.queue.latency', queue.latency, tags: ["queue:#{queue.name}"])
36
40
  end
41
+
42
+ Statter.dogstatsd&.flush(sync: true)
37
43
  end
38
44
  end
39
45
  end
@@ -1,3 +1,6 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+
3
+ require "sidekiq/instrument/statter"
1
4
  require "sidekiq/instrument/version"
2
5
  require "sidekiq/instrument/worker"
3
6
  require "sidekiq/instrument/middleware/client"
@@ -6,10 +6,10 @@ require 'sidekiq/instrument/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'sidekiq-instrument'
8
8
  spec.version = Sidekiq::Instrument::VERSION
9
- spec.authors = ['Matt Larraz']
10
- spec.email = ['mlarraz@enova.com']
9
+ spec.authors = ['Loan Application Services']
10
+ spec.email = ['application_services@enova.com']
11
11
 
12
- spec.summary = 'StatsD instrumentation for Sidekiq'
12
+ spec.summary = 'StatsD & DogStatsD Instrumentation for Sidekiq'
13
13
  spec.homepage = 'https://github.com/enova/sidekiq-instrument'
14
14
  spec.license = 'MIT'
15
15
 
@@ -18,10 +18,13 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.add_dependency 'sidekiq', '>= 4.2', '< 7'
20
20
  spec.add_dependency 'statsd-instrument', '>= 2.0.4'
21
+ spec.add_dependency 'dogstatsd-ruby', '~> 5.5'
22
+ spec.add_dependency 'activesupport', '>= 5.1', '< 7'
21
23
 
22
24
  spec.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.2'
23
25
  spec.add_development_dependency 'rake', '~> 12.0'
24
26
  spec.add_development_dependency 'rspec', '~> 3.0'
25
27
  spec.add_development_dependency 'pry-byebug', '~> 3.4'
26
- spec.add_development_dependency 'coveralls', '~> 0.8'
28
+ spec.add_development_dependency 'simplecov'
29
+ spec.add_development_dependency 'simplecov-cobertura'
27
30
  end
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.4.1
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
- - Matt Larraz
7
+ - Loan Application Services
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-28 00:00:00.000000000 Z
11
+ date: 2022-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -44,6 +44,40 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 2.0.4
47
+ - !ruby/object:Gem::Dependency
48
+ name: dogstatsd-ruby
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.5'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: activesupport
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '5.1'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '7'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '5.1'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '7'
47
81
  - !ruby/object:Gem::Dependency
48
82
  name: bundler
49
83
  requirement: !ruby/object:Gem::Requirement
@@ -107,30 +141,44 @@ dependencies:
107
141
  - !ruby/object:Gem::Version
108
142
  version: '3.4'
109
143
  - !ruby/object:Gem::Dependency
110
- name: coveralls
144
+ name: simplecov
111
145
  requirement: !ruby/object:Gem::Requirement
112
146
  requirements:
113
- - - "~>"
147
+ - - ">="
114
148
  - !ruby/object:Gem::Version
115
- version: '0.8'
149
+ version: '0'
116
150
  type: :development
117
151
  prerelease: false
118
152
  version_requirements: !ruby/object:Gem::Requirement
119
153
  requirements:
120
- - - "~>"
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ - !ruby/object:Gem::Dependency
158
+ name: simplecov-cobertura
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
121
169
  - !ruby/object:Gem::Version
122
- version: '0.8'
170
+ version: '0'
123
171
  description:
124
172
  email:
125
- - mlarraz@enova.com
173
+ - application_services@enova.com
126
174
  executables: []
127
175
  extensions: []
128
176
  extra_rdoc_files: []
129
177
  files:
178
+ - ".github/workflows/ci.yml"
130
179
  - ".gitignore"
131
180
  - ".rspec"
132
181
  - ".simplecov"
133
- - ".travis.yml"
134
182
  - Gemfile
135
183
  - LICENSE.txt
136
184
  - README.md
@@ -141,6 +189,7 @@ files:
141
189
  - lib/sidekiq/instrument/middleware/client.rb
142
190
  - lib/sidekiq/instrument/middleware/server.rb
143
191
  - lib/sidekiq/instrument/mixin.rb
192
+ - lib/sidekiq/instrument/statter.rb
144
193
  - lib/sidekiq/instrument/version.rb
145
194
  - lib/sidekiq/instrument/worker.rb
146
195
  - sidekiq-instrument.gemspec
@@ -166,5 +215,5 @@ requirements: []
166
215
  rubygems_version: 3.1.6
167
216
  signing_key:
168
217
  specification_version: 4
169
- summary: StatsD instrumentation for Sidekiq
218
+ summary: StatsD & DogStatsD Instrumentation for Sidekiq
170
219
  test_files: []
data/.travis.yml DELETED
@@ -1,20 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5.8
5
- - 2.6.6
6
- - 2.7.2
7
-
8
- services:
9
- - redis-server
10
-
11
- before_install: gem install bundler -v 2.0.2
12
-
13
- deploy:
14
- provider: rubygems
15
- api_key:
16
- secure: T0S2ipyvGkY2qL6oxcgZgBl+krGR3qFlL4vNyzy+rvaZAV8YNijQiM7YyggTLhnKai3SxuHjzN1ZiT7vzlklJn9k2qRhU1uVq4xW+YX6yVNBBbugJGqNuyw3p2BUOga83ES2jA/Kby9mLAJEebS5LmupapSCeElsmhYzXIlV9SYH1mZV4CHQ06Luv3r1DQ8z1cwrB+5N+Y9TNV1wXa/LbuxJPl6jgxN0oJ+RFU7lTHtovMwyL+wRXLiRpZc2k6dH0IUo03QxYVCUDIvShdX26WfzF+fpSPRgOHnbJeaBTbeuxntFzEDy6Td2hpRQWP31i+/8BzPWGCLqUfS55uQqFM06UI/vnZnbe8NlI57gzw6yJHPsFoyg8Cw/3TABhw+SEOoMyBdued4RGKF6EgYsx3hW+KUhEvncnBg6F7jRdZgtHmk6s8iU+/d39pgQh4AiCJQOhINErAnnH2P5hM3TDoZYQlkUjw0FQ0F8bTmRKJq4JhMyvtwMutvMuSIN+8q7utNTxzFquvYcmAcNYafsmuC7Qtvpqi0iVzQ3f3c+SCljcvEnUEf66+xufkn79eSAYcCrL/FdZOdBEiXpaY2wdtJO7Kr66BMhzGCjlO8YQoDw0pgsES9Uy5H1JtfphjWzHWYdiYDBoofFURE1jO/pJ9V9dp9ezzOcvW4faZhL8ho=
17
- gem: sidekiq-instrument
18
- on:
19
- tags: true
20
- repo: enova/sidekiq-instrument