sidekiq-prometheus-exporter 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|