yabeda-sidekiq 0.1.2 → 0.6.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: 6a03934644e2fc09d12cd15f68fb2f91e919ae6012a56a858468717b0deb3f0b
4
- data.tar.gz: 2a8224f49b33cd184f92ebf3ceec12fe16617177ef0446317b97bc3c54de0639
3
+ metadata.gz: 63dde1ca9f23aca58fe86e630c4cbaa48426ad3621fee5bc0b6fa5dc804d0a3d
4
+ data.tar.gz: 67ab69e2ba72d772ed577636edb12f28b06ab829c9e31ba3e18fe74f711c01f7
5
5
  SHA512:
6
- metadata.gz: c3ef7f9d8a00b01aecd0b76cccd73c48a99d066226c2ab944f340739dadf4689f8efeacdebbb9be2af5327ab93d0cc78a9f17664ef83973b46950515d4f23edc
7
- data.tar.gz: 19e190aa609c601c76f5b3e19c282dddf8bbfc993837f0d1f53592c11058918579209eb5a1f41d5d25c908cc8c5c73568cd7a33d35de1564811e2ca0a3d58e60
6
+ metadata.gz: c03295246b723eb55b6b93fa3bf0068c8306aa01ddd11915d228dba4c8d70640b961d2f63cb8448d88c130f98d3560ab6fca0cf01fb94fef00751ddf6390ea39
7
+ data.tar.gz: e010471f073e8becf98515531e2c532025cdaac64fac393fdad485074b0705964ed60e564d6b523da50b5421be14b6a3dd6838d1f228b535be5d9926d3218cee
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
+
8
+ ## 0.6.0 - 2020-07-15
9
+
10
+ ### Added
11
+
12
+ - Ability to override or add tags for every job via `yabeda_tags` method. @Envek
13
+
14
+ ## 0.5.0 - 2020-02-20
15
+
16
+ ### Added
17
+
18
+ - New `sidekiq_job_latency` histogram to track latency statistics of different job classes. [#9](https://github.com/yabeda-rb/yabeda-sidekiq/pull/9) by [@asusikov]
19
+
20
+ ### Changed
21
+
22
+ - **BREAKING CHANGE!** Renamed `sidekiq_jobs_latency` gauge to `sidekiq_queue_latency` to better describe its purpose and differentiate with the new histogram. [#9](https://github.com/yabeda-rb/yabeda-sidekiq/pull/9) by [@asusikov]
23
+
24
+ ## 0.2.0 - 2020-01-14
25
+
26
+ ### Changed
27
+
28
+ - Added `tags` option to metric declarations for compatibility with yabeda and yabeda-prometheus 0.2. @Envek
29
+
30
+ ## 0.1.4 - 2019-10-07
31
+
32
+ ### Added
33
+
34
+ - Require of core yabeda gem [#4](https://github.com/yabeda-rb/yabeda-sidekiq/pull/4). [@dsalahutdinov]
35
+
36
+ ## 0.1.3 - 2018-10-25
37
+
38
+ ### Fixed
39
+
40
+ - Require of core yabeda gem [#1](https://github.com/yabeda-rb/yabeda-sidekiq/issues/1). @Envek
41
+
42
+ ## 0.1.2 - 2018-10-17
43
+
44
+ ### Changed
45
+
46
+ - Renamed evil-metrics-sidekiq gem to yabeda-sidekiq. @Envek
47
+
48
+ ## 0.1.1 - 2018-10-05
49
+
50
+ ### Changed
51
+
52
+ - Automatic add client and server middlewares to Sidekiq. @Envek
53
+
54
+ ## 0.1.0 - 2018-10-03
55
+
56
+ - Initial release of evil-metrics-sidekiq gem. @Envek
57
+
58
+ [@dsalahutdinov]: https://github.com/dsalahutdinov "Salahutdinov Dmitry"
59
+ [@asusikov]: https://github.com/asusikov "Alexander Susikov"
data/README.md CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  Built-in metrics for [Sidekiq] monitoring out of the box! Part of the [yabeda] suite.
4
4
 
5
+ Sample Grafana dashboard ID: [11667](https://grafana.com/grafana/dashboards/11667)
6
+
5
7
  ## Installation
6
8
 
7
9
  ```ruby
8
- gem 'yabeda-rails'
10
+ gem 'yabeda-sidekiq'
9
11
  # Then add monitoring system adapter, e.g.:
10
12
  # gem 'yabeda-prometheus'
11
13
  ```
@@ -31,6 +33,8 @@ end
31
33
  - Number of jobs have been finished successfully: `sidekiq_jobs_success_total` (segmented by queue and class name)
32
34
  - Number of jobs have been failed: `sidekiq_jobs_failed_total` (segmented by queue and class name)
33
35
  - Time of job run: `sidekiq_job_runtime` (seconds per job execution, segmented by queue and class name)
36
+ - Time of the queue latency `sidekiq_queue_latency` (the difference in seconds since the oldest job in the queue was enqueued)
37
+ - Time of the job latency `sidekiq_job_latency` (the difference in seconds since the enqueuing until running job)
34
38
  - Number of jobs in queues: `sidekiq_jobs_waiting_count` (segmented by queue)
35
39
  - Number of scheduled jobs:`sidekiq_jobs_scheduled_count`
36
40
  - Number of jobs in retry set: `sidekiq_jobs_retry_count`
@@ -38,6 +42,29 @@ end
38
42
  - Active workers count: `sidekiq_active_processes`
39
43
  - Active processes count: `sidekiq_active_workers_count`
40
44
 
45
+ ## Custom tags
46
+
47
+ You can add additional tags to these metrics by declaring `yabeda_tags` method in your worker.
48
+
49
+ ```ruby
50
+ # This block is optional but some adapters (like Prometheus) requires that all tags should be declared in advance
51
+ Yabeda.configure do
52
+ default_tag :importance, nil
53
+ end
54
+
55
+ class MyWorker
56
+ include Sidekiq::Worker
57
+
58
+ def yabeda_tags(*params) # This method will be called first, before +perform+
59
+ { importance: extract_importance(params) }
60
+ end
61
+
62
+ def perform(*params)
63
+ # Your logic here
64
+ end
65
+ end
66
+ ```
67
+
41
68
  # Roadmap (TODO or Help wanted)
42
69
 
43
70
  - Implement optional segmentation of retry/schedule/dead sets
@@ -3,6 +3,7 @@
3
3
  require "sidekiq"
4
4
  require "sidekiq/api"
5
5
 
6
+ require "yabeda"
6
7
  require "yabeda/sidekiq/version"
7
8
  require "yabeda/sidekiq/client_middleware"
8
9
  require "yabeda/sidekiq/server_middleware"
@@ -17,20 +18,29 @@ module Yabeda
17
18
  Yabeda.configure do
18
19
  group :sidekiq
19
20
 
20
- counter :jobs_enqueued_total, comment: "A counter of the total number of jobs sidekiq enqueued."
21
+ counter :jobs_enqueued_total, tags: %i[queue worker], comment: "A counter of the total number of jobs sidekiq enqueued."
21
22
 
22
23
  next unless ::Sidekiq.server?
23
24
 
24
- counter :jobs_executed_total, comment: "A counter of the total number of jobs sidekiq executed."
25
- counter :jobs_success_total, comment: "A counter of the total number of jobs successfully processed by sidekiq."
26
- counter :jobs_failed_total, comment: "A counter of the total number of jobs failed in sidekiq."
27
- gauge :jobs_waiting_count, comment: "The number of jobs waiting to process in sidekiq."
28
- gauge :active_workers_count, comment: "The number of currently running machines with sidekiq workers."
29
- gauge :jobs_scheduled_count, comment: "The number of jobs scheduled for later execution."
30
- gauge :jobs_retry_count, comment: "The number of failed jobs waiting to be retried"
31
- gauge :jobs_dead_count, comment: "The number of jobs exceeded their retry count."
32
- gauge :active_processes, comment: "The number of active Sidekiq worker processes."
33
- histogram :job_runtime, unit: :seconds, per: :job, comment: "A histogram of the job execution time.",
25
+ counter :jobs_executed_total, tags: %i[queue worker], comment: "A counter of the total number of jobs sidekiq executed."
26
+ counter :jobs_success_total, tags: %i[queue worker], comment: "A counter of the total number of jobs successfully processed by sidekiq."
27
+ counter :jobs_failed_total, tags: %i[queue worker], comment: "A counter of the total number of jobs failed in sidekiq."
28
+
29
+ gauge :jobs_waiting_count, tags: %i[queue], comment: "The number of jobs waiting to process in sidekiq."
30
+ gauge :active_workers_count, tags: [], comment: "The number of currently running machines with sidekiq workers."
31
+ gauge :jobs_scheduled_count, tags: [], comment: "The number of jobs scheduled for later execution."
32
+ gauge :jobs_retry_count, tags: [], comment: "The number of failed jobs waiting to be retried"
33
+ gauge :jobs_dead_count, tags: [], comment: "The number of jobs exceeded their retry count."
34
+ gauge :active_processes, tags: [], comment: "The number of active Sidekiq worker processes."
35
+ gauge :queue_latency, tags: %i[queue], comment: "The queue latency, the difference in seconds since the oldest job in the queue was enqueued"
36
+
37
+ histogram :job_latency, comment: "The job latency, the difference in seconds between enqueued and running time",
38
+ unit: :seconds, per: :job,
39
+ tags: %i[queue worker],
40
+ buckets: LONG_RUNNING_JOB_RUNTIME_BUCKETS
41
+ histogram :job_runtime, comment: "A histogram of the job execution time.",
42
+ unit: :seconds, per: :job,
43
+ tags: %i[queue worker],
34
44
  buckets: LONG_RUNNING_JOB_RUNTIME_BUCKETS
35
45
 
36
46
  collect do
@@ -45,6 +55,10 @@ module Yabeda
45
55
  sidekiq_active_processes.set({}, stats.processes_size)
46
56
  sidekiq_jobs_retry_count.set({}, stats.retry_size)
47
57
 
58
+ ::Sidekiq::Queue.all.each do |queue|
59
+ sidekiq_queue_latency.set({ queue: queue.name }, queue.latency)
60
+ end
61
+
48
62
  # That is quite slow if your retry set is large
49
63
  # I don't want to enable it by default
50
64
  # retries_by_queues =
@@ -74,7 +88,7 @@ module Yabeda
74
88
 
75
89
  class << self
76
90
  def labelize(worker, job, queue)
77
- { queue: queue, worker: worker_class(worker, job) }
91
+ { queue: queue, worker: worker_class(worker, job), **custom_tags(worker, job).to_h }
78
92
  end
79
93
 
80
94
  def worker_class(worker, job)
@@ -83,6 +97,12 @@ module Yabeda
83
97
  end
84
98
  (worker.is_a?(String) ? worker : worker.class).to_s
85
99
  end
100
+
101
+ def custom_tags(worker, job)
102
+ return {} unless worker.respond_to?(:yabeda_tags)
103
+
104
+ worker.method(:yabeda_tags).arity.zero? ? worker.yabeda_tags : worker.yabeda_tags(*job["args"])
105
+ end
86
106
  end
87
107
  end
88
108
  end
@@ -8,6 +8,8 @@ module Yabeda
8
8
  labels = Yabeda::Sidekiq.labelize(worker, job, queue)
9
9
  start = Time.now
10
10
  begin
11
+ job_instance = ::Sidekiq::Job.new(job)
12
+ Yabeda.sidekiq_job_latency.measure(labels, job_instance.latency)
11
13
  yield
12
14
  Yabeda.sidekiq_jobs_success_total.increment(labels)
13
15
  rescue Exception # rubocop: disable Lint/RescueException
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Yabeda
4
4
  module Sidekiq
5
- VERSION = "0.1.2"
5
+ VERSION = "0.6.0"
6
6
  end
7
7
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_dependency "yabeda"
25
+ spec.add_dependency "yabeda", "~> 0.2"
26
26
  spec.add_dependency "sidekiq"
27
27
 
28
28
  spec.add_development_dependency "bundler", "~> 1.16"
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yabeda-sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Novikov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-17 00:00:00.000000000 Z
11
+ date: 2020-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yabeda
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sidekiq
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +92,7 @@ files:
92
92
  - ".rspec"
93
93
  - ".rubocop.yml"
94
94
  - ".travis.yml"
95
+ - CHANGELOG.md
95
96
  - Gemfile
96
97
  - LICENSE.txt
97
98
  - README.md
@@ -107,7 +108,7 @@ homepage: https://github.com/yabeda-rb/yabeda-sidekiq
107
108
  licenses:
108
109
  - MIT
109
110
  metadata: {}
110
- post_install_message:
111
+ post_install_message:
111
112
  rdoc_options: []
112
113
  require_paths:
113
114
  - lib
@@ -122,9 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
123
  - !ruby/object:Gem::Version
123
124
  version: '0'
124
125
  requirements: []
125
- rubyforge_project:
126
- rubygems_version: 2.7.6
127
- signing_key:
126
+ rubygems_version: 3.1.2
127
+ signing_key:
128
128
  specification_version: 4
129
129
  summary: Extensible Prometheus exporter for monitoring your Sidekiq
130
130
  test_files: []