prometheus_exporter 0.5.1 → 0.5.2
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/.rubocop.yml +2 -1
- data/CHANGELOG +8 -3
- data/README.md +166 -1
- data/bin/prometheus_exporter +4 -0
- data/lib/prometheus_exporter.rb +1 -0
- data/lib/prometheus_exporter/instrumentation.rb +1 -0
- data/lib/prometheus_exporter/instrumentation/process.rb +2 -0
- data/lib/prometheus_exporter/instrumentation/sidekiq_queue.rb +39 -0
- data/lib/prometheus_exporter/metric/base.rb +4 -0
- data/lib/prometheus_exporter/server.rb +1 -0
- data/lib/prometheus_exporter/server/collector.rb +1 -0
- data/lib/prometheus_exporter/server/delayed_job_collector.rb +11 -0
- data/lib/prometheus_exporter/server/hutch_collector.rb +6 -0
- data/lib/prometheus_exporter/server/runner.rb +13 -1
- data/lib/prometheus_exporter/server/shoryuken_collector.rb +8 -0
- data/lib/prometheus_exporter/server/sidekiq_collector.rb +9 -0
- data/lib/prometheus_exporter/server/sidekiq_queue_collector.rb +45 -0
- data/lib/prometheus_exporter/server/web_collector.rb +5 -0
- data/lib/prometheus_exporter/version.rb +1 -1
- data/prometheus_exporter.gemspec +2 -2
- metadata +12 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d503831ed018381a2f32d77b14f04db0533d8f03f19befda4067fe29ad464e
|
4
|
+
data.tar.gz: 31227ad5e110551343e4d0d1837a834333d0203c1df2b6343fe7b5584bb818ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b594c1eec85156ccf1ee08e5ef9c4bc864f266c9d6960b74148dc5b2dc8c2712f37281125d0399928cdd49897b558593f25069d507db190bbe19616a2ad6a93
|
7
|
+
data.tar.gz: 794a3837221c3e16aca9547eb833fade063b501627f6dafc7da8454e85d288d72d4d78adf6fe82a164ff54fa656ee0ea6024a418c328197d6b9aebf1a407c7e3
|
data/.rubocop.yml
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
inherit_gem:
|
2
|
+
rubocop-discourse: default.yml
|
data/CHANGELOG
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.2 - 01-07-2020
|
2
|
+
|
3
|
+
- FEATURE: expanded instrumentation for sidekiq
|
4
|
+
- FEATURE: configurable default labels
|
5
|
+
|
6
|
+
0.5.1 - 25-02-2020
|
2
7
|
|
3
8
|
- FEATURE: Allow configuring the default client's host and port via environment variables
|
4
9
|
|
5
|
-
0.5.0 - 14-02-
|
10
|
+
0.5.0 - 14-02-2020
|
6
11
|
|
7
12
|
- Breaking change: listen only to localhost by default to prevent unintended insecure configuration
|
8
13
|
- FIX: Avoid calling `hostname` aggressively, instead cache it on the exporter instance
|
9
14
|
|
10
|
-
0.4.17 - 13-01-
|
15
|
+
0.4.17 - 13-01-2020
|
11
16
|
|
12
17
|
- FEATURE: add support for `to_h` on all metrics which can be used to query existing key/values
|
13
18
|
|
data/README.md
CHANGED
@@ -190,6 +190,23 @@ Ensure you run the exporter in a monitored background process:
|
|
190
190
|
$ bundle exec prometheus_exporter
|
191
191
|
```
|
192
192
|
|
193
|
+
#### Metrics collected by Rails integration middleware
|
194
|
+
|
195
|
+
| Type | Name | Description |
|
196
|
+
| --- | --- | --- |
|
197
|
+
| Counter | `http_requests_total` | Total HTTP requests from web app |
|
198
|
+
| Summary | `http_duration_seconds` | Time spent in HTTP reqs in seconds |
|
199
|
+
| Summary | `http_redis_duration_seconds`¹ | Time spent in HTTP reqs in Redis, in seconds |
|
200
|
+
| Summary | `http_sql_duration_seconds`² | Time spent in HTTP reqs in SQL in seconds |
|
201
|
+
| Summary | `http_queue_duration_seconds`³ | Time spent queueing the request in load balancer in seconds |
|
202
|
+
|
203
|
+
All metrics have a `controller` and an `action` label.
|
204
|
+
`http_requests_total` additionally has a (HTTP response) `status` label.
|
205
|
+
|
206
|
+
¹) Only available when Redis is used.
|
207
|
+
²) Only available when Mysql or PostgreSQL are used.
|
208
|
+
³) Only available when [Instrumenting Request Queueing Time](#instrumenting-request-queueing-time) is set up.
|
209
|
+
|
193
210
|
#### Activerecord Connection Pool Metrics
|
194
211
|
|
195
212
|
This collects activerecord connection pool metrics.
|
@@ -244,6 +261,19 @@ Sidekiq.configure_server do |config|
|
|
244
261
|
end
|
245
262
|
```
|
246
263
|
|
264
|
+
##### Metrics collected by ActiveRecord Instrumentation
|
265
|
+
|
266
|
+
| Type | Name | Description |
|
267
|
+
| --- | --- | --- |
|
268
|
+
| Gauge | `active_record_connection_pool_connections` | Total connections in pool |
|
269
|
+
| Gauge | `active_record_connection_pool_busy` | Connections in use in pool |
|
270
|
+
| Gauge | `active_record_connection_pool_dead` | Dead connections in pool |
|
271
|
+
| Gauge | `active_record_connection_pool_idle` | Idle connections in pool |
|
272
|
+
| Gauge | `active_record_connection_pool_waiting` | Connection requests waiting |
|
273
|
+
| Gauge | `active_record_connection_pool_size` | Maximum allowed connection pool size |
|
274
|
+
|
275
|
+
All metrics collected by the ActiveRecord integration include at least the following labels: `pid` (of the process the stats where collected in), `pool_name`, any labels included in the `config_labels` option (prefixed with `dbconfig_`, example: `dbconfig_host`), and all custom labels provided with the `custom_labels` option.
|
276
|
+
|
247
277
|
#### Per-process stats
|
248
278
|
|
249
279
|
You may also be interested in per-process stats. This collects memory and GC stats:
|
@@ -260,11 +290,30 @@ end
|
|
260
290
|
# in unicorn/puma/passenger be sure to run a new process instrumenter after fork
|
261
291
|
after_fork do
|
262
292
|
require 'prometheus_exporter/instrumentation'
|
263
|
-
PrometheusExporter::Instrumentation::Process.start(type:"web")
|
293
|
+
PrometheusExporter::Instrumentation::Process.start(type: "web")
|
264
294
|
end
|
265
295
|
|
266
296
|
```
|
267
297
|
|
298
|
+
##### Metrics collected by Process Instrumentation
|
299
|
+
|
300
|
+
| Type | Name | Description |
|
301
|
+
| --- | --- | --- |
|
302
|
+
| Gauge | `heap_free_slots` | Free ruby heap slots |
|
303
|
+
| Gauge | `heap_live_slots` | Used ruby heap slots |
|
304
|
+
| Gauge | `v8_heap_size`* | Total JavaScript V8 heap size (bytes) |
|
305
|
+
| Gauge | `v8_used_heap_size`* | Total used JavaScript V8 heap size (bytes) |
|
306
|
+
| Gauge | `v8_physical_size`* | Physical size consumed by V8 heaps |
|
307
|
+
| Gauge | `v8_heap_count`* | Number of V8 contexts running |
|
308
|
+
| Gauge | `rss` | Total RSS used by process |
|
309
|
+
| Counter | `major_gc_ops_total` | Major GC operations by process |
|
310
|
+
| Counter | `minor_gc_ops_total` | Minor GC operations by process |
|
311
|
+
| Counter | `allocated_objects_total` | Total number of allocated objects by process |
|
312
|
+
|
313
|
+
_Metrics marked with * are only collected when `MiniRacer` is defined._
|
314
|
+
|
315
|
+
Metrics collected by Process instrumentation include labels `type` (as given with the `type` option), `pid` (of the process the stats where collected in), and any custom labels given to `Process.start` with the `labels` option.
|
316
|
+
|
268
317
|
#### Sidekiq metrics
|
269
318
|
|
270
319
|
Including Sidekiq metrics (how many jobs ran? how many failed? how long did they take? how many are dead? how many were restarted?)
|
@@ -279,6 +328,17 @@ Sidekiq.configure_server do |config|
|
|
279
328
|
end
|
280
329
|
```
|
281
330
|
|
331
|
+
To monitor Queue size and latency:
|
332
|
+
|
333
|
+
```ruby
|
334
|
+
Sidekiq.configure_server do |config|
|
335
|
+
config.on :startup do
|
336
|
+
require 'prometheus_exporter/instrumentation'
|
337
|
+
PrometheusExporter::Instrumentation::SidekiqQueue.start
|
338
|
+
end
|
339
|
+
end
|
340
|
+
```
|
341
|
+
|
282
342
|
To monitor Sidekiq process info:
|
283
343
|
|
284
344
|
```ruby
|
@@ -300,6 +360,35 @@ Sometimes the Sidekiq server shuts down before it can send metrics, that were ge
|
|
300
360
|
end
|
301
361
|
```
|
302
362
|
|
363
|
+
##### Metrics collected by Sidekiq Instrumentation
|
364
|
+
|
365
|
+
**PrometheusExporter::Instrumentation::Sidekiq**
|
366
|
+
| Type | Name | Description |
|
367
|
+
| --- | --- | --- |
|
368
|
+
| Counter | `sidekiq_job_duration_seconds` | Total time spent in sidekiq jobs |
|
369
|
+
| Counter | `sidekiq_jobs_total` | Total number of sidekiq jobs executed |
|
370
|
+
| Counter | `sidekiq_restarted_jobs_total` | Total number of sidekiq jobs that we restarted because of a sidekiq shutdown |
|
371
|
+
| Counter | `sidekiq_failed_jobs_total` | Total number of failed sidekiq jobs |
|
372
|
+
|
373
|
+
All metrics have a `job_name` label.
|
374
|
+
|
375
|
+
**PrometheusExporter::Instrumentation::Sidekiq.death_handler**
|
376
|
+
| Type | Name | Description |
|
377
|
+
| --- | --- | --- |
|
378
|
+
| Counter | `sidekiq_dead_jobs_total` | Total number of dead sidekiq jobs |
|
379
|
+
|
380
|
+
This metric also has a `job_name` label.
|
381
|
+
|
382
|
+
**PrometheusExporter::Instrumentation::SidekiqQueue**
|
383
|
+
| Type | Name | Description |
|
384
|
+
| --- | --- | --- |
|
385
|
+
| Gauge | `sidekiq_queue_backlog_total` | Size of the sidekiq queue |
|
386
|
+
| Gauge | `sidekiq_queue_latency_seconds` | Latency of the sidekiq queue |
|
387
|
+
|
388
|
+
Both metrics will have a `queue` label with the name of the queue.
|
389
|
+
|
390
|
+
_See [Metrics collected by Process Instrumentation](#metrics-collected-by-process-instrumentation) for a list of metrics the Process instrumentation will produce._
|
391
|
+
|
303
392
|
#### Shoryuken metrics
|
304
393
|
|
305
394
|
For Shoryuken metrics (how many jobs ran? how many failed? how long did they take? how many were restarted?)
|
@@ -313,6 +402,17 @@ Shoryuken.configure_server do |config|
|
|
313
402
|
end
|
314
403
|
```
|
315
404
|
|
405
|
+
##### Metrics collected by Shoryuken Instrumentation
|
406
|
+
|
407
|
+
| Type | Name | Description |
|
408
|
+
| --- | --- | --- |
|
409
|
+
| Counter | `shoryuken_job_duration_seconds` | Total time spent in shoryuken jobs |
|
410
|
+
| Counter | `shoryuken_jobs_total` | Total number of shoryuken jobs executed |
|
411
|
+
| Counter | `shoryuken_restarted_jobs_total` | Total number of shoryuken jobs that we restarted because of a shoryuken shutdown |
|
412
|
+
| Counter | `shoryuken_failed_jobs_total` | Total number of failed shoryuken jobs |
|
413
|
+
|
414
|
+
All metrics have labels for `job_name` and `queue_name`.
|
415
|
+
|
316
416
|
#### Delayed Job plugin
|
317
417
|
|
318
418
|
In an initializer:
|
@@ -324,6 +424,19 @@ unless Rails.env == "test"
|
|
324
424
|
end
|
325
425
|
```
|
326
426
|
|
427
|
+
##### Metrics collected by Delayed Job Instrumentation
|
428
|
+
|
429
|
+
| Type | Name | Description | Labels |
|
430
|
+
| --- | --- | --- | --- |
|
431
|
+
| Counter | `delayed_job_duration_seconds` | Total time spent in delayed jobs | `job_name` |
|
432
|
+
| Counter | `delayed_jobs_total` | Total number of delayed jobs executed | `job_name` |
|
433
|
+
| Gauge | `delayed_jobs_enqueued` | Number of enqueued delayed jobs | - |
|
434
|
+
| Gauge | `delayed_jobs_pending` | Number of pending delayed jobs | - |
|
435
|
+
| Counter | `delayed_failed_jobs_total` | Total number failed delayed jobs executed | `job_name` |
|
436
|
+
| Counter | `delayed_jobs_max_attempts_reached_total` | Total number of delayed jobs that reached max attempts | - |
|
437
|
+
| Summary | `delayed_job_duration_seconds_summary` | Summary of the time it takes jobs to execute | `status` |
|
438
|
+
| Summary | `delayed_job_attempts_summary` | Summary of the amount of attempts it takes delayed jobs to succeed | - |
|
439
|
+
|
327
440
|
#### Hutch Message Processing Tracer
|
328
441
|
|
329
442
|
Capture [Hutch](https://github.com/gocardless/hutch) metrics (how many jobs ran? how many failed? how long did they take?)
|
@@ -335,6 +448,16 @@ unless Rails.env == "test"
|
|
335
448
|
end
|
336
449
|
```
|
337
450
|
|
451
|
+
##### Metrics collected by Hutch Instrumentation
|
452
|
+
|
453
|
+
| Type | Name | Description |
|
454
|
+
| --- | --- | --- |
|
455
|
+
| Counter | `hutch_job_duration_seconds` | Total time spent in hutch jobs |
|
456
|
+
| Counter | `hutch_jobs_total` | Total number of hutch jobs executed |
|
457
|
+
| Counter | `hutch_failed_jobs_total` | Total number failed hutch jobs executed |
|
458
|
+
|
459
|
+
All metrics have a `job_name` label.
|
460
|
+
|
338
461
|
#### Instrumenting Request Queueing Time
|
339
462
|
|
340
463
|
Request Queueing is defined as the time it takes for a request to reach your application (instrumented by this `prometheus_exporter`) from farther upstream (as your load balancer). A high queueing time usually means that your backend cannot handle all the incoming requests in time, so they queue up (= you should see if you need to add more capacity).
|
@@ -359,6 +482,20 @@ after_worker_boot do
|
|
359
482
|
end
|
360
483
|
```
|
361
484
|
|
485
|
+
#### Metrics collected by Puma Instrumentation
|
486
|
+
|
487
|
+
| Type | Name | Description |
|
488
|
+
| --- | --- | --- |
|
489
|
+
| Gauge | `puma_workers_total` | Number of puma workers |
|
490
|
+
| Gauge | `puma_booted_workers_total` | Number of puma workers booted |
|
491
|
+
| Gauge | `puma_old_workers_total` | Number of old puma workers |
|
492
|
+
| Gauge | `puma_running_threads_total` | Number of puma threads currently running |
|
493
|
+
| Gauge | `puma_request_backlog_total` | Number of requests waiting to be processed by a puma thread |
|
494
|
+
| Gauge | `puma_thread_pool_capacity_total` | Number of puma threads available at current scale |
|
495
|
+
| Gauge | `puma_max_threads_total` | Number of puma threads at available at max scale |
|
496
|
+
|
497
|
+
All metrics may have a `phase` label.
|
498
|
+
|
362
499
|
### Unicorn process metrics
|
363
500
|
|
364
501
|
In order to gather metrics from unicorn processes, we use `rainbows`, which exposes `Rainbows::Linux.tcp_listener_stats` to gather information about active workers and queued requests. To start monitoring your unicorn processes, you'll need to know both the path to unicorn PID file and the listen address (`pid_file` and `listen` in your unicorn config file)
|
@@ -374,6 +511,14 @@ prometheus_exporter --unicorn-master /var/run/unicorn.pid --unicorn-listen-addre
|
|
374
511
|
|
375
512
|
Note: You must install the `raindrops` gem in your `Gemfile` or locally.
|
376
513
|
|
514
|
+
#### Metrics collected by Unicorn Instrumentation
|
515
|
+
|
516
|
+
| Type | Name | Description |
|
517
|
+
| --- | --- | --- |
|
518
|
+
| Gauge | `unicorn_workers_total` | Number of unicorn workers |
|
519
|
+
| Gauge | `unicorn_active_workers_total` | Number of active unicorn workers |
|
520
|
+
| Gauge | `unicorn_request_backlog_total` | Number of requests waiting to be processed by a unicorn worker |
|
521
|
+
|
377
522
|
### Custom type collectors
|
378
523
|
|
379
524
|
In some cases you may have custom metrics you want to ship the collector in a batch. In this case you may still be interested in the base collector behavior, but would like to add your own special messages.
|
@@ -542,6 +687,26 @@ ruby_web_requests{hostname="app-server-01",route="test/route"} 1
|
|
542
687
|
ruby_web_requests{hostname="app-server-01"} 1
|
543
688
|
```
|
544
689
|
|
690
|
+
### Exporter Process Configuration
|
691
|
+
|
692
|
+
When running the process for `prometheus_exporter` using `bin/prometheus_exporter`, there are several configurations that
|
693
|
+
can be passed in:
|
694
|
+
|
695
|
+
The following will run the process at
|
696
|
+
- Port `8080` (default `9394`)
|
697
|
+
- Bind to `0.0.0.0` (default `localhost`)
|
698
|
+
- Timeout in `1 second` for metrics endpoint (default `2 seconds`)
|
699
|
+
- Metric prefix as `foo_` (default `ruby_`)
|
700
|
+
- Default labels as `{environment: "integration", foo: "bar"}`
|
701
|
+
|
702
|
+
```bash
|
703
|
+
prometheus_exporter -p 8080 \
|
704
|
+
-b 0.0.0.0 \
|
705
|
+
-t 1 \
|
706
|
+
--label '{"environment": "integration", "foo": "bar"}' \
|
707
|
+
--prefix 'foo_'
|
708
|
+
```
|
709
|
+
|
545
710
|
### Client default labels
|
546
711
|
|
547
712
|
You can specify a default label for instrumentation metrics sent by a specific client. For example:
|
data/bin/prometheus_exporter
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'optparse'
|
5
|
+
require 'json'
|
5
6
|
|
6
7
|
require_relative "./../lib/prometheus_exporter"
|
7
8
|
require_relative "./../lib/prometheus_exporter/server"
|
@@ -34,6 +35,9 @@ def run
|
|
34
35
|
opt.on('--prefix METRIC_PREFIX', "Prefix to apply to all metrics (default: #{PrometheusExporter::DEFAULT_PREFIX})") do |o|
|
35
36
|
options[:prefix] = o.to_s
|
36
37
|
end
|
38
|
+
opt.on('--label METRIC_LABEL', "Label to apply to all metrics (default: #{PrometheusExporter::DEFAULT_LABEL})") do |o|
|
39
|
+
options[:label] = JSON.parse(o.to_s)
|
40
|
+
end
|
37
41
|
opt.on('-c', '--collector FILE', String, "(optional) Custom collector to run") do |o|
|
38
42
|
custom_collector_filename = o.to_s
|
39
43
|
end
|
data/lib/prometheus_exporter.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative "client"
|
|
4
4
|
require_relative "instrumentation/process"
|
5
5
|
require_relative "instrumentation/method_profiler"
|
6
6
|
require_relative "instrumentation/sidekiq"
|
7
|
+
require_relative "instrumentation/sidekiq_queue"
|
7
8
|
require_relative "instrumentation/delayed_job"
|
8
9
|
require_relative "instrumentation/puma"
|
9
10
|
require_relative "instrumentation/hutch"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PrometheusExporter::Instrumentation
|
4
|
+
class SidekiqQueue
|
5
|
+
def self.start(client: nil, frequency: 30)
|
6
|
+
client ||= PrometheusExporter::Client.default
|
7
|
+
sidekiq_queue_collector = new
|
8
|
+
|
9
|
+
Thread.new do
|
10
|
+
loop do
|
11
|
+
begin
|
12
|
+
client.send_json(sidekiq_queue_collector.collect)
|
13
|
+
rescue StandardError => e
|
14
|
+
STDERR.puts("Prometheus Exporter Failed To Collect Sidekiq Queue metrics #{e}")
|
15
|
+
ensure
|
16
|
+
sleep frequency
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def collect
|
23
|
+
{
|
24
|
+
type: 'sidekiq_queue',
|
25
|
+
queues: collect_queue_stats
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def collect_queue_stats
|
30
|
+
::Sidekiq::Queue.all.map do |queue|
|
31
|
+
{
|
32
|
+
backlog_total: queue.size,
|
33
|
+
latency_seconds: queue.latency.to_i,
|
34
|
+
labels: { queue: queue.name }
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -5,6 +5,7 @@ require_relative "server/type_collector"
|
|
5
5
|
require_relative "server/web_collector"
|
6
6
|
require_relative "server/process_collector"
|
7
7
|
require_relative "server/sidekiq_collector"
|
8
|
+
require_relative "server/sidekiq_queue_collector"
|
8
9
|
require_relative "server/delayed_job_collector"
|
9
10
|
require_relative "server/collector_base"
|
10
11
|
require_relative "server/collector"
|
@@ -13,6 +13,7 @@ module PrometheusExporter::Server
|
|
13
13
|
register_collector(WebCollector.new)
|
14
14
|
register_collector(ProcessCollector.new)
|
15
15
|
register_collector(SidekiqCollector.new)
|
16
|
+
register_collector(SidekiqQueueCollector.new)
|
16
17
|
register_collector(DelayedJobCollector.new)
|
17
18
|
register_collector(PumaCollector.new)
|
18
19
|
register_collector(HutchCollector.new)
|
@@ -2,6 +2,17 @@
|
|
2
2
|
|
3
3
|
module PrometheusExporter::Server
|
4
4
|
class DelayedJobCollector < TypeCollector
|
5
|
+
def initialize
|
6
|
+
@delayed_jobs_total = nil
|
7
|
+
@delayed_job_duration_seconds = nil
|
8
|
+
@delayed_jobs_total = nil
|
9
|
+
@delayed_failed_jobs_total = nil
|
10
|
+
@delayed_jobs_max_attempts_reached_total = nil
|
11
|
+
@delayed_job_duration_seconds_summary = nil
|
12
|
+
@delayed_job_attempts_summary = nil
|
13
|
+
@delayed_jobs_enqueued = nil
|
14
|
+
@delayed_jobs_pending = nil
|
15
|
+
end
|
5
16
|
|
6
17
|
def type
|
7
18
|
"delayed_job"
|
@@ -9,6 +9,13 @@ module PrometheusExporter::Server
|
|
9
9
|
|
10
10
|
class Runner
|
11
11
|
def initialize(options = {})
|
12
|
+
@timeout = nil
|
13
|
+
@port = nil
|
14
|
+
@bind = nil
|
15
|
+
@collector_class = nil
|
16
|
+
@type_collectors = nil
|
17
|
+
@prefix = nil
|
18
|
+
|
12
19
|
options.each do |k, v|
|
13
20
|
send("#{k}=", v) if self.class.method_defined?("#{k}=")
|
14
21
|
end
|
@@ -16,6 +23,7 @@ module PrometheusExporter::Server
|
|
16
23
|
|
17
24
|
def start
|
18
25
|
PrometheusExporter::Metric::Base.default_prefix = prefix
|
26
|
+
PrometheusExporter::Metric::Base.default_labels = label
|
19
27
|
|
20
28
|
register_type_collectors
|
21
29
|
|
@@ -37,7 +45,7 @@ module PrometheusExporter::Server
|
|
37
45
|
end
|
38
46
|
|
39
47
|
attr_accessor :unicorn_listen_address, :unicorn_pid_file
|
40
|
-
attr_writer :prefix, :port, :bind, :collector_class, :type_collectors, :timeout, :verbose, :server_class
|
48
|
+
attr_writer :prefix, :port, :bind, :collector_class, :type_collectors, :timeout, :verbose, :server_class, :label
|
41
49
|
|
42
50
|
def prefix
|
43
51
|
@prefix || PrometheusExporter::DEFAULT_PREFIX
|
@@ -76,6 +84,10 @@ module PrometheusExporter::Server
|
|
76
84
|
@_collector ||= collector_class.new
|
77
85
|
end
|
78
86
|
|
87
|
+
def label
|
88
|
+
@label ||= PrometheusExporter::DEFAULT_LABEL
|
89
|
+
end
|
90
|
+
|
79
91
|
private
|
80
92
|
|
81
93
|
def register_type_collectors
|
@@ -3,6 +3,14 @@
|
|
3
3
|
module PrometheusExporter::Server
|
4
4
|
class ShoryukenCollector < TypeCollector
|
5
5
|
|
6
|
+
def initialize
|
7
|
+
@shoryuken_jobs_total = nil
|
8
|
+
@shoryuken_job_duration_seconds = nil
|
9
|
+
@shoryuken_jobs_total = nil
|
10
|
+
@shoryuken_restarted_jobs_total = nil
|
11
|
+
@shoryuken_failed_jobs_total = nil
|
12
|
+
end
|
13
|
+
|
6
14
|
def type
|
7
15
|
"shoryuken"
|
8
16
|
end
|
@@ -3,6 +3,15 @@
|
|
3
3
|
module PrometheusExporter::Server
|
4
4
|
class SidekiqCollector < TypeCollector
|
5
5
|
|
6
|
+
def initialize
|
7
|
+
@sidekiq_jobs_total = nil
|
8
|
+
@sidekiq_job_duration_seconds = nil
|
9
|
+
@sidekiq_jobs_total = nil
|
10
|
+
@sidekiq_restarted_jobs_total = nil
|
11
|
+
@sidekiq_failed_jobs_total = nil
|
12
|
+
@sidekiq_dead_jobs_total = nil
|
13
|
+
end
|
14
|
+
|
6
15
|
def type
|
7
16
|
"sidekiq"
|
8
17
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module PrometheusExporter::Server
|
3
|
+
class SidekiqQueueCollector < TypeCollector
|
4
|
+
MAX_SIDEKIQ_METRIC_AGE = 60
|
5
|
+
|
6
|
+
SIDEKIQ_QUEUE_GAUGES = {
|
7
|
+
'backlog_total' => 'Size of the sidekiq queue.',
|
8
|
+
'latency_seconds' => 'Latency of the sidekiq queue.',
|
9
|
+
}.freeze
|
10
|
+
|
11
|
+
attr_reader :sidekiq_metrics, :gauges
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@sidekiq_metrics = []
|
15
|
+
@gauges = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def type
|
19
|
+
'sidekiq_queue'
|
20
|
+
end
|
21
|
+
|
22
|
+
def metrics
|
23
|
+
sidekiq_metrics.map do |metric|
|
24
|
+
labels = metric.fetch("labels", {})
|
25
|
+
SIDEKIQ_QUEUE_GAUGES.map do |name, help|
|
26
|
+
if (value = metric[name])
|
27
|
+
gauge = gauges[name] ||= PrometheusExporter::Metric::Gauge.new("sidekiq_queue_#{name}", help)
|
28
|
+
gauge.observe(value, labels)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
gauges.values
|
34
|
+
end
|
35
|
+
|
36
|
+
def collect(object)
|
37
|
+
now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
|
38
|
+
object['queues'].each do |queue|
|
39
|
+
queue["created_at"] = now
|
40
|
+
sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
|
41
|
+
sidekiq_metrics << queue
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -4,6 +4,11 @@ module PrometheusExporter::Server
|
|
4
4
|
class WebCollector < TypeCollector
|
5
5
|
def initialize
|
6
6
|
@metrics = {}
|
7
|
+
@http_requests_total = nil
|
8
|
+
@http_duration_seconds = nil
|
9
|
+
@http_redis_duration_seconds = nil
|
10
|
+
@http_sql_duration_seconds = nil
|
11
|
+
@http_queue_duration_seconds = nil
|
7
12
|
end
|
8
13
|
|
9
14
|
def type
|
data/prometheus_exporter.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
|
27
27
|
spec.add_development_dependency "rubocop", ">= 0.69"
|
28
28
|
spec.add_development_dependency "bundler", "> 1.16"
|
29
|
-
spec.add_development_dependency "rake", "~>
|
29
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
30
30
|
spec.add_development_dependency "minitest", "~> 5.0"
|
31
31
|
spec.add_development_dependency "guard", "~> 2.0"
|
32
32
|
spec.add_development_dependency "mini_racer", "~> 0.1"
|
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.add_development_dependency "oj", "~> 3.0"
|
35
35
|
spec.add_development_dependency "rack-test", "~> 0.8.3"
|
36
36
|
spec.add_development_dependency "minitest-stub-const", "~> 0.6"
|
37
|
-
spec.add_development_dependency
|
37
|
+
spec.add_development_dependency "rubocop-discourse", ">2"
|
38
38
|
if !RUBY_ENGINE == 'jruby'
|
39
39
|
spec.add_development_dependency "raindrops", "~> 0.19"
|
40
40
|
end
|
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.5.
|
4
|
+
version: 0.5.2
|
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: 2020-
|
11
|
+
date: 2020-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: minitest
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,16 +154,16 @@ dependencies:
|
|
154
154
|
name: rubocop-discourse
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- - "
|
157
|
+
- - ">"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: '
|
159
|
+
version: '2'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- - "
|
164
|
+
- - ">"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
166
|
+
version: '2'
|
167
167
|
description: Prometheus metric collector and exporter for Ruby
|
168
168
|
email:
|
169
169
|
- sam.saffron@gmail.com
|
@@ -196,6 +196,7 @@ files:
|
|
196
196
|
- lib/prometheus_exporter/instrumentation/puma.rb
|
197
197
|
- lib/prometheus_exporter/instrumentation/shoryuken.rb
|
198
198
|
- lib/prometheus_exporter/instrumentation/sidekiq.rb
|
199
|
+
- lib/prometheus_exporter/instrumentation/sidekiq_queue.rb
|
199
200
|
- lib/prometheus_exporter/instrumentation/unicorn.rb
|
200
201
|
- lib/prometheus_exporter/metric.rb
|
201
202
|
- lib/prometheus_exporter/metric/base.rb
|
@@ -215,6 +216,7 @@ files:
|
|
215
216
|
- lib/prometheus_exporter/server/runner.rb
|
216
217
|
- lib/prometheus_exporter/server/shoryuken_collector.rb
|
217
218
|
- lib/prometheus_exporter/server/sidekiq_collector.rb
|
219
|
+
- lib/prometheus_exporter/server/sidekiq_queue_collector.rb
|
218
220
|
- lib/prometheus_exporter/server/type_collector.rb
|
219
221
|
- lib/prometheus_exporter/server/unicorn_collector.rb
|
220
222
|
- lib/prometheus_exporter/server/web_collector.rb
|
@@ -242,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
244
|
version: '0'
|
243
245
|
requirements: []
|
244
246
|
rubygems_version: 3.0.3
|
245
|
-
signing_key:
|
247
|
+
signing_key:
|
246
248
|
specification_version: 4
|
247
249
|
summary: Prometheus Exporter
|
248
250
|
test_files: []
|