app_profiler 0.2.3 → 0.2.5

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: f312a0076c72716017684a2438e0a255250fda160f5e7450813869da8bcac922
4
- data.tar.gz: cbec087431d3a5271599bb6e6b2238aa4e67d7f51c79e7d1f3a50a3da3d12feb
3
+ metadata.gz: 36a0afed63f70a16ab782039e981583c16e80f846eb6caf6cefce219d7934d0d
4
+ data.tar.gz: eda36bd2a579b25757db0e872c3f2aa1cbdda60ddf486b4bd3ad90f34f74829c
5
5
  SHA512:
6
- metadata.gz: 55c7acf18a8c4933e348e80ac6f58201797c1f2935b928c1749fca01fec1d65bf4414648240aeac65fdd5044838565b46a002c4ea87f6472c543478946221c3e
7
- data.tar.gz: a5b18127dff76a6482f30d17b18bb9dcb4f3db42a5c0434b6dc764e57f6383ba86417fa1fa9f5e6ce0dcae007aa0470a294f566346c07c87b30a733021451483
6
+ metadata.gz: 8ef999eb872722bca7b910b88df8a091c756b4d9f0e95da4ac770aacfb0b5454a160ca37b8c13852e25e5fd8aecf698f6bc06f6669104cbbb02c5af033b66a80
7
+ data.tar.gz: 2896ca3138e8b631445b628bcd6206e77bcd94fbef57c00560b0a63f8677b3103555eef97aabbb936722406d5667ec6c8885c9224fe85cd82d2619f45fdb9051
@@ -40,7 +40,7 @@ module AppProfiler
40
40
  end
41
41
 
42
42
  def release_run_lock
43
- self.class.run_lock.unlock
43
+ self.class.run_lock.unlock if self.class.run_lock.locked?
44
44
  rescue ThreadError
45
45
  AppProfiler.logger.warn("[AppProfiler] run lock not released as it was never acquired")
46
46
  end
@@ -50,7 +50,6 @@ module AppProfiler
50
50
 
51
51
  def profile_params(params)
52
52
  return params if params.valid?
53
-
54
53
  return unless AppProfiler.profile_sampler_enabled
55
54
 
56
55
  AppProfiler::Sampler.profile_params(params, AppProfiler.profile_sampler_config)
@@ -8,6 +8,10 @@ module AppProfiler
8
8
  @data[:mode]
9
9
  end
10
10
 
11
+ def metadata
12
+ @data[:metadata]
13
+ end
14
+
11
15
  def format
12
16
  FILE_EXTENSION
13
17
  end
@@ -8,6 +8,10 @@ module AppProfiler
8
8
  @data[:meta][:mode]
9
9
  end
10
10
 
11
+ def metadata
12
+ @data[:meta]
13
+ end
14
+
11
15
  def format
12
16
  FILE_EXTENSION
13
17
  end
@@ -81,7 +81,7 @@ module AppProfiler
81
81
  end
82
82
 
83
83
  def metadata
84
- @data[:metadata]
84
+ raise NotImplementedError
85
85
  end
86
86
 
87
87
  def mode
@@ -5,19 +5,21 @@ require "app_profiler/sampler/vernier_config"
5
5
  module AppProfiler
6
6
  module Sampler
7
7
  class Config
8
- attr_reader :sample_rate, :paths, :cpu_interval, :backends_probability
8
+ attr_reader :sample_rate, :targets, :exclude_targets, :cpu_interval, :backends_probability
9
9
 
10
10
  SAMPLE_RATE = 0.001 # 0.1%
11
- PATHS = ["/"]
11
+ TARGETS = ["/"]
12
12
  BACKEND_PROBABILITES = { stackprof: 1.0, vernier: 0.0 }
13
- @backends = {}
13
+ EMPTY_ARRAY = []
14
14
 
15
15
  def initialize(sample_rate: SAMPLE_RATE,
16
- paths: PATHS,
16
+ targets: TARGETS,
17
17
  backends_probability: BACKEND_PROBABILITES,
18
18
  backends_config: {
19
19
  stackprof: StackprofConfig.new,
20
- })
20
+ },
21
+ paths: nil,
22
+ exclude_targets: EMPTY_ARRAY)
21
23
 
22
24
  if sample_rate < 0.0 || sample_rate > 1.0
23
25
  raise ArgumentError, "sample_rate must be between 0 and 1"
@@ -25,10 +27,13 @@ module AppProfiler
25
27
 
26
28
  raise ArgumentError, "mode probabilities must sum to 1" unless backends_probability.values.sum == 1.0
27
29
 
30
+ ActiveSupport::Deprecation.new.warn("passing paths is deprecated, use targets instead") if paths
31
+
28
32
  @sample_rate = sample_rate
29
- @paths = paths
33
+ @targets = paths || targets
30
34
  @backends_config = backends_config
31
35
  @backends_probability = backends_probability
36
+ @exclude_targets = exclude_targets
32
37
  end
33
38
 
34
39
  def get_backend_config(backend_name)
@@ -3,20 +3,30 @@
3
3
  require "app_profiler/sampler/config"
4
4
  module AppProfiler
5
5
  module Sampler
6
+ @excluded_cache = {}
6
7
  class << self
7
8
  def profile_params(request, config)
8
- return unless sample?(config, request)
9
+ profile_params_for(request.path, config)
10
+ end
11
+
12
+ def profile_params_for(target, config)
13
+ return unless sample?(config, target)
9
14
 
10
15
  get_profile_params(config)
11
16
  end
12
17
 
13
18
  private
14
19
 
15
- def sample?(config, request)
20
+ def sample?(config, target)
16
21
  return false if Kernel.rand > config.sample_rate
22
+ return false if @excluded_cache[target]
23
+
24
+ if config.exclude_targets.any? { |t| target.match?(t) }
25
+ @excluded_cache[target] = true
26
+ return false
27
+ end
17
28
 
18
- path = request.path
19
- return false unless config.paths.any? { |p| path.match?(p) }
29
+ return false unless config.targets.any? { |t| target.match?(t) }
20
30
 
21
31
  true
22
32
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppProfiler
4
- VERSION = "0.2.3"
4
+ VERSION = "0.2.5"
5
5
  end
data/lib/app_profiler.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support"
3
4
  require "active_support/core_ext/class"
4
5
  require "active_support/core_ext/module"
5
6
  require "logger"
@@ -63,7 +64,7 @@ module AppProfiler
63
64
  mattr_reader :profile_enqueue_failure, default: nil
64
65
  mattr_reader :after_process_queue, default: nil
65
66
  mattr_accessor :forward_metadata_on_upload, default: false
66
- mattr_accessor :profile_sampler_enabled, default: false
67
+
67
68
  mattr_accessor :profile_sampler_config
68
69
 
69
70
  class << self
@@ -116,6 +117,28 @@ module AppProfiler
116
117
  @profiler_backend = new_profiler_backend
117
118
  end
118
119
 
120
+ def profile_sampler_enabled=(value)
121
+ if value.is_a?(Proc)
122
+ raise ArgumentError,
123
+ "profile_sampler_enabled must be a proc or a lambda that accepts no argument" if value.arity != 0
124
+ else
125
+ raise ArgumentError, "Must be TrueClass or FalseClass" unless [TrueClass, FalseClass].include?(value.class)
126
+ end
127
+
128
+ @profile_sampler_enabled = value
129
+ end
130
+
131
+ def profile_sampler_enabled
132
+ return false unless defined?(@profile_sampler_enabled)
133
+
134
+ @profile_sampler_enabled.is_a?(Proc) ? @profile_sampler_enabled.call : @profile_sampler_enabled
135
+ rescue => e
136
+ logger.error(
137
+ "[AppProfiler.profile_sampler_enabled] exception: #{e}, message: #{e.message}",
138
+ )
139
+ false
140
+ end
141
+
119
142
  def backend_for(backend_name)
120
143
  if vernier_supported? &&
121
144
  backend_name == AppProfiler::Backend::VernierBackend.name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app_profiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gannon McGibbon
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2024-08-28 00:00:00.000000000 Z
16
+ date: 2024-10-15 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activesupport
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  - !ruby/object:Gem::Version
185
185
  version: '0'
186
186
  requirements: []
187
- rubygems_version: 3.5.17
187
+ rubygems_version: 3.5.21
188
188
  signing_key:
189
189
  specification_version: 4
190
190
  summary: Collect performance profiles for your Rails application.