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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19c9b546f067ae2704fa77ae6d9427ec127066297e5b764946eee6182ecbee10
4
- data.tar.gz: '01368678dd52fde279caaa874e961fbd804083818d77f0d35ceb1c0a7fe3a676'
3
+ metadata.gz: 5afa9a13612433356ad5a2df69f6fa8e418bb2f202720f15da65145d0c7d40dc
4
+ data.tar.gz: 6b67b8ec0db255dacde33e74f1c36510db0a8859c67b8a465df6f5b6da26a803
5
5
  SHA512:
6
- metadata.gz: ca830409f6dc45d30e14bb69c1593724ed9a563eaf2082588225f46fffe189c0a1363d445cc499b7b96cf648a1ffaf80267a668ec5a4b15fef2af915bd7765b8
7
- data.tar.gz: e73a76762d62b85007edce9bd6fdc7a21ffff41115dcf284587f74787b740de303c44592be65ff720cbda9310ac7dfec43db7f6d349dc4fc085eef3daca0a8c0
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
@@ -2,4 +2,4 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.5.0
5
- before_install: gem install bundler -v 1.15.4
5
+ before_install: gem install bundler -v 2.1.0
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
@@ -1,4 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'simplecov', :require => false, :group => :test
4
+ gem 'simplecov', :require => false, :group => :test
5
+ gem 'm'
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 5 (and Rails 3 and 4), add this to your Gemfile:
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 application:
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
- Barnes.start
45
+ before_fork do
46
+ # worker configuration
47
+ Barnes.start
48
+ end
46
49
  ```
47
50
 
data/Rakefile CHANGED
@@ -29,7 +29,8 @@ task :default => :test
29
29
 
30
30
  desc 'Run tests'
31
31
  Rake::TestTask.new :test do |t|
32
- t.libs << 'test/lib'
33
- t.pattern = 'test/*_test.rb'
32
+ t.libs << 'test'
33
+ t.libs << 'lib'
34
+ t.pattern = 'test/**/*_test.rb'
34
35
  t.verbose = true
35
36
  end
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 'rake', '~> 10'
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 "bundler", "~> 1.15"
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 reporter: reporter, sample_rate: sample_rate, panels: panels
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
@@ -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
@@ -41,7 +41,7 @@ module Barnes
41
41
  }
42
42
 
43
43
  initializer 'barnes' do |app|
44
- Barnes.start(config.barnes)
44
+ Barnes.start(**config.barnes)
45
45
  end
46
46
  end
47
47
  end
@@ -28,11 +28,11 @@ module Barnes
28
28
  def initialize(sample_rate)
29
29
  super()
30
30
 
31
- require 'barnes/instruments/puma_backlog'
32
- backlog_reporter = Barnes::Instruments::PumaBacklog.new
31
+ require 'barnes/instruments/puma_instrument'
32
+ puma_instrument = Barnes::Instruments::PumaInstrument.new
33
33
 
34
- if backlog_reporter.valid?
35
- instrument backlog_reporter
34
+ if puma_instrument.valid?
35
+ instrument puma_instrument
36
36
  end
37
37
 
38
38
  require 'barnes/instruments/stopwatch'
@@ -22,5 +22,5 @@
22
22
  #
23
23
 
24
24
  module Barnes
25
- VERSION = "0.0.4"
25
+ VERSION = "0.0.8"
26
26
  end
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
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: 2018-04-12 00:00:00.000000000 Z
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: rake
42
+ name: rack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10'
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: bundler
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.15'
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.15'
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/puma_backlog.rb
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
- rubyforge_project:
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