chillout 0.8.6 → 0.8.7

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
  SHA1:
3
- metadata.gz: 658b6a7781d10cb43a0d4b337823465ed2be5b0f
4
- data.tar.gz: 71bf4f623d9ed3f1db59443a84b5b2737c5ad190
3
+ metadata.gz: 6631dcadcf73b03ed3a10a4ef2e7d79ac081c3cf
4
+ data.tar.gz: e2097e2a4d295b7fd0f6c36f6eac008aad94523c
5
5
  SHA512:
6
- metadata.gz: 03b4744020e8157adb20fbd5a418d9679c1be269dcc597d5e67d2b198ac03102aa534ad94962c7aa46c5154fc292c3fe38b6d7a44380138626bb8fa255bbab89
7
- data.tar.gz: 57a7ab5198b538415f0d1e2eea38f8b1542b5aa9a05cc380181a38b2dfd7fda26fdb390e958dbb9049e21c535d3fcf126812e678d59970ab150778598f536045
6
+ metadata.gz: d10872b0af3d30b51ef10dfaa6530e177cc1d3f329ea39a621127d691dc10d9befc1a73e4fc2e3029fa06c0605df6fc51369bf0d662f0f3babd603a8ec6fe61b
7
+ data.tar.gz: b1a7b075053a58cb0e06e7f75cac2f6c6c4ca255c7a8abe9056eae3c05ea9549ece21bc5341ff6ac263631f479466d4474f8c1571ec77f5b0e2024a2079639b7
@@ -10,7 +10,7 @@ env:
10
10
  - SAMPLE_APP=rails_4_0_0
11
11
  - SAMPLE_APP=rails_4_0_13
12
12
  - SAMPLE_APP=rails_4_1_0
13
- - SAMPLE_APP=rails_4_1_16
13
+ - SAMPLE_APP=rails_4_1_16 SIDEKIQ_SUPPORTED=true
14
14
  - SAMPLE_APP=rails_4_2_0 SIDEKIQ_SUPPORTED=true
15
15
  - SAMPLE_APP=rails_4_2_8 SIDEKIQ_SUPPORTED=true
16
16
  - SAMPLE_APP=rails_5_0_3 SIDEKIQ_SUPPORTED=true
@@ -24,7 +24,7 @@ matrix:
24
24
  - rvm: 2.4.1
25
25
  env: SAMPLE_APP=rails_4_1_0
26
26
  - rvm: 2.4.1
27
- env: SAMPLE_APP=rails_4_1_16
27
+ env: SAMPLE_APP=rails_4_1_16 SIDEKIQ_SUPPORTED=true
28
28
  - rvm: 2.4.1
29
29
  env: SAMPLE_APP=rails_4_2_0 SIDEKIQ_SUPPORTED=true
30
30
  - rvm: 2.1.10
@@ -34,6 +34,10 @@ matrix:
34
34
  - rvm: 2.1.10
35
35
  env: SAMPLE_APP=rails_5_1_1 SIDEKIQ_SUPPORTED=true
36
36
  include:
37
+ - rvm: 2.1.10
38
+ env: SIDEKIQ_VERSION=3.5.3 SAMPLE_APP=rails_4_1_16 SIDEKIQ_SUPPORTED=true
39
+ - rvm: 2.1.10
40
+ env: SIDEKIQ_VERSION=4.0 SAMPLE_APP=rails_4_1_16 SIDEKIQ_SUPPORTED=true
37
41
  - rvm: 2.4.1
38
42
  env: SAMPLE_APP=rails_4_2_8 STRATEGY=active_job SIDEKIQ_SUPPORTED=true
39
43
  - rvm: 2.4.1
@@ -1,5 +1,11 @@
1
1
  # chillout gem changes
2
2
 
3
+ 0.8.7
4
+ -----
5
+
6
+ - Introduced sidekiq jobs monitoring.
7
+
8
+
3
9
  0.8.6
4
10
  -----
5
11
 
data/Gemfile CHANGED
@@ -8,5 +8,7 @@ gemspec
8
8
  if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2')
9
9
  gem "rack", "1.6"
10
10
  gem "activejob", "= 4.2.8"
11
- gem "sidekiq", "~> 4.2"
11
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || "~> 4.2"
12
+ else
13
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
12
14
  end
@@ -1,18 +1,72 @@
1
1
  module Chillout
2
2
  module Middleware
3
3
 
4
+ class SidekiqJobMeasurement
5
+ attr_reader :retriable, :queue, :started,
6
+ :finished, :delay, :duration, :success
7
+
8
+ def initialize(job, queue, started, finished, success)
9
+ @class = job["class"].to_s
10
+ @retriable = job["retry"].to_s
11
+ @queue = queue
12
+ @started = started.utc
13
+ @finished = finished.utc
14
+ enqueued_at = job["enqueued_at"] || @finished.to_f
15
+ @delay = 1000.0 * (@finished.to_f - enqueued_at)
16
+ @duration = 1000.0 * (@finished.to_f - @started.to_f)
17
+ @success = success.to_s
18
+ end
19
+
20
+ def job_class
21
+ @class
22
+ end
23
+
24
+ def as_measurements()
25
+ [{
26
+ series: "sidekiq_jobs",
27
+ tags: {
28
+ class: @class,
29
+ retriable: @retriable,
30
+ queue: @queue,
31
+ success: @success.to_s,
32
+ },
33
+ timestamp: @finished.iso8601,
34
+ values: {
35
+ finished: 1,
36
+ duration: @duration.to_f,
37
+ delay: @delay.to_f
38
+ },
39
+ }]
40
+ end
41
+ end
42
+
4
43
  class SidekiqCreationsMonitor
5
44
  def initialize(options)
6
45
  @client = options.fetch(:client)
7
46
  end
8
47
 
9
- def call(_worker, _job, _queue)
48
+ def call(_worker, job, queue)
49
+ started = Time.now.utc
50
+ success = false
10
51
  yield
52
+ success = true
11
53
  ensure
54
+ enqueue(queue, job, started, success)
55
+ end
56
+
57
+ def enqueue(_queue, job, started, success)
58
+ finished = Time.now.utc
12
59
  if creations = Chillout.creations
13
60
  Chillout.creations = nil
14
61
  @client.enqueue(creations)
15
62
  end
63
+ @client.enqueue(SidekiqJobMeasurement.new(
64
+ job,
65
+ _queue,
66
+ started,
67
+ finished,
68
+ success
69
+ ))
16
70
  end
17
71
  end
18
72
 
@@ -1,3 +1,3 @@
1
1
  module Chillout
2
- VERSION = "0.8.6"
2
+ VERSION = "0.8.7"
3
3
  end
@@ -8,15 +8,32 @@ class SidekiqWorkersSendMetricsTest < AcceptanceTestCase
8
8
  test_endpoint = TestEndpoint.new(port: 8081)
9
9
 
10
10
  test_endpoint.listen
11
- test_sidekiq_worker.boot(chillout_port: 8081)
12
11
  test_sidekiq_worker.push_job
12
+ test_sidekiq_worker.boot(chillout_port: 8081)
13
13
 
14
14
  if ENV['STRATEGY'] != 'active_job'
15
15
  assert test_endpoint.has_received_information_about_startup
16
16
  end
17
17
  assert test_endpoint.has_one_creation_for_entity_resource
18
+
19
+ assert sidekiq = test_endpoint.has_one_sidekiq_metric
20
+ assert_equal "CreateEntityJob", sidekiq.fetch("tags").fetch("class")
21
+ assert_equal "default", sidekiq.fetch("tags").fetch("queue")
22
+ assert_equal "true", sidekiq.fetch("tags").fetch("retriable")
23
+ assert_equal "true", sidekiq.fetch("tags").fetch("success")
24
+
25
+ assert sidekiq.fetch("timestamp")
26
+
27
+ assert_equal 1, sidekiq.fetch("values").fetch("finished")
28
+ assert_operator 90, :>, sidekiq.fetch("values").fetch("duration")
29
+ assert_operator 0, :<, sidekiq.fetch("values").fetch("duration")
30
+ assert_operator 8000, :>, sidekiq.fetch("values").fetch("delay")
31
+ assert_operator 200, :<, sidekiq.fetch("values").fetch("delay")
18
32
  ensure
19
- test_sidekiq_worker.shutdown if test_sidekiq_worker
33
+ if test_sidekiq_worker
34
+ test_sidekiq_worker.clear_jobs
35
+ test_sidekiq_worker.shutdown
36
+ end
20
37
  end
21
38
 
22
39
  end if ENV['SIDEKIQ_SUPPORTED']
@@ -24,8 +24,13 @@ module Chillout
24
24
  end
25
25
  end
26
26
 
27
- def test_enqueues_and_clears_creations
27
+ def test_enqueues_stats_and_clears_creations
28
28
  @client.expects(:enqueue).with(FakeJob::MOCK_CREATIONS)
29
+ @client.expects(:enqueue).with do |measurement|
30
+ SidekiqJobMeasurement === measurement &&
31
+ measurement.success == "true" &&
32
+ measurement.job_class == "Chillout::Middleware::SidekiqTest::FakeJob"
33
+ end
29
34
  Sidekiq::Testing.inline! { FakeJob.perform_async }
30
35
  assert_nil Chillout.creations
31
36
  end
@@ -35,11 +40,35 @@ module Chillout
35
40
  def perform; end
36
41
  end
37
42
 
38
- def test_does_nothing_when_no_creations
43
+ def test_enqueues_stats_only_when_no_creations
44
+ @client.expects(:enqueue).with do |measurement|
45
+ SidekiqJobMeasurement === measurement
46
+ end
39
47
  Sidekiq::Testing.inline! { EmptyJob.perform_async }
40
48
  assert_nil Chillout.creations
41
49
  end
42
50
 
51
+ class ErrorJob
52
+ Doh = Class.new(StandardError)
53
+ include Sidekiq::Worker
54
+ def perform
55
+ raise Doh
56
+ end
57
+ end
58
+
59
+ def test_enqueues_stats_even_on_failure
60
+ @client.expects(:enqueue).with do |measurement|
61
+ SidekiqJobMeasurement === measurement &&
62
+ measurement.success == "false"
63
+ end
64
+ Sidekiq::Testing.inline! do
65
+ assert_raises(ErrorJob::Doh) do
66
+ ErrorJob.perform_async
67
+ end
68
+ end
69
+ assert_nil Chillout.creations
70
+ end
71
+
43
72
  end
44
73
  end
45
74
  end
@@ -3,3 +3,8 @@ source 'https://rubygems.org'
3
3
  gem 'rails', '4.1.16'
4
4
  gem 'sqlite3'
5
5
  gem 'chillout', :path => '../../../'
6
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2')
7
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || "~> 4.2"
8
+ else
9
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
10
+ end
@@ -0,0 +1,6 @@
1
+ class CreateEntityJob
2
+ include Sidekiq::Worker
3
+ def perform
4
+ Entity.create!(name: Time.current.to_s)
5
+ end
6
+ end
@@ -4,7 +4,7 @@ gem 'rails', '4.2.0'
4
4
  gem 'sqlite3'
5
5
  gem 'chillout', :path => '../../../'
6
6
  if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2')
7
- gem "sidekiq", "~> 4.2"
7
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || "~> 4.2"
8
8
  else
9
- gem 'sidekiq'
9
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
10
10
  end
@@ -3,4 +3,4 @@ source 'https://rubygems.org'
3
3
  gem 'rails', '4.2.8'
4
4
  gem 'sqlite3'
5
5
  gem 'chillout', :path => '../../../'
6
- gem 'sidekiq'
6
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
@@ -3,4 +3,4 @@ source 'https://rubygems.org'
3
3
  gem 'rails', '5.0.3'
4
4
  gem 'sqlite3'
5
5
  gem 'chillout', :path => '../../../'
6
- gem 'sidekiq'
6
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
@@ -3,4 +3,4 @@ source 'https://rubygems.org'
3
3
  gem 'rails', '5.1.1'
4
4
  gem 'sqlite3'
5
5
  gem 'chillout', :path => '../../../'
6
- gem 'sidekiq'
6
+ gem "sidekiq", ENV['SIDEKIQ_VERSION'] || ">= 5"
@@ -5,6 +5,7 @@ require 'rack/test'
5
5
  require 'pathname'
6
6
  require 'bbq/spawn'
7
7
  require 'sidekiq/testing'
8
+ require 'sidekiq/api'
8
9
 
9
10
  $LOAD_PATH << File.expand_path('../../lib', __FILE__)
10
11
 
@@ -135,6 +136,12 @@ class TestSidekiqServer
135
136
  )
136
137
  end
137
138
  end
139
+
140
+ def clear_jobs
141
+ Sidekiq::Testing.disable! do
142
+ Sidekiq::Queue.new.💣
143
+ end
144
+ end
138
145
  end
139
146
 
140
147
  class TestEndpoint
@@ -145,6 +152,7 @@ class TestEndpoint
145
152
  @metrics = Queue.new
146
153
  @startups = Queue.new
147
154
  @port = port
155
+ @all_metrics = []
148
156
  end
149
157
 
150
158
  def listen
@@ -182,36 +190,33 @@ class TestEndpoint
182
190
  end
183
191
 
184
192
  def has_one_creation_for_entity_resource
185
- 10.times do
186
- begin
187
- many = metrics.pop(true)
188
- metric = many["measurements"].find{|m| m["series"] == "Entity" }
189
- return metric if metric
190
- rescue ThreadError
191
- sleep(1)
192
- end
193
- end
194
- false
193
+ look_for_series("Entity")
195
194
  end
196
195
 
197
196
  def has_one_purchase
198
- 10.times do
199
- begin
200
- many = metrics.pop(true)
201
- metric = many["measurements"].find{|m| m["series"] == "purchases" }
202
- return metric if metric
203
- rescue ThreadError
204
- sleep(1)
205
- end
206
- end
207
- false
197
+ look_for_series("purchases")
208
198
  end
209
199
 
210
200
  def has_one_controller_metric
201
+ look_for_series("request")
202
+ end
203
+
204
+ def has_one_sidekiq_metric
205
+ look_for_series("sidekiq_jobs")
206
+ end
207
+
208
+ private
209
+
210
+ def look_for(&search)
211
211
  10.times do
212
212
  begin
213
+ metric = @all_metrics.find(&search)
214
+ return metric if metric
215
+
213
216
  many = metrics.pop(true)
214
- metric = many["measurements"].find{|m| m["series"] == "request" }
217
+ @all_metrics.concat(many["measurements"])
218
+
219
+ metric = @all_metrics.find(&search)
215
220
  return metric if metric
216
221
  rescue ThreadError
217
222
  sleep(1)
@@ -220,5 +225,8 @@ class TestEndpoint
220
225
  false
221
226
  end
222
227
 
223
- end
228
+ def look_for_series(series)
229
+ look_for{|m| m["series"] == series }
230
+ end
224
231
 
232
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chillout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.6
4
+ version: 0.8.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Lomnicki
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-07-03 00:00:00.000000000 Z
14
+ date: 2017-07-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: multi_json
@@ -388,6 +388,7 @@ files:
388
388
  - test/support/rails_4_1_16/app/controllers/entities_controller.rb
389
389
  - test/support/rails_4_1_16/app/controllers/purchases_controller.rb
390
390
  - test/support/rails_4_1_16/app/helpers/application_helper.rb
391
+ - test/support/rails_4_1_16/app/jobs/create_entity_job.rb
391
392
  - test/support/rails_4_1_16/app/models/.keep
392
393
  - test/support/rails_4_1_16/app/models/concerns/.keep
393
394
  - test/support/rails_4_1_16/app/models/entity.rb
@@ -800,6 +801,7 @@ test_files:
800
801
  - test/support/rails_4_1_16/app/controllers/entities_controller.rb
801
802
  - test/support/rails_4_1_16/app/controllers/purchases_controller.rb
802
803
  - test/support/rails_4_1_16/app/helpers/application_helper.rb
804
+ - test/support/rails_4_1_16/app/jobs/create_entity_job.rb
803
805
  - test/support/rails_4_1_16/app/models/.keep
804
806
  - test/support/rails_4_1_16/app/models/concerns/.keep
805
807
  - test/support/rails_4_1_16/app/models/entity.rb