Module: AppProfiler
- Defined in:
- lib/app_profiler/server.rb,
lib/app_profiler.rb,
lib/app_profiler/exec.rb,
lib/app_profiler/backend.rb,
lib/app_profiler/railtie.rb,
lib/app_profiler/sampler.rb,
lib/app_profiler/version.rb,
lib/app_profiler/middleware.rb,
lib/app_profiler/parameters.rb,
lib/app_profiler/profile_id.rb,
lib/app_profiler/base_profile.rb,
lib/app_profiler/yarn/command.rb,
lib/app_profiler/sampler/config.rb,
lib/app_profiler/vernier_profile.rb,
lib/app_profiler/stackprof_profile.rb,
lib/app_profiler/request_parameters.rb,
lib/app_profiler/viewer/base_viewer.rb,
lib/app_profiler/backend/base_backend.rb,
lib/app_profiler/storage/base_storage.rb,
lib/app_profiler/storage/file_storage.rb,
lib/app_profiler/yarn/with_speedscope.rb,
lib/app_profiler/viewer/firefox_viewer.rb,
lib/app_profiler/middleware/base_action.rb,
lib/app_profiler/middleware/view_action.rb,
lib/app_profiler/sampler/vernier_config.rb,
lib/app_profiler/viewer/base_middleware.rb,
lib/app_profiler/backend/vernier_backend.rb,
lib/app_profiler/middleware/upload_action.rb,
lib/app_profiler/sampler/stackprof_config.rb,
lib/app_profiler/viewer/speedscope_viewer.rb,
lib/app_profiler/backend/stackprof_backend.rb,
lib/app_profiler/yarn/with_firefox_profiler.rb,
lib/app_profiler/storage/google_cloud_storage.rb,
lib/app_profiler/viewer/firefox_remote_viewer.rb,
lib/app_profiler/viewer/speedscope_remote_viewer.rb,
lib/app_profiler/viewer/firefox_remote_viewer/middleware.rb,
lib/app_profiler/viewer/speedscope_remote_viewer/middleware.rb
Overview
This module provides a means to start a golang-inspired profile server it is implemented using stdlib and Rack to avoid additional dependencies
Defined Under Namespace
Modules: Backend, Exec, Sampler, Server, Storage, Viewer, Yarn
Classes: BackendError, BaseProfile, ConfigurationError, Middleware, Parameters, ProfileId, Railtie, RequestParameters, StackprofProfile, VernierProfile
Constant Summary
collapse
- PROFILE_ID_METADATA_KEY =
:profile_id
- PROFILE_BACKEND_METADATA_KEY =
:profiler
- DefaultProfileFormatter =
proc do |upload|
"#{AppProfiler.speedscope_host}#profileURL=#{upload.url}"
end
- DefaultProfilePrefix =
proc do
Time.zone.now.strftime("%Y%m%d-%H%M%S")
end
- VERSION =
"0.5.0"
Class Attribute Summary collapse
Class Method Summary
collapse
Class Attribute Details
.otel_instrumentation_enabled ⇒ Object
Returns the value of attribute otel_instrumentation_enabled.
82
83
84
|
# File 'lib/app_profiler.rb', line 82
def otel_instrumentation_enabled
@otel_instrumentation_enabled
end
|
Class Method Details
.after_process_queue=(handler) ⇒ Object
240
241
242
243
244
245
246
|
# File 'lib/app_profiler.rb', line 240
def after_process_queue=(handler)
if handler && (!handler.is_a?(Proc) || (handler.lambda? && handler.arity != 2))
raise ArgumentError, "after_process_queue must be a proc or a lambda that accepts two arguments"
end
@@after_process_queue = handler end
|
.backend ⇒ Object
198
199
200
|
# File 'lib/app_profiler.rb', line 198
def backend
profiler_backend.name
end
|
.backend=(new_backend) ⇒ Object
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/app_profiler.rb', line 126
def backend=(new_backend)
return if (new_profiler_backend = backend_for(new_backend)) == profiler_backend
if running?
raise BackendError,
"cannot change backend to #{new_backend} while #{backend} backend is running"
end
clear
@profiler_backend = new_profiler_backend
end
|
.backend_for(backend_name) ⇒ Object
.deprecator ⇒ Object
84
85
86
|
# File 'lib/app_profiler.rb', line 84
def deprecator @deprecator ||= ActiveSupport::Deprecation.new("in future releases", "app_profiler")
end
|
216
217
218
|
# File 'lib/app_profiler.rb', line 216
def
@@profile_data_header ||= .dup << "-Data" end
|
.profile_enqueue_failure=(handler) ⇒ Object
232
233
234
235
236
237
238
|
# File 'lib/app_profiler.rb', line 232
def profile_enqueue_failure=(handler)
if handler && (!handler.is_a?(Proc) || (handler.lambda? && handler.arity != 1))
raise ArgumentError, "profile_enqueue_failure must be a proc or a lambda that accepts one argument"
end
@@profile_enqueue_failure = handler end
|
.profile_enqueue_success=(handler) ⇒ Object
224
225
226
227
228
229
230
|
# File 'lib/app_profiler.rb', line 224
def profile_enqueue_success=(handler)
if handler && (!handler.is_a?(Proc) || (handler.lambda? && handler.arity != 0))
raise ArgumentError, "profile_enqueue_success must be proc or a lambda that accepts no argument"
end
@@profile_enqueue_success = handler end
|
.profile_file_name=(value) ⇒ Object
146
147
148
149
150
|
# File 'lib/app_profiler.rb', line 146
def profile_file_name=(value)
raise ArgumentError, "profile_file_name must be a proc" if value && !value.is_a?(Proc)
@@profile_file_name = value end
|
206
207
208
209
210
|
# File 'lib/app_profiler.rb', line 206
def ()
@@profile_header = @@request_profile_header = nil @@profile_data_header = nil end
|
.profile_sampler_enabled ⇒ Object
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
# File 'lib/app_profiler.rb', line 163
def profile_sampler_enabled
return false unless defined?(@profile_sampler_enabled)
@profile_sampler_enabled.is_a?(Proc) ? @profile_sampler_enabled.call : @profile_sampler_enabled
rescue => e
if ActiveSupport.respond_to?(:error_reporter)
ActiveSupport.error_reporter.report(e)
else
logger.error(
"[AppProfiler.profile_sampler_enabled] exception: #{e}, message: #{e.message}",
)
end
false
end
|
.profile_sampler_enabled=(value) ⇒ Object
152
153
154
155
156
157
158
159
160
161
|
# File 'lib/app_profiler.rb', line 152
def profile_sampler_enabled=(value)
if value.is_a?(Proc)
raise ArgumentError,
"profile_sampler_enabled must be a proc or a lambda that accepts no argument" if value.arity != 0
else
raise ArgumentError, "Must be TrueClass or FalseClass" unless [TrueClass, FalseClass].include?(value.class)
end
@profile_sampler_enabled = value
end
|
.profile_url(upload) ⇒ Object
248
249
250
251
252
|
# File 'lib/app_profiler.rb', line 248
def profile_url(upload)
return unless AppProfiler.profile_url_formatter
AppProfiler.profile_url_formatter.call(upload)
end
|
220
221
222
|
# File 'lib/app_profiler.rb', line 220
def profile_url_formatter=(block)
@@profile_url_formatter = block end
|
.profiler ⇒ Object
122
123
124
|
# File 'lib/app_profiler.rb', line 122
def profiler
@profiler ||= profiler_backend.new
end
|
212
213
214
|
# File 'lib/app_profiler.rb', line 212
def
@@request_profile_header ||= .upcase.tr("-", "_").prepend("HTTP_") end
|
.run(*args, backend: nil, **kwargs, &block) ⇒ Object
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
# File 'lib/app_profiler.rb', line 88
def run(*args, backend: nil, **kwargs, &block)
if backend
original_backend = self.backend
self.backend = backend
end
profiler.run(*args, **kwargs, &block)
rescue BackendError => e
if ActiveSupport.respond_to?(:error_reporter)
ActiveSupport.error_reporter.report(e, context: { app_profiler: { backend: backend } })
else
logger.error(
"[AppProfiler.run] exception #{e} configuring backend #{backend}: #{e.message}",
)
end
yield
ensure
self.backend = original_backend if backend
ProfileId::Current.reset
end
|
.running? ⇒ Boolean
118
119
120
|
# File 'lib/app_profiler.rb', line 118
def running?
@profiler&.running?
end
|
.stackprof_viewer ⇒ Object
138
139
140
|
# File 'lib/app_profiler.rb', line 138
def stackprof_viewer
@@stackprof_viewer ||= Viewer::SpeedscopeViewer end
|
.start(*args, backend: nil, **kwargs) ⇒ Object
108
109
110
111
|
# File 'lib/app_profiler.rb', line 108
def start(*args, backend: nil, **kwargs)
self.backend = backend if backend
profiler.start(*args, **kwargs)
end
|
.stop ⇒ Object
113
114
115
116
|
# File 'lib/app_profiler.rb', line 113
def stop
profiler.stop
profiler.results.tap { clear }
end
|
.vernier_supported? ⇒ Boolean
.vernier_viewer ⇒ Object
142
143
144
|
# File 'lib/app_profiler.rb', line 142
def vernier_viewer
@@vernier_viewer ||= Viewer::FirefoxViewer end
|
.viewer ⇒ Object
254
255
256
257
|
# File 'lib/app_profiler.rb', line 254
def viewer
deprecator.warn("AppProfiler.viewer is deprecated, please use stackprof_viewer instead.")
stackprof_viewer
end
|
.viewer=(viewer) ⇒ Object
259
260
261
262
|
# File 'lib/app_profiler.rb', line 259
def viewer=(viewer)
deprecator.warn("AppProfiler.viewer= is deprecated, please use stackprof_viewer= instead.")
self.stackprof_viewer = viewer
end
|