gctools-rails 0.0.1

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