active-profiling 0.1.2 → 2.0

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.
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,20 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2024-04-15 15:03:39 UTC using RuboCop version 1.63.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
11
+ Metrics/PerceivedComplexity:
12
+ Max: 9
13
+
14
+ # Offense count: 1
15
+ # Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, CheckDefinitionPathHierarchyRoots, Regex, IgnoreExecutableScripts, AllowedAcronyms.
16
+ # CheckDefinitionPathHierarchyRoots: lib, spec, test, src
17
+ # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
18
+ Naming/FileName:
19
+ Exclude:
20
+ - 'lib/active-profiling.rb'
data/FUNDING.yml ADDED
@@ -0,0 +1,2 @@
1
+ github:
2
+ - dark-panda
data/Gemfile CHANGED
@@ -1,12 +1,11 @@
1
+ # frozen_string_literal: true
1
2
 
2
- source "http://rubygems.org"
3
+ source 'https://rubygems.org'
3
4
 
4
5
  gemspec
5
6
 
6
- gem "rdoc", "~> 3.12"
7
- gem "rake", "~> 10.0"
8
-
9
- if File.exists?('Gemfile.local')
10
- instance_eval File.read('Gemfile.local')
11
- end
7
+ gem 'rake'
8
+ gem 'rdoc'
9
+ gem 'rubocop', require: false
12
10
 
11
+ instance_eval File.read('Gemfile.local') if File.exist?('Gemfile.local')
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2017 J Smith <dark.panda@gmail.com>
1
+ Copyright (c) 2012-2024 J Smith <dark.panda@gmail.com>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person
4
4
  obtaining a copy of this software and associated documentation
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
-
2
- # -*- ruby -*-
1
+ # frozen_string_literal: true
3
2
 
4
3
  require 'rubygems'
5
4
  require 'rubygems/package_task'
@@ -7,7 +6,7 @@ require 'rake/testtask'
7
6
  require 'rdoc/task'
8
7
  require 'bundler/gem_tasks'
9
8
 
10
- $:.push File.expand_path(File.dirname(__FILE__), 'lib')
9
+ $LOAD_PATH.push File.expand_path(File.dirname(__FILE__), 'lib')
11
10
 
12
11
  version = ActiveProfiling::VERSION
13
12
 
@@ -25,4 +24,3 @@ Rake::RDocTask.new do |t|
25
24
  t.rdoc_dir = 'doc'
26
25
  t.rdoc_files.include('README.rdoc', 'MIT-LICENSE', 'lib/**/*.rb')
27
26
  end
28
-
@@ -1,26 +1,29 @@
1
- # -*- encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../lib/active-profiling/version', __FILE__)
3
+ require File.expand_path('lib/active-profiling/version', __dir__)
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "active-profiling"
6
+ s.name = 'active-profiling'
7
7
  s.version = ActiveProfiling::VERSION
8
8
 
9
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
- s.authors = ["J Smith"]
11
- s.description = "A Rails profiling suite."
9
+ s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
10
+ s.required_ruby_version = '>= 3.0'
11
+
12
+ s.authors = ['J Smith']
13
+ s.description = 'A Rails profiling suite.'
12
14
  s.summary = s.description
13
- s.email = "dark.panda@gmail.com"
14
- s.license = "MIT"
15
+ s.email = 'dark.panda@gmail.com'
16
+ s.license = 'MIT'
15
17
  s.extra_rdoc_files = [
16
- "README.rdoc"
18
+ 'README.rdoc'
17
19
  ]
18
- s.files = `git ls-files`.split($\)
20
+ s.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
19
21
  s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
20
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
21
- s.homepage = "http://github.com/dark-panda/active-profiling"
22
- s.require_paths = ["lib"]
22
+ s.homepage = 'https://github.com/dark-panda/active-profiling'
23
+ s.require_paths = ['lib']
23
24
 
24
- s.add_dependency("rails", [">= 3.0"])
25
+ s.add_dependency('rails', ['>= 6.0'])
26
+ s.metadata = {
27
+ 'rubygems_mfa_required' => 'true'
28
+ }
25
29
  end
26
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module ActionController
3
4
  module ActionProfiling
@@ -13,25 +14,21 @@ module ActionController
13
14
  :around_filter
14
15
  end
15
16
 
16
- send around_filter_method, :action_profiler, :if => proc {
17
+ send around_filter_method, :action_profiler, if: proc {
17
18
  Rails.application.config.active_profiling.profiler.enabled && ActiveProfiling.ruby_prof?
18
19
  }
19
20
 
20
- send around_filter_method, :action_gc_statistics, :if => proc {
21
+ send around_filter_method, :action_gc_statistics, if: proc {
21
22
  Rails.application.config.active_profiling.gc_statistics.enabled && ActiveProfiling.gc_statistics?
22
23
  }
23
24
  end
24
25
 
25
- def action_profiler(*args)
26
- ruby_profiler(:name => "#{controller_name}.#{action_name}") do
27
- yield
28
- end
26
+ def action_profiler(*, &block)
27
+ ruby_profiler(name: "#{controller_name}.#{action_name}", &block)
29
28
  end
30
29
 
31
- def action_gc_statistics(*args)
32
- gc_statistics do
33
- yield
34
- end
30
+ def action_gc_statistics(*, &block)
31
+ gc_statistics(&block)
35
32
  end
36
33
  end
37
34
 
@@ -1,49 +1,48 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module ActiveProfiling::ActionController
3
4
  class LogSubscriber < ActiveSupport::LogSubscriber
4
5
  def profiler_output(event)
5
- return unless logger &&
6
- logger.send("#{config.profiler.log_level}?")
6
+ return unless logger&.send("#{config.profiler.log_level}?")
7
7
 
8
- report = self.indent(event.payload[:profiler_output])
8
+ report = indent(event.payload[:profiler_output])
9
9
  title = event.payload[:title]
10
10
 
11
11
  logger.send(
12
12
  config.profiler.log_level,
13
- "#{color("Profiler Output: #{title}", YELLOW, true)}\n#{report}"
13
+ "#{color("Profiler Output: #{title}", YELLOW, bold: true)}\n#{report}"
14
14
  )
15
15
  end
16
16
 
17
17
  def profiler_output_to_file(event)
18
- return unless logger &&
19
- logger.send("#{config.profiler.log_level}?")
18
+ return unless logger&.send("#{config.profiler.log_level}?")
20
19
 
21
20
  logger.send(
22
21
  config.profiler.log_level,
23
- color("Wrote profiling information to #{event.payload[:file_name]}", YELLOW, true)
22
+ color("Wrote profiling information to #{event.payload[:file_name]}", YELLOW, bold: true)
24
23
  )
25
24
  end
26
25
 
27
26
  def gc_statistics(event)
28
- return unless logger &&
29
- logger.send("#{config.gc_statistics.log_level}?")
27
+ return unless logger&.send("#{config.gc_statistics.log_level}?")
30
28
 
31
- unless event.payload[:report].blank?
32
- title = event.payload[:title]
33
- report = self.indent(event.payload[:report])
29
+ return if event.payload[:report].blank?
34
30
 
35
- logger.send(
36
- config.gc_statistics.log_level,
37
- "#{color("GC Statistics: #{title}", YELLOW, true)}\n#{report}"
38
- )
39
- end
31
+ title = event.payload[:title]
32
+ report = indent(event.payload[:report])
33
+
34
+ logger.send(
35
+ config.gc_statistics.log_level,
36
+ "#{color("GC Statistics: #{title}", YELLOW, bold: true)}\n#{report}"
37
+ )
40
38
  end
41
39
 
42
40
  def logger
43
41
  ::Rails.logger
44
42
  end
45
43
 
46
- protected
44
+ private
45
+
47
46
  def config
48
47
  Rails.application.config.active_profiling
49
48
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'active-profiling/action_controller/action_profiling'
3
4
  require 'active-profiling/action_controller/log_subscriber'
@@ -1,33 +1,36 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module ActiveProfiling::ActiveRecord
3
4
  class BacktraceLogSubscriber < ::ActiveSupport::LogSubscriber
4
5
  def sql(event)
5
- return unless config.enabled &&
6
- config.log_level &&
7
- logger &&
8
- logger.send("#{config.log_level}?")
6
+ return unless skip_backtrace?
9
7
 
10
8
  payload = event.payload
11
9
 
12
- return if 'SCHEMA' == payload[:name]
10
+ return if payload[:name] == 'SCHEMA'
13
11
 
14
12
  backtrace = event.send(:caller).collect { |line|
15
- if line_match(line)
16
- " #{line}"
17
- end
13
+ " #{line}" if line_match(line)
18
14
  }.compact
19
15
 
20
- unless backtrace.empty?
21
- name = color(payload[:name], YELLOW, true)
22
- logger.send(config.log_level, " #{name}\n#{backtrace.join("\n")}")
23
- end
16
+ return if backtrace.empty?
17
+
18
+ name = color(payload[:name], YELLOW, true)
19
+ logger.send(config.log_level, " #{name}\n#{backtrace.join("\n")}")
24
20
  end
25
21
 
26
22
  def logger
27
23
  ::ActiveRecord::Base.logger
28
24
  end
29
25
 
30
- protected
26
+ private
27
+
28
+ def skip_backtrace?
29
+ config.enabled &&
30
+ config.log_level &&
31
+ logger&.send("#{config.log_level}?")
32
+ end
33
+
31
34
  def config
32
35
  Rails.application.config.active_profiling.active_record.backtrace_logger
33
36
  end
@@ -39,4 +42,3 @@ module ActiveProfiling::ActiveRecord
39
42
  end
40
43
 
41
44
  ActiveProfiling::ActiveRecord::BacktraceLogSubscriber.attach_to :active_record
42
-
@@ -1,3 +1,3 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'active-profiling/active_record/backtrace_log_subscriber'
3
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module ActiveProfiling
3
4
  module GCStatistics
@@ -6,7 +7,7 @@ module ActiveProfiling
6
7
  if defined?(GC::Profiler)
7
8
  def gc_statistics_report(options = {})
8
9
  options = {
9
- :disable_gc => false
10
+ disable_gc: false
10
11
  }.merge(options)
11
12
 
12
13
  GC.disable if options[:disable_gc]
@@ -15,14 +16,11 @@ module ActiveProfiling
15
16
 
16
17
  retval = yield
17
18
 
18
- if options[:disable_gc]
19
- GC.enable
20
- end
19
+ GC.enable if options[:disable_gc]
21
20
 
22
21
  result = GC::Profiler.result
23
22
 
24
- return [ retval, result ]
25
-
23
+ [retval, result]
26
24
  ensure
27
25
  GC.enable if options[:disable_gc]
28
26
  GC::Profiler.disable
@@ -31,7 +29,7 @@ module ActiveProfiling
31
29
  elsif GC.respond_to?(:enable_stats)
32
30
  def gc_statistics_report(options = {})
33
31
  options = {
34
- :disable_gc => false
32
+ disable_gc: false
35
33
  }.merge(options)
36
34
 
37
35
  GC.disable if options[:disable_gc]
@@ -47,18 +45,17 @@ module ActiveProfiling
47
45
  "Time (ms): #{GC.time / 1000.0}"
48
46
  ].join("\n")
49
47
 
50
- return [ retval, result ]
51
-
48
+ [retval, result]
52
49
  ensure
53
50
  GC.enable if options[:disable_gc]
54
51
  GC.disable_stats
55
52
  GC.clear_stats
56
53
  end
57
54
  else
58
- $stderr.puts "NOTICE: this version of Ruby cannot report on GC statistics."
55
+ $stderr.warn 'NOTICE: this version of Ruby cannot report on GC statistics.'
59
56
 
60
- def gc_statistics_report(*args)
61
- [ yield, nil ]
57
+ def gc_statistics_report(*)
58
+ [yield, nil]
62
59
  end
63
60
  end
64
61
 
@@ -85,21 +82,19 @@ module ActiveProfiling
85
82
  # with the GC statistics patch found here:
86
83
  #
87
84
  # http://blog.pluron.com/2008/02/memory-profilin.html
88
- def gc_statistics(*args)
85
+ def gc_statistics(*args, &block)
89
86
  options = Rails.application.config.active_profiling.gc_statistics.merge(args.extract_options!)
90
87
 
91
- result, gc_report = gc_statistics_report(options) do
92
- yield
93
- end
88
+ result, gc_report = gc_statistics_report(options, &block)
94
89
 
95
90
  ActiveSupport::Notifications.instrument('gc_statistics.active_profiling', {
96
- :report => gc_report,
97
- :title => options[:title] || args.first
91
+ report: gc_report,
92
+ title: options[:title] || args.first
98
93
  })
99
94
 
100
95
  result
101
96
  end
102
97
  end
103
98
 
104
- self.extend(GCStatistics)
99
+ extend(GCStatistics)
105
100
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module ActiveProfiling
3
4
  class Railtie < Rails::Railtie
@@ -43,23 +44,23 @@ module ActiveProfiling
43
44
  # :print_file => true
44
45
  # }
45
46
  DEFAULT_PROFILER_OPTIONS = {
46
- :enabled => false,
47
+ enabled: false,
47
48
 
48
- :measure_mode => :process_time,
49
+ measure_mode: :process_time,
49
50
 
50
- :disable_gc => true,
51
+ disable_gc: true,
51
52
 
52
- :printer => :graph,
53
+ printer: :graph,
53
54
 
54
- :call_tree_prefix => 'callgrind.out.',
55
+ call_tree_prefix: 'callgrind.out.',
55
56
 
56
- :output => nil,
57
+ output: nil,
57
58
 
58
- :log_level => :info,
59
+ log_level: :info,
59
60
 
60
- :printer_options => {
61
- :min_percent => 1,
62
- :print_file => true
61
+ printer_options: {
62
+ min_percent: 1,
63
+ print_file: true
63
64
  }
64
65
  }.freeze
65
66
 
@@ -77,11 +78,11 @@ module ActiveProfiling
77
78
  # whenever you need to and see results as you go.
78
79
  # * +:log_level+ - The log level to spit the GC statistics to.
79
80
  DEFAULT_GC_STATISTICS_OPTIONS = {
80
- :enabled => false,
81
+ enabled: false,
81
82
 
82
- :disable_gc => false,
83
+ disable_gc: false,
83
84
 
84
- :log_level => :info
85
+ log_level: :info
85
86
  }.freeze
86
87
 
87
88
  # These settings are the default values used for the ActiveRecord
@@ -98,11 +99,11 @@ module ActiveProfiling
98
99
  # /^#{Rails.root}(?!(\/vendor\/rails|\/\.bundle))/ so that only lines
99
100
  # in your application code are logged.
100
101
  DEFAULT_AR_BACKTRACE_LOGGER_OPTIONS = {
101
- :enabled => false,
102
+ enabled: false,
102
103
 
103
- :verbose => false,
104
+ verbose: false,
104
105
 
105
- :log_level => :debug
106
+ log_level: :debug
106
107
  }.freeze
107
108
 
108
109
  config.active_profiling = ActiveSupport::OrderedOptions.new
@@ -111,13 +112,13 @@ module ActiveProfiling
111
112
  config.active_profiling.active_record = ActiveSupport::OrderedOptions.new
112
113
  config.active_profiling.active_record.backtrace_logger = ActiveSupport::OrderedOptions.new
113
114
 
114
- initializer "active_profiling.set_profiling_config" do |app|
115
+ initializer 'active_profiling.set_profiling_config' do |app|
115
116
  options = app.config.active_profiling
116
117
 
117
118
  options.profiler.reverse_merge!(DEFAULT_PROFILER_OPTIONS)
118
119
  options.gc_statistics.reverse_merge!(DEFAULT_GC_STATISTICS_OPTIONS)
119
120
  options.active_record.backtrace_logger.reverse_merge!(DEFAULT_AR_BACKTRACE_LOGGER_OPTIONS)
120
- options.active_record.backtrace_logger[:matcher] ||= /^#{Rails.root}(?!(\/vendor\/rails|\/\.bundle))/
121
+ options.active_record.backtrace_logger[:matcher] ||= %r{#{Rails.root}(?!(/vendor/rails|/\.bundle))}
121
122
  end
122
123
  end
123
124
  end