app_profiler 0.2.3 → 0.2.5

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: 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.