appsignal 3.10.0-java → 3.12.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +197 -0
- data/Gemfile +1 -0
- data/Rakefile +1 -1
- data/benchmark.rake +99 -42
- data/lib/appsignal/cli/demo.rb +0 -1
- data/lib/appsignal/cli/diagnose.rb +1 -1
- data/lib/appsignal/config.rb +204 -130
- data/lib/appsignal/demo.rb +16 -26
- data/lib/appsignal/event_formatter/rom/sql_formatter.rb +1 -0
- data/lib/appsignal/event_formatter.rb +3 -2
- data/lib/appsignal/helpers/instrumentation.rb +331 -19
- data/lib/appsignal/hooks/action_cable.rb +21 -16
- data/lib/appsignal/hooks/active_job.rb +14 -8
- data/lib/appsignal/hooks/delayed_job.rb +1 -1
- data/lib/appsignal/hooks/shoryuken.rb +3 -63
- data/lib/appsignal/integrations/action_cable.rb +5 -7
- data/lib/appsignal/integrations/active_support_notifications.rb +1 -0
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +36 -35
- data/lib/appsignal/integrations/data_mapper.rb +1 -0
- data/lib/appsignal/integrations/delayed_job_plugin.rb +27 -33
- data/lib/appsignal/integrations/dry_monitor.rb +1 -0
- data/lib/appsignal/integrations/excon.rb +1 -0
- data/lib/appsignal/integrations/grape.rb +7 -0
- data/lib/appsignal/integrations/hanami.rb +8 -43
- data/lib/appsignal/integrations/http.rb +1 -0
- data/lib/appsignal/integrations/net_http.rb +1 -0
- data/lib/appsignal/integrations/object.rb +6 -0
- data/lib/appsignal/integrations/padrino.rb +8 -73
- data/lib/appsignal/integrations/que.rb +13 -20
- data/lib/appsignal/integrations/railtie.rb +36 -14
- data/lib/appsignal/integrations/rake.rb +1 -5
- data/lib/appsignal/integrations/redis.rb +1 -0
- data/lib/appsignal/integrations/redis_client.rb +1 -0
- data/lib/appsignal/integrations/resque.rb +2 -5
- data/lib/appsignal/integrations/shoryuken.rb +75 -0
- data/lib/appsignal/integrations/sidekiq.rb +7 -15
- data/lib/appsignal/integrations/sinatra.rb +8 -19
- data/lib/appsignal/integrations/unicorn.rb +1 -0
- data/lib/appsignal/integrations/webmachine.rb +2 -5
- data/lib/appsignal/loaders/grape.rb +13 -0
- data/lib/appsignal/loaders/hanami.rb +40 -0
- data/lib/appsignal/loaders/padrino.rb +68 -0
- data/lib/appsignal/loaders/sinatra.rb +24 -0
- data/lib/appsignal/loaders.rb +92 -0
- data/lib/appsignal/logger.rb +7 -3
- data/lib/appsignal/probes/helpers.rb +1 -0
- data/lib/appsignal/probes/mri.rb +1 -0
- data/lib/appsignal/probes/sidekiq.rb +1 -0
- data/lib/appsignal/probes.rb +3 -0
- data/lib/appsignal/rack/abstract_middleware.rb +20 -13
- data/lib/appsignal/rack/event_handler.rb +44 -13
- data/lib/appsignal/rack/generic_instrumentation.rb +1 -0
- data/lib/appsignal/rack/grape_middleware.rb +2 -1
- data/lib/appsignal/rack/streaming_listener.rb +1 -0
- data/lib/appsignal/rack.rb +35 -0
- data/lib/appsignal/span.rb +1 -0
- data/lib/appsignal/transaction.rb +308 -101
- data/lib/appsignal/utils/data.rb +0 -1
- data/lib/appsignal/utils/hash_sanitizer.rb +0 -1
- data/lib/appsignal/utils/integration_logger.rb +0 -13
- data/lib/appsignal/utils/integration_memory_logger.rb +0 -13
- data/lib/appsignal/utils/json.rb +0 -1
- data/lib/appsignal/utils/query_params_sanitizer.rb +0 -1
- data/lib/appsignal/utils/stdout_and_logger_message.rb +0 -1
- data/lib/appsignal/utils.rb +6 -0
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +169 -14
- data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
- data/spec/lib/appsignal/cli/demo_spec.rb +0 -1
- data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +1 -1
- data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1
- data/spec/lib/appsignal/config_spec.rb +291 -44
- data/spec/lib/appsignal/demo_spec.rb +1 -2
- data/spec/lib/appsignal/environment_spec.rb +4 -2
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +43 -74
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/activejob_spec.rb +12 -3
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +2 -443
- data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +4 -7
- data/spec/lib/appsignal/hooks/excon_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/gvl_spec.rb +2 -2
- data/spec/lib/appsignal/hooks/http_spec.rb +1 -3
- data/spec/lib/appsignal/hooks/net_http_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +5 -8
- data/spec/lib/appsignal/hooks/redis_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/resque_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/sequel_spec.rb +3 -5
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -171
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +1 -1
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +459 -0
- data/spec/lib/appsignal/integrations/grape_spec.rb +36 -0
- data/spec/lib/appsignal/integrations/hanami_spec.rb +9 -178
- data/spec/lib/appsignal/integrations/http_spec.rb +1 -5
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +4 -2
- data/spec/lib/appsignal/integrations/net_http_spec.rb +1 -1
- data/spec/lib/appsignal/integrations/object_spec.rb +1 -3
- data/spec/lib/appsignal/integrations/padrino_spec.rb +8 -330
- data/spec/lib/appsignal/integrations/que_spec.rb +3 -4
- data/spec/lib/appsignal/integrations/railtie_spec.rb +275 -191
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +167 -0
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +15 -13
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +9 -104
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +13 -1
- data/spec/lib/appsignal/loaders/grape_spec.rb +12 -0
- data/spec/lib/appsignal/loaders/hanami_spec.rb +95 -0
- data/spec/lib/appsignal/loaders/padrino_spec.rb +277 -0
- data/spec/lib/appsignal/loaders/sinatra_spec.rb +47 -0
- data/spec/lib/appsignal/loaders_spec.rb +137 -0
- data/spec/lib/appsignal/probes/sidekiq_spec.rb +1 -1
- data/spec/lib/appsignal/probes_spec.rb +6 -5
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +51 -5
- data/spec/lib/appsignal/rack/event_handler_spec.rb +114 -10
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +1 -1
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +2 -35
- data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +1 -1
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +4 -2
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +3 -3
- data/spec/lib/appsignal/rack_spec.rb +63 -0
- data/spec/lib/appsignal/span_spec.rb +1 -3
- data/spec/lib/appsignal/transaction_spec.rb +1640 -1075
- data/spec/lib/appsignal/utils/integration_logger_spec.rb +12 -16
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -10
- data/spec/lib/appsignal_spec.rb +601 -36
- data/spec/lib/puma/appsignal_spec.rb +0 -3
- data/spec/spec_helper.rb +5 -4
- data/spec/support/helpers/config_helpers.rb +2 -1
- data/spec/support/helpers/loader_helper.rb +21 -0
- data/spec/support/helpers/transaction_helpers.rb +44 -20
- data/spec/support/matchers/transaction.rb +15 -1
- data/spec/support/stubs/appsignal/loaders/loader_stub.rb +7 -0
- data/spec/support/testing.rb +47 -1
- metadata +19 -2
@@ -4,7 +4,6 @@ require "logger"
|
|
4
4
|
|
5
5
|
module Appsignal
|
6
6
|
module Utils
|
7
|
-
# @api private
|
8
7
|
class IntegrationMemoryLogger
|
9
8
|
LEVELS = {
|
10
9
|
Logger::DEBUG => :DEBUG,
|
@@ -35,18 +34,6 @@ module Appsignal
|
|
35
34
|
add(:WARN, message)
|
36
35
|
end
|
37
36
|
|
38
|
-
def seen_keys
|
39
|
-
@seen_keys ||= Set.new
|
40
|
-
end
|
41
|
-
|
42
|
-
def warn_once_then_debug(key, message)
|
43
|
-
if seen_keys.add?(key).nil?
|
44
|
-
debug message
|
45
|
-
else
|
46
|
-
warn message
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
37
|
def error(message)
|
51
38
|
add(:ERROR, message)
|
52
39
|
end
|
data/lib/appsignal/utils/json.rb
CHANGED
data/lib/appsignal/utils.rb
CHANGED
data/lib/appsignal/version.rb
CHANGED
data/lib/appsignal.rb
CHANGED
@@ -22,8 +22,8 @@ module Appsignal
|
|
22
22
|
include Helpers::Instrumentation
|
23
23
|
include Helpers::Metrics
|
24
24
|
|
25
|
-
#
|
26
|
-
#
|
25
|
+
# The loaded AppSignal configuration.
|
26
|
+
# Returns the current AppSignal configuration.
|
27
27
|
#
|
28
28
|
# Can return `nil` if no configuration has been set or automatically loaded
|
29
29
|
# by an automatic integration or by calling {.start}.
|
@@ -31,12 +31,31 @@ module Appsignal
|
|
31
31
|
# @example
|
32
32
|
# Appsignal.config
|
33
33
|
#
|
34
|
-
# @example Setting the configuration
|
35
|
-
# Appsignal.config = Appsignal::Config.new(Dir.pwd, "production")
|
36
|
-
#
|
37
34
|
# @return [Config, nil]
|
35
|
+
# @see configure
|
36
|
+
# @see Config
|
37
|
+
attr_reader :config
|
38
|
+
|
39
|
+
# Set the AppSignal config.
|
40
|
+
#
|
41
|
+
# @deprecated Use {Appsignal.configure} instead.
|
42
|
+
# @param conf [Appsignal::Config]
|
43
|
+
# @return [void]
|
38
44
|
# @see Config
|
39
|
-
|
45
|
+
def config=(conf)
|
46
|
+
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
47
|
+
"Configuring AppSignal with `Appsignal.config=` is deprecated. " \
|
48
|
+
"Use `Appsignal.configure { |config| ... }` to configure AppSignal. " \
|
49
|
+
"https://docs.appsignal.com/ruby/configuration.html\n" \
|
50
|
+
"#{caller.first}"
|
51
|
+
@config = conf
|
52
|
+
end
|
53
|
+
|
54
|
+
# @api private
|
55
|
+
def _config=(conf)
|
56
|
+
@config = conf
|
57
|
+
end
|
58
|
+
|
40
59
|
# Accessor for toggle if the AppSignal C-extension is loaded.
|
41
60
|
#
|
42
61
|
# Can be `nil` if extension has not been loaded yet. See
|
@@ -47,7 +66,7 @@ module Appsignal
|
|
47
66
|
# @see Extension
|
48
67
|
# @see extension_loaded?
|
49
68
|
attr_accessor :extension_loaded
|
50
|
-
# @!attribute [rw]
|
69
|
+
# @!attribute [rw] internal_logger
|
51
70
|
# Accessor for the internal AppSignal logger.
|
52
71
|
#
|
53
72
|
# Not to be confused with our logging feature.
|
@@ -59,10 +78,8 @@ module Appsignal
|
|
59
78
|
# {.start}) the contents of the "in memory logger" is written to the new
|
60
79
|
# logger.
|
61
80
|
#
|
62
|
-
# @note some classes may have options to set custom loggers. Their
|
63
|
-
# defaults are pointed to this attribute.
|
64
81
|
# @api private
|
65
|
-
# @return [
|
82
|
+
# @return [Utils::IntegrationLogger or Utils::IntegrationMemoryLogger]
|
66
83
|
# @see start
|
67
84
|
attr_writer :internal_logger
|
68
85
|
|
@@ -89,7 +106,9 @@ module Appsignal
|
|
89
106
|
# Appsignal.start
|
90
107
|
#
|
91
108
|
# @example with custom loaded configuration
|
92
|
-
# Appsignal.
|
109
|
+
# Appsignal.configure(:production) do |config|
|
110
|
+
# config.ignore_actions = ["My action"]
|
111
|
+
# end
|
93
112
|
# Appsignal.start
|
94
113
|
#
|
95
114
|
# @return [void]
|
@@ -111,11 +130,13 @@ module Appsignal
|
|
111
130
|
|
112
131
|
if config.valid?
|
113
132
|
if config.active?
|
133
|
+
@started = true
|
114
134
|
internal_logger.info "Starting AppSignal #{Appsignal::VERSION} " \
|
115
135
|
"(#{$PROGRAM_NAME}, Ruby #{RUBY_VERSION}, #{RUBY_PLATFORM})"
|
116
136
|
config.write_to_environment
|
117
137
|
Appsignal::Extension.start
|
118
138
|
Appsignal::Hooks.load_hooks
|
139
|
+
Appsignal::Loaders.start
|
119
140
|
|
120
141
|
if config[:enable_allocation_tracking] && !Appsignal::System.jruby?
|
121
142
|
Appsignal::Extension.install_allocation_event_hook
|
@@ -149,14 +170,102 @@ module Appsignal
|
|
149
170
|
# @since 1.0.0
|
150
171
|
def stop(called_by = nil)
|
151
172
|
if called_by
|
152
|
-
internal_logger.debug("Stopping
|
173
|
+
internal_logger.debug("Stopping AppSignal (#{called_by})")
|
153
174
|
else
|
154
|
-
internal_logger.debug("Stopping
|
175
|
+
internal_logger.debug("Stopping AppSignal")
|
155
176
|
end
|
156
177
|
Appsignal::Extension.stop
|
157
178
|
Appsignal::Probes.stop
|
158
179
|
end
|
159
180
|
|
181
|
+
# Configure the AppSignal Ruby gem using a DSL.
|
182
|
+
#
|
183
|
+
# Pass a block to the configure method to configure the Ruby gem.
|
184
|
+
#
|
185
|
+
# Each config option defined in our docs can be fetched, set and modified
|
186
|
+
# via a helper method in the given block.
|
187
|
+
#
|
188
|
+
# After AppSignal has started using {start}, the configuration can not be
|
189
|
+
# modified. Any calls to this helper will be ignored.
|
190
|
+
#
|
191
|
+
# This helper should not be used to configure multiple environments, like
|
192
|
+
# done in the YAML file. Configure the environment you want active when the
|
193
|
+
# application starts.
|
194
|
+
#
|
195
|
+
# @example Configure AppSignal for the application
|
196
|
+
# Appsignal.configure do |config|
|
197
|
+
# config.path = "/the/app/path"
|
198
|
+
# config.active = ENV["APP_ACTIVE"] == "true"
|
199
|
+
# config.push_api_key = File.read("appsignal_key.txt").chomp
|
200
|
+
# config.ignore_actions = ENDPOINTS.select { |e| e.public? }.map(&:name)
|
201
|
+
# config.request_headers << "MY_CUSTOM_HEADER"
|
202
|
+
# end
|
203
|
+
#
|
204
|
+
# @example Configure AppSignal for the application and select the environment
|
205
|
+
# Appsignal.configure(:production) do |config|
|
206
|
+
# config.active = true
|
207
|
+
# end
|
208
|
+
#
|
209
|
+
# @example Automatically detects the app environment
|
210
|
+
# # Tries to determine the app environment automatically from the
|
211
|
+
# # environment and the libraries it integrates with.
|
212
|
+
# ENV["RACK_ENV"] = "production"
|
213
|
+
#
|
214
|
+
# Appsignal.configure do |config|
|
215
|
+
# config.env # => "production"
|
216
|
+
# end
|
217
|
+
#
|
218
|
+
# @example Calling configure multiple times for different environments resets the configuration
|
219
|
+
# Appsignal.configure(:development) do |config|
|
220
|
+
# config.ignore_actions = ["My action"]
|
221
|
+
# end
|
222
|
+
#
|
223
|
+
# Appsignal.configure(:production) do |config|
|
224
|
+
# config.ignore_actions # => []
|
225
|
+
# end
|
226
|
+
#
|
227
|
+
# @example Load config without a block
|
228
|
+
# # This will require either ENV vars being set
|
229
|
+
# # or the config/appsignal.yml being present
|
230
|
+
# Appsignal.configure
|
231
|
+
# # Or for the environment given as an argument
|
232
|
+
# Appsignal.configure(:production)
|
233
|
+
#
|
234
|
+
# @yield [Config] Gives the {Config} instance to the block.
|
235
|
+
# @return [void]
|
236
|
+
# @see config
|
237
|
+
# @see Config
|
238
|
+
# @see https://docs.appsignal.com/ruby/configuration.html Configuration guide
|
239
|
+
# @see https://docs.appsignal.com/ruby/configuration/options.html Configuration options
|
240
|
+
def configure(env = nil)
|
241
|
+
if Appsignal.started?
|
242
|
+
Appsignal.internal_logger
|
243
|
+
.warn("AppSignal is already started. Ignoring `Appsignal.configure` call.")
|
244
|
+
return
|
245
|
+
end
|
246
|
+
|
247
|
+
if config && config.env == env.to_s
|
248
|
+
config
|
249
|
+
else
|
250
|
+
self._config = Appsignal::Config.new(
|
251
|
+
Dir.pwd,
|
252
|
+
env || ENV["APPSIGNAL_APP_ENV"] || ENV["RAILS_ENV"] || ENV.fetch("RACK_ENV", nil),
|
253
|
+
{},
|
254
|
+
Appsignal.internal_logger,
|
255
|
+
nil,
|
256
|
+
false
|
257
|
+
)
|
258
|
+
config.load_config
|
259
|
+
end
|
260
|
+
|
261
|
+
config_dsl = Appsignal::Config::ConfigDSL.new(config)
|
262
|
+
if block_given?
|
263
|
+
yield config_dsl
|
264
|
+
config.merge_dsl_options(config_dsl.dsl_options)
|
265
|
+
end
|
266
|
+
config.validate
|
267
|
+
end
|
268
|
+
|
160
269
|
def forked
|
161
270
|
return unless active?
|
162
271
|
|
@@ -165,10 +274,44 @@ module Appsignal
|
|
165
274
|
Appsignal::Extension.start
|
166
275
|
end
|
167
276
|
|
277
|
+
# Load an AppSignal integration.
|
278
|
+
#
|
279
|
+
# Load one of the supported integrations via our loader system.
|
280
|
+
# This will set config defaults and integratie with the library if
|
281
|
+
# AppSignal is active upon start.
|
282
|
+
#
|
283
|
+
# @example Load Sinatra integrations
|
284
|
+
# # First load the integration
|
285
|
+
# Appsignal.load(:sinatra)
|
286
|
+
# # Start AppSignal
|
287
|
+
# Appsignal.start
|
288
|
+
#
|
289
|
+
# @example Load Sinatra integrations and define custom config
|
290
|
+
# # First load the integration
|
291
|
+
# Appsignal.load(:sinatra)
|
292
|
+
#
|
293
|
+
# # Customize config
|
294
|
+
# Appsignal.configure do |config|
|
295
|
+
# config.ignore_actions = ["GET /ping"]
|
296
|
+
# end
|
297
|
+
#
|
298
|
+
#
|
299
|
+
# # Start AppSignal
|
300
|
+
# Appsignal.start
|
301
|
+
#
|
302
|
+
# @param integration_name [String, Symbol] Name of the integration to load.
|
303
|
+
# @return [void]
|
304
|
+
# @since 3.12.0
|
305
|
+
def load(integration_name)
|
306
|
+
Loaders.load(integration_name)
|
307
|
+
end
|
308
|
+
|
309
|
+
# @api private
|
168
310
|
def get_server_state(key)
|
169
311
|
Appsignal::Extension.get_server_state(key)
|
170
312
|
end
|
171
313
|
|
314
|
+
# @api private
|
172
315
|
def in_memory_logger
|
173
316
|
@in_memory_logger ||=
|
174
317
|
Appsignal::Utils::IntegrationMemoryLogger.new.tap do |l|
|
@@ -176,6 +319,7 @@ module Appsignal
|
|
176
319
|
end
|
177
320
|
end
|
178
321
|
|
322
|
+
# @api private
|
179
323
|
def internal_logger
|
180
324
|
@internal_logger ||= in_memory_logger
|
181
325
|
end
|
@@ -195,7 +339,7 @@ module Appsignal
|
|
195
339
|
def start_logger
|
196
340
|
callers = caller
|
197
341
|
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
198
|
-
"
|
342
|
+
"Calling 'Appsignal.start_logger' is deprecated. " \
|
199
343
|
"The logger will be started when calling 'Appsignal.start'. " \
|
200
344
|
"Remove the 'Appsignal.start_logger' call in the following file to " \
|
201
345
|
"remove this message.\n#{callers.first}"
|
@@ -237,6 +381,16 @@ module Appsignal
|
|
237
381
|
!!extension_loaded
|
238
382
|
end
|
239
383
|
|
384
|
+
# Returns if {.start} has been called before with a valid config to start
|
385
|
+
# AppSignal.
|
386
|
+
#
|
387
|
+
# @return [Boolean]
|
388
|
+
# @see Extension
|
389
|
+
# @since 3.12.0
|
390
|
+
def started?
|
391
|
+
defined?(@started) ? @started : false
|
392
|
+
end
|
393
|
+
|
240
394
|
# Returns the active state of the AppSignal integration.
|
241
395
|
#
|
242
396
|
# Conditions apply for AppSignal to be marked as active:
|
@@ -313,6 +467,7 @@ module Appsignal
|
|
313
467
|
end
|
314
468
|
end
|
315
469
|
|
470
|
+
require "appsignal/loaders"
|
316
471
|
require "appsignal/environment"
|
317
472
|
require "appsignal/system"
|
318
473
|
require "appsignal/utils"
|
@@ -4,7 +4,7 @@ require "appsignal/cli/diagnose/paths"
|
|
4
4
|
|
5
5
|
describe Appsignal::CLI::Diagnose::Paths do
|
6
6
|
describe "#paths" do
|
7
|
-
before {
|
7
|
+
before { start_agent }
|
8
8
|
|
9
9
|
it "returns gem installation path as package_install_path" do
|
10
10
|
expect(described_class.new.paths[:package_install_path]).to eq(
|
@@ -67,7 +67,6 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
|
|
67
67
|
capture_diagnatics_report_request
|
68
68
|
end
|
69
69
|
before(:send_report => :no_cli_option) { options["no-send-report"] = nil }
|
70
|
-
after { Appsignal.config = nil }
|
71
70
|
|
72
71
|
def capture_diagnatics_report_request
|
73
72
|
stub_diagnostics_report_request.to_rack(DiagnosticsReportEndpoint)
|