barnes 0.0.4 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/check_changelog.yml +12 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +19 -0
- data/Gemfile +2 -1
- data/README.md +7 -4
- data/Rakefile +3 -2
- data/barnes.gemspec +5 -3
- data/lib/barnes.rb +6 -1
- data/lib/barnes/instruments/puma_instrument.rb +51 -0
- data/lib/barnes/instruments/puma_stats_value.rb +49 -0
- data/lib/barnes/periodic.rb +4 -2
- data/lib/barnes/railtie.rb +1 -1
- data/lib/barnes/resource_usage.rb +4 -4
- data/lib/barnes/version.rb +1 -1
- metadata +39 -11
- data/lib/barnes/instruments/puma_backlog.rb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5afa9a13612433356ad5a2df69f6fa8e418bb2f202720f15da65145d0c7d40dc
|
4
|
+
data.tar.gz: 6b67b8ec0db255dacde33e74f1c36510db0a8859c67b8a465df6f5b6da26a803
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17e28cbca9e2a77a773d94ce06ccf46e2e2ca948482b408ac9f2a6fa13fa9401a186bb1067174d774b707c15a562f5b6c70b48163e41f5cb3152b36e1c190a5f
|
7
|
+
data.tar.gz: cde051f96eaf3b2dc8ef5eb1bfa943ef0b1dd694c40857f6cbe48cff4eb8274ed4749f1616582df27466b967d4b98be5987fc5673bda4f3d9f8adbbcba7250c8
|
@@ -0,0 +1,12 @@
|
|
1
|
+
name: Check Changelog
|
2
|
+
|
3
|
+
on: [pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v1
|
10
|
+
- name: Check that CHANGELOG is touched
|
11
|
+
run: |
|
12
|
+
cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## Master (unrleased)
|
2
|
+
|
3
|
+
## 0.0.8
|
4
|
+
|
5
|
+
- Fix warnings in Ruby 2.7
|
6
|
+
|
7
|
+
## 0.0.7
|
8
|
+
|
9
|
+
- Report when an app is using Puma
|
10
|
+
|
11
|
+
## 0.0.6
|
12
|
+
|
13
|
+
- Support Puma max threads, support Puma spawned threads
|
14
|
+
- Drop Puma backlog metric
|
15
|
+
|
16
|
+
## 0.0.5
|
17
|
+
|
18
|
+
- Support Puma pool capacity value #15
|
19
|
+
|
1
20
|
## 0.0.4
|
2
21
|
|
3
22
|
- Support Puma backlog #14
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,9 +4,9 @@ A fork of [trashed](https://github.com/basecamp/trashed) focused on Ruby metrics
|
|
4
4
|
|
5
5
|
## Setup
|
6
6
|
|
7
|
-
### Rails 5
|
7
|
+
### Rails 3, 4, 5, and 6
|
8
8
|
|
9
|
-
On Rails
|
9
|
+
On Rails 6 (and Rails 3 and 4 and 5), add this to your Gemfile:
|
10
10
|
|
11
11
|
```
|
12
12
|
gem "barnes"
|
@@ -32,7 +32,7 @@ Then run:
|
|
32
32
|
$ bundle install
|
33
33
|
```
|
34
34
|
|
35
|
-
In your
|
35
|
+
In your puma.rb file:
|
36
36
|
|
37
37
|
|
38
38
|
```ruby
|
@@ -42,6 +42,9 @@ require 'barnes'
|
|
42
42
|
Then you'll need to start the client with default values:
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
|
45
|
+
before_fork do
|
46
|
+
# worker configuration
|
47
|
+
Barnes.start
|
48
|
+
end
|
46
49
|
```
|
47
50
|
|
data/Rakefile
CHANGED
data/barnes.gemspec
CHANGED
@@ -21,12 +21,14 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.add_runtime_dependency 'statsd-ruby', '~> 1.1'
|
25
24
|
spec.required_ruby_version = '>= 2.2.0'
|
26
25
|
|
26
|
+
spec.add_runtime_dependency 'statsd-ruby', '~> 1.1'
|
27
27
|
spec.add_runtime_dependency 'multi_json', '~> 1'
|
28
28
|
|
29
|
-
spec.add_development_dependency '
|
29
|
+
spec.add_development_dependency 'rack', '~> 2'
|
30
|
+
spec.add_development_dependency 'rake', '>= 10'
|
30
31
|
spec.add_development_dependency 'minitest', '~> 5.3'
|
31
|
-
spec.add_development_dependency "
|
32
|
+
spec.add_development_dependency "puma", '~> 3.12'
|
33
|
+
spec.add_development_dependency "wait_for_it", '~> 0.1'
|
32
34
|
end
|
data/lib/barnes.rb
CHANGED
@@ -54,7 +54,12 @@ module Barnes
|
|
54
54
|
panels << Barnes::ResourceUsage.new(sample_rate)
|
55
55
|
end
|
56
56
|
|
57
|
-
Periodic.new
|
57
|
+
Periodic.new(
|
58
|
+
reporter: reporter,
|
59
|
+
sample_rate: sample_rate,
|
60
|
+
panels: panels,
|
61
|
+
debug: ENV['BARNES_DEBUG']
|
62
|
+
)
|
58
63
|
end
|
59
64
|
end
|
60
65
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'barnes/instruments/puma_stats_value'
|
4
|
+
module Barnes
|
5
|
+
module Instruments
|
6
|
+
class PumaInstrument
|
7
|
+
def initialize(sample_rate=nil)
|
8
|
+
@debug = ENV["BARNES_DEBUG_PUMA_STATS"]
|
9
|
+
@puma_has_stats = (defined?(::Puma) && ::Puma.respond_to?(:stats))
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid?
|
13
|
+
return false unless defined?(Puma)
|
14
|
+
return false unless ENV["DYNO"] && ENV["DYNO"].start_with?("web")
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
def start!(state)
|
19
|
+
require 'multi_json'
|
20
|
+
end
|
21
|
+
|
22
|
+
def json_stats
|
23
|
+
return {} unless @puma_has_stats
|
24
|
+
MultiJson.load(::Puma.stats || "{}")
|
25
|
+
|
26
|
+
# Puma loader has not been initialized yet
|
27
|
+
rescue NoMethodError => e
|
28
|
+
raise e unless e.message =~ /nil/
|
29
|
+
raise e unless e.message =~ /stats/
|
30
|
+
return {}
|
31
|
+
end
|
32
|
+
|
33
|
+
def instrument!(state, counters, gauges)
|
34
|
+
gauges['using.puma'] = 1
|
35
|
+
|
36
|
+
stats = json_stats
|
37
|
+
return if stats.empty?
|
38
|
+
|
39
|
+
puts "Puma debug stats from barnes: #{stats}" if @debug
|
40
|
+
|
41
|
+
pool_capacity = StatValue.new(stats, "pool_capacity").value
|
42
|
+
max_threads = StatValue.new(stats, "max_threads").value
|
43
|
+
spawned = StatValue.new(stats, "running").value
|
44
|
+
|
45
|
+
gauges[:'pool.capacity'] = pool_capacity if pool_capacity
|
46
|
+
gauges[:'threads.max'] = max_threads if max_threads
|
47
|
+
gauges[:'threads.spawned'] = spawned if spawned
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Barnes
|
2
|
+
module Instruments
|
3
|
+
class PumaInstrument
|
4
|
+
# This class is responsible for consuming a puma
|
5
|
+
# generated stats hash that can come in two "flavors"
|
6
|
+
# one is a "single process" server which will look like this:
|
7
|
+
#
|
8
|
+
# { "backlog": 0, "running": 0, "pool_capacity": 16 }
|
9
|
+
#
|
10
|
+
# The other is a multiple cluster server that will look like this:
|
11
|
+
#
|
12
|
+
# {"workers"=>2, "phase"=>0, "booted_workers"=>2, "old_workers"=>0, "worker_status"=>[{"pid"=>35020, "index"=>0, "phase"=>0, "booted"=>true, "last_checkin"=>"2018-05-21T19:53:18Z", "last_status"=>{"backlog"=>0, "running"=>5, "pool_capacity"=>5}}, {"pid"=>35021, "index"=>1, "phase"=>0, "booted"=>true, "last_checkin"=>"2018-05-21T19:53:18Z", "last_status"=>{"backlog"=>0, "running"=>5, "pool_capacity"=>5}}]}
|
13
|
+
#
|
14
|
+
class StatValue
|
15
|
+
attr_reader :stats, :key
|
16
|
+
|
17
|
+
def initialize(stats, key)
|
18
|
+
@stats = stats
|
19
|
+
@key = key
|
20
|
+
@cluster = stats.key?("worker_status")
|
21
|
+
end
|
22
|
+
|
23
|
+
def single?
|
24
|
+
!cluster?
|
25
|
+
end
|
26
|
+
|
27
|
+
def cluster?
|
28
|
+
@cluster
|
29
|
+
end
|
30
|
+
|
31
|
+
# For single worker process use value directly
|
32
|
+
# for multiple workers use the sum.
|
33
|
+
#
|
34
|
+
# https://github.com/puma/puma/pull/1532
|
35
|
+
def value
|
36
|
+
return stats[key] if single?
|
37
|
+
first_worker = stats["worker_status"].first
|
38
|
+
return nil unless first_worker && first_worker["last_status"].key?(key)
|
39
|
+
|
40
|
+
value = 0
|
41
|
+
stats["worker_status"].each do |worker_status|
|
42
|
+
value += worker_status["last_status"][key] || 0
|
43
|
+
end
|
44
|
+
return value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/barnes/periodic.rb
CHANGED
@@ -28,10 +28,10 @@ module Barnes
|
|
28
28
|
# to a reporting instance of `Barnes::Reporter` at a semi-regular
|
29
29
|
# rate.
|
30
30
|
class Periodic
|
31
|
-
def initialize(reporter:, sample_rate: 1, panels: [])
|
31
|
+
def initialize(reporter:, sample_rate: 1, debug: false, panels: [])
|
32
32
|
@reporter = reporter
|
33
33
|
@reporter.sample_rate = sample_rate
|
34
|
-
|
34
|
+
@debug = debug
|
35
35
|
# compute interval based on a 60s reporting phase.
|
36
36
|
@interval = sample_rate * 60.0
|
37
37
|
@panels = panels
|
@@ -57,6 +57,8 @@ module Barnes
|
|
57
57
|
@panels.each do |panel|
|
58
58
|
panel.instrument! env[STATE], env[COUNTERS], env[GAUGES]
|
59
59
|
end
|
60
|
+
|
61
|
+
puts env.to_json if @debug
|
60
62
|
@reporter.report env
|
61
63
|
end
|
62
64
|
end
|
data/lib/barnes/railtie.rb
CHANGED
@@ -28,11 +28,11 @@ module Barnes
|
|
28
28
|
def initialize(sample_rate)
|
29
29
|
super()
|
30
30
|
|
31
|
-
require 'barnes/instruments/
|
32
|
-
|
31
|
+
require 'barnes/instruments/puma_instrument'
|
32
|
+
puma_instrument = Barnes::Instruments::PumaInstrument.new
|
33
33
|
|
34
|
-
if
|
35
|
-
instrument
|
34
|
+
if puma_instrument.valid?
|
35
|
+
instrument puma_instrument
|
36
36
|
end
|
37
37
|
|
38
38
|
require 'barnes/instruments/stopwatch'
|
data/lib/barnes/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barnes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- schneems
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: statsd-ruby
|
@@ -39,17 +39,31 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rack
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '10'
|
55
69
|
- !ruby/object:Gem::Dependency
|
@@ -67,19 +81,33 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '5.3'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: puma
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.12'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.12'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: wait_for_it
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1
|
103
|
+
version: '0.1'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1
|
110
|
+
version: '0.1'
|
83
111
|
description: Report GC usage data to StatsD.
|
84
112
|
email:
|
85
113
|
- richard.schneeman@gmail.com
|
@@ -88,12 +116,12 @@ extensions: []
|
|
88
116
|
extra_rdoc_files: []
|
89
117
|
files:
|
90
118
|
- ".codeclimate.yaml"
|
119
|
+
- ".github/workflows/check_changelog.yml"
|
91
120
|
- ".gitignore"
|
92
121
|
- ".travis.yml"
|
93
122
|
- CHANGELOG.md
|
94
123
|
- CODE_OF_CONDUCT.md
|
95
124
|
- Gemfile
|
96
|
-
- Gemfile.lock
|
97
125
|
- MIT-LICENSE
|
98
126
|
- README.md
|
99
127
|
- Rakefile
|
@@ -105,7 +133,8 @@ files:
|
|
105
133
|
- lib/barnes/consts.rb
|
106
134
|
- lib/barnes/instruments/gctools_oobgc.rb
|
107
135
|
- lib/barnes/instruments/object_space_counter.rb
|
108
|
-
- lib/barnes/instruments/
|
136
|
+
- lib/barnes/instruments/puma_instrument.rb
|
137
|
+
- lib/barnes/instruments/puma_stats_value.rb
|
109
138
|
- lib/barnes/instruments/ree_gc.rb
|
110
139
|
- lib/barnes/instruments/ruby_gc.rb
|
111
140
|
- lib/barnes/instruments/stopwatch.rb
|
@@ -134,8 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
163
|
- !ruby/object:Gem::Version
|
135
164
|
version: '0'
|
136
165
|
requirements: []
|
137
|
-
|
138
|
-
rubygems_version: 2.7.6
|
166
|
+
rubygems_version: 3.1.2
|
139
167
|
signing_key:
|
140
168
|
specification_version: 4
|
141
169
|
summary: Ruby GC stats => StatsD
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Barnes
|
4
|
-
module Instruments
|
5
|
-
class PumaBacklog
|
6
|
-
def initialize(sample_rate=nil)
|
7
|
-
end
|
8
|
-
|
9
|
-
def valid?
|
10
|
-
defined?(Puma) &&
|
11
|
-
Puma.respond_to?(:stats) &&
|
12
|
-
ENV["DYNO"] && ENV["DYNO"].start_with?("web")
|
13
|
-
end
|
14
|
-
|
15
|
-
def start!(state)
|
16
|
-
require 'multi_json'
|
17
|
-
end
|
18
|
-
|
19
|
-
def json_stats
|
20
|
-
MultiJson.load(Puma.stats || "{}")
|
21
|
-
|
22
|
-
# Puma loader has not been initialized yet
|
23
|
-
rescue NoMethodError => e
|
24
|
-
raise e unless e.message =~ /nil/
|
25
|
-
raise e unless e.message =~ /stats/
|
26
|
-
return {}
|
27
|
-
end
|
28
|
-
|
29
|
-
# For single worker process use backlog directly
|
30
|
-
# for multiple workers sum backlog.
|
31
|
-
#
|
32
|
-
# https://github.com/puma/puma/pull/1532
|
33
|
-
def instrument!(state, counters, gauges)
|
34
|
-
stats = self.json_stats
|
35
|
-
return if stats.empty?
|
36
|
-
|
37
|
-
backlog = stats["backlog"]
|
38
|
-
if backlog.nil?
|
39
|
-
backlog = stats["worker_status"].map do |worker_status|
|
40
|
-
worker_status["last_status"]["backlog"]
|
41
|
-
end.reduce(0, :+)
|
42
|
-
end
|
43
|
-
|
44
|
-
gauges[:'backlog.requests'] = backlog
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|