prometheus_exporter 0.4.16 → 0.5.3

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -1
  3. data/CHANGELOG +22 -0
  4. data/README.md +189 -5
  5. data/bin/prometheus_exporter +11 -1
  6. data/lib/prometheus_exporter.rb +13 -0
  7. data/lib/prometheus_exporter/client.rb +8 -1
  8. data/lib/prometheus_exporter/instrumentation.rb +2 -0
  9. data/lib/prometheus_exporter/instrumentation/active_record.rb +1 -12
  10. data/lib/prometheus_exporter/instrumentation/process.rb +3 -12
  11. data/lib/prometheus_exporter/instrumentation/shoryuken.rb +31 -0
  12. data/lib/prometheus_exporter/instrumentation/sidekiq_queue.rb +39 -0
  13. data/lib/prometheus_exporter/metric/base.rb +8 -0
  14. data/lib/prometheus_exporter/metric/counter.rb +8 -0
  15. data/lib/prometheus_exporter/metric/gauge.rb +8 -0
  16. data/lib/prometheus_exporter/metric/histogram.rb +16 -0
  17. data/lib/prometheus_exporter/metric/summary.rb +17 -0
  18. data/lib/prometheus_exporter/server.rb +2 -0
  19. data/lib/prometheus_exporter/server/active_record_collector.rb +1 -0
  20. data/lib/prometheus_exporter/server/collector.rb +2 -0
  21. data/lib/prometheus_exporter/server/delayed_job_collector.rb +11 -0
  22. data/lib/prometheus_exporter/server/hutch_collector.rb +6 -0
  23. data/lib/prometheus_exporter/server/runner.rb +17 -28
  24. data/lib/prometheus_exporter/server/shoryuken_collector.rb +67 -0
  25. data/lib/prometheus_exporter/server/sidekiq_collector.rb +9 -0
  26. data/lib/prometheus_exporter/server/sidekiq_queue_collector.rb +46 -0
  27. data/lib/prometheus_exporter/server/web_collector.rb +5 -0
  28. data/lib/prometheus_exporter/server/web_server.rb +2 -1
  29. data/lib/prometheus_exporter/version.rb +1 -1
  30. data/prometheus_exporter.gemspec +16 -13
  31. metadata +26 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f71a3c031cd843aba70a3fb4692b73507c7ad7b1256e1cf5b1dbb264cebf73d3
4
- data.tar.gz: 0fbc4a8c24a2ce6d95e6aa315938fc0f4be46c8e769db49397fcbfd2b3dd81f4
3
+ metadata.gz: a284b77cbd17e80457e94520d18976dc3dd6fb8c238d8a90cda6513e291f01ad
4
+ data.tar.gz: 4464419fc9c67d387edd9d6d5bdfac1411d0864d29c0cd3a6f10d2f02b3d7e24
5
5
  SHA512:
6
- metadata.gz: 760279a05df24ae8b06d11bed36d4121afe223020bd36a4cd8f945195c402313aea6c58c81b1f85c0d40b64812af31a37e1537ecc14573b435830311c0415cfd
7
- data.tar.gz: cc36f5859f8195000899e8b2bb066d9bf03698a8280e532231fda9e4bd7756d478fb0d5bd7c4e87dd34bb0a73f88485b198fd53f8c8bf8709c761fdcce41347c
6
+ metadata.gz: 84c2e2af95a8839cd9deecca9fbc26bacff590ae5cb3677862f1eb1d476401114406130cc78d2248cec0380e70c1b74b306e1265b3343bbac9c09d8400e692a3
7
+ data.tar.gz: 41898546588ef7eafa772252ef5ed1a8c222e4009e64ccec35d463217336597a94f1c844f3e2174e030c19a7c1b90d1028e5729cc393cf797654362f5d66b7f2
@@ -1 +1,2 @@
1
- inherit_from: https://raw.githubusercontent.com/discourse/discourse/master/.rubocop.yml
1
+ inherit_gem:
2
+ rubocop-discourse: default.yml
data/CHANGELOG CHANGED
@@ -1,3 +1,25 @@
1
+ 0.5.3 - 29-07-2020
2
+
3
+ - FEATURE: added #remove to all metric types so users can remove specific labels if needed
4
+
5
+ 0.5.2 - 01-07-2020
6
+
7
+ - FEATURE: expanded instrumentation for sidekiq
8
+ - FEATURE: configurable default labels
9
+
10
+ 0.5.1 - 25-02-2020
11
+
12
+ - FEATURE: Allow configuring the default client's host and port via environment variables
13
+
14
+ 0.5.0 - 14-02-2020
15
+
16
+ - Breaking change: listen only to localhost by default to prevent unintended insecure configuration
17
+ - FIX: Avoid calling `hostname` aggressively, instead cache it on the exporter instance
18
+
19
+ 0.4.17 - 13-01-2020
20
+
21
+ - FEATURE: add support for `to_h` on all metrics which can be used to query existing key/values
22
+
1
23
  0.4.16 - 04-11-2019
2
24
 
3
25
  - FEATURE: Support #reset! on all metric types to reset a metric to default
data/README.md CHANGED
@@ -13,6 +13,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
13
13
  * [Rails integration](#rails-integration)
14
14
  * [Per-process stats](#per-process-stats)
15
15
  * [Sidekiq metrics](#sidekiq-metrics)
16
+ * [Shoryuken metrics](#shoryuken-metrics)
16
17
  * [ActiveRecord Connection Pool Metrics](#activerecord-connection-pool-metrics)
17
18
  * [Delayed Job plugin](#delayed-job-plugin)
18
19
  * [Hutch metrics](#hutch-message-processing-tracer)
@@ -23,6 +24,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
23
24
  * [GraphQL support](#graphql-support)
24
25
  * [Metrics default prefix / labels](#metrics-default-prefix--labels)
25
26
  * [Client default labels](#client-default-labels)
27
+ * [Client default host](#client-default-host)
26
28
  * [Transport concerns](#transport-concerns)
27
29
  * [JSON generation and parsing](#json-generation-and-parsing)
28
30
  * [Contributing](#contributing)
@@ -62,8 +64,9 @@ require 'prometheus_exporter/server'
62
64
  require 'prometheus_exporter/client'
63
65
  require 'prometheus_exporter/instrumentation'
64
66
 
67
+ # bind is the address, on which the webserver will listen
65
68
  # port is the port that will provide the /metrics route
66
- server = PrometheusExporter::Server::WebServer.new port: 12345
69
+ server = PrometheusExporter::Server::WebServer.new bind: 'localhost', port: 12345
67
70
  server.start
68
71
 
69
72
  # wire up a default local client
@@ -115,7 +118,7 @@ In some cases (for example, unicorn or puma clusters) you may want to aggregate
115
118
 
116
119
  Simplest way to achieve this is to use the built-in collector.
117
120
 
118
- First, run an exporter on your desired port (we use the default port of 9394):
121
+ First, run an exporter on your desired port (we use the default bind to localhost and port of 9394):
119
122
 
120
123
  ```
121
124
  $ prometheus_exporter
@@ -187,13 +190,30 @@ Ensure you run the exporter in a monitored background process:
187
190
  $ bundle exec prometheus_exporter
188
191
  ```
189
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
+
190
210
  #### Activerecord Connection Pool Metrics
191
211
 
192
212
  This collects activerecord connection pool metrics.
193
213
 
194
214
  It supports injection of custom labels and the connection config options (`username`, `database`, `host`, `port`) as labels.
195
215
 
196
- For Puma single mode
216
+ For Puma single mode
197
217
  ```ruby
198
218
  #in puma.rb
199
219
  require 'prometheus_exporter/instrumentation'
@@ -219,7 +239,7 @@ end
219
239
  For Unicorn / Passenger
220
240
 
221
241
  ```ruby
222
- after_fork do
242
+ after_fork do |_server, _worker|
223
243
  require 'prometheus_exporter/instrumentation'
224
244
  PrometheusExporter::Instrumentation::ActiveRecord.start(
225
245
  custom_labels: { type: "unicorn_worker" }, #optional params
@@ -241,6 +261,19 @@ Sidekiq.configure_server do |config|
241
261
  end
242
262
  ```
243
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
+
244
277
  #### Per-process stats
245
278
 
246
279
  You may also be interested in per-process stats. This collects memory and GC stats:
@@ -257,11 +290,30 @@ end
257
290
  # in unicorn/puma/passenger be sure to run a new process instrumenter after fork
258
291
  after_fork do
259
292
  require 'prometheus_exporter/instrumentation'
260
- PrometheusExporter::Instrumentation::Process.start(type:"web")
293
+ PrometheusExporter::Instrumentation::Process.start(type: "web")
261
294
  end
262
295
 
263
296
  ```
264
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
+
265
317
  #### Sidekiq metrics
266
318
 
267
319
  Including Sidekiq metrics (how many jobs ran? how many failed? how long did they take? how many are dead? how many were restarted?)
@@ -276,6 +328,17 @@ Sidekiq.configure_server do |config|
276
328
  end
277
329
  ```
278
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
+
279
342
  To monitor Sidekiq process info:
280
343
 
281
344
  ```ruby
@@ -297,6 +360,59 @@ Sometimes the Sidekiq server shuts down before it can send metrics, that were ge
297
360
  end
298
361
  ```
299
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
+
392
+ #### Shoryuken metrics
393
+
394
+ For Shoryuken metrics (how many jobs ran? how many failed? how long did they take? how many were restarted?)
395
+
396
+ ```ruby
397
+ Shoryuken.configure_server do |config|
398
+ config.server_middleware do |chain|
399
+ require 'prometheus_exporter/instrumentation'
400
+ chain.add PrometheusExporter::Instrumentation::Shoryuken
401
+ end
402
+ end
403
+ ```
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
+
300
416
  #### Delayed Job plugin
301
417
 
302
418
  In an initializer:
@@ -308,6 +424,19 @@ unless Rails.env == "test"
308
424
  end
309
425
  ```
310
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
+
311
440
  #### Hutch Message Processing Tracer
312
441
 
313
442
  Capture [Hutch](https://github.com/gocardless/hutch) metrics (how many jobs ran? how many failed? how long did they take?)
@@ -319,6 +448,16 @@ unless Rails.env == "test"
319
448
  end
320
449
  ```
321
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
+
322
461
  #### Instrumenting Request Queueing Time
323
462
 
324
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).
@@ -343,6 +482,20 @@ after_worker_boot do
343
482
  end
344
483
  ```
345
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
+
346
499
  ### Unicorn process metrics
347
500
 
348
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)
@@ -358,6 +511,14 @@ prometheus_exporter --unicorn-master /var/run/unicorn.pid --unicorn-listen-addre
358
511
 
359
512
  Note: You must install the `raindrops` gem in your `Gemfile` or locally.
360
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
+
361
522
  ### Custom type collectors
362
523
 
363
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.
@@ -526,6 +687,26 @@ ruby_web_requests{hostname="app-server-01",route="test/route"} 1
526
687
  ruby_web_requests{hostname="app-server-01"} 1
527
688
  ```
528
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
+
529
710
  ### Client default labels
530
711
 
531
712
  You can specify a default label for instrumentation metrics sent by a specific client. For example:
@@ -545,6 +726,9 @@ Will result in:
545
726
  http_requests_total{controller="home","action"="index",service="app-server-01",app_name="app-01"} 2
546
727
  http_requests_total{service="app-server-01",app_name="app-01"} 1
547
728
  ```
729
+ ### Client default host
730
+
731
+ By default, `PrometheusExporter::Client.default` connects to `localhost:9394`. If your setup requires this (e.g. when using `docker-compose`), you can change the default host and port by setting the environment variables `PROMETHEUS_EXPORTER_HOST` and `PROMETHEUS_EXPORTER_PORT`.
548
732
 
549
733
  ## Transport concerns
550
734
 
@@ -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"
@@ -19,6 +20,12 @@ def run
19
20
  "Port exporter should listen on (default: #{PrometheusExporter::DEFAULT_PORT})") do |o|
20
21
  options[:port] = o.to_i
21
22
  end
23
+ opt.on('-b',
24
+ '--bind STRING',
25
+ String,
26
+ "IP address exporter should listen on (default: #{PrometheusExporter::DEFAULT_BIND_ADDRESS})") do |o|
27
+ options[:bind] = o.to_s
28
+ end
22
29
  opt.on('-t',
23
30
  '--timeout INTEGER',
24
31
  Integer,
@@ -28,6 +35,9 @@ def run
28
35
  opt.on('--prefix METRIC_PREFIX', "Prefix to apply to all metrics (default: #{PrometheusExporter::DEFAULT_PREFIX})") do |o|
29
36
  options[:prefix] = o.to_s
30
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
31
41
  opt.on('-c', '--collector FILE', String, "(optional) Custom collector to run") do |o|
32
42
  custom_collector_filename = o.to_s
33
43
  end
@@ -81,7 +91,7 @@ def run
81
91
 
82
92
  runner = PrometheusExporter::Server::Runner.new(options)
83
93
 
84
- puts "#{Time.now} Starting prometheus exporter on port #{runner.port}"
94
+ puts "#{Time.now} Starting prometheus exporter on #{runner.bind}:#{runner.port}"
85
95
  runner.start
86
96
  sleep
87
97
  end
@@ -7,7 +7,9 @@ require "thread"
7
7
  module PrometheusExporter
8
8
  # per: https://github.com/prometheus/prometheus/wiki/Default-port-allocations
9
9
  DEFAULT_PORT = 9394
10
+ DEFAULT_BIND_ADDRESS = 'localhost'
10
11
  DEFAULT_PREFIX = 'ruby_'
12
+ DEFAULT_LABEL = {}
11
13
  DEFAULT_TIMEOUT = 2
12
14
 
13
15
  class OjCompat
@@ -19,6 +21,17 @@ module PrometheusExporter
19
21
  end
20
22
  end
21
23
 
24
+ def self.hostname
25
+ @hostname ||=
26
+ begin
27
+ require 'socket'
28
+ Socket.gethostname
29
+ rescue => e
30
+ STDERR.puts "Unable to lookup hostname #{e}"
31
+ "unknown-host"
32
+ end
33
+ end
34
+
22
35
  def self.detect_json_serializer(preferred)
23
36
  if preferred.nil?
24
37
  preferred = :oj if has_oj?
@@ -53,7 +53,14 @@ module PrometheusExporter
53
53
  MAX_SOCKET_AGE = 25
54
54
  MAX_QUEUE_SIZE = 10_000
55
55
 
56
- def initialize(host: 'localhost', port: PrometheusExporter::DEFAULT_PORT, max_queue_size: nil, thread_sleep: 0.5, json_serializer: nil, custom_labels: nil)
56
+ def initialize(
57
+ host: ENV.fetch('PROMETHEUS_EXPORTER_HOST', 'localhost'),
58
+ port: ENV.fetch('PROMETHEUS_EXPORTER_PORT', PrometheusExporter::DEFAULT_PORT),
59
+ max_queue_size: nil,
60
+ thread_sleep: 0.5,
61
+ json_serializer: nil,
62
+ custom_labels: nil
63
+ )
57
64
  @metrics = []
58
65
 
59
66
  @queue = Queue.new
@@ -4,8 +4,10 @@ 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"
10
11
  require_relative "instrumentation/unicorn"
11
12
  require_relative "instrumentation/active_record"
13
+ require_relative "instrumentation/shoryuken"
@@ -51,17 +51,6 @@ module PrometheusExporter::Instrumentation
51
51
  def initialize(metric_labels, config_labels)
52
52
  @metric_labels = metric_labels
53
53
  @config_labels = config_labels
54
- @hostname = nil
55
- end
56
-
57
- def hostname
58
- @hostname ||=
59
- begin
60
- `hostname`.strip
61
- rescue => e
62
- STDERR.puts "Unable to lookup hostname #{e}"
63
- "unknown-host"
64
- end
65
54
  end
66
55
 
67
56
  def collect
@@ -87,7 +76,7 @@ module PrometheusExporter::Instrumentation
87
76
  metric = {
88
77
  pid: pid,
89
78
  type: "active_record",
90
- hostname: hostname,
79
+ hostname: ::PrometheusExporter.hostname,
91
80
  metric_labels: labels
92
81
  }
93
82
  metric.merge!(pool.stat)
@@ -3,6 +3,8 @@
3
3
  # collects stats from currently running process
4
4
  module PrometheusExporter::Instrumentation
5
5
  class Process
6
+ @thread = nil if !defined?(@thread)
7
+
6
8
  def self.start(client: nil, type: "ruby", frequency: 30, labels: nil)
7
9
 
8
10
  metric_labels =
@@ -42,24 +44,13 @@ module PrometheusExporter::Instrumentation
42
44
 
43
45
  def initialize(metric_labels)
44
46
  @metric_labels = metric_labels
45
- @hostname = nil
46
- end
47
-
48
- def hostname
49
- @hostname ||=
50
- begin
51
- `hostname`.strip
52
- rescue => e
53
- STDERR.puts "Unable to lookup hostname #{e}"
54
- "unknown-host"
55
- end
56
47
  end
57
48
 
58
49
  def collect
59
50
  metric = {}
60
51
  metric[:type] = "process"
61
52
  metric[:metric_labels] = @metric_labels
62
- metric[:hostname] = hostname
53
+ metric[:hostname] = ::PrometheusExporter.hostname
63
54
  collect_gc_stats(metric)
64
55
  collect_v8_stats(metric)
65
56
  collect_process_stats(metric)
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrometheusExporter::Instrumentation
4
+ class Shoryuken
5
+
6
+ def initialize(client: nil)
7
+ @client = client || PrometheusExporter::Client.default
8
+ end
9
+
10
+ def call(worker, queue, msg, body)
11
+ success = false
12
+ start = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
13
+ result = yield
14
+ success = true
15
+ result
16
+ rescue ::Shoryuken::Shutdown => e
17
+ shutdown = true
18
+ raise e
19
+ ensure
20
+ duration = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start
21
+ @client.send_json(
22
+ type: "shoryuken",
23
+ queue: queue,
24
+ name: worker.class.name,
25
+ success: success,
26
+ shutdown: shutdown,
27
+ duration: duration
28
+ )
29
+ end
30
+ end
31
+ end
@@ -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
@@ -2,6 +2,10 @@
2
2
 
3
3
  module PrometheusExporter::Metric
4
4
  class Base
5
+
6
+ @default_prefix = nil if !defined?(@default_prefix)
7
+ @default_labels = nil if !defined?(@default_labels)
8
+
5
9
  # prefix applied to all metrics
6
10
  def self.default_prefix=(name)
7
11
  @default_prefix = name
@@ -38,6 +42,10 @@ module PrometheusExporter::Metric
38
42
  raise "Not implemented"
39
43
  end
40
44
 
45
+ def to_h
46
+ raise "Not implemented"
47
+ end
48
+
41
49
  def from_json(json)
42
50
  json = JSON.parse(json) if String === json
43
51
  @name = json["name"]
@@ -23,6 +23,14 @@ module PrometheusExporter::Metric
23
23
  end.join("\n")
24
24
  end
25
25
 
26
+ def to_h
27
+ @data.dup
28
+ end
29
+
30
+ def remove(labels)
31
+ @data.delete(labels)
32
+ end
33
+
26
34
  def observe(increment = 1, labels = {})
27
35
  @data[labels] ||= 0
28
36
  @data[labels] += increment
@@ -23,6 +23,14 @@ module PrometheusExporter::Metric
23
23
  @data = {}
24
24
  end
25
25
 
26
+ def to_h
27
+ @data.dup
28
+ end
29
+
30
+ def remove(labels)
31
+ @data.delete(labels)
32
+ end
33
+
26
34
  def observe(value, labels = {})
27
35
  if value.nil?
28
36
  data.delete(labels)
@@ -17,6 +17,22 @@ module PrometheusExporter::Metric
17
17
  @observations = {}
18
18
  end
19
19
 
20
+ def to_h
21
+ data = {}
22
+ @observations.each do |labels, buckets|
23
+ count = @counts[labels]
24
+ sum = @sums[labels]
25
+ data[labels] = { "count" => count, "sum" => sum }
26
+ end
27
+ data
28
+ end
29
+
30
+ def remove(labels)
31
+ @observations.delete(labels)
32
+ @counts.delete(labels)
33
+ @sums.delete(labels)
34
+ end
35
+
20
36
  def type
21
37
  "histogram"
22
38
  end
@@ -22,6 +22,23 @@ module PrometheusExporter::Metric
22
22
  @sums = {}
23
23
  end
24
24
 
25
+ def to_h
26
+ data = {}
27
+ calculate_all_quantiles.each do |labels, quantiles|
28
+ count = @counts[labels]
29
+ sum = @sums[labels]
30
+ data[labels] = { "count" => count, "sum" => sum }
31
+ end
32
+ data
33
+ end
34
+
35
+ def remove(labels)
36
+ @counts.delete(labels)
37
+ @sums.delete(labels)
38
+ @buffers[0].delete(labels)
39
+ @buffers[1].delete(labels)
40
+ end
41
+
25
42
  def type
26
43
  "summary"
27
44
  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"
@@ -14,3 +15,4 @@ require_relative "server/puma_collector"
14
15
  require_relative "server/hutch_collector"
15
16
  require_relative "server/unicorn_collector"
16
17
  require_relative "server/active_record_collector"
18
+ require_relative "server/shoryuken_collector"
@@ -27,6 +27,7 @@ module PrometheusExporter::Server
27
27
 
28
28
  @active_record_metrics.map do |m|
29
29
  metric_key = (m["metric_labels"] || {}).merge("pid" => m["pid"])
30
+ metric_key.merge!(m["custom_labels"]) if m["custom_labels"]
30
31
 
31
32
  ACTIVE_RECORD_GAUGES.map do |k, help|
32
33
  k = k.to_s
@@ -13,11 +13,13 @@ 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)
19
20
  register_collector(UnicornCollector.new)
20
21
  register_collector(ActiveRecordCollector.new)
22
+ register_collector(ShoryukenCollector.new)
21
23
  end
22
24
 
23
25
  def register_collector(collector)
@@ -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"
@@ -2,6 +2,12 @@
2
2
 
3
3
  module PrometheusExporter::Server
4
4
  class HutchCollector < TypeCollector
5
+ def initialize
6
+ @hutch_jobs_total = nil
7
+ @hutch_job_duration_seconds = nil
8
+ @hutch_jobs_total = nil
9
+ @hutch_failed_jobs_total = nil
10
+ end
5
11
 
6
12
  def type
7
13
  "hutch"
@@ -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
 
@@ -32,73 +40,54 @@ module PrometheusExporter::Server
32
40
  )
33
41
  end
34
42
 
35
- server = server_class.new port: port, collector: collector, timeout: timeout, verbose: verbose
43
+ server = server_class.new port: port, bind: bind, collector: collector, timeout: timeout, verbose: verbose
36
44
  server.start
37
45
  end
38
46
 
39
- def prefix=(prefix)
40
- @prefix = prefix
41
- end
47
+ attr_accessor :unicorn_listen_address, :unicorn_pid_file
48
+ attr_writer :prefix, :port, :bind, :collector_class, :type_collectors, :timeout, :verbose, :server_class, :label
42
49
 
43
50
  def prefix
44
51
  @prefix || PrometheusExporter::DEFAULT_PREFIX
45
52
  end
46
53
 
47
- def port=(port)
48
- @port = port
49
- end
50
-
51
54
  def port
52
55
  @port || PrometheusExporter::DEFAULT_PORT
53
56
  end
54
57
 
55
- def collector_class=(collector_class)
56
- @collector_class = collector_class
58
+ def bind
59
+ @bind || PrometheusExporter::DEFAULT_BIND_ADDRESS
57
60
  end
58
61
 
59
62
  def collector_class
60
63
  @collector_class || PrometheusExporter::Server::Collector
61
64
  end
62
65
 
63
- def type_collectors=(type_collectors)
64
- @type_collectors = type_collectors
65
- end
66
-
67
66
  def type_collectors
68
67
  @type_collectors || []
69
68
  end
70
69
 
71
- def timeout=(timeout)
72
- @timeout = timeout
73
- end
74
-
75
70
  def timeout
76
71
  @timeout || PrometheusExporter::DEFAULT_TIMEOUT
77
72
  end
78
73
 
79
- def verbose=(verbose)
80
- @verbose = verbose
81
- end
82
-
83
74
  def verbose
84
75
  return @verbose if defined? @verbose
85
76
  false
86
77
  end
87
78
 
88
- def server_class=(server_class)
89
- @server_class = server_class
90
- end
91
-
92
79
  def server_class
93
80
  @server_class || PrometheusExporter::Server::WebServer
94
81
  end
95
82
 
96
- attr_accessor :unicorn_listen_address, :unicorn_pid_file
97
-
98
83
  def collector
99
84
  @_collector ||= collector_class.new
100
85
  end
101
86
 
87
+ def label
88
+ @label ||= PrometheusExporter::DEFAULT_LABEL
89
+ end
90
+
102
91
  private
103
92
 
104
93
  def register_type_collectors
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrometheusExporter::Server
4
+ class ShoryukenCollector < TypeCollector
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
+
14
+ def type
15
+ "shoryuken"
16
+ end
17
+
18
+ def collect(obj)
19
+ default_labels = { job_name: obj['name'] , queue_name: obj['queue'] }
20
+ custom_labels = obj['custom_labels']
21
+ labels = custom_labels.nil? ? default_labels : default_labels.merge(custom_labels)
22
+
23
+ ensure_shoryuken_metrics
24
+ @shoryuken_job_duration_seconds.observe(obj["duration"], labels)
25
+ @shoryuken_jobs_total.observe(1, labels)
26
+ @shoryuken_restarted_jobs_total.observe(1, labels) if obj["shutdown"]
27
+ @shoryuken_failed_jobs_total.observe(1, labels) if !obj["success"] && !obj["shutdown"]
28
+ end
29
+
30
+ def metrics
31
+ if @shoryuken_jobs_total
32
+ [
33
+ @shoryuken_job_duration_seconds,
34
+ @shoryuken_jobs_total,
35
+ @shoryuken_restarted_jobs_total,
36
+ @shoryuken_failed_jobs_total,
37
+ ]
38
+ else
39
+ []
40
+ end
41
+ end
42
+
43
+ protected
44
+
45
+ def ensure_shoryuken_metrics
46
+ if !@shoryuken_jobs_total
47
+
48
+ @shoryuken_job_duration_seconds =
49
+ PrometheusExporter::Metric::Counter.new(
50
+ "shoryuken_job_duration_seconds", "Total time spent in shoryuken jobs.")
51
+
52
+ @shoryuken_jobs_total =
53
+ PrometheusExporter::Metric::Counter.new(
54
+ "shoryuken_jobs_total", "Total number of shoryuken jobs executed.")
55
+
56
+ @shoryuken_restarted_jobs_total =
57
+ PrometheusExporter::Metric::Counter.new(
58
+ "shoryuken_restarted_jobs_total", "Total number of shoryuken jobs that we restarted because of a shoryuken shutdown.")
59
+
60
+ @shoryuken_failed_jobs_total =
61
+ PrometheusExporter::Metric::Counter.new(
62
+ "shoryuken_failed_jobs_total", "Total number of failed shoryuken jobs.")
63
+
64
+ end
65
+ end
66
+ end
67
+ 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,46 @@
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
+ queue["labels"].merge!(object['custom_labels']) if object['custom_labels']
41
+ sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
42
+ sidekiq_metrics << queue
43
+ end
44
+ end
45
+ end
46
+ 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
@@ -9,7 +9,7 @@ module PrometheusExporter::Server
9
9
  class WebServer
10
10
  attr_reader :collector
11
11
 
12
- def initialize(port: , collector: nil, timeout: PrometheusExporter::DEFAULT_TIMEOUT, verbose: false)
12
+ def initialize(port: , bind: nil, collector: nil, timeout: PrometheusExporter::DEFAULT_TIMEOUT, verbose: false)
13
13
 
14
14
  @verbose = verbose
15
15
 
@@ -38,6 +38,7 @@ module PrometheusExporter::Server
38
38
 
39
39
  @server = WEBrick::HTTPServer.new(
40
40
  Port: port,
41
+ BindAddress: bind,
41
42
  Logger: logger,
42
43
  AccessLog: access_log,
43
44
  )
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PrometheusExporter
4
- VERSION = "0.4.16"
4
+ VERSION = '0.5.3'
5
5
  end
@@ -5,26 +5,28 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "prometheus_exporter/version"
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.name = "prometheus_exporter"
9
- spec.version = PrometheusExporter::VERSION
10
- spec.authors = ["Sam Saffron"]
11
- spec.email = ["sam.saffron@gmail.com"]
8
+ spec.name = "prometheus_exporter"
9
+ spec.version = PrometheusExporter::VERSION
10
+ spec.authors = ["Sam Saffron"]
11
+ spec.email = ["sam.saffron@gmail.com"]
12
12
 
13
- spec.summary = %q{Prometheus Exporter}
14
- spec.description = %q{Prometheus metric collector and exporter for Ruby}
15
- spec.homepage = "https://github.com/discourse/prometheus_exporter"
16
- spec.license = "MIT"
13
+ spec.summary = %q{Prometheus Exporter}
14
+ spec.description = %q{Prometheus metric collector and exporter for Ruby}
15
+ spec.homepage = "https://github.com/discourse/prometheus_exporter"
16
+ spec.license = "MIT"
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ spec.post_install_message = "prometheus_exporter will only bind to localhost by default as of v0.5"
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
21
  f.match(%r{^(test|spec|features|bin)/})
20
22
  end
21
- spec.bindir = "bin"
22
- spec.executables = ["prometheus_exporter"]
23
- spec.require_paths = ["lib"]
23
+ spec.bindir = "bin"
24
+ spec.executables = ["prometheus_exporter"]
25
+ spec.require_paths = ["lib"]
24
26
 
25
27
  spec.add_development_dependency "rubocop", ">= 0.69"
26
28
  spec.add_development_dependency "bundler", "> 1.16"
27
- spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rake", "~> 13.0"
28
30
  spec.add_development_dependency "minitest", "~> 5.0"
29
31
  spec.add_development_dependency "guard", "~> 2.0"
30
32
  spec.add_development_dependency "mini_racer", "~> 0.1"
@@ -32,6 +34,7 @@ Gem::Specification.new do |spec|
32
34
  spec.add_development_dependency "oj", "~> 3.0"
33
35
  spec.add_development_dependency "rack-test", "~> 0.8.3"
34
36
  spec.add_development_dependency "minitest-stub-const", "~> 0.6"
37
+ spec.add_development_dependency "rubocop-discourse", ">2"
35
38
  if !RUBY_ENGINE == 'jruby'
36
39
  spec.add_development_dependency "raindrops", "~> 0.19"
37
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.4.16
4
+ version: 0.5.3
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: 2019-11-03 00:00:00.000000000 Z
11
+ date: 2020-07-29 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: '10.0'
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: '10.0'
54
+ version: '13.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rubocop-discourse
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">"
158
+ - !ruby/object:Gem::Version
159
+ version: '2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">"
165
+ - !ruby/object:Gem::Version
166
+ version: '2'
153
167
  description: Prometheus metric collector and exporter for Ruby
154
168
  email:
155
169
  - sam.saffron@gmail.com
@@ -180,7 +194,9 @@ files:
180
194
  - lib/prometheus_exporter/instrumentation/method_profiler.rb
181
195
  - lib/prometheus_exporter/instrumentation/process.rb
182
196
  - lib/prometheus_exporter/instrumentation/puma.rb
197
+ - lib/prometheus_exporter/instrumentation/shoryuken.rb
183
198
  - lib/prometheus_exporter/instrumentation/sidekiq.rb
199
+ - lib/prometheus_exporter/instrumentation/sidekiq_queue.rb
184
200
  - lib/prometheus_exporter/instrumentation/unicorn.rb
185
201
  - lib/prometheus_exporter/metric.rb
186
202
  - lib/prometheus_exporter/metric/base.rb
@@ -198,7 +214,9 @@ files:
198
214
  - lib/prometheus_exporter/server/process_collector.rb
199
215
  - lib/prometheus_exporter/server/puma_collector.rb
200
216
  - lib/prometheus_exporter/server/runner.rb
217
+ - lib/prometheus_exporter/server/shoryuken_collector.rb
201
218
  - lib/prometheus_exporter/server/sidekiq_collector.rb
219
+ - lib/prometheus_exporter/server/sidekiq_queue_collector.rb
202
220
  - lib/prometheus_exporter/server/type_collector.rb
203
221
  - lib/prometheus_exporter/server/unicorn_collector.rb
204
222
  - lib/prometheus_exporter/server/web_collector.rb
@@ -209,7 +227,8 @@ homepage: https://github.com/discourse/prometheus_exporter
209
227
  licenses:
210
228
  - MIT
211
229
  metadata: {}
212
- post_install_message:
230
+ post_install_message: prometheus_exporter will only bind to localhost by default as
231
+ of v0.5
213
232
  rdoc_options: []
214
233
  require_paths:
215
234
  - lib
@@ -225,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
244
  version: '0'
226
245
  requirements: []
227
246
  rubygems_version: 3.0.3
228
- signing_key:
247
+ signing_key:
229
248
  specification_version: 4
230
249
  summary: Prometheus Exporter
231
250
  test_files: []