sidekiq-instrument 0.4.1 → 0.5.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 +4 -4
- data/.github/workflows/ci.yml +36 -0
- data/.simplecov +6 -3
- data/README.md +36 -6
- data/bin/console +5 -4
- data/lib/sidekiq/instrument/middleware/client.rb +3 -1
- data/lib/sidekiq/instrument/middleware/server.rb +10 -3
- data/lib/sidekiq/instrument/mixin.rb +15 -4
- data/lib/sidekiq/instrument/statter.rb +15 -0
- data/lib/sidekiq/instrument/version.rb +1 -1
- data/lib/sidekiq/instrument/worker.rb +8 -4
- data/lib/sidekiq/instrument.rb +3 -0
- data/sidekiq-instrument.gemspec +7 -4
- metadata +60 -11
- data/.travis.yml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dec762f020453b49d17551ce8dba6146fad0b4fdb5c06fbc5ce17ad57bdafae5
|
4
|
+
data.tar.gz: 98e6f98439a8a886a8ec4adc0b8daa83d181629ebe7f2e4020861dc66379c533
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 123de131fd9d2aa45d1256c2b4c53c25e1cdc1181b02ab16e230ca6e2cbdeda2785c8b2b58a20b27a5056a8dc2bfc48dfaff8ad26c887e60addb4684acb20162
|
7
|
+
data.tar.gz: 56b1cb9ac84cb8ee016da9ab99fabe7e000b59c46b1c0b23a107798193f8ab979c9e782f3525b4ff8041455533ebe8837e375803e3313478e670e9137b203852
|
@@ -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 '
|
1
|
+
require 'simplecov'
|
2
|
+
require 'simplecov-cobertura'
|
2
3
|
|
3
4
|
SimpleCov.formatters = [
|
4
5
|
SimpleCov::Formatter::HTMLFormatter,
|
5
|
-
|
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
|
-
[](https://travis-ci.org/enova/sidekiq-instrument)
|
3
|
-
[](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
|
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
|
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
|
4
|
-
require
|
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
|
11
|
+
# require 'pry'
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start
|
@@ -7,7 +7,9 @@ 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
|
-
|
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))
|
11
13
|
|
12
14
|
yield
|
13
15
|
end
|
@@ -5,12 +5,19 @@ module Sidekiq::Instrument
|
|
5
5
|
include Sidekiq::Instrument::MetricNames
|
6
6
|
|
7
7
|
def call(worker, job, queue, &block)
|
8
|
-
|
8
|
+
Statter.statsd.increment(metric_name(worker, 'dequeue'))
|
9
|
+
Statter.dogstatsd&.increment('sidekiq.dequeue', worker_dog_options(worker))
|
9
10
|
|
10
|
-
|
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
|
-
|
17
|
+
Statter.statsd.increment(metric_name(worker, 'error'))
|
18
|
+
Statter.dogstatsd&.increment('sidekiq.error', worker_dog_options(worker))
|
13
19
|
raise e
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
23
|
+
|
@@ -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
|
-
|
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
|
@@ -21,18 +21,22 @@ module Sidekiq::Instrument
|
|
21
21
|
self.class::METRIC_NAMES.each do |method, stat|
|
22
22
|
stat ||= method
|
23
23
|
|
24
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
37
41
|
end
|
38
42
|
end
|
data/lib/sidekiq/instrument.rb
CHANGED
data/sidekiq-instrument.gemspec
CHANGED
@@ -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 = ['
|
10
|
-
spec.email = ['
|
9
|
+
spec.authors = ['Loan Application Services']
|
10
|
+
spec.email = ['application_services@enova.com']
|
11
11
|
|
12
|
-
spec.summary = 'StatsD
|
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.0'
|
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 '
|
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
|
+
version: 0.5.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: 2022-
|
11
|
+
date: 2022-11-03 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.0
|
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.0
|
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:
|
144
|
+
name: simplecov
|
111
145
|
requirement: !ruby/object:Gem::Requirement
|
112
146
|
requirements:
|
113
|
-
- - "
|
147
|
+
- - ">="
|
114
148
|
- !ruby/object:Gem::Version
|
115
|
-
version: '0
|
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
|
170
|
+
version: '0'
|
123
171
|
description:
|
124
172
|
email:
|
125
|
-
-
|
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
|
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
|