prometheus_exporter 0.5.1 → 0.8.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +42 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +7 -1
  5. data/Appraisals +10 -0
  6. data/CHANGELOG +36 -3
  7. data/README.md +278 -5
  8. data/bin/prometheus_exporter +21 -0
  9. data/gemfiles/.bundle/config +2 -0
  10. data/gemfiles/ar_60.gemfile +5 -0
  11. data/gemfiles/ar_61.gemfile +7 -0
  12. data/lib/prometheus_exporter.rb +2 -0
  13. data/lib/prometheus_exporter/client.rb +27 -3
  14. data/lib/prometheus_exporter/instrumentation.rb +2 -0
  15. data/lib/prometheus_exporter/instrumentation/active_record.rb +14 -7
  16. data/lib/prometheus_exporter/instrumentation/delayed_job.rb +3 -2
  17. data/lib/prometheus_exporter/instrumentation/method_profiler.rb +2 -1
  18. data/lib/prometheus_exporter/instrumentation/process.rb +2 -0
  19. data/lib/prometheus_exporter/instrumentation/puma.rb +16 -4
  20. data/lib/prometheus_exporter/instrumentation/resque.rb +40 -0
  21. data/lib/prometheus_exporter/instrumentation/sidekiq.rb +44 -3
  22. data/lib/prometheus_exporter/instrumentation/sidekiq_queue.rb +50 -0
  23. data/lib/prometheus_exporter/metric/base.rb +4 -0
  24. data/lib/prometheus_exporter/metric/counter.rb +4 -0
  25. data/lib/prometheus_exporter/metric/gauge.rb +4 -0
  26. data/lib/prometheus_exporter/metric/histogram.rb +6 -0
  27. data/lib/prometheus_exporter/metric/summary.rb +7 -0
  28. data/lib/prometheus_exporter/middleware.rb +40 -17
  29. data/lib/prometheus_exporter/server.rb +2 -0
  30. data/lib/prometheus_exporter/server/active_record_collector.rb +3 -1
  31. data/lib/prometheus_exporter/server/collector.rb +2 -0
  32. data/lib/prometheus_exporter/server/delayed_job_collector.rb +20 -8
  33. data/lib/prometheus_exporter/server/hutch_collector.rb +6 -0
  34. data/lib/prometheus_exporter/server/puma_collector.rb +9 -1
  35. data/lib/prometheus_exporter/server/resque_collector.rb +54 -0
  36. data/lib/prometheus_exporter/server/runner.rb +24 -2
  37. data/lib/prometheus_exporter/server/shoryuken_collector.rb +8 -0
  38. data/lib/prometheus_exporter/server/sidekiq_collector.rb +11 -2
  39. data/lib/prometheus_exporter/server/sidekiq_queue_collector.rb +46 -0
  40. data/lib/prometheus_exporter/server/web_collector.rb +7 -5
  41. data/lib/prometheus_exporter/server/web_server.rb +29 -17
  42. data/lib/prometheus_exporter/version.rb +1 -1
  43. data/prometheus_exporter.gemspec +9 -5
  44. metadata +67 -17
  45. data/.travis.yml +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4855e62023cc91a24d7f604765a4c34c3cc652421e2f60d6041b8b87376dd74f
4
- data.tar.gz: 9772f78ab97d6ae4218afefc353660f1c162df5c801aca60f326e0eeda1894c9
3
+ metadata.gz: 562647915cd81e672056a83fc79a031d2a0ebb2b4a7a5e32f5786ae5c7d480a7
4
+ data.tar.gz: 525e28d0cbe4e853c91bb463970fd231b134dba6b5a190c61a2ff7710074fb7b
5
5
  SHA512:
6
- metadata.gz: 2e1450823b8b770a2538891a4315451e5be4dbe6bc3ffe77ba0b0081c6f436b5a2cfe189c4e4c77442bad72180f0ba6144c074378b55c266d5e6c33b4aa40f42
7
- data.tar.gz: 62457c9bdfaedfc02acbdfd0e472790a4ba5b5c124778f8f58173fc0b98f442d7d23e71fd16345334fe71778e46096559e7c2ae32c94255f155abb0dc3a92619
6
+ metadata.gz: 324b3b0acd1c97e8b5535dff8f57500b4dc3f2433456372c609accbc78d1baf839d82a1e38eabb543f043bbc9fefb401ab1460ba252ee8b9330fe0a91acffc1d
7
+ data.tar.gz: b2a0082d4e2431cc1f24f11a6af86d6965e2db7c93df1021ed58b38ff8651c84d1e8939b42a13b1b7cac60c9237435ff838a24918ed0ee18d13c3df2aece76d4
@@ -0,0 +1,42 @@
1
+ name: Test Exporter
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ schedule:
7
+ - cron: '0 0 * * 0' # weekly
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ name: Ruby ${{ matrix.ruby }}
13
+ strategy:
14
+ matrix:
15
+ ruby: ["2.7", "2.6", "2.5"]
16
+ steps:
17
+ - uses: actions/checkout@master
18
+ with:
19
+ fetch-depth: 1
20
+ - uses: actions/setup-ruby@v1
21
+ with:
22
+ ruby-version: ${{ matrix.ruby }}
23
+ - uses: actions/cache@v2
24
+ with:
25
+ path: vendor/bundle
26
+ key: ${{ runner.os }}-${{ matrix.ruby }}-gems-v2-${{ hashFiles('**/Gemfile.lock') }}
27
+ restore-keys: |
28
+ ${{ runner.os }}-${{ matrix.ruby }}-gems-v2-
29
+ - name: Setup gems
30
+ run: |
31
+ gem install bundler
32
+ # for Ruby <= 2.6 , details https://github.com/rubygems/rubygems/issues/3284
33
+ gem update --system 3.0.8 && gem update --system
34
+ bundle config path vendor/bundle
35
+ bundle install --jobs 4
36
+ bundle exec appraisal install
37
+ - name: Rubocop
38
+ run: bundle exec rubocop
39
+ - name: install gems
40
+ run: bundle exec appraisal bundle
41
+ - name: Run tests
42
+ run: bundle exec appraisal rake
data/.gitignore CHANGED
@@ -7,5 +7,7 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  Gemfile.lock
10
+ /gemfiles/*.gemfile.lock
11
+
10
12
 
11
13
  .rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml
data/.rubocop.yml CHANGED
@@ -1 +1,7 @@
1
- inherit_from: https://raw.githubusercontent.com/discourse/discourse/master/.rubocop.yml
1
+ inherit_gem:
2
+ rubocop-discourse: default.yml
3
+
4
+ AllCops:
5
+ Exclude:
6
+ - 'gemfiles/**/*'
7
+ - 'vendor/**/*'
data/Appraisals ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise "ar-60" do
4
+ # we are using this version as default in gemspec
5
+ # gem "activerecord", "~> 6.0.0"
6
+ end
7
+
8
+ appraise "ar-61" do
9
+ gem "activerecord", "~> 6.1.1"
10
+ end
data/CHANGELOG CHANGED
@@ -1,13 +1,46 @@
1
- 0.5.1 - 25-02-2019
1
+ 0.8.0 - 05-07-2021
2
+
3
+ - FIX: handle ThreadError more gracefully in cases where process shuts down
4
+ - FEATURE: add job_name and queue_name labels to delayed job metrics
5
+ - FEATURE: always scope puma metrics on hostname in collector
6
+ - FEATURE: add customizable labels option to puma collector
7
+ - FEATURE: support for Rescue
8
+ - DEV: Remove support for EOL ruby 2.5
9
+ - FIX: Add source location to MethodProfiler patches
10
+ - FEATURE: Improve Active Record instrumentation
11
+ - FEATURE: Support HTTP_X_AMZN_TRACE_ID when supplied
12
+
13
+ 0.7.0 - 29-12-2020
14
+
15
+ - Dev: Removed support from EOL rubies, only 2.5, 2.6, 2.7 and 3.0 are supported now.
16
+ - Dev: Better support for Ruby 3.0, explicitly depending on webrick
17
+ - Dev: Rails 6.1 instrumentation support
18
+ - FEATURE: clean pattern for overriding middleware labels was introduced (in README)
19
+ - Fix: Better support for forking
20
+
21
+ 0.6.0 - 17-11-2020
22
+
23
+ - FEATURE: add support for basic-auth in the prometheus_exporter web server
24
+
25
+ 0.5.3 - 29-07-2020
26
+
27
+ - FEATURE: added #remove to all metric types so users can remove specific labels if needed
28
+
29
+ 0.5.2 - 01-07-2020
30
+
31
+ - FEATURE: expanded instrumentation for sidekiq
32
+ - FEATURE: configurable default labels
33
+
34
+ 0.5.1 - 25-02-2020
2
35
 
3
36
  - FEATURE: Allow configuring the default client's host and port via environment variables
4
37
 
5
- 0.5.0 - 14-02-2019
38
+ 0.5.0 - 14-02-2020
6
39
 
7
40
  - Breaking change: listen only to localhost by default to prevent unintended insecure configuration
8
41
  - FIX: Avoid calling `hostname` aggressively, instead cache it on the exporter instance
9
42
 
10
- 0.4.17 - 13-01-2019
43
+ 0.4.17 - 13-01-2020
11
44
 
12
45
  - FEATURE: add support for `to_h` on all metrics which can be used to query existing key/values
13
46
 
data/README.md CHANGED
@@ -19,6 +19,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
19
19
  * [Hutch metrics](#hutch-message-processing-tracer)
20
20
  * [Puma metrics](#puma-metrics)
21
21
  * [Unicorn metrics](#unicorn-process-metrics)
22
+ * [Resque metrics](#resque-metrics)
22
23
  * [Custom type collectors](#custom-type-collectors)
23
24
  * [Multi process mode with custom collector](#multi-process-mode-with-custom-collector)
24
25
  * [GraphQL support](#graphql-support)
@@ -33,7 +34,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
33
34
 
34
35
  ## Requirements
35
36
 
36
- Minimum Ruby of version 2.3.0 is required, Ruby 2.2.0 is EOL as of 2018-03-31
37
+ Minimum Ruby of version 2.5.0 is required, Ruby 2.4.0 is EOL as of 2020-04-05
37
38
 
38
39
  ## Installation
39
40
 
@@ -190,6 +191,64 @@ Ensure you run the exporter in a monitored background process:
190
191
  $ bundle exec prometheus_exporter
191
192
  ```
192
193
 
194
+ #### Metrics collected by Rails integration middleware
195
+
196
+ | Type | Name | Description |
197
+ | --- | --- | --- |
198
+ | Counter | `http_requests_total` | Total HTTP requests from web app |
199
+ | Summary | `http_duration_seconds` | Time spent in HTTP reqs in seconds |
200
+ | Summary | `http_redis_duration_seconds`¹ | Time spent in HTTP reqs in Redis, in seconds |
201
+ | Summary | `http_sql_duration_seconds`² | Time spent in HTTP reqs in SQL in seconds |
202
+ | Summary | `http_queue_duration_seconds`³ | Time spent queueing the request in load balancer in seconds |
203
+
204
+ All metrics have a `controller` and an `action` label.
205
+ `http_requests_total` additionally has a (HTTP response) `status` label.
206
+
207
+ To add your own labels to the default metrics, create a subclass of `PrometheusExporter::Middleware`, override `custom_labels`, and use it in your initializer.
208
+ ```ruby
209
+ class MyMiddleware < PrometheusExporter::Middleware
210
+ def custom_labels(env)
211
+ labels = {}
212
+
213
+ if env['HTTP_X_PLATFORM']
214
+ labels['platform'] = env['HTTP_X_PLATFORM']
215
+ end
216
+
217
+ labels
218
+ end
219
+ end
220
+ ```
221
+
222
+ If you're not using Rails like framework, you can extend `PrometheusExporter::Middleware#default_labels` in a way to add more relevant labels.
223
+ For example you can mimic [prometheus-client](https://github.com/prometheus/client_ruby) labels with code like this:
224
+ ```ruby
225
+ class MyMiddleware < PrometheusExporter::Middleware
226
+ def default_labels(env, result)
227
+ status = (result && result[0]) || -1
228
+ path = [env["SCRIPT_NAME"], env["PATH_INFO"]].join
229
+ {
230
+ path: strip_ids_from_path(path),
231
+ method: env["REQUEST_METHOD"],
232
+ status: status
233
+ }
234
+ end
235
+
236
+ def strip_ids_from_path(path)
237
+ path
238
+ .gsub(%r{/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(/|$)}, '/:uuid\\1')
239
+ .gsub(%r{/\d+(/|$)}, '/:id\\1')
240
+ end
241
+ end
242
+ ```
243
+ That way you won't have all metrics labeled with `controller=other` and `action=other`, but have labels such as
244
+ ```
245
+ ruby_http_duration_seconds{path="/api/v1/teams/:id",method="GET",status="200",quantile="0.99"} 0.009880661998977303
246
+ ```
247
+
248
+ ¹) Only available when Redis is used.
249
+ ²) Only available when Mysql or PostgreSQL are used.
250
+ ³) Only available when [Instrumenting Request Queueing Time](#instrumenting-request-queueing-time) is set up.
251
+
193
252
  #### Activerecord Connection Pool Metrics
194
253
 
195
254
  This collects activerecord connection pool metrics.
@@ -244,6 +303,19 @@ Sidekiq.configure_server do |config|
244
303
  end
245
304
  ```
246
305
 
306
+ ##### Metrics collected by ActiveRecord Instrumentation
307
+
308
+ | Type | Name | Description |
309
+ | --- | --- | --- |
310
+ | Gauge | `active_record_connection_pool_connections` | Total connections in pool |
311
+ | Gauge | `active_record_connection_pool_busy` | Connections in use in pool |
312
+ | Gauge | `active_record_connection_pool_dead` | Dead connections in pool |
313
+ | Gauge | `active_record_connection_pool_idle` | Idle connections in pool |
314
+ | Gauge | `active_record_connection_pool_waiting` | Connection requests waiting |
315
+ | Gauge | `active_record_connection_pool_size` | Maximum allowed connection pool size |
316
+
317
+ 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.
318
+
247
319
  #### Per-process stats
248
320
 
249
321
  You may also be interested in per-process stats. This collects memory and GC stats:
@@ -260,11 +332,30 @@ end
260
332
  # in unicorn/puma/passenger be sure to run a new process instrumenter after fork
261
333
  after_fork do
262
334
  require 'prometheus_exporter/instrumentation'
263
- PrometheusExporter::Instrumentation::Process.start(type:"web")
335
+ PrometheusExporter::Instrumentation::Process.start(type: "web")
264
336
  end
265
337
 
266
338
  ```
267
339
 
340
+ ##### Metrics collected by Process Instrumentation
341
+
342
+ | Type | Name | Description |
343
+ | --- | --- | --- |
344
+ | Gauge | `heap_free_slots` | Free ruby heap slots |
345
+ | Gauge | `heap_live_slots` | Used ruby heap slots |
346
+ | Gauge | `v8_heap_size`* | Total JavaScript V8 heap size (bytes) |
347
+ | Gauge | `v8_used_heap_size`* | Total used JavaScript V8 heap size (bytes) |
348
+ | Gauge | `v8_physical_size`* | Physical size consumed by V8 heaps |
349
+ | Gauge | `v8_heap_count`* | Number of V8 contexts running |
350
+ | Gauge | `rss` | Total RSS used by process |
351
+ | Counter | `major_gc_ops_total` | Major GC operations by process |
352
+ | Counter | `minor_gc_ops_total` | Minor GC operations by process |
353
+ | Counter | `allocated_objects_total` | Total number of allocated objects by process |
354
+
355
+ _Metrics marked with * are only collected when `MiniRacer` is defined._
356
+
357
+ 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.
358
+
268
359
  #### Sidekiq metrics
269
360
 
270
361
  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 +370,17 @@ Sidekiq.configure_server do |config|
279
370
  end
280
371
  ```
281
372
 
373
+ To monitor Queue size and latency:
374
+
375
+ ```ruby
376
+ Sidekiq.configure_server do |config|
377
+ config.on :startup do
378
+ require 'prometheus_exporter/instrumentation'
379
+ PrometheusExporter::Instrumentation::SidekiqQueue.start
380
+ end
381
+ end
382
+ ```
383
+
282
384
  To monitor Sidekiq process info:
283
385
 
284
386
  ```ruby
@@ -300,6 +402,35 @@ Sometimes the Sidekiq server shuts down before it can send metrics, that were ge
300
402
  end
301
403
  ```
302
404
 
405
+ ##### Metrics collected by Sidekiq Instrumentation
406
+
407
+ **PrometheusExporter::Instrumentation::Sidekiq**
408
+ | Type | Name | Description |
409
+ | --- | --- | --- |
410
+ | Summary | `sidekiq_job_duration_seconds` | Time spent in sidekiq jobs |
411
+ | Counter | `sidekiq_jobs_total` | Total number of sidekiq jobs executed |
412
+ | Counter | `sidekiq_restarted_jobs_total` | Total number of sidekiq jobs that we restarted because of a sidekiq shutdown |
413
+ | Counter | `sidekiq_failed_jobs_total` | Total number of failed sidekiq jobs |
414
+
415
+ All metrics have a `job_name` label and a `queue` label.
416
+
417
+ **PrometheusExporter::Instrumentation::Sidekiq.death_handler**
418
+ | Type | Name | Description |
419
+ | --- | --- | --- |
420
+ | Counter | `sidekiq_dead_jobs_total` | Total number of dead sidekiq jobs |
421
+
422
+ This metric has a `job_name` label and a `queue` label.
423
+
424
+ **PrometheusExporter::Instrumentation::SidekiqQueue**
425
+ | Type | Name | Description |
426
+ | --- | --- | --- |
427
+ | Gauge | `sidekiq_queue_backlog_total` | Size of the sidekiq queue |
428
+ | Gauge | `sidekiq_queue_latency_seconds` | Latency of the sidekiq queue |
429
+
430
+ Both metrics will have a `queue` label with the name of the queue.
431
+
432
+ _See [Metrics collected by Process Instrumentation](#metrics-collected-by-process-instrumentation) for a list of metrics the Process instrumentation will produce._
433
+
303
434
  #### Shoryuken metrics
304
435
 
305
436
  For Shoryuken metrics (how many jobs ran? how many failed? how long did they take? how many were restarted?)
@@ -313,6 +444,17 @@ Shoryuken.configure_server do |config|
313
444
  end
314
445
  ```
315
446
 
447
+ ##### Metrics collected by Shoryuken Instrumentation
448
+
449
+ | Type | Name | Description |
450
+ | --- | --- | --- |
451
+ | Counter | `shoryuken_job_duration_seconds` | Total time spent in shoryuken jobs |
452
+ | Counter | `shoryuken_jobs_total` | Total number of shoryuken jobs executed |
453
+ | Counter | `shoryuken_restarted_jobs_total` | Total number of shoryuken jobs that we restarted because of a shoryuken shutdown |
454
+ | Counter | `shoryuken_failed_jobs_total` | Total number of failed shoryuken jobs |
455
+
456
+ All metrics have labels for `job_name` and `queue_name`.
457
+
316
458
  #### Delayed Job plugin
317
459
 
318
460
  In an initializer:
@@ -324,6 +466,21 @@ unless Rails.env == "test"
324
466
  end
325
467
  ```
326
468
 
469
+ ##### Metrics collected by Delayed Job Instrumentation
470
+
471
+ | Type | Name | Description | Labels |
472
+ | --- | --- | --- | --- |
473
+ | Counter | `delayed_job_duration_seconds` | Total time spent in delayed jobs | `job_name` |
474
+ | Counter | `delayed_jobs_total` | Total number of delayed jobs executed | `job_name` |
475
+ | Gauge | `delayed_jobs_enqueued` | Number of enqueued delayed jobs | - |
476
+ | Gauge | `delayed_jobs_pending` | Number of pending delayed jobs | - |
477
+ | Counter | `delayed_failed_jobs_total` | Total number failed delayed jobs executed | `job_name` |
478
+ | Counter | `delayed_jobs_max_attempts_reached_total` | Total number of delayed jobs that reached max attempts | - |
479
+ | Summary | `delayed_job_duration_seconds_summary` | Summary of the time it takes jobs to execute | `status` |
480
+ | Summary | `delayed_job_attempts_summary` | Summary of the amount of attempts it takes delayed jobs to succeed | - |
481
+
482
+ All metrics have labels for `job_name` and `queue_name`.
483
+
327
484
  #### Hutch Message Processing Tracer
328
485
 
329
486
  Capture [Hutch](https://github.com/gocardless/hutch) metrics (how many jobs ran? how many failed? how long did they take?)
@@ -335,13 +492,23 @@ unless Rails.env == "test"
335
492
  end
336
493
  ```
337
494
 
495
+ ##### Metrics collected by Hutch Instrumentation
496
+
497
+ | Type | Name | Description |
498
+ | --- | --- | --- |
499
+ | Counter | `hutch_job_duration_seconds` | Total time spent in hutch jobs |
500
+ | Counter | `hutch_jobs_total` | Total number of hutch jobs executed |
501
+ | Counter | `hutch_failed_jobs_total` | Total number failed hutch jobs executed |
502
+
503
+ All metrics have a `job_name` label.
504
+
338
505
  #### Instrumenting Request Queueing Time
339
506
 
340
507
  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).
341
508
 
342
509
  As this metric starts before `prometheus_exporter` can handle the request, you must add a specific HTTP header as early in your infrastructure as possible (we recommend your load balancer or reverse proxy).
343
510
 
344
- Configure your HTTP server / load balancer to add a header `X-Request-Start: t=<MSEC>` when passing the request upstream. For more information, please consult your software manual.
511
+ The Amazon Application Load Balancer [request tracing header](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html) is natively supported. If you are using another upstream entrypoint, you may configure your HTTP server / load balancer to add a header `X-Request-Start: t=<MSEC>` when passing the request upstream. For more information, please consult your software manual.
345
512
 
346
513
  Hint: we aim to be API-compatible with the big APM solutions, so if you've got requests queueing time configured for them, it should be expected to also work with `prometheus_exporter`.
347
514
 
@@ -359,6 +526,42 @@ after_worker_boot do
359
526
  end
360
527
  ```
361
528
 
529
+ #### Metrics collected by Puma Instrumentation
530
+
531
+ | Type | Name | Description |
532
+ | --- | --- | --- |
533
+ | Gauge | `puma_workers_total` | Number of puma workers |
534
+ | Gauge | `puma_booted_workers_total` | Number of puma workers booted |
535
+ | Gauge | `puma_old_workers_total` | Number of old puma workers |
536
+ | Gauge | `puma_running_threads_total` | Number of puma threads currently running |
537
+ | Gauge | `puma_request_backlog_total` | Number of requests waiting to be processed by a puma thread |
538
+ | Gauge | `puma_thread_pool_capacity_total` | Number of puma threads available at current scale |
539
+ | Gauge | `puma_max_threads_total` | Number of puma threads at available at max scale |
540
+
541
+ All metrics may have a `phase` label and all custom labels provided with the `labels` option.
542
+
543
+ ### Resque metrics
544
+
545
+ The resque metrics are using the `Resque.info` method, which queries Redis internally. To start monitoring your resque
546
+ installation, you'll need to start the instrumentation:
547
+
548
+ ```ruby
549
+ # e.g. config/initializers/resque.rb
550
+ require 'prometheus_exporter/instrumentation'
551
+ PrometheusExporter::Instrumentation::Resque.start
552
+ ```
553
+
554
+ #### Metrics collected by Resque Instrumentation
555
+
556
+ | Type | Name | Description |
557
+ | --- | --- | --- |
558
+ | Gauge | `processed_jobs_total` | Total number of processed Resque jobs |
559
+ | Gauge | `failed_jobs_total` | Total number of failed Resque jobs |
560
+ | Gauge | `pending_jobs_total` | Total number of pending Resque jobs |
561
+ | Gauge | `queues_total` | Total number of Resque queues |
562
+ | Gauge | `workers_total` | Total number of Resque workers running |
563
+ | Gauge | `working_total` | Total number of Resque workers working |
564
+
362
565
  ### Unicorn process metrics
363
566
 
364
567
  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 +577,14 @@ prometheus_exporter --unicorn-master /var/run/unicorn.pid --unicorn-listen-addre
374
577
 
375
578
  Note: You must install the `raindrops` gem in your `Gemfile` or locally.
376
579
 
580
+ #### Metrics collected by Unicorn Instrumentation
581
+
582
+ | Type | Name | Description |
583
+ | --- | --- | --- |
584
+ | Gauge | `unicorn_workers_total` | Number of unicorn workers |
585
+ | Gauge | `unicorn_active_workers_total` | Number of active unicorn workers |
586
+ | Gauge | `unicorn_request_backlog_total` | Number of requests waiting to be processed by a unicorn worker |
587
+
377
588
  ### Custom type collectors
378
589
 
379
590
  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.
@@ -432,8 +643,8 @@ Then you can collect the metrics you need on demand:
432
643
 
433
644
  ```ruby
434
645
  def metrics
435
- user_count_gague = PrometheusExporter::Metric::Gauge.new('user_count', 'number of users in the app')
436
- user_count_gague.observe User.count
646
+ user_count_gauge = PrometheusExporter::Metric::Gauge.new('user_count', 'number of users in the app')
647
+ user_count_gauge.observe User.count
437
648
  [user_count_gauge]
438
649
  end
439
650
  ```
@@ -542,6 +753,68 @@ ruby_web_requests{hostname="app-server-01",route="test/route"} 1
542
753
  ruby_web_requests{hostname="app-server-01"} 1
543
754
  ```
544
755
 
756
+ ### Exporter Process Configuration
757
+
758
+ When running the process for `prometheus_exporter` using `bin/prometheus_exporter`, there are several configurations that
759
+ can be passed in:
760
+
761
+ ```
762
+ Usage: prometheus_exporter [options]
763
+ -p, --port INTEGER Port exporter should listen on (default: 9394)
764
+ -b, --bind STRING IP address exporter should listen on (default: localhost)
765
+ -t, --timeout INTEGER Timeout in seconds for metrics endpoint (default: 2)
766
+ --prefix METRIC_PREFIX Prefix to apply to all metrics (default: ruby_)
767
+ --label METRIC_LABEL Label to apply to all metrics (default: {})
768
+ -c, --collector FILE (optional) Custom collector to run
769
+ -a, --type-collector FILE (optional) Custom type collectors to run in main collector
770
+ -v, --verbose
771
+ --auth FILE (optional) enable basic authentication using a htpasswd FILE
772
+ --realm REALM (optional) Use REALM for basic authentication (default: "Prometheus Exporter")
773
+ --unicorn-listen-address ADDRESS
774
+ (optional) Address where unicorn listens on (unix or TCP address)
775
+ --unicorn-master PID_FILE (optional) PID file of unicorn master process to monitor unicorn
776
+ ```
777
+
778
+ #### Example
779
+
780
+ The following will run the process at
781
+ - Port `8080` (default `9394`)
782
+ - Bind to `0.0.0.0` (default `localhost`)
783
+ - Timeout in `1 second` for metrics endpoint (default `2 seconds`)
784
+ - Metric prefix as `foo_` (default `ruby_`)
785
+ - Default labels as `{environment: "integration", foo: "bar"}`
786
+
787
+ ```bash
788
+ prometheus_exporter -p 8080 \
789
+ -b 0.0.0.0 \
790
+ -t 1 \
791
+ --label '{"environment": "integration", "foo": "bar"}' \
792
+ --prefix 'foo_'
793
+ ```
794
+
795
+ #### Enabling Basic Authentication
796
+
797
+ If you desire authentication on your `/metrics` route, you can enable basic authentication with the `--auth` option.
798
+
799
+ ```
800
+ $ prometheus_exporter --auth my-htpasswd-file
801
+ ```
802
+
803
+ Additionally, the `--realm` option may be used to provide a customized realm for the challenge request.
804
+
805
+ Notes:
806
+
807
+ * You will need to create a `htpasswd` formatted file before hand which contains one or more user:password entries
808
+ * Only the basic `crypt` encryption is currently supported
809
+
810
+ A simple `htpasswd` file can be created with the Apache `htpasswd` utility; e.g:
811
+
812
+ ```
813
+ $ htpasswd -cdb my-htpasswd-file my-user my-unencrypted-password
814
+ ```
815
+
816
+ This will create a file named `my-htpasswd-file` which is suitable for use the `--auth` option.
817
+
545
818
  ### Client default labels
546
819
 
547
820
  You can specify a default label for instrumentation metrics sent by a specific client. For example: