gctools-rails 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cdc8d15dffd87f6c054da68038632f4cd243c5ad
4
+ data.tar.gz: c9ef627da0520a515ea2b0e5c1abca7640871aef
5
+ SHA512:
6
+ metadata.gz: 7c0a16a9246b01abea5bf153bd134d50bd44dba208db076552eb4862020929e599cd708ece77ea3c1121cef139f6b93b8f4bb391c7b0b385ad4d76308a4c0789
7
+ data.tar.gz: c8495fbadbb6deb50f1fd2a2aa336277e051dd8a56ef0ed8498a921e7a90980d67f465f4446df26a9b2cb7d752b1f0a67f0f0f71b0f1bca1fc0614c64da78e8f
@@ -0,0 +1,3 @@
1
+ /tmp
2
+ /.bundle
3
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'activesupport'
@@ -0,0 +1,19 @@
1
+ ## gctools-rails
2
+
3
+ Logs the amount of time spent in the MRI garbage collector to the Rails controller log. For example:
4
+
5
+ ```
6
+ Completed 200 OK in 631ms (Views: 22.1ms | ActiveRecord: 18.7ms | GC=167.0ms | Search=0.0ms | Redis=2 | Memcache=7 | master-queries=3 | shard_0-queries=20 | shop_name=shop1.myshopify.io | dest_host=shop1.myshopify.io | pid=45776 | shop_id=1 | shard_id=0 | request_id=cfec5667-8f0b-4b11-b676-6300083bd04f | session_id=20ee8aefeeeae62ece61f6510eed6ac6446723cb315659084f760488bcac1857 | ssl=false | rev=1 )
7
+ ```
8
+
9
+ ### Install
10
+
11
+ Add the following to your Gemfile:
12
+
13
+ ```ruby
14
+ gem 'gctools-rails'
15
+ ```
16
+
17
+ ### Notes
18
+
19
+ gctools-rails cannot be used at the same time as the [gctools logger](https://github.com/tmm1/gctools/blob/master/lib/gctools/logger.rb), as they both use `GCProf.after_gc_hook`.
@@ -0,0 +1,20 @@
1
+ task :default => :test
2
+
3
+ # ==========================================================
4
+ # Packaging
5
+ # ==========================================================
6
+
7
+ GEMSPEC = eval(File.read('gctools-rails.gemspec'))
8
+
9
+ require 'rubygems/package_task'
10
+ Gem::PackageTask.new(GEMSPEC) do |pkg|
11
+ end
12
+
13
+ # ==========================================================
14
+ # Testing
15
+ # ==========================================================
16
+
17
+ require 'rake/testtask'
18
+ Rake::TestTask.new 'test' do |t|
19
+ t.test_files = FileList['test/test_*.rb']
20
+ end
@@ -0,0 +1,18 @@
1
+ $:.unshift File.expand_path("../lib", __FILE__)
2
+
3
+ require 'gctools/rails/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'gctools-rails'
7
+ s.version = Gctools::Rails::VERSION
8
+ s.summary = 'rails logging with gctools'
9
+ s.description = 'rails controller logging of GC stats using gctools'
10
+
11
+ s.homepage = 'https://github.com/csfrancis/gctools-rails'
12
+ s.authors = 'Scott Francis'
13
+ s.email = 'scott.francis@shopify.com'
14
+ s.license = 'MIT'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.add_runtime_dependency 'gctools', '~> 0.2', '>= 0.2.3'
18
+ end
@@ -0,0 +1,5 @@
1
+ require 'gctools/gcprof'
2
+ require 'gctools/rails/timer'
3
+ require 'gctools/rails/time_logger'
4
+ require 'gctools/rails/middleware'
5
+ require 'gctools/rails/railtie' if defined?(Rails::Railtie)
@@ -0,0 +1,16 @@
1
+ module Gctools
2
+ module Rails
3
+ class Middleware
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ Timer.clear
10
+ @app.call(env)
11
+ ensure
12
+ Timer.clear
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module Gctools
2
+ module Rails
3
+ class Railtie < ::Rails::Railtie
4
+ initializer 'gctools_rails.configure_controller' do |app|
5
+ app.config.middleware.insert 0, Gctools::Rails::Middleware
6
+
7
+ ActiveSupport.on_load :action_controller do
8
+ include TimeLogger
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ require 'active_support'
2
+
3
+ module Gctools
4
+ module Rails
5
+ module TimeLogger
6
+ extend ActiveSupport::Concern
7
+
8
+ def append_info_to_payload(payload)
9
+ super
10
+ payload[:gc_time] = Timer.value
11
+ end
12
+
13
+ module ClassMethods
14
+ def log_process_action(payload)
15
+ messages, gc_time = super, payload[:gc_time]
16
+ messages << ("GC=%.1fms" % gc_time) if gc_time
17
+ messages
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ module Gctools
2
+ module Rails
3
+ module Timer
4
+ def self.value
5
+ Thread.current[:gctools_time] ||= 0
6
+ end
7
+
8
+ def self.add(gc_time_ms)
9
+ Thread.current[:gctools_time] = value + gc_time_ms
10
+ end
11
+
12
+ def self.clear
13
+ Thread.current[:gctools_time] = 0
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ GCProf.after_gc_hook = Proc.new { |info, start, end_mark, end_sweep|
20
+ Gctools::Rails::Timer.add((end_mark[:time] - start[:time]) * 1000) if end_sweep
21
+ }
@@ -0,0 +1,5 @@
1
+ module Gctools
2
+ module Rails
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,57 @@
1
+ require 'minitest/autorun'
2
+ require 'gctools/rails'
3
+
4
+ class FakeBaseController
5
+ def append_info_to_payload(payload); payload; end
6
+ def self.log_process_action(payload); ''; end
7
+ end
8
+
9
+ class FakeController < FakeBaseController
10
+ include Gctools::Rails::TimeLogger
11
+ end
12
+
13
+ class TestRails < MiniTest::Test
14
+ def setup
15
+ Gctools::Rails::Timer.clear
16
+ end
17
+
18
+ def test_timer_is_thread_local
19
+ t = Gctools::Rails::Timer
20
+
21
+ assert_equal 0, t.value
22
+ t.add(100)
23
+ assert_equal 100, t.value
24
+
25
+ th = Thread.new do
26
+ assert_equal 0, t.value
27
+ end
28
+ ensure
29
+ th.join if th
30
+ end
31
+
32
+ def test_time_logger_updates_payload
33
+ c = FakeController.new
34
+
35
+ Gctools::Rails::Timer.add(100)
36
+
37
+ p = {}
38
+ c.append_info_to_payload(p)
39
+ assert_equal 100, p[:gc_time]
40
+
41
+ assert c.class.log_process_action(p) =~ /GC=/
42
+ end
43
+
44
+ def test_middleware_clears_timer
45
+ c = Class.new do
46
+ def call(env)
47
+ v = Gctools::Rails::Timer.value
48
+ Gctools::Rails::Timer.add(100)
49
+ v
50
+ end
51
+ end.new
52
+
53
+ Gctools::Rails::Timer.add(100)
54
+ assert_equal 0, Gctools::Rails::Middleware.new(c).call({})
55
+ assert_equal 0, Gctools::Rails::Timer.value
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gctools-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Scott Francis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gctools
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.2.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.2.3
33
+ description: rails controller logging of GC stats using gctools
34
+ email: scott.francis@shopify.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - ".gitignore"
40
+ - Gemfile
41
+ - README.md
42
+ - Rakefile
43
+ - gctools-rails.gemspec
44
+ - lib/gctools/rails.rb
45
+ - lib/gctools/rails/middleware.rb
46
+ - lib/gctools/rails/railtie.rb
47
+ - lib/gctools/rails/time_logger.rb
48
+ - lib/gctools/rails/timer.rb
49
+ - lib/gctools/rails/version.rb
50
+ - test/test_rails.rb
51
+ homepage: https://github.com/csfrancis/gctools-rails
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.2.2
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: rails logging with gctools
75
+ test_files: []