sidekiq-prometheus-exporter 0.1.7 → 0.1.8
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/.travis.yml +6 -3
- data/README.md +50 -21
- data/gemfiles/sidekiq_3.3.1.gemfile.lock +1 -1
- data/gemfiles/sidekiq_3.x.gemfile.lock +1 -1
- data/gemfiles/sidekiq_4.x.gemfile.lock +1 -1
- data/gemfiles/sidekiq_5.x.gemfile.lock +1 -1
- data/lib/sidekiq/prometheus/exporter.rb +24 -22
- data/lib/sidekiq/prometheus/exporter/cron.rb +26 -0
- data/lib/sidekiq/prometheus/exporter/exporters.rb +39 -0
- data/lib/sidekiq/prometheus/exporter/standard.rb +49 -0
- data/lib/sidekiq/prometheus/exporter/templates/cron.erb +3 -0
- data/lib/sidekiq/prometheus/exporter/templates/{metrics.erb → standard.erb} +0 -0
- data/lib/sidekiq/prometheus/exporter/version.rb +1 -1
- metadata +7 -4
- data/lib/sidekiq/prometheus/exporter/metrics.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 706d6acff0ad51c9b9ef02fe334dd52d0dd07b1c
|
4
|
+
data.tar.gz: abaaa090c2f50dd8f7be85d42c3281f9613a23de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09667bd3b4668aee6453110e5bc3275302294bea3cca1e604afa23aaf3f607d9e96a4122b06809a79bdee7011e74abb070341b4072c07fba8cfe5dcc8ddd6b74'
|
7
|
+
data.tar.gz: d91010ae4fd338f8f0e2649e1533ca998f2778bf7e3a4a7506cd698e2ce4cf10a7e5d3941c6fbb76482dd3f7cf1da8fe9e5b1bbcc53e142bcac62522f09566b7
|
data/.travis.yml
CHANGED
@@ -2,9 +2,10 @@ sudo: false
|
|
2
2
|
language: ruby
|
3
3
|
rvm:
|
4
4
|
- 2.2.10
|
5
|
-
- 2.3.
|
6
|
-
- 2.4.
|
7
|
-
- 2.5.
|
5
|
+
- 2.3.8
|
6
|
+
- 2.4.6
|
7
|
+
- 2.5.5
|
8
|
+
- 2.6.2
|
8
9
|
gemfile:
|
9
10
|
- gemfiles/sidekiq_3.3.1.gemfile
|
10
11
|
- gemfiles/sidekiq_3.x.gemfile
|
@@ -13,6 +14,8 @@ gemfile:
|
|
13
14
|
addons:
|
14
15
|
code_climate:
|
15
16
|
repo_token: $CODECLIMATE_REPO_TOKEN
|
17
|
+
notifications:
|
18
|
+
email: false
|
16
19
|
|
17
20
|
cache: bundler
|
18
21
|
before_install: gem install bundler -v 1.16.5
|
data/README.md
CHANGED
@@ -14,22 +14,28 @@ Open [dashboard example file](/examples/sidekiq.json), then open `https://<your
|
|
14
14
|
|
15
15
|
# Available metrics
|
16
16
|
|
17
|
-
(starting Sidekiq `v3.3.1`)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
17
|
+
*(starting Sidekiq `v3.3.1`)*
|
18
|
+
|
19
|
+
### Standard
|
20
|
+
|
21
|
+
| Name | Type | Description |
|
22
|
+
|-------------------------------------------|---------|-------------------------|
|
23
|
+
| sidekiq_processed_jobs_total | counter | The total number of processed jobs
|
24
|
+
| sidekiq_failed_jobs_total | counter | The total number of failed jobs
|
25
|
+
| sidekiq_busy_workers | gauge | The number of workers performing the job
|
26
|
+
| sidekiq_enqueued_jobs | gauge | The number of enqueued jobs
|
27
|
+
| sidekiq_scheduled_jobs | gauge | The number of jobs scheduled for a future execution
|
28
|
+
| sidekiq_retry_jobs | gauge | The number of jobs scheduled for the next try
|
29
|
+
| sidekiq_dead_jobs | gauge | The number of jobs being dead
|
30
|
+
| sidekiq_queue_latency_seconds | gauge | The amount of seconds between oldest job being pushed to the queue and current time (labels: `name`)
|
31
|
+
| sidekiq_queue_max_processing_time_seconds | gauge | The amount of seconds between oldest job of the queue being executed and current time (labels: `name`)
|
32
|
+
| sidekiq_queue_enqueued_jobs | gauge | The number of enqueued jobs in the queue (labels: `name`)
|
33
|
+
|
34
|
+
### [Cron](https://github.com/ondrejbartas/sidekiq-cron)
|
35
|
+
|
36
|
+
| Name | Type | Description |
|
37
|
+
|-------------------------------------------|---------|-------------------------|
|
38
|
+
| sidekiq_cron_jobs | gauge | The number of cron jobs
|
33
39
|
|
34
40
|
# Installation
|
35
41
|
|
@@ -67,9 +73,9 @@ end
|
|
67
73
|
run Sidekiq::Prometheus::Exporter.to_app
|
68
74
|
```
|
69
75
|
|
70
|
-
|
76
|
+
Use your favorite server to start it up, like this
|
71
77
|
|
72
|
-
```
|
78
|
+
```bash
|
73
79
|
$ bundle exec rackup -p9292 -o0.0.0.0
|
74
80
|
```
|
75
81
|
|
@@ -77,9 +83,9 @@ and then `curl https://0.0.0.0:9292/metrics`
|
|
77
83
|
|
78
84
|
# Sidekiq Web (extream)
|
79
85
|
|
80
|
-
If you are
|
81
|
-
you have it inside your private network or only Prometheus scraper will have
|
82
|
-
|
86
|
+
If you are ok with metrics being exposed via Sidekiq web dashboard because
|
87
|
+
you have it inside your private network or only Prometheus scraper will have access
|
88
|
+
to a machine/port/etc, then add a few lines into your web `config.ru`
|
83
89
|
|
84
90
|
```ruby
|
85
91
|
require 'sidekiq/web'
|
@@ -90,10 +96,33 @@ Sidekiq::Web.register(Sidekiq::Prometheus::Exporter)
|
|
90
96
|
|
91
97
|
and then `curl https://<your-sidekiq-web-uri>/metrics`
|
92
98
|
|
99
|
+
# Sidekiq Contribs
|
100
|
+
|
101
|
+
By default we try to detect as many as possible [sidekiq contribs](https://github.com/mperham/sidekiq/wiki/Related-Projects)
|
102
|
+
and add their metrics to the output.
|
103
|
+
But you can change this behaviour by configuring exporters setting
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
require 'sidekiq/prometheus/exporter'
|
107
|
+
|
108
|
+
# Keep the default auto-detect behaviour
|
109
|
+
Sidekiq::Prometheus::Exporter.configure do |config|
|
110
|
+
config.exporters = :auto_detect
|
111
|
+
end
|
112
|
+
|
113
|
+
# Keep only standard (by default) and cron metrics
|
114
|
+
Sidekiq::Prometheus::Exporter.configure do |config|
|
115
|
+
config.exporters = %i(cron)
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
93
119
|
## Contributing
|
94
120
|
|
95
121
|
Bug reports and pull requests to support earlier versions of Sidekiq are welcome on GitHub at https://github.com/Strech/sidekiq-prometheus-exporter/issues.
|
96
122
|
|
123
|
+
If you are missing your favourite Sidekiq contrib and want to contribute,
|
124
|
+
please make sure that you are following naming conventions from [Prometheus](https://prometheus.io/docs/practices/naming/).
|
125
|
+
|
97
126
|
# License
|
98
127
|
|
99
128
|
Please see [LICENSE](https://github.com/mperham/sidekiq/blob/master/LICENSE) for licensing details.
|
@@ -1,41 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'erb'
|
4
3
|
require 'sidekiq/prometheus/exporter/version'
|
5
|
-
require 'sidekiq/prometheus/exporter/
|
4
|
+
require 'sidekiq/prometheus/exporter/exporters'
|
6
5
|
|
7
6
|
module Sidekiq
|
8
7
|
module Prometheus
|
9
8
|
# Expose Prometheus metrics via Rack application or Sidekiq::Web application
|
10
9
|
module Exporter
|
11
|
-
|
12
|
-
NOT_FOUND_TEXT = 'Not Found'.freeze
|
10
|
+
REQUEST_VERB = 'GET'.freeze
|
13
11
|
REQUEST_METHOD = 'REQUEST_METHOD'.freeze
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
TEMPLATE = ERB.new(File.read(File.expand_path('exporter/templates/metrics.erb', __dir__)))
|
12
|
+
NOT_FOUND_TEXT = 'Not Found'.freeze
|
13
|
+
MOUNT_PATH = '/metrics'.freeze
|
14
|
+
HEADERS = {'Content-Type' => 'text/plain; version=0.0.4', 'Cache-Control' => 'no-cache'}.freeze
|
15
|
+
EXPORTERS = Exporters.new
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
class << self
|
18
|
+
def configure
|
19
|
+
yield(EXPORTERS)
|
23
20
|
end
|
24
|
-
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
run Sidekiq::Prometheus::Exporter
|
22
|
+
def registered(app)
|
23
|
+
app.get(MOUNT_PATH) do
|
24
|
+
Sidekiq::Prometheus::Exporter.call(REQUEST_METHOD => REQUEST_VERB)
|
30
25
|
end
|
31
26
|
end
|
32
|
-
end
|
33
27
|
|
34
|
-
|
35
|
-
|
28
|
+
def to_app
|
29
|
+
Rack::Builder.app do
|
30
|
+
map(MOUNT_PATH) do
|
31
|
+
run Sidekiq::Prometheus::Exporter
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
36
|
+
def call(env)
|
37
|
+
return [404, HEADERS, [NOT_FOUND_TEXT]] if env[REQUEST_METHOD] != REQUEST_VERB
|
38
|
+
|
39
|
+
[200, HEADERS, [EXPORTERS.to_s]]
|
40
|
+
end
|
39
41
|
end
|
40
42
|
end
|
41
43
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
# Exporter for the https://github.com/ondrejbartas/sidekiq-cron
|
6
|
+
module Sidekiq
|
7
|
+
module Prometheus
|
8
|
+
module Exporter
|
9
|
+
class Cron
|
10
|
+
TEMPLATE = ERB.new(File.read(File.expand_path('templates/cron.erb', __dir__)))
|
11
|
+
|
12
|
+
def self.available?
|
13
|
+
defined?(Sidekiq::Cron)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@cron_jobs_count = Sidekiq::Cron::Job.count
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
TEMPLATE.result(binding).chomp!
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sidekiq/prometheus/exporter/standard'
|
4
|
+
require 'sidekiq/prometheus/exporter/cron'
|
5
|
+
|
6
|
+
module Sidekiq
|
7
|
+
module Prometheus
|
8
|
+
module Exporter
|
9
|
+
class Exporters
|
10
|
+
AVAILABLE_EXPORTERS = {
|
11
|
+
standard: Sidekiq::Prometheus::Exporter::Standard,
|
12
|
+
cron: Sidekiq::Prometheus::Exporter::Cron
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@enabled = AVAILABLE_EXPORTERS.values.select(&:available?)
|
17
|
+
end
|
18
|
+
|
19
|
+
def exporters=(value)
|
20
|
+
value = Array(value) unless value.respond_to?(:select)
|
21
|
+
potential = AVAILABLE_EXPORTERS
|
22
|
+
|
23
|
+
unless value.include?(:auto_detect)
|
24
|
+
potential = potential.select { |name, _| value.include?(name) }
|
25
|
+
end
|
26
|
+
|
27
|
+
@enabled =
|
28
|
+
%i(standard).concat(potential.keys).uniq
|
29
|
+
.map { |name| AVAILABLE_EXPORTERS.fetch(name) }
|
30
|
+
.select(&:available?)
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
@enabled.map { |exporter| exporter.new.to_s }.join("\n".freeze)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
require 'sidekiq/api'
|
5
|
+
|
6
|
+
module Sidekiq
|
7
|
+
module Prometheus
|
8
|
+
module Exporter
|
9
|
+
class Standard
|
10
|
+
TEMPLATE = ERB.new(File.read(File.expand_path('templates/standard.erb', __dir__)))
|
11
|
+
|
12
|
+
QueueStats = Struct.new(:name, :size, :latency)
|
13
|
+
|
14
|
+
def self.available?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@overview_stats = Sidekiq::Stats.new
|
20
|
+
@queues_stats = queues_stats
|
21
|
+
@max_processing_times = max_processing_times
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
TEMPLATE.result(binding).chomp!
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def queues_stats
|
31
|
+
Sidekiq::Queue.all.map do |queue|
|
32
|
+
QueueStats.new(queue.name, queue.size, queue.latency)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def max_processing_times
|
37
|
+
now = Time.now.to_i
|
38
|
+
Sidekiq::Workers.new
|
39
|
+
.map { |_, _, execution| execution }
|
40
|
+
.group_by { |execution| execution['queue'] }
|
41
|
+
.each_with_object({}) do |(queue, executions), memo|
|
42
|
+
oldest_execution = executions.min_by { |execution| execution['run_at'] }
|
43
|
+
memo[queue] = now - oldest_execution['run_at']
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-prometheus-exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Fedorov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -201,8 +201,11 @@ files:
|
|
201
201
|
- gemfiles/sidekiq_5.x.gemfile
|
202
202
|
- gemfiles/sidekiq_5.x.gemfile.lock
|
203
203
|
- lib/sidekiq/prometheus/exporter.rb
|
204
|
-
- lib/sidekiq/prometheus/exporter/
|
205
|
-
- lib/sidekiq/prometheus/exporter/
|
204
|
+
- lib/sidekiq/prometheus/exporter/cron.rb
|
205
|
+
- lib/sidekiq/prometheus/exporter/exporters.rb
|
206
|
+
- lib/sidekiq/prometheus/exporter/standard.rb
|
207
|
+
- lib/sidekiq/prometheus/exporter/templates/cron.erb
|
208
|
+
- lib/sidekiq/prometheus/exporter/templates/standard.erb
|
206
209
|
- lib/sidekiq/prometheus/exporter/version.rb
|
207
210
|
- sidekiq-prometheus-exporter.gemspec
|
208
211
|
homepage: https://github.com/Strech/sidekiq-prometheus-exporter
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'sidekiq/api'
|
4
|
-
|
5
|
-
module Sidekiq
|
6
|
-
module Prometheus
|
7
|
-
class Metrics
|
8
|
-
QueueStats = Struct.new(:name, :size, :latency)
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@overview_stats = Sidekiq::Stats.new
|
12
|
-
@queues_stats = queues_stats
|
13
|
-
@max_processing_times = max_processing_times
|
14
|
-
end
|
15
|
-
|
16
|
-
def __binding__
|
17
|
-
binding
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def queues_stats
|
23
|
-
Sidekiq::Queue.all.map do |queue|
|
24
|
-
QueueStats.new(queue.name, queue.size, queue.latency)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def max_processing_times
|
29
|
-
now = Time.now.to_i
|
30
|
-
Sidekiq::Workers.new
|
31
|
-
.map { |_, _, execution| execution }
|
32
|
-
.group_by { |execution| execution['queue'] }
|
33
|
-
.each_with_object({}) do |(queue, executions), memo|
|
34
|
-
oldest_execution = executions.min_by { |execution| execution['run_at'] }
|
35
|
-
memo[queue] = now - oldest_execution['run_at']
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|