prometheus_exporter 0.8.0 → 2.0.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 +4 -4
- data/.github/workflows/ci.yml +36 -25
- data/CHANGELOG +51 -26
- data/README.md +151 -52
- data/bin/prometheus_exporter +19 -6
- data/lib/prometheus_exporter/client.rb +13 -6
- data/lib/prometheus_exporter/instrumentation/active_record.rb +5 -5
- data/lib/prometheus_exporter/instrumentation/process.rb +1 -1
- data/lib/prometheus_exporter/instrumentation/puma.rb +12 -12
- data/lib/prometheus_exporter/instrumentation/resque.rb +7 -7
- data/lib/prometheus_exporter/instrumentation/sidekiq.rb +27 -7
- data/lib/prometheus_exporter/instrumentation/sidekiq_process.rb +58 -0
- data/lib/prometheus_exporter/instrumentation/sidekiq_queue.rb +27 -13
- data/lib/prometheus_exporter/instrumentation/sidekiq_stats.rb +43 -0
- data/lib/prometheus_exporter/instrumentation/unicorn.rb +4 -4
- data/lib/prometheus_exporter/instrumentation.rb +2 -0
- data/lib/prometheus_exporter/metric/base.rb +11 -9
- data/lib/prometheus_exporter/metric/gauge.rb +4 -0
- data/lib/prometheus_exporter/metric/histogram.rb +13 -1
- data/lib/prometheus_exporter/middleware.rb +8 -4
- data/lib/prometheus_exporter/server/collector.rb +2 -0
- data/lib/prometheus_exporter/server/delayed_job_collector.rb +17 -18
- data/lib/prometheus_exporter/server/puma_collector.rb +7 -7
- data/lib/prometheus_exporter/server/resque_collector.rb +6 -6
- data/lib/prometheus_exporter/server/runner.rb +11 -2
- data/lib/prometheus_exporter/server/sidekiq_collector.rb +1 -1
- data/lib/prometheus_exporter/server/sidekiq_process_collector.rb +46 -0
- data/lib/prometheus_exporter/server/sidekiq_queue_collector.rb +1 -1
- data/lib/prometheus_exporter/server/sidekiq_stats_collector.rb +46 -0
- data/lib/prometheus_exporter/server/unicorn_collector.rb +3 -3
- data/lib/prometheus_exporter/server/web_collector.rb +17 -17
- data/lib/prometheus_exporter/server/web_server.rb +6 -8
- data/lib/prometheus_exporter/server.rb +2 -0
- data/lib/prometheus_exporter/version.rb +1 -1
- data/prometheus_exporter.gemspec +1 -1
- metadata +10 -6
@@ -4,13 +4,13 @@ module PrometheusExporter::Server
|
|
4
4
|
class PumaCollector < TypeCollector
|
5
5
|
MAX_PUMA_METRIC_AGE = 30
|
6
6
|
PUMA_GAUGES = {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
workers: "Number of puma workers.",
|
8
|
+
booted_workers: "Number of puma workers booted.",
|
9
|
+
old_workers: "Number of old puma workers.",
|
10
|
+
running_threads: "Number of puma threads currently running.",
|
11
|
+
request_backlog: "Number of requests waiting to be processed by a puma thread.",
|
12
|
+
thread_pool_capacity: "Number of puma threads available at current scale.",
|
13
|
+
max_threads: "Number of puma threads at available at max scale.",
|
14
14
|
}
|
15
15
|
|
16
16
|
def initialize
|
@@ -4,12 +4,12 @@ module PrometheusExporter::Server
|
|
4
4
|
class ResqueCollector < TypeCollector
|
5
5
|
MAX_RESQUE_METRIC_AGE = 30
|
6
6
|
RESQUE_GAUGES = {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
processed_jobs: "Total number of processed Resque jobs.",
|
8
|
+
failed_jobs: "Total number of failed Resque jobs.",
|
9
|
+
pending_jobs: "Total number of pending Resque jobs.",
|
10
|
+
queues: "Total number of Resque queues.",
|
11
|
+
workers: "Total number of Resque workers running.",
|
12
|
+
working: "Total number of Resque workers working."
|
13
13
|
}
|
14
14
|
|
15
15
|
def initialize
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../client'
|
4
4
|
require_relative '../instrumentation/unicorn'
|
5
5
|
|
6
6
|
module PrometheusExporter::Server
|
@@ -17,6 +17,7 @@ module PrometheusExporter::Server
|
|
17
17
|
@prefix = nil
|
18
18
|
@auth = nil
|
19
19
|
@realm = nil
|
20
|
+
@histogram = nil
|
20
21
|
|
21
22
|
options.each do |k, v|
|
22
23
|
send("#{k}=", v) if self.class.method_defined?("#{k}=")
|
@@ -27,6 +28,10 @@ module PrometheusExporter::Server
|
|
27
28
|
PrometheusExporter::Metric::Base.default_prefix = prefix
|
28
29
|
PrometheusExporter::Metric::Base.default_labels = label
|
29
30
|
|
31
|
+
if histogram
|
32
|
+
PrometheusExporter::Metric::Base.default_aggregation = PrometheusExporter::Metric::Histogram
|
33
|
+
end
|
34
|
+
|
30
35
|
register_type_collectors
|
31
36
|
|
32
37
|
unless collector.is_a?(PrometheusExporter::Server::CollectorBase)
|
@@ -47,7 +52,7 @@ module PrometheusExporter::Server
|
|
47
52
|
end
|
48
53
|
|
49
54
|
attr_accessor :unicorn_listen_address, :unicorn_pid_file
|
50
|
-
attr_writer :prefix, :port, :bind, :collector_class, :type_collectors, :timeout, :verbose, :server_class, :label, :auth, :realm
|
55
|
+
attr_writer :prefix, :port, :bind, :collector_class, :type_collectors, :timeout, :verbose, :server_class, :label, :auth, :realm, :histogram
|
51
56
|
|
52
57
|
def auth
|
53
58
|
@auth || nil
|
@@ -98,6 +103,10 @@ module PrometheusExporter::Server
|
|
98
103
|
@label ||= PrometheusExporter::DEFAULT_LABEL
|
99
104
|
end
|
100
105
|
|
106
|
+
def histogram
|
107
|
+
@histogram || false
|
108
|
+
end
|
109
|
+
|
101
110
|
private
|
102
111
|
|
103
112
|
def register_type_collectors
|
@@ -52,7 +52,7 @@ module PrometheusExporter::Server
|
|
52
52
|
if !@sidekiq_jobs_total
|
53
53
|
|
54
54
|
@sidekiq_job_duration_seconds =
|
55
|
-
PrometheusExporter::Metric::
|
55
|
+
PrometheusExporter::Metric::Base.default_aggregation.new(
|
56
56
|
"sidekiq_job_duration_seconds", "Total time spent in sidekiq jobs.")
|
57
57
|
|
58
58
|
@sidekiq_jobs_total =
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PrometheusExporter::Server
|
4
|
+
class SidekiqProcessCollector < PrometheusExporter::Server::TypeCollector
|
5
|
+
MAX_SIDEKIQ_METRIC_AGE = 60
|
6
|
+
|
7
|
+
SIDEKIQ_PROCESS_GAUGES = {
|
8
|
+
'busy' => 'Number of running jobs',
|
9
|
+
'concurrency' => 'Maximum concurrency',
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
attr_reader :sidekiq_metrics, :gauges
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@sidekiq_metrics = []
|
16
|
+
@gauges = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def type
|
20
|
+
'sidekiq_process'
|
21
|
+
end
|
22
|
+
|
23
|
+
def metrics
|
24
|
+
sidekiq_metrics.map do |metric|
|
25
|
+
labels = metric.fetch('labels', {})
|
26
|
+
SIDEKIQ_PROCESS_GAUGES.map do |name, help|
|
27
|
+
if (value = metric[name])
|
28
|
+
gauge = gauges[name] ||= PrometheusExporter::Metric::Gauge.new("sidekiq_process_#{name}", help)
|
29
|
+
gauge.observe(value, labels)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
gauges.values
|
35
|
+
end
|
36
|
+
|
37
|
+
def collect(object)
|
38
|
+
now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
39
|
+
process = object['process']
|
40
|
+
|
41
|
+
process["created_at"] = now
|
42
|
+
sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
|
43
|
+
sidekiq_metrics << process
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PrometheusExporter::Server
|
4
|
+
class SidekiqStatsCollector < TypeCollector
|
5
|
+
MAX_SIDEKIQ_METRIC_AGE = 60
|
6
|
+
|
7
|
+
SIDEKIQ_STATS_GAUGES = {
|
8
|
+
'dead_size' => 'Size of dead the queue',
|
9
|
+
'enqueued' => 'Number of enqueued jobs',
|
10
|
+
'failed' => 'Number of failed jobs',
|
11
|
+
'processed' => 'Total number of processed jobs',
|
12
|
+
'processes_size' => 'Number of processes',
|
13
|
+
'retry_size' => 'Size of the retries queue',
|
14
|
+
'scheduled_size' => 'Size of the scheduled queue',
|
15
|
+
'workers_size' => 'Number of jobs actively being processed',
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
attr_reader :sidekiq_metrics, :gauges
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@sidekiq_metrics = []
|
22
|
+
@gauges = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def type
|
26
|
+
'sidekiq_stats'
|
27
|
+
end
|
28
|
+
|
29
|
+
def metrics
|
30
|
+
sidekiq_metrics.map do |metric|
|
31
|
+
SIDEKIQ_STATS_GAUGES.map do |name, help|
|
32
|
+
if (value = metric['stats'][name])
|
33
|
+
gauge = gauges[name] ||= PrometheusExporter::Metric::Gauge.new("sidekiq_stats_#{name}", help)
|
34
|
+
gauge.observe(value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
gauges.values
|
40
|
+
end
|
41
|
+
|
42
|
+
def collect(object)
|
43
|
+
sidekiq_metrics << object
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -6,9 +6,9 @@ class PrometheusExporter::Server::UnicornCollector < PrometheusExporter::Server:
|
|
6
6
|
MAX_UNICORN_METRIC_AGE = 60
|
7
7
|
|
8
8
|
UNICORN_GAUGES = {
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
workers: 'Number of unicorn workers.',
|
10
|
+
active_workers: 'Number of active unicorn workers',
|
11
|
+
request_backlog: 'Number of requests waiting to be processed by a unicorn worker.'
|
12
12
|
}.freeze
|
13
13
|
|
14
14
|
def initialize
|
@@ -5,10 +5,10 @@ module PrometheusExporter::Server
|
|
5
5
|
def initialize
|
6
6
|
@metrics = {}
|
7
7
|
@http_requests_total = nil
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@
|
8
|
+
@http_request_duration_seconds = nil
|
9
|
+
@http_request_redis_duration_seconds = nil
|
10
|
+
@http_request_sql_duration_seconds = nil
|
11
|
+
@http_request_queue_duration_seconds = nil
|
12
12
|
end
|
13
13
|
|
14
14
|
def type
|
@@ -33,23 +33,23 @@ module PrometheusExporter::Server
|
|
33
33
|
"Total HTTP requests from web app."
|
34
34
|
)
|
35
35
|
|
36
|
-
@metrics["
|
37
|
-
"
|
36
|
+
@metrics["http_request_duration_seconds"] = @http_request_duration_seconds = PrometheusExporter::Metric::Base.default_aggregation.new(
|
37
|
+
"http_request_duration_seconds",
|
38
38
|
"Time spent in HTTP reqs in seconds."
|
39
39
|
)
|
40
40
|
|
41
|
-
@metrics["
|
42
|
-
"
|
41
|
+
@metrics["http_request_redis_duration_seconds"] = @http_request_redis_duration_seconds = PrometheusExporter::Metric::Base.default_aggregation.new(
|
42
|
+
"http_request_redis_duration_seconds",
|
43
43
|
"Time spent in HTTP reqs in Redis, in seconds."
|
44
44
|
)
|
45
45
|
|
46
|
-
@metrics["
|
47
|
-
"
|
46
|
+
@metrics["http_request_sql_duration_seconds"] = @http_request_sql_duration_seconds = PrometheusExporter::Metric::Base.default_aggregation.new(
|
47
|
+
"http_request_sql_duration_seconds",
|
48
48
|
"Time spent in HTTP reqs in SQL in seconds."
|
49
49
|
)
|
50
50
|
|
51
|
-
@metrics["
|
52
|
-
"
|
51
|
+
@metrics["http_request_queue_duration_seconds"] = @http_request_queue_duration_seconds = PrometheusExporter::Metric::Base.default_aggregation.new(
|
52
|
+
"http_request_queue_duration_seconds",
|
53
53
|
"Time spent queueing the request in load balancer in seconds."
|
54
54
|
)
|
55
55
|
end
|
@@ -60,19 +60,19 @@ module PrometheusExporter::Server
|
|
60
60
|
custom_labels = obj['custom_labels']
|
61
61
|
labels = custom_labels.nil? ? default_labels : default_labels.merge(custom_labels)
|
62
62
|
|
63
|
-
@http_requests_total.observe(1, labels)
|
63
|
+
@http_requests_total.observe(1, labels.merge(status: obj["status"]))
|
64
64
|
|
65
65
|
if timings = obj["timings"]
|
66
|
-
@
|
66
|
+
@http_request_duration_seconds.observe(timings["total_duration"], labels)
|
67
67
|
if redis = timings["redis"]
|
68
|
-
@
|
68
|
+
@http_request_redis_duration_seconds.observe(redis["duration"], labels)
|
69
69
|
end
|
70
70
|
if sql = timings["sql"]
|
71
|
-
@
|
71
|
+
@http_request_sql_duration_seconds.observe(sql["duration"], labels)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
if queue_time = obj["queue_time"]
|
75
|
-
@
|
75
|
+
@http_request_queue_duration_seconds.observe(queue_time, labels)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
@@ -29,16 +29,17 @@ module PrometheusExporter::Server
|
|
29
29
|
@bad_metrics_total.observe(0)
|
30
30
|
|
31
31
|
@access_log, @logger = nil
|
32
|
+
log_target = opts[:log_target]
|
32
33
|
|
33
34
|
if @verbose
|
34
35
|
@access_log = [
|
35
36
|
[$stderr, WEBrick::AccessLog::COMMON_LOG_FORMAT],
|
36
37
|
[$stderr, WEBrick::AccessLog::REFERER_LOG_FORMAT],
|
37
38
|
]
|
38
|
-
@logger = WEBrick::Log.new($stderr)
|
39
|
+
@logger = WEBrick::Log.new(log_target || $stderr)
|
39
40
|
else
|
40
41
|
@access_log = []
|
41
|
-
@logger = WEBrick::Log.new("/dev/null")
|
42
|
+
@logger = WEBrick::Log.new(log_target || "/dev/null")
|
42
43
|
end
|
43
44
|
|
44
45
|
@logger.info "Using Basic Authentication via #{@auth}" if @verbose && @auth
|
@@ -87,10 +88,7 @@ module PrometheusExporter::Server
|
|
87
88
|
@collector.process(block)
|
88
89
|
rescue => e
|
89
90
|
if @verbose
|
90
|
-
|
91
|
-
STDERR.puts e.inspect
|
92
|
-
STDERR.puts e.backtrace
|
93
|
-
STDERR.puts
|
91
|
+
@logger.error "\n\n#{e.inspect}\n#{e.backtrace}\n\n"
|
94
92
|
end
|
95
93
|
@bad_metrics_total.observe
|
96
94
|
res.body = "Bad Metrics #{e}"
|
@@ -108,7 +106,7 @@ module PrometheusExporter::Server
|
|
108
106
|
begin
|
109
107
|
@server.start
|
110
108
|
rescue => e
|
111
|
-
|
109
|
+
@logger.error "Failed to start prometheus collector web on port #{@port}: #{e}"
|
112
110
|
end
|
113
111
|
end
|
114
112
|
end
|
@@ -125,7 +123,7 @@ module PrometheusExporter::Server
|
|
125
123
|
end
|
126
124
|
rescue Timeout::Error
|
127
125
|
# we timed out ... bummer
|
128
|
-
|
126
|
+
@logger.error "Generating Prometheus metrics text timed out"
|
129
127
|
end
|
130
128
|
|
131
129
|
metrics = []
|
@@ -6,6 +6,8 @@ require_relative "server/web_collector"
|
|
6
6
|
require_relative "server/process_collector"
|
7
7
|
require_relative "server/sidekiq_collector"
|
8
8
|
require_relative "server/sidekiq_queue_collector"
|
9
|
+
require_relative "server/sidekiq_process_collector"
|
10
|
+
require_relative "server/sidekiq_stats_collector"
|
9
11
|
require_relative "server/delayed_job_collector"
|
10
12
|
require_relative "server/collector_base"
|
11
13
|
require_relative "server/collector"
|
data/prometheus_exporter.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "rake", "~> 13.0"
|
32
32
|
spec.add_development_dependency "minitest", "~> 5.0"
|
33
33
|
spec.add_development_dependency "guard", "~> 2.0"
|
34
|
-
spec.add_development_dependency "mini_racer", "~> 0.
|
34
|
+
spec.add_development_dependency "mini_racer", "~> 0.5.0"
|
35
35
|
spec.add_development_dependency "guard-minitest", "~> 2.0"
|
36
36
|
spec.add_development_dependency "oj", "~> 3.0"
|
37
37
|
spec.add_development_dependency "rack-test", "~> 0.8.3"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prometheus_exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: webrick
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: 0.5.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: 0.5.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: guard-minitest
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -243,7 +243,9 @@ files:
|
|
243
243
|
- lib/prometheus_exporter/instrumentation/resque.rb
|
244
244
|
- lib/prometheus_exporter/instrumentation/shoryuken.rb
|
245
245
|
- lib/prometheus_exporter/instrumentation/sidekiq.rb
|
246
|
+
- lib/prometheus_exporter/instrumentation/sidekiq_process.rb
|
246
247
|
- lib/prometheus_exporter/instrumentation/sidekiq_queue.rb
|
248
|
+
- lib/prometheus_exporter/instrumentation/sidekiq_stats.rb
|
247
249
|
- lib/prometheus_exporter/instrumentation/unicorn.rb
|
248
250
|
- lib/prometheus_exporter/metric.rb
|
249
251
|
- lib/prometheus_exporter/metric/base.rb
|
@@ -264,7 +266,9 @@ files:
|
|
264
266
|
- lib/prometheus_exporter/server/runner.rb
|
265
267
|
- lib/prometheus_exporter/server/shoryuken_collector.rb
|
266
268
|
- lib/prometheus_exporter/server/sidekiq_collector.rb
|
269
|
+
- lib/prometheus_exporter/server/sidekiq_process_collector.rb
|
267
270
|
- lib/prometheus_exporter/server/sidekiq_queue_collector.rb
|
271
|
+
- lib/prometheus_exporter/server/sidekiq_stats_collector.rb
|
268
272
|
- lib/prometheus_exporter/server/type_collector.rb
|
269
273
|
- lib/prometheus_exporter/server/unicorn_collector.rb
|
270
274
|
- lib/prometheus_exporter/server/web_collector.rb
|
@@ -292,7 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
296
|
version: '0'
|
293
297
|
requirements: []
|
294
298
|
rubygems_version: 3.1.6
|
295
|
-
signing_key:
|
299
|
+
signing_key:
|
296
300
|
specification_version: 4
|
297
301
|
summary: Prometheus Exporter
|
298
302
|
test_files: []
|