tpt-rails 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0669d857b54eed34690e1f47f44c7b8fde75a7ddc612dec36db7fe3cb96e7d24'
4
- data.tar.gz: 507c33fe3739bd57ff55ea7d42508f6a5394df1b7d5be1fcaf27f3beb8d792fe
3
+ metadata.gz: 8f34cc827a621a48f4a71602ddf6de4c8da4738a1644708136cb5d0e716795be
4
+ data.tar.gz: 165dbfd4ffc8e3a149ae0c4a88600ee39319b21ba99882846902ec7d1511fd74
5
5
  SHA512:
6
- metadata.gz: 6ed1fa381014e4baad4c6cd3919dc1069735c19b7ddb225ae920b6bf746bdcfa02bb21badd8967876f176ee26cd27565c4e9f67240255d024f701aaeff9ab2e8
7
- data.tar.gz: da2721a6091ecc9e49afec62450a66b576ab31a08e17a044110bee307b8218522a085f2b1b86aad65cf1d8021c0db6bafbf6c2eb238ebe22172151a261ca92f9
6
+ metadata.gz: a9a6507480b7e46bee217c524c243b89c7994135cd06c1353e30b97fa4b57088cf6dcfac699f1bd10407da15fd0d1c872922bf9ad6d52d4d8a1b8680926da1fc
7
+ data.tar.gz: bcf18231087259a786e1254c3d81520f383163928043cf42415a0ab4e0af199e28b8aea695ebfa9c2d660c9e5a1e847ddfcb0d0b99a6effd00ebfc3da11d3934
data/README.md CHANGED
@@ -100,6 +100,18 @@ Tpt::Rails provides the following endpoint:
100
100
 
101
101
  This endpoint reports an error via `Tpt::Rails.report` and emits a metric to Datadog.
102
102
 
103
+ ### Puma instrumentation
104
+
105
+ Add the following to `config/puma.rb` to have Puma metrics sent to Datadog:
106
+
107
+ ```ruby
108
+ before_fork do
109
+ Tpt::Rails::PumaStatsCollector.run(metrics_client: Tpt::Rails.statsd)
110
+ end
111
+ ```
112
+
113
+ Note: this currently only collects metrics when running Puma in _clustered_ mode (i.e. w/ more than one worker)
114
+
103
115
  ## Developing this Gem
104
116
 
105
117
  ### Running tests
@@ -70,13 +70,14 @@ service:
70
70
  resources:
71
71
  # requests is guaranteed. kubernetes will only put your pod on a node where it can guarantee these
72
72
  # amounts.
73
- requests:
74
- memory: 256Mi
75
- cpu: 200m
76
- # limits is when your pod gets killed for using too many resources
77
- limits:
73
+ requests: &requests
78
74
  memory: 512Mi
79
- cpu: 1
75
+ cpu: 500m
76
+ # limits is when your pod gets killed for using too many resources. normally these should be set
77
+ # the same as the "requests" limit, but if you have a unique workload that requires burstable
78
+ # limits then consult with CloudOps
79
+ limits:
80
+ *requests
80
81
 
81
82
  app:
82
83
  # this configures your service to be available at <%= Tpt::Rails.app_name %>.<ingress_dns_name>
@@ -6,6 +6,7 @@ end
6
6
  require 'tpt/rails/engine'
7
7
  require 'tpt/rails/internal'
8
8
  require 'tpt/rails/config'
9
+ require 'tpt/rails/puma_stats_collector'
9
10
 
10
11
  module Tpt::Rails
11
12
  class NotConfigured < StandardError; end
@@ -0,0 +1,86 @@
1
+ module Tpt::Rails::PumaStatsCollector # :nodoc:
2
+ class PumaStats
3
+ def initialize(stats)
4
+ @stats = JSON.parse(stats, symbolize_names: true)
5
+ end
6
+
7
+ def clustered?
8
+ @stats.has_key?(:workers)
9
+ end
10
+
11
+ def workers
12
+ @stats.fetch(:workers, 1)
13
+ end
14
+
15
+ def booted_workers
16
+ @stats.fetch(:booted_workers, 1)
17
+ end
18
+
19
+ def running
20
+ get_stat(:running)
21
+ end
22
+
23
+ def backlog
24
+ get_stat(:backlog)
25
+ end
26
+
27
+ def pool_capacity
28
+ get_stat(:pool_capacity)
29
+ end
30
+
31
+ def max_threads
32
+ get_stat(:max_threads)
33
+ end
34
+
35
+ def to_s
36
+ {
37
+ workers: workers,
38
+ booted_workers: booted_workers,
39
+ running: running,
40
+ backlog: backlog,
41
+ pool_capacity: pool_capacity,
42
+ max_threads: max_threads
43
+ }.to_json
44
+ end
45
+
46
+ private
47
+ def get_stat(name)
48
+ if clustered?
49
+ @stats[:worker_status].map { |s| s[:last_status].fetch(name, 0) }.sum
50
+ else
51
+ @stats.fetch(name, 0)
52
+ end
53
+ end
54
+ end
55
+
56
+ class << self
57
+ def run(metrics_client:, start_delay: 10, collect_interval: 30)
58
+ Thread.new do
59
+ # Give Puma time to start
60
+ sleep start_delay
61
+
62
+ # Get pod name if set
63
+ pod_name = ENV["KUBE_POD"]
64
+
65
+ loop do
66
+ begin
67
+ stats = PumaStats.new(Puma.stats)
68
+
69
+ tags = []
70
+ # Add pod_name tag if set
71
+ tags << "pod_name:#{pod_name}" if pod_name
72
+
73
+ metrics_client.gauge("puma.workers", stats.workers, tags: tags)
74
+ metrics_client.gauge("puma.booted_workers", stats.booted_workers, tags: tags)
75
+ metrics_client.gauge("puma.running", stats.running, tags: tags)
76
+ metrics_client.gauge("puma.backlog", stats.backlog, tags: tags)
77
+ metrics_client.gauge("puma.pool_capacity", stats.pool_capacity, tags: tags)
78
+ metrics_client.gauge("puma.max_threads", stats.max_threads, tags: tags)
79
+ end
80
+
81
+ sleep collect_interval
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -1,5 +1,5 @@
1
1
  module Tpt
2
2
  module Rails
3
- VERSION = '1.1.0'
3
+ VERSION = '1.2.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tpt-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TpT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-28 00:00:00.000000000 Z
11
+ date: 2020-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -126,6 +126,7 @@ files:
126
126
  - lib/tpt/rails/internal/datadog.rb
127
127
  - lib/tpt/rails/internal/error_reporter.rb
128
128
  - lib/tpt/rails/internal/health_checks.rb
129
+ - lib/tpt/rails/puma_stats_collector.rb
129
130
  - lib/tpt/rails/version.rb
130
131
  homepage: https://github.com/TeachersPayTeachers/tpt-rails
131
132
  licenses: