nightwing 0.0.4

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 026f5c884e256b1db6ae3dfc0d491ef78355f181
4
+ data.tar.gz: bd780bd6f1331e749da81c91545ad2a0ef994ac0
5
+ SHA512:
6
+ metadata.gz: 1f068baec9849f613dce5da7971752904d8f2ebf260264ee36dd95c7a3807a0e0f5f70a583de518ec429dcfe3c0ba63cf7c008a077fbe60c30284d67155b176e
7
+ data.tar.gz: 4c311cb5de9248e5b5961cf088b6658dcb3207483cc158b6e1d7525d5fcdea7dda5f8a3be171d5e5dd572669689a775abd4e0f2a8c9f1ce9b16f5cef786667d5
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ .DS_Store
2
+ robin-*.gem
3
+ nightwing-*.gem
4
+ .idea
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+ Documentation:
4
+ Enabled: false
5
+ Metrics/AbcSize:
6
+ Max: 35
7
+ Metrics/MethodLength:
8
+ Enabled: false
9
+ Metrics/LineLength:
10
+ Max: 120
11
+ StringLiterals:
12
+ EnforcedStyle: double_quotes
13
+ Style/FrozenStringLiteralComment:
14
+ Enabled: false
15
+ Style/SignalException:
16
+ Enabled: false
17
+ Style/GuardClause:
18
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ ## Unreleased
2
+
3
+ - Renamed project to "Nightwing"
4
+ - Gem name is now "nightwing"
5
+
6
+ ## 0.0.4
7
+
8
+ - Changed default namespace from "robin.sidekiq" to "sidekiq"
9
+ - Removed Librato dependency
10
+ - `:client` middleware option is now required
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,70 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ nightwing (0.0.4)
5
+ activesupport (>= 4.1.0)
6
+ sidekiq (>= 2.6)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (4.2.5.1)
12
+ i18n (~> 0.7)
13
+ json (~> 1.7, >= 1.7.7)
14
+ minitest (~> 5.1)
15
+ thread_safe (~> 0.3, >= 0.3.4)
16
+ tzinfo (~> 1.1)
17
+ ast (2.2.0)
18
+ builder (3.2.2)
19
+ concurrent-ruby (1.0.0)
20
+ connection_pool (2.2.0)
21
+ diff-lcs (1.2.5)
22
+ i18n (0.7.0)
23
+ json (1.8.3)
24
+ minitest (5.8.4)
25
+ parser (2.3.0.2)
26
+ ast (~> 2.2)
27
+ powerpack (0.1.1)
28
+ rainbow (2.1.0)
29
+ redis (3.2.2)
30
+ rspec (3.4.0)
31
+ rspec-core (~> 3.4.0)
32
+ rspec-expectations (~> 3.4.0)
33
+ rspec-mocks (~> 3.4.0)
34
+ rspec-core (3.4.1)
35
+ rspec-support (~> 3.4.0)
36
+ rspec-expectations (3.4.0)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.4.0)
39
+ rspec-mocks (3.4.1)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.4.0)
42
+ rspec-support (3.4.1)
43
+ rspec_junit_formatter (0.2.3)
44
+ builder (< 4)
45
+ rspec-core (>= 2, < 4, != 2.12.0)
46
+ rubocop (0.36.0)
47
+ parser (>= 2.3.0.0, < 3.0)
48
+ powerpack (~> 0.1)
49
+ rainbow (>= 1.99.1, < 3.0)
50
+ ruby-progressbar (~> 1.7)
51
+ ruby-progressbar (1.7.5)
52
+ sidekiq (4.1.0)
53
+ concurrent-ruby (~> 1.0)
54
+ connection_pool (~> 2.2, >= 2.2.0)
55
+ redis (~> 3.2, >= 3.2.1)
56
+ thread_safe (0.3.5)
57
+ tzinfo (1.2.2)
58
+ thread_safe (~> 0.1)
59
+
60
+ PLATFORMS
61
+ ruby
62
+
63
+ DEPENDENCIES
64
+ nightwing!
65
+ rspec (~> 3.4, >= 3.4.0)
66
+ rspec_junit_formatter (~> 0.2, >= 0.2.3)
67
+ rubocop (~> 0.36)
68
+
69
+ BUNDLED WITH
70
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # Nightwing
2
+
3
+ Nightwing is a Sidekiq middleware for capturing worker metrics including number processed, number of failures, timing, etc.
4
+
5
+ ## Installation
6
+
7
+ Inside your Gemfile, add the following line:
8
+
9
+ ```Gemfile
10
+ gem 'nightwing', github: 'teespring/nightwing'
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ You will need to add the code below to your app. In a typical Rails app, this would go into an initializer.
16
+
17
+ ```ruby
18
+ # config/initializers/sidekiq.rb
19
+ Sidekiq.configure_server do |config|
20
+ config.server_middleware do |chain|
21
+ chain.add Nightwing::Sidekiq::Stats, client: Librato
22
+ chain.add Nightwing::Sidekiq::QueueStats, client: Librato
23
+ chain.add Nightwing::Sidekiq::WorkerStats, client: Librato
24
+ end
25
+ end
26
+ ```
27
+
28
+ ### Available options
29
+
30
+ - `client`: Librato or statsd client. Required.
31
+ - `namespace`: the string each metric is prefixed with. Defaults to `"sidekiq"`.
32
+
33
+ ## Metrics
34
+
35
+ Below are the metrics reported to Librato from the Sidekiq middleware
36
+
37
+ - `sidekiq.retries`: number of jobs to be retried
38
+ - `sidekiq.scheduled`: number of jobs scheduled to run
39
+ - `sidekiq.processed`: number of times middleware called
40
+ - `sidekiq.failed`: number of jobs that raised an error
41
+
42
+ ### Queue specific
43
+
44
+ - `sidekiq.<queue>.size`: depth for a given queue
45
+ - `sidekiq.<queue>.latency`: latency for given queue¹
46
+ - `sidekiq.<queue>.processed`: number of times middleware called for given queue
47
+ - `sidekiq.<queue>.failed`: number of jobs in given queue that raised an error
48
+
49
+ ¹: the difference between now and when the oldest job was enqueued (given in seconds)
50
+
51
+ ### Worker specific
52
+
53
+ - `sidekiq.<queue>.<worker>.processed`: number of times middleware called for given worker
54
+ - `sidekiq.<queue>.<worker>.failed`: number of jobs in given worker that raised an error
55
+ - `sidekiq.<queue>.<worker>.finished`: number of successful worker jobs
data/circle.yml ADDED
@@ -0,0 +1,5 @@
1
+ test:
2
+ pre:
3
+ - bundle exec rubocop
4
+ override:
5
+ - bundle exec rspec -r rspec_junit_formatter --format RspecJunitFormatter -o $CIRCLE_TEST_REPORTS/rspec/junit.xml
data/lib/nightwing.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "nightwing/version"
2
+ require "nightwing/sidekiq/stats"
3
+ require "nightwing/sidekiq/queue_stats"
4
+ require "nightwing/sidekiq/worker_stats"
@@ -0,0 +1,23 @@
1
+ require "active_support/core_ext/string"
2
+
3
+ module Nightwing
4
+ class Metric
5
+ attr_reader :namespace
6
+
7
+ def initialize(namespace)
8
+ @namespace = namespace
9
+ end
10
+
11
+ ##
12
+ # Generates a metric name
13
+ #
14
+ # @param [String] queue
15
+ # @param [Class] worker
16
+ #
17
+ # returns a String object
18
+ def for(queue:, worker: nil)
19
+ worker_name = worker.to_s.underscore.tr("/", "_") if worker
20
+ [namespace, queue, worker_name].compact.join(".")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Nightwing
2
+ class NilClient
3
+ def increment(*args)
4
+ end
5
+
6
+ def measure(*args)
7
+ end
8
+ alias timing measure
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ require "sidekiq/api"
2
+ require "nightwing/metric"
3
+ require "nightwing/nil_client"
4
+
5
+ module Nightwing
6
+ module Sidekiq
7
+ class Base
8
+ attr_reader :namespace, :client
9
+
10
+ def initialize(options = {})
11
+ @namespace = options.fetch(:namespace, "sidekiq")
12
+ @client = options.fetch(:client, Nightwing::NilClient.new)
13
+ end
14
+
15
+ private
16
+
17
+ def metrics
18
+ @_metrics ||= Nightwing::Metric.new(namespace)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ require "nightwing/sidekiq/base"
2
+
3
+ module Nightwing
4
+ module Sidekiq
5
+ ##
6
+ # Sidekiq server middleware for measuring Sidekiq queues
7
+ class QueueStats < Base
8
+ ##
9
+ # Sends Sidekiq queue metrics to client then yields
10
+ #
11
+ # @param [Sidekiq::Worker] _worker
12
+ # The worker the job belongs to.
13
+ #
14
+ # @param [Hash] _msg
15
+ # The job message.
16
+ #
17
+ # @param [String] queue
18
+ # The current queue.
19
+ def call(_worker, _msg, queue)
20
+ exception = nil
21
+ sidekiq_queue = ::Sidekiq::Queue.new(queue)
22
+ queue_namespace = metrics.for(queue: queue)
23
+
24
+ client.measure "#{queue_namespace}.size", sidekiq_queue.size
25
+ client.measure "#{queue_namespace}.latency", sidekiq_queue.latency
26
+ client.increment "#{queue_namespace}.processed"
27
+
28
+ begin
29
+ yield
30
+ rescue => e
31
+ exception = e
32
+ end
33
+
34
+ if exception
35
+ client.increment "#{queue_namespace}.failed"
36
+ raise exception
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,49 @@
1
+ require "nightwing/sidekiq/base"
2
+
3
+ module Nightwing
4
+ module Sidekiq
5
+ ##
6
+ # Sidekiq server middleware for measuring Sidekiq stats
7
+ class Stats < Base
8
+ ##
9
+ # Sends Sidekiq metrics to statsd client then yields
10
+ #
11
+ # @param [Sidekiq::Worker] _worker
12
+ # The worker the job belongs to.
13
+ #
14
+ # @param [Hash] _msg
15
+ # The job message.
16
+ #
17
+ # @param [String] _queue
18
+ # The current queue.
19
+ def call(_worker, _msg, _queue)
20
+ exception = nil
21
+
22
+ client.measure "#{namespace}.retries", retries.size
23
+ client.measure "#{namespace}.scheduled", scheduled.size
24
+ client.increment "#{namespace}.processed"
25
+
26
+ begin
27
+ yield
28
+ rescue => e
29
+ exception = e
30
+ end
31
+
32
+ if exception
33
+ client.increment "#{namespace}.failed"
34
+ raise exception
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def retries
41
+ @_retries ||= ::Sidekiq::RetrySet.new
42
+ end
43
+
44
+ def scheduled
45
+ @_scheduled ||= ::Sidekiq::ScheduledSet.new
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ require "nightwing/sidekiq/base"
2
+
3
+ module Nightwing
4
+ module Sidekiq
5
+ class WorkerStats < Base
6
+ def call(worker, _msg, queue)
7
+ exception = nil
8
+ worker_namespace = metrics.for(queue: queue, worker: worker.class)
9
+
10
+ client.increment "#{worker_namespace}.processed"
11
+
12
+ begin
13
+ yield
14
+ rescue => e
15
+ exception = e
16
+ end
17
+
18
+ if exception
19
+ client.increment "#{worker_namespace}.failed"
20
+ raise exception
21
+ end
22
+
23
+ client.increment "#{worker_namespace}.finished"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Nightwing
2
+ VERSION = "0.0.4".freeze
3
+ end
data/nightwing.gemspec ADDED
@@ -0,0 +1,21 @@
1
+ require File.expand_path("../lib/nightwing/version", __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "nightwing"
5
+ s.version = Nightwing::VERSION
6
+ s.date = "2016-01-26"
7
+ s.summary = "Sidekiq metrics gathering"
8
+ s.description = "Sidekiq metrics gathering"
9
+ s.authors = ["Chris Ledet"]
10
+ s.email = "chris.ledet@teespring.com"
11
+ s.files = `git ls-files`.split
12
+ s.homepage = "https://github.com/teespring/nightwing"
13
+ s.license = "MIT"
14
+
15
+ s.add_runtime_dependency "sidekiq", ">= 2.6"
16
+ s.add_runtime_dependency "activesupport", ">= 4.1.0"
17
+
18
+ s.add_development_dependency "rubocop", "~> 0.36"
19
+ s.add_development_dependency "rspec", "~> 3.4", ">= 3.4.0"
20
+ s.add_development_dependency "rspec_junit_formatter", "~> 0.2", ">= 0.2.3"
21
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe Nightwing::Metric do
4
+ subject { described_class.new("sidekiq") }
5
+
6
+ it "returns name for queue metric" do
7
+ metric_name = subject.for(queue: "default")
8
+ expect(metric_name).to eq("sidekiq.default")
9
+ end
10
+
11
+ it "returns name for worker metric" do
12
+ metric_name = subject.for(queue: "default", worker: "CoolWorker")
13
+ expect(metric_name).to eq("sidekiq.default.cool_worker")
14
+ end
15
+
16
+ it "returns name for module worker metric" do
17
+ metric_name = subject.for(queue: "default", worker: "App::AwesomeWorker")
18
+ expect(metric_name).to eq("sidekiq.default.app_awesome_worker")
19
+ end
20
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Nightwing::Sidekiq::QueueStats do
4
+ subject { Nightwing::Sidekiq::QueueStats.new(client: Nightwing::NilClient.new) }
5
+
6
+ describe "#call" do
7
+ let(:fake_queue) { Struct.new(:size, :latency).new(0, 0) }
8
+
9
+ before do
10
+ allow(Sidekiq::Queue).to receive(:new).and_return fake_queue
11
+ end
12
+
13
+ context "when everything just works" do
14
+ it "increments process count" do
15
+ expect(subject.client).to receive(:measure).with("sidekiq.default.size", 0)
16
+ expect(subject.client).to receive(:measure).with("sidekiq.default.latency", 0)
17
+ expect(subject.client).to receive(:increment).with("sidekiq.default.processed")
18
+
19
+ subject.call(nil, nil, "default") do
20
+ # beep
21
+ end
22
+ end
23
+ end
24
+
25
+ context "when something fails" do
26
+ it "increments process and failure count" do
27
+ expect(subject.client).to receive(:measure).with("sidekiq.default.size", 0)
28
+ expect(subject.client).to receive(:measure).with("sidekiq.default.latency", 0)
29
+ expect(subject.client).to receive(:increment).with("sidekiq.default.processed")
30
+ expect(subject.client).to receive(:increment).with("sidekiq.default.failed")
31
+
32
+ expect do
33
+ subject.call(nil, nil, "default") do
34
+ fail "beep"
35
+ end
36
+ end.to raise_error RuntimeError
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe Nightwing::Sidekiq::Stats do
4
+ subject { Nightwing::Sidekiq::Stats.new(client: Nightwing::NilClient.new) }
5
+
6
+ before do
7
+ fake_set = Struct.new(:size).new(1)
8
+ allow(Sidekiq::RetrySet).to receive(:new).and_return(fake_set)
9
+ allow(Sidekiq::ScheduledSet).to receive(:new).and_return(fake_set)
10
+ end
11
+
12
+ describe "#call" do
13
+ context "when everything just works" do
14
+ it "increments process count" do
15
+ expect(subject.client).to receive(:measure).with("sidekiq.retries", 1)
16
+ expect(subject.client).to receive(:measure).with("sidekiq.scheduled", 1)
17
+ expect(subject.client).to receive(:increment).with("sidekiq.processed")
18
+
19
+ subject.call(nil, nil, nil) do
20
+ # beep
21
+ end
22
+ end
23
+ end
24
+
25
+ context "when something fails" do
26
+ it "increments process and failure count" do
27
+ expect(subject.client).to receive(:measure).with("sidekiq.retries", 1)
28
+ expect(subject.client).to receive(:measure).with("sidekiq.scheduled", 1)
29
+ expect(subject.client).to receive(:increment).with("sidekiq.processed")
30
+ expect(subject.client).to receive(:increment).with("sidekiq.failed")
31
+
32
+ expect do
33
+ subject.call(nil, nil, nil) do
34
+ fail "beep"
35
+ end
36
+ end.to raise_error RuntimeError
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Nightwing::Sidekiq::WorkerStats do
4
+ MyWorker = Class.new
5
+
6
+ subject { Nightwing::Sidekiq::WorkerStats.new(client: Nightwing::NilClient.new) }
7
+
8
+ describe "#call" do
9
+ context "when everything just works" do
10
+ it "increments process count" do
11
+ expect(subject.client).to receive(:increment).with("sidekiq.default.my_worker.processed")
12
+ expect(subject.client).to receive(:increment).with("sidekiq.default.my_worker.finished")
13
+
14
+ subject.call(MyWorker.new, nil, "default") do
15
+ # beep
16
+ end
17
+ end
18
+ end
19
+
20
+ context "when something fails" do
21
+ it "increments process and failure count" do
22
+ expect(subject.client).to receive(:increment).with("sidekiq.default.my_worker.processed")
23
+ expect(subject.client).to receive(:increment).with("sidekiq.default.my_worker.failed")
24
+
25
+ expect do
26
+ subject.call(MyWorker.new, nil, "default") do
27
+ fail "beep"
28
+ end
29
+ end.to raise_error RuntimeError
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,2 @@
1
+ require "rspec"
2
+ require "nightwing"
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nightwing
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Chris Ledet
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sidekiq
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 4.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 4.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.36'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.36'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 3.4.0
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '3.4'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 3.4.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec_junit_formatter
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.2'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 0.2.3
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.2'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.2.3
95
+ description: Sidekiq metrics gathering
96
+ email: chris.ledet@teespring.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - ".gitignore"
102
+ - ".rspec"
103
+ - ".rubocop.yml"
104
+ - ".ruby-version"
105
+ - CHANGELOG.md
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - README.md
109
+ - circle.yml
110
+ - lib/nightwing.rb
111
+ - lib/nightwing/metric.rb
112
+ - lib/nightwing/nil_client.rb
113
+ - lib/nightwing/sidekiq/base.rb
114
+ - lib/nightwing/sidekiq/queue_stats.rb
115
+ - lib/nightwing/sidekiq/stats.rb
116
+ - lib/nightwing/sidekiq/worker_stats.rb
117
+ - lib/nightwing/version.rb
118
+ - nightwing.gemspec
119
+ - spec/nightwing/metric_spec.rb
120
+ - spec/nightwing/sidekiq/queue_stats_spec.rb
121
+ - spec/nightwing/sidekiq/stats_spec.rb
122
+ - spec/nightwing/sidekiq/worker_stats_spec.rb
123
+ - spec/spec_helper.rb
124
+ homepage: https://github.com/teespring/nightwing
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.5.1
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Sidekiq metrics gathering
148
+ test_files: []