sidekiq-worker_stats 0.0.6 → 0.0.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 +4 -4
- data/README.md +1 -1
- data/lib/sidekiq/worker_stats/configuration.rb +5 -1
- data/lib/sidekiq/worker_stats/stats.rb +25 -0
- data/lib/sidekiq/worker_stats/version.rb +1 -1
- data/test/worker_stats/test_middleware.rb +35 -12
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2dfa84049939f2b9e106c0c952210cc8ca4f775
|
4
|
+
data.tar.gz: 5247578e6a5277f95954a64b002d8e1d9f13b4ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 755fab1f88cbd2e373f706644e9b8f977fbec17804311ccf6f0baa9787feab1f81922392a8fd4fd1e78bc723f6d29a319da2b85494d588a7b4dce8ef9f7e53d3
|
7
|
+
data.tar.gz: 0f513ff1b469ad9e7d948a6e79b0485e9b7dc78f6601a5d310505ece41982bd706c978a2c81a19821e481ef0f22f9d46aaefd838ec9153e0a3474fc524b95742
|
data/README.md
CHANGED
@@ -50,5 +50,5 @@ All configurations you can include on `sidekiq_options`
|
|
50
50
|
|---------------|------|---------|-------------|
|
51
51
|
| `worker_stats_enabled` | boolean | false | Whether `worker_stats` should be enabled for this worker or not |
|
52
52
|
| `worker_stats_mem_sleep ` | number | 5 | How many seconds to wait between each memory measurement |
|
53
|
-
|
53
|
+
| `worker_stats_max_samples ` | number | 1000 | How many samples to keep for a given worker, it will delete the oldest samples first |
|
54
54
|
|
@@ -3,6 +3,7 @@ module Sidekiq
|
|
3
3
|
class Configuration
|
4
4
|
DEFAULT_MEM_SLEEP = 5.freeze
|
5
5
|
DEFAULT_ENABLED = false.freeze
|
6
|
+
DEFAULT_MAX_SAMPLES = 1000
|
6
7
|
|
7
8
|
attr_reader :klass
|
8
9
|
|
@@ -17,7 +18,10 @@ module Sidekiq
|
|
17
18
|
def enabled
|
18
19
|
@klass.get_sidekiq_options['worker_stats_enabled'] || Sidekiq::WorkerStats::Configuration::DEFAULT_ENABLED
|
19
20
|
end
|
21
|
+
|
22
|
+
def max_samples
|
23
|
+
@klass.get_sidekiq_options['worker_stats_max_samples'] || Sidekiq::WorkerStats::Configuration::DEFAULT_MAX_SAMPLES
|
24
|
+
end
|
20
25
|
end
|
21
26
|
end
|
22
27
|
end
|
23
|
-
|
@@ -65,6 +65,8 @@ module Sidekiq
|
|
65
65
|
Sidekiq.redis do |redis|
|
66
66
|
redis.hset ::Sidekiq::WorkerStats::REDIS_HASH, worker_key, JSON.generate(data)
|
67
67
|
end
|
68
|
+
|
69
|
+
remove_old_samples
|
68
70
|
end
|
69
71
|
|
70
72
|
private
|
@@ -83,6 +85,29 @@ module Sidekiq
|
|
83
85
|
def current_memory
|
84
86
|
`awk '{ print $2 }' /proc/#{@pid}/statm`.strip.to_i * @page_size
|
85
87
|
end
|
88
|
+
|
89
|
+
# Remove old samples if number of samples > @config.max_samples
|
90
|
+
def remove_old_samples
|
91
|
+
keys = nil
|
92
|
+
Sidekiq.redis do |redis|
|
93
|
+
keys = redis.hkeys ::Sidekiq::WorkerStats::REDIS_HASH
|
94
|
+
end
|
95
|
+
|
96
|
+
return if keys.length <= @config.max_samples
|
97
|
+
|
98
|
+
keys = keys.map { |k| k.split(':') if k.start_with?(@klass.to_s) }.compact
|
99
|
+
|
100
|
+
return if keys.length <= @config.max_samples
|
101
|
+
|
102
|
+
keys.sort! { |x, y| x[1] <=> y[1] }
|
103
|
+
keys = keys.map { |k| k.join(':') }
|
104
|
+
|
105
|
+
Sidekiq.redis do |redis|
|
106
|
+
keys[0..keys.length - @config.max_samples - 1].each do |k|
|
107
|
+
redis.hdel ::Sidekiq::WorkerStats::REDIS_HASH, k
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
86
111
|
end
|
87
112
|
end
|
88
113
|
end
|
@@ -7,15 +7,15 @@ require 'sidekiq/worker_stats'
|
|
7
7
|
class BasicWorker
|
8
8
|
include Sidekiq::Worker
|
9
9
|
|
10
|
-
sidekiq_options(
|
10
|
+
sidekiq_options(
|
11
11
|
worker_stats_enabled: true,
|
12
12
|
worker_stats_mem_sleep: 1
|
13
|
-
|
13
|
+
)
|
14
14
|
|
15
|
-
def perform(
|
15
|
+
def perform(_arg1)
|
16
16
|
# Let's use some memory
|
17
17
|
a = []
|
18
|
-
|
18
|
+
(1..5_000_000).each do |i|
|
19
19
|
a << i.to_s * 10
|
20
20
|
end
|
21
21
|
end
|
@@ -24,9 +24,9 @@ end
|
|
24
24
|
class NoStatsWorker
|
25
25
|
include Sidekiq::Worker
|
26
26
|
|
27
|
-
sidekiq_options(
|
27
|
+
sidekiq_options(
|
28
28
|
worker_stats_enabled: false
|
29
|
-
|
29
|
+
)
|
30
30
|
|
31
31
|
def perform
|
32
32
|
end
|
@@ -35,13 +35,26 @@ end
|
|
35
35
|
class ErrorWorker
|
36
36
|
include Sidekiq::Worker
|
37
37
|
|
38
|
-
sidekiq_options(
|
38
|
+
sidekiq_options(
|
39
39
|
worker_stats_enabled: true,
|
40
40
|
worker_stats_mem_sleep: 1
|
41
|
-
|
41
|
+
)
|
42
|
+
|
43
|
+
def perform
|
44
|
+
raise StandardError.new('Error')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Max2Worker
|
49
|
+
include Sidekiq::Worker
|
50
|
+
|
51
|
+
sidekiq_options(
|
52
|
+
worker_stats_enabled: true,
|
53
|
+
worker_stats_mem_sleep: 1,
|
54
|
+
worker_stats_max_samples: 2
|
55
|
+
)
|
42
56
|
|
43
57
|
def perform
|
44
|
-
raise StandardError.new("Error")
|
45
58
|
end
|
46
59
|
end
|
47
60
|
|
@@ -54,7 +67,7 @@ class TestMiddleware < Minitest::Test
|
|
54
67
|
|
55
68
|
def test_basic_worker_stats_are_saved
|
56
69
|
Sidekiq::Testing.inline! do
|
57
|
-
BasicWorker.perform_async(
|
70
|
+
BasicWorker.perform_async('teste')
|
58
71
|
end
|
59
72
|
end
|
60
73
|
|
@@ -71,9 +84,19 @@ class TestMiddleware < Minitest::Test
|
|
71
84
|
end
|
72
85
|
end
|
73
86
|
end
|
74
|
-
|
87
|
+
|
88
|
+
def test_max_samples
|
89
|
+
Sidekiq::Testing.inline! do
|
90
|
+
Max2Worker.perform_async
|
91
|
+
Max2Worker.perform_async
|
92
|
+
Max2Worker.perform_async
|
93
|
+
Max2Worker.perform_async
|
94
|
+
end
|
95
|
+
|
96
|
+
# Should only mantain record for 2 elements
|
97
|
+
end
|
98
|
+
|
75
99
|
def test_that_middleware_reports_end
|
76
100
|
skip 'todo'
|
77
101
|
end
|
78
|
-
|
79
102
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-worker_stats
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Jesus
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|