barnes 0.0.4 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
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