appsignal 3.9.3-java → 3.11.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +22 -19
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +180 -0
- data/Gemfile +1 -0
- data/README.md +0 -1
- data/Rakefile +1 -1
- data/benchmark.rake +99 -42
- data/build_matrix.yml +10 -12
- data/gemfiles/webmachine1.gemfile +5 -4
- data/lib/appsignal/cli/demo.rb +0 -1
- data/lib/appsignal/config.rb +57 -97
- data/lib/appsignal/demo.rb +15 -20
- data/lib/appsignal/environment.rb +6 -1
- 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 +490 -16
- data/lib/appsignal/hooks/action_cable.rb +21 -16
- data/lib/appsignal/hooks/active_job.rb +15 -14
- 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/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 +21 -25
- data/lib/appsignal/integrations/que.rb +13 -20
- data/lib/appsignal/integrations/railtie.rb +1 -1
- data/lib/appsignal/integrations/rake.rb +45 -15
- 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 -25
- data/lib/appsignal/integrations/unicorn.rb +1 -0
- data/lib/appsignal/integrations/webmachine.rb +12 -9
- 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 +67 -24
- data/lib/appsignal/rack/body_wrapper.rb +143 -0
- data/lib/appsignal/rack/event_handler.rb +39 -8
- data/lib/appsignal/rack/generic_instrumentation.rb +6 -4
- data/lib/appsignal/rack/grape_middleware.rb +3 -2
- data/lib/appsignal/rack/hanami_middleware.rb +1 -1
- data/lib/appsignal/rack/instrumentation_middleware.rb +62 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +1 -3
- data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -3
- data/lib/appsignal/rack/streaming_listener.rb +14 -59
- data/lib/appsignal/rack.rb +60 -0
- data/lib/appsignal/span.rb +1 -0
- data/lib/appsignal/transaction.rb +353 -104
- 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 +9 -6
- data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +139 -43
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +43 -74
- data/spec/lib/appsignal/hooks/activejob_spec.rb +9 -0
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +2 -443
- data/spec/lib/appsignal/hooks/rake_spec.rb +100 -17
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -171
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +459 -0
- data/spec/lib/appsignal/integrations/padrino_spec.rb +181 -131
- data/spec/lib/appsignal/integrations/que_spec.rb +3 -4
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +167 -0
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +4 -4
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +10 -2
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +77 -17
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +144 -11
- data/spec/lib/appsignal/rack/body_wrapper_spec.rb +263 -0
- data/spec/lib/appsignal/rack/event_handler_spec.rb +81 -10
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +70 -17
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +1 -1
- data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +38 -0
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +4 -2
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +43 -120
- data/spec/lib/appsignal/rack_spec.rb +63 -0
- data/spec/lib/appsignal/transaction_spec.rb +1675 -953
- 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 +517 -13
- data/spec/support/helpers/transaction_helpers.rb +44 -20
- data/spec/support/matchers/transaction.rb +15 -1
- data/spec/support/mocks/dummy_app.rb +1 -1
- data/spec/support/testing.rb +1 -1
- metadata +12 -4
- data/support/check_versions +0 -22
data/lib/appsignal/config.rb
CHANGED
@@ -10,6 +10,7 @@ module Appsignal
|
|
10
10
|
class Config
|
11
11
|
include Appsignal::Utils::StdoutAndLoggerMessage
|
12
12
|
|
13
|
+
# @api private
|
13
14
|
DEFAULT_CONFIG = {
|
14
15
|
:activejob_report_errors => "all",
|
15
16
|
:ca_file_path => File.expand_path(File.join("../../../resources/cacert.pem"), __FILE__),
|
@@ -23,6 +24,7 @@ module Appsignal
|
|
23
24
|
:enable_gvl_global_timer => true,
|
24
25
|
:enable_gvl_waiting_threads => true,
|
25
26
|
:enable_rails_error_reporter => true,
|
27
|
+
:enable_rake_performance_instrumentation => false,
|
26
28
|
:endpoint => "https://push.appsignal.com",
|
27
29
|
:files_world_accessible => true,
|
28
30
|
:filter_metadata => [],
|
@@ -66,15 +68,31 @@ module Appsignal
|
|
66
68
|
"trace" => ::Logger::DEBUG
|
67
69
|
}.freeze
|
68
70
|
|
69
|
-
|
70
|
-
|
71
|
+
# @api private
|
72
|
+
ENV_STRING_KEYS = {
|
71
73
|
"APPSIGNAL_ACTIVEJOB_REPORT_ERRORS" => :activejob_report_errors,
|
72
74
|
"APPSIGNAL_APP_NAME" => :name,
|
73
75
|
"APPSIGNAL_BIND_ADDRESS" => :bind_address,
|
74
76
|
"APPSIGNAL_CA_FILE_PATH" => :ca_file_path,
|
75
|
-
"
|
77
|
+
"APPSIGNAL_HOSTNAME" => :hostname,
|
78
|
+
"APPSIGNAL_HOST_ROLE" => :host_role,
|
79
|
+
"APPSIGNAL_HTTP_PROXY" => :http_proxy,
|
80
|
+
"APPSIGNAL_LOG" => :log,
|
81
|
+
"APPSIGNAL_LOG_LEVEL" => :log_level,
|
82
|
+
"APPSIGNAL_LOG_PATH" => :log_path,
|
83
|
+
"APPSIGNAL_LOGGING_ENDPOINT" => :logging_endpoint,
|
84
|
+
"APPSIGNAL_PUSH_API_ENDPOINT" => :endpoint,
|
85
|
+
"APPSIGNAL_PUSH_API_KEY" => :push_api_key,
|
86
|
+
"APPSIGNAL_SIDEKIQ_REPORT_ERRORS" => :sidekiq_report_errors,
|
87
|
+
"APPSIGNAL_STATSD_PORT" => :statsd_port,
|
88
|
+
"APPSIGNAL_WORKING_DIRECTORY_PATH" => :working_directory_path,
|
89
|
+
"APPSIGNAL_WORKING_DIR_PATH" => :working_dir_path,
|
90
|
+
"APP_REVISION" => :revision
|
91
|
+
}.freeze
|
92
|
+
# @api private
|
93
|
+
ENV_BOOLEAN_KEYS = {
|
94
|
+
"APPSIGNAL_ACTIVE" => :active,
|
76
95
|
"APPSIGNAL_DEBUG" => :debug,
|
77
|
-
"APPSIGNAL_DNS_SERVERS" => :dns_servers,
|
78
96
|
"APPSIGNAL_ENABLE_ALLOCATION_TRACKING" => :enable_allocation_tracking,
|
79
97
|
"APPSIGNAL_ENABLE_HOST_METRICS" => :enable_host_metrics,
|
80
98
|
"APPSIGNAL_ENABLE_MINUTELY_PROBES" => :enable_minutely_probes,
|
@@ -83,100 +101,36 @@ module Appsignal
|
|
83
101
|
"APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER" => :enable_gvl_global_timer,
|
84
102
|
"APPSIGNAL_ENABLE_GVL_WAITING_THREADS" => :enable_gvl_waiting_threads,
|
85
103
|
"APPSIGNAL_ENABLE_RAILS_ERROR_REPORTER" => :enable_rails_error_reporter,
|
104
|
+
"APPSIGNAL_ENABLE_RAKE_PERFORMANCE_INSTRUMENTATION" =>
|
105
|
+
:enable_rake_performance_instrumentation,
|
86
106
|
"APPSIGNAL_FILES_WORLD_ACCESSIBLE" => :files_world_accessible,
|
87
|
-
"APPSIGNAL_FILTER_METADATA" => :filter_metadata,
|
88
|
-
"APPSIGNAL_FILTER_PARAMETERS" => :filter_parameters,
|
89
|
-
"APPSIGNAL_FILTER_SESSION_DATA" => :filter_session_data,
|
90
|
-
"APPSIGNAL_HOSTNAME" => :hostname,
|
91
|
-
"APPSIGNAL_HOST_ROLE" => :host_role,
|
92
|
-
"APPSIGNAL_HTTP_PROXY" => :http_proxy,
|
93
|
-
"APPSIGNAL_IGNORE_ACTIONS" => :ignore_actions,
|
94
|
-
"APPSIGNAL_IGNORE_ERRORS" => :ignore_errors,
|
95
|
-
"APPSIGNAL_IGNORE_LOGS" => :ignore_logs,
|
96
|
-
"APPSIGNAL_IGNORE_NAMESPACES" => :ignore_namespaces,
|
97
107
|
"APPSIGNAL_INSTRUMENT_HTTP_RB" => :instrument_http_rb,
|
98
108
|
"APPSIGNAL_INSTRUMENT_NET_HTTP" => :instrument_net_http,
|
99
109
|
"APPSIGNAL_INSTRUMENT_REDIS" => :instrument_redis,
|
100
110
|
"APPSIGNAL_INSTRUMENT_SEQUEL" => :instrument_sequel,
|
101
|
-
"APPSIGNAL_LOG" => :log,
|
102
|
-
"APPSIGNAL_LOG_LEVEL" => :log_level,
|
103
|
-
"APPSIGNAL_LOG_PATH" => :log_path,
|
104
|
-
"APPSIGNAL_LOGGING_ENDPOINT" => :logging_endpoint,
|
105
|
-
"APPSIGNAL_PUSH_API_ENDPOINT" => :endpoint,
|
106
|
-
"APPSIGNAL_PUSH_API_KEY" => :push_api_key,
|
107
|
-
"APPSIGNAL_REQUEST_HEADERS" => :request_headers,
|
108
111
|
"APPSIGNAL_RUNNING_IN_CONTAINER" => :running_in_container,
|
109
112
|
"APPSIGNAL_SEND_ENVIRONMENT_METADATA" => :send_environment_metadata,
|
110
113
|
"APPSIGNAL_SEND_PARAMS" => :send_params,
|
111
114
|
"APPSIGNAL_SEND_SESSION_DATA" => :send_session_data,
|
112
|
-
"APPSIGNAL_SIDEKIQ_REPORT_ERRORS" => :sidekiq_report_errors,
|
113
115
|
"APPSIGNAL_SKIP_SESSION_DATA" => :skip_session_data,
|
114
|
-
"
|
115
|
-
"APPSIGNAL_TRANSACTION_DEBUG_MODE" => :transaction_debug_mode,
|
116
|
-
"APPSIGNAL_WORKING_DIRECTORY_PATH" => :working_directory_path,
|
117
|
-
"APPSIGNAL_WORKING_DIR_PATH" => :working_dir_path,
|
118
|
-
"APP_REVISION" => :revision
|
116
|
+
"APPSIGNAL_TRANSACTION_DEBUG_MODE" => :transaction_debug_mode
|
119
117
|
}.freeze
|
120
118
|
# @api private
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
APPSIGNAL_LOGGING_ENDPOINT
|
133
|
-
APPSIGNAL_PUSH_API_ENDPOINT
|
134
|
-
APPSIGNAL_PUSH_API_KEY
|
135
|
-
APPSIGNAL_SIDEKIQ_REPORT_ERRORS
|
136
|
-
APPSIGNAL_STATSD_PORT
|
137
|
-
APPSIGNAL_WORKING_DIRECTORY_PATH
|
138
|
-
APPSIGNAL_WORKING_DIR_PATH
|
139
|
-
APP_REVISION
|
140
|
-
].freeze
|
141
|
-
# @api private
|
142
|
-
ENV_BOOLEAN_KEYS = %w[
|
143
|
-
APPSIGNAL_ACTIVE
|
144
|
-
APPSIGNAL_DEBUG
|
145
|
-
APPSIGNAL_ENABLE_ALLOCATION_TRACKING
|
146
|
-
APPSIGNAL_ENABLE_HOST_METRICS
|
147
|
-
APPSIGNAL_ENABLE_MINUTELY_PROBES
|
148
|
-
APPSIGNAL_ENABLE_STATSD
|
149
|
-
APPSIGNAL_ENABLE_NGINX_METRICS
|
150
|
-
APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER
|
151
|
-
APPSIGNAL_ENABLE_GVL_WAITING_THREADS
|
152
|
-
APPSIGNAL_ENABLE_RAILS_ERROR_REPORTER
|
153
|
-
APPSIGNAL_FILES_WORLD_ACCESSIBLE
|
154
|
-
APPSIGNAL_INSTRUMENT_HTTP_RB
|
155
|
-
APPSIGNAL_INSTRUMENT_NET_HTTP
|
156
|
-
APPSIGNAL_INSTRUMENT_REDIS
|
157
|
-
APPSIGNAL_INSTRUMENT_SEQUEL
|
158
|
-
APPSIGNAL_RUNNING_IN_CONTAINER
|
159
|
-
APPSIGNAL_SEND_ENVIRONMENT_METADATA
|
160
|
-
APPSIGNAL_SEND_PARAMS
|
161
|
-
APPSIGNAL_SEND_SESSION_DATA
|
162
|
-
APPSIGNAL_SKIP_SESSION_DATA
|
163
|
-
APPSIGNAL_TRANSACTION_DEBUG_MODE
|
164
|
-
].freeze
|
119
|
+
ENV_ARRAY_KEYS = {
|
120
|
+
"APPSIGNAL_DNS_SERVERS" => :dns_servers,
|
121
|
+
"APPSIGNAL_FILTER_METADATA" => :filter_metadata,
|
122
|
+
"APPSIGNAL_FILTER_PARAMETERS" => :filter_parameters,
|
123
|
+
"APPSIGNAL_FILTER_SESSION_DATA" => :filter_session_data,
|
124
|
+
"APPSIGNAL_IGNORE_ACTIONS" => :ignore_actions,
|
125
|
+
"APPSIGNAL_IGNORE_ERRORS" => :ignore_errors,
|
126
|
+
"APPSIGNAL_IGNORE_LOGS" => :ignore_logs,
|
127
|
+
"APPSIGNAL_IGNORE_NAMESPACES" => :ignore_namespaces,
|
128
|
+
"APPSIGNAL_REQUEST_HEADERS" => :request_headers
|
129
|
+
}.freeze
|
165
130
|
# @api private
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
APPSIGNAL_FILTER_PARAMETERS
|
170
|
-
APPSIGNAL_FILTER_SESSION_DATA
|
171
|
-
APPSIGNAL_IGNORE_ACTIONS
|
172
|
-
APPSIGNAL_IGNORE_ERRORS
|
173
|
-
APPSIGNAL_IGNORE_LOGS
|
174
|
-
APPSIGNAL_IGNORE_NAMESPACES
|
175
|
-
APPSIGNAL_REQUEST_HEADERS
|
176
|
-
].freeze
|
177
|
-
ENV_FLOAT_KEYS = %w[
|
178
|
-
APPSIGNAL_CPU_COUNT
|
179
|
-
].freeze
|
131
|
+
ENV_FLOAT_KEYS = {
|
132
|
+
"APPSIGNAL_CPU_COUNT" => :cpu_count
|
133
|
+
}.freeze
|
180
134
|
|
181
135
|
# @attribute [r] system_config
|
182
136
|
# Config detected on the system level.
|
@@ -207,8 +161,10 @@ module Appsignal
|
|
207
161
|
# @api private
|
208
162
|
# @return [Hash]
|
209
163
|
|
164
|
+
# @api private
|
210
165
|
attr_reader :root_path, :env, :config_hash, :system_config,
|
211
166
|
:initial_config, :file_config, :env_config, :override_config
|
167
|
+
# @api private
|
212
168
|
attr_accessor :logger
|
213
169
|
|
214
170
|
# Initialize a new configuration object for AppSignal.
|
@@ -312,6 +268,7 @@ module Appsignal
|
|
312
268
|
config_hash[key] = value
|
313
269
|
end
|
314
270
|
|
271
|
+
# @api private
|
315
272
|
def log_level
|
316
273
|
level = ::Logger::DEBUG if config_hash[:debug] || config_hash[:transaction_debug_mode]
|
317
274
|
option = config_hash[:log_level]
|
@@ -322,6 +279,7 @@ module Appsignal
|
|
322
279
|
level.nil? ? Appsignal::Config::DEFAULT_LOG_LEVEL : level
|
323
280
|
end
|
324
281
|
|
282
|
+
# @api private
|
325
283
|
def log_file_path
|
326
284
|
return @log_file_path if defined? @log_file_path
|
327
285
|
|
@@ -356,6 +314,7 @@ module Appsignal
|
|
356
314
|
@valid && config_hash[:active]
|
357
315
|
end
|
358
316
|
|
317
|
+
# @api private
|
359
318
|
def write_to_environment # rubocop:disable Metrics/AbcSize
|
360
319
|
ENV["_APPSIGNAL_ACTIVE"] = active?.to_s
|
361
320
|
ENV["_APPSIGNAL_AGENT_PATH"] = File.expand_path("../../ext", __dir__).to_s
|
@@ -401,6 +360,7 @@ module Appsignal
|
|
401
360
|
ENV["_APP_REVISION"] = config_hash[:revision].to_s
|
402
361
|
end
|
403
362
|
|
363
|
+
# @api private
|
404
364
|
def validate
|
405
365
|
# Strip path from endpoint so we're backwards compatible with
|
406
366
|
# earlier versions of the gem.
|
@@ -499,35 +459,35 @@ module Appsignal
|
|
499
459
|
config = {}
|
500
460
|
|
501
461
|
# Configuration with string type
|
502
|
-
ENV_STRING_KEYS.each do |
|
503
|
-
env_var = ENV.fetch(
|
462
|
+
ENV_STRING_KEYS.each do |env_key, option|
|
463
|
+
env_var = ENV.fetch(env_key, nil)
|
504
464
|
next unless env_var
|
505
465
|
|
506
|
-
config[
|
466
|
+
config[option] = env_var
|
507
467
|
end
|
508
468
|
|
509
469
|
# Configuration with boolean type
|
510
|
-
ENV_BOOLEAN_KEYS.each do |
|
511
|
-
env_var = ENV.fetch(
|
470
|
+
ENV_BOOLEAN_KEYS.each do |env_key, option|
|
471
|
+
env_var = ENV.fetch(env_key, nil)
|
512
472
|
next unless env_var
|
513
473
|
|
514
|
-
config[
|
474
|
+
config[option] = env_var.casecmp("true").zero?
|
515
475
|
end
|
516
476
|
|
517
477
|
# Configuration with array of strings type
|
518
|
-
ENV_ARRAY_KEYS.each do |
|
519
|
-
env_var = ENV.fetch(
|
478
|
+
ENV_ARRAY_KEYS.each do |env_key, option|
|
479
|
+
env_var = ENV.fetch(env_key, nil)
|
520
480
|
next unless env_var
|
521
481
|
|
522
|
-
config[
|
482
|
+
config[option] = env_var.split(",")
|
523
483
|
end
|
524
484
|
|
525
485
|
# Configuration with float type
|
526
|
-
ENV_FLOAT_KEYS.each do |
|
527
|
-
env_var = ENV.fetch(
|
486
|
+
ENV_FLOAT_KEYS.each do |env_key, option|
|
487
|
+
env_var = ENV.fetch(env_key, nil)
|
528
488
|
next unless env_var
|
529
489
|
|
530
|
-
config[
|
490
|
+
config[option] = env_var.to_f
|
531
491
|
end
|
532
492
|
|
533
493
|
config
|
data/lib/appsignal/demo.rb
CHANGED
@@ -39,18 +39,15 @@ module Appsignal
|
|
39
39
|
private
|
40
40
|
|
41
41
|
def create_example_error_request
|
42
|
-
transaction = Appsignal::Transaction.create(
|
43
|
-
SecureRandom.uuid,
|
44
|
-
Appsignal::Transaction::HTTP_REQUEST,
|
45
|
-
rack_request
|
46
|
-
)
|
42
|
+
transaction = Appsignal::Transaction.create(Appsignal::Transaction::HTTP_REQUEST)
|
47
43
|
begin
|
48
44
|
raise TestError,
|
49
45
|
"Hello world! This is an error used for demonstration purposes."
|
50
46
|
rescue => error
|
51
47
|
Appsignal.set_error(error)
|
52
48
|
end
|
53
|
-
transaction
|
49
|
+
add_params_to(transaction)
|
50
|
+
add_headers_to(transaction)
|
54
51
|
transaction.set_metadata("path", "/hello")
|
55
52
|
transaction.set_metadata("method", "GET")
|
56
53
|
transaction.set_action("DemoController#hello")
|
@@ -59,16 +56,13 @@ module Appsignal
|
|
59
56
|
end
|
60
57
|
|
61
58
|
def create_example_performance_request
|
62
|
-
transaction = Appsignal::Transaction.create(
|
63
|
-
SecureRandom.uuid,
|
64
|
-
Appsignal::Transaction::HTTP_REQUEST,
|
65
|
-
rack_request
|
66
|
-
)
|
59
|
+
transaction = Appsignal::Transaction.create(Appsignal::Transaction::HTTP_REQUEST)
|
67
60
|
Appsignal.instrument "action_view.render", "Render hello.html.erb",
|
68
61
|
"<h1>Hello world!</h1>" do
|
69
62
|
sleep 2
|
70
63
|
end
|
71
|
-
transaction
|
64
|
+
add_params_to(transaction)
|
65
|
+
add_headers_to(transaction)
|
72
66
|
transaction.set_metadata("path", "/hello")
|
73
67
|
transaction.set_metadata("method", "GET")
|
74
68
|
transaction.set_action("DemoController#hello")
|
@@ -80,13 +74,15 @@ module Appsignal
|
|
80
74
|
transaction.set_metadata("demo_sample", "true")
|
81
75
|
end
|
82
76
|
|
83
|
-
def
|
84
|
-
|
85
|
-
"
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
77
|
+
def add_params_to(transaction)
|
78
|
+
transaction.set_params(
|
79
|
+
"controller" => "demo",
|
80
|
+
"action" => "hello"
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
def add_headers_to(transaction)
|
85
|
+
transaction.set_headers(
|
90
86
|
"REMOTE_ADDR" => "127.0.0.1",
|
91
87
|
"REQUEST_METHOD" => "GET",
|
92
88
|
"SERVER_NAME" => "localhost",
|
@@ -102,7 +98,6 @@ module Appsignal
|
|
102
98
|
"HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0)",
|
103
99
|
"HTTP_REFERER" => "http://appsignal.com/accounts"
|
104
100
|
)
|
105
|
-
::Rack::Request.new(env)
|
106
101
|
end
|
107
102
|
end
|
108
103
|
end
|
@@ -121,7 +121,12 @@ module Appsignal
|
|
121
121
|
def self.report_supported_gems
|
122
122
|
return unless defined?(Bundler) # Do nothing if Bundler is not present
|
123
123
|
|
124
|
-
bundle_gem_specs =
|
124
|
+
bundle_gem_specs =
|
125
|
+
if ::Bundler.rubygems.respond_to?(:installed_specs)
|
126
|
+
::Bundler.rubygems.installed_specs
|
127
|
+
else
|
128
|
+
::Bundler.rubygems.all_specs
|
129
|
+
end
|
125
130
|
SUPPORTED_GEMS.each do |gem_name|
|
126
131
|
gem_spec = bundle_gem_specs.find { |spec| spec.name == gem_name }
|
127
132
|
next unless gem_spec
|
@@ -10,14 +10,14 @@ module Appsignal
|
|
10
10
|
# event, the same object will be called intermittently in a threaded environment.
|
11
11
|
# So only keep global configuration as state and pass the payload around as an
|
12
12
|
# argument if you need to use helper methods.
|
13
|
-
#
|
14
|
-
# @api private
|
15
13
|
class EventFormatter
|
16
14
|
class << self
|
15
|
+
# @api private
|
17
16
|
def formatters
|
18
17
|
@formatters ||= {}
|
19
18
|
end
|
20
19
|
|
20
|
+
# @api private
|
21
21
|
def formatter_classes
|
22
22
|
@formatter_classes ||= {}
|
23
23
|
end
|
@@ -49,6 +49,7 @@ module Appsignal
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
# @api private
|
52
53
|
def format(name, payload)
|
53
54
|
formatter = formatters[name]
|
54
55
|
formatter&.format(payload)
|