sidekiq-statsd 2.0.1 → 2.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c0a8286f6068e0cde4639ae549ddb4ffea4b615b5e21be7913e8a911f7a6d5e
4
- data.tar.gz: eeacf3e1cacfda19717958059aab50d4f64a645934188530b842c2edd98a94de
3
+ metadata.gz: e6d8e3354a5bc87cb290fa801fe88fd84af3c6903cc0177f80a95769b29dee43
4
+ data.tar.gz: d4be3f1f2e8d80c43ace8e07fa86daabb53b8060cccc0a0ba6f27dc992f98019
5
5
  SHA512:
6
- metadata.gz: ed5110d9d73f6e0f7f4d7ba1521ab98af4187aeb271cbadc3c880af499cefab64a79da9aa87b9797ce8d75170f0c5bf209d22dc18671cc3f02f524c1e355c7fc
7
- data.tar.gz: 5cbf10d942527cdc0e7ea3c43ee0e08ef5f14c7b6000673b81d66451c93bcbc2d66017240caea5b6d3f61e076713329f45d79e510b79235aea93ac18efa1ae78
6
+ metadata.gz: b73d03dd5d3a6cc0f3a41e06f0b5be7b065fe30f2d45198a5acba85f34caee0e1542b2ee607701df9f63cd49dd0e78289f803ec71b04f76c17ad2603349faf3b
7
+ data.tar.gz: 406fde1d9d0a9686704e31c50a66b191d81a5f5a7c6cc5986467e223c2cf6507d92979a1e4f5b5dc0b26e95853943508b024bc6c78c7891f73e754bdc52de4c0
@@ -1,3 +1,7 @@
1
+ # 2.1.0
2
+
3
+ * Report stats across all workers (processing, runtime)
4
+
1
5
  # 2.0.1
2
6
 
3
7
  * Fix stuck global stats (retries, processed, etc.)
data/README.md CHANGED
@@ -3,7 +3,12 @@
3
3
  [![Build Status](https://secure.travis-ci.org/phstc/sidekiq-statsd.png)](http://travis-ci.org/phstc/sidekiq-statsd)
4
4
  [![Dependency Status](https://gemnasium.com/phstc/sidekiq-statsd.png)](https://gemnasium.com/phstc/sidekiq-statsd)
5
5
 
6
- Sidekiq StatsD is a [Sidekiq server middleware](https://github.com/mperham/sidekiq/wiki/Middleware) to send [Sidekiq worker metrics](https://github.com/mperham/sidekiq/wiki/API#wiki-stats) through [statsd](https://github.com/reinh/statsd).
6
+ Sidekiq StatsD is a [Sidekiq server middleware](https://github.com/mperham/sidekiq/wiki/Middleware) to send Sidekiq metrics through [statsd](https://github.com/reinh/statsd):
7
+
8
+ - [global metrics](https://github.com/mperham/sidekiq/wiki/API#wiki-stats)
9
+ - [queue metrics](https://github.com/mperham/sidekiq/wiki/API#queue)
10
+ - [worker metrics](https://github.com/mperham/sidekiq/wiki/API#workers) (`processing`, `runtime`)
11
+ - job metrics (`processing_time` and `success` / `failure`)
7
12
 
8
13
  ## Compatibility
9
14
 
@@ -50,16 +55,12 @@ end
50
55
 
51
56
  ```ruby
52
57
  # @param [Hash] options The options to initialize the StatsD client.
53
- # @option options [Statsd] :statsd Existing statsd client to use.
58
+ # @option options [Statsd] :statsd Existing [statsd client](https://github.com/github/statsd-ruby) to use.
54
59
  # @option options [String] :env ("production") The env to segment the metric key (e.g. env.prefix.worker_name.success|failure).
55
60
  # @option options [String] :prefix ("worker") The prefix to segment the metric key (e.g. env.prefix.worker_name.success|failure).
56
- # @option options [String] :host ("localhost") The StatsD host.
57
- # @option options [String] :port ("8125") The StatsD port.
58
61
  # @option options [String] :sidekiq_stats ("true") Send Sidekiq global stats e.g. total enqueued, processed and failed.
59
62
  ```
60
63
 
61
- If you have a [statsd instance](https://github.com/github/statsd-ruby) you can pass it through the `:statsd` option. If not you can pass the `:host` and `:port` to connect to statsd.
62
-
63
64
  ## Contributing
64
65
 
65
66
  1. Fork it
@@ -41,6 +41,7 @@ module Sidekiq::Statsd
41
41
  raise e
42
42
  ensure
43
43
  report_global_stats(b) if @options[:sidekiq_stats]
44
+ report_worker_stats(b) if @options[:sidekiq_stats]
44
45
  report_queue_stats(b, msg['queue'])
45
46
  end
46
47
  end
@@ -63,9 +64,20 @@ module Sidekiq::Statsd
63
64
  def report_queue_stats(statsd, queue_name)
64
65
  sidekiq_queue = Sidekiq::Queue.new(queue_name)
65
66
  statsd.gauge prefix('queues', queue_name, 'enqueued'), sidekiq_queue.size
67
+ statsd.gauge prefix('queues', queue_name, 'latency'), sidekiq_queue.latency
68
+ end
69
+
70
+ def report_worker_stats(statsd)
71
+ workers = Sidekiq::Workers.new.to_a.map { |_pid, _tid, work| work }
72
+ worker_groups = workers.group_by { |worker| worker['queue'] }
66
73
 
67
- if sidekiq_queue.respond_to?(:latency)
68
- statsd.gauge prefix('queues', queue_name, 'latency'), sidekiq_queue.latency
74
+ workers.each do |worker|
75
+ runtime = Time.now.to_i - worker['run_at']
76
+ statsd.gauge prefix('queues', worker['queue'], 'runtime'), runtime
77
+ end
78
+
79
+ worker_groups.each do |queue_name, workers|
80
+ statsd.gauge prefix('queues', queue_name, 'processing'), workers.size
69
81
  end
70
82
  end
71
83
 
@@ -78,3 +90,4 @@ module Sidekiq::Statsd
78
90
  end
79
91
  end # ServerMiddleware
80
92
  end # Sidekiq
93
+
@@ -1,6 +1,6 @@
1
1
  module Sidekiq
2
2
  module Statsd
3
- VERSION = '2.0.1'
3
+ VERSION = '2.1.0'
4
4
  end
5
5
  end
6
6
 
@@ -39,20 +39,15 @@ describe Sidekiq::Statsd::ServerMiddleware do
39
39
 
40
40
  context 'without global sidekiq stats' do
41
41
  it "doesn't initialize a Sidekiq::Stats instance" do
42
- # Sidekiq::Stats.new calls fetch_stats!, which makes redis calls
42
+ # Sidekiq::Stats.new makes redis calls
43
43
  expect(Sidekiq::Stats).not_to receive(:new)
44
44
  described_class.new(statsd: client, sidekiq_stats: false)
45
45
  end
46
46
 
47
- it "doesn't gauge sidekiq stats" do
48
- expect(client).not_to receive(:enqueued)
49
- expect(client).not_to receive(:retry_size)
50
- expect(client).not_to receive(:processed)
51
- expect(client).not_to receive(:failed)
52
-
53
- described_class
54
- .new(statsd: client, sidekiq_stats: false)
55
- .call(worker, msg, queue, &clean_job)
47
+ it "doesn't initialize a Sidekiq::Workers instance" do
48
+ # Sidekiq::Workers.new makes redis calls
49
+ expect(Sidekiq::Workers).not_to receive(:new)
50
+ described_class.new(statsd: client, sidekiq_stats: false)
56
51
  end
57
52
  end
58
53
 
@@ -1,10 +1,16 @@
1
+ require 'active_support/testing/time_helpers'
2
+
1
3
  shared_examples "a resilient gauge reporter" do
4
+ include ActiveSupport::Testing::TimeHelpers
5
+
2
6
  let(:sidekiq_stats) { double(enqueued: 1, processed: 2, failed: 3, retry_size: 4) }
7
+ let!(:sidekiq_workers) { [["pid", "tid", { "queue" => "my_queue", "run_at" => Time.now.to_i }]] }
3
8
  let(:queue_stats) { double(size: 3, latency: 4.2) }
4
9
 
5
10
  before do
6
11
  allow(Sidekiq::Stats).to receive(:new) { sidekiq_stats }
7
12
  allow(Sidekiq::Queue).to receive(:new).with('mailer') { queue_stats }
13
+ allow(Sidekiq::Workers).to receive(:new) { sidekiq_workers }
8
14
  end
9
15
 
10
16
  it "gauges enqueued jobs" do
@@ -60,4 +66,24 @@ shared_examples "a resilient gauge reporter" do
60
66
 
61
67
  middleware.call(worker, msg, queue, &job)
62
68
  end
69
+
70
+ it "gauges precessing jobs" do
71
+ expect(client)
72
+ .to receive(:gauge)
73
+ .with("production.worker.queues.my_queue.processing", 1)
74
+ .once
75
+
76
+ middleware.call(worker, msg, queue, &job)
77
+ end
78
+
79
+ it "gauges job runtime" do
80
+ travel_to 5.minutes.from_now
81
+
82
+ expect(client)
83
+ .to receive(:gauge)
84
+ .with("production.worker.queues.my_queue.runtime", 300)
85
+ .once
86
+
87
+ middleware.call(worker, msg, queue, &job)
88
+ end
63
89
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-statsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pablo Cantero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-30 00:00:00.000000000 Z
11
+ date: 2020-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport