appsignal 3.4.0 → 3.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +63 -21
- data/.rubocop_todo.yml +68 -54
- data/.semaphore/semaphore.yml +11 -11
- data/CHANGELOG.md +37 -0
- data/Rakefile +15 -99
- data/appsignal.gemspec +3 -4
- data/bin/appsignal +4 -2
- data/build_matrix.yml +4 -4
- data/ext/._appsignal-agent +0 -0
- data/ext/Rakefile +22 -21
- data/ext/agent.rb +2 -0
- data/ext/base.rb +14 -17
- data/ext/extconf.rb +4 -1
- data/lib/appsignal/auth_check.rb +3 -3
- data/lib/appsignal/capistrano.rb +1 -1
- data/lib/appsignal/cli/demo.rb +5 -2
- data/lib/appsignal/cli/diagnose/paths.rb +4 -1
- data/lib/appsignal/cli/diagnose/utils.rb +7 -3
- data/lib/appsignal/cli/diagnose.rb +7 -5
- data/lib/appsignal/cli/helpers.rb +1 -4
- data/lib/appsignal/cli/install.rb +4 -10
- data/lib/appsignal/cli.rb +3 -2
- data/lib/appsignal/config.rb +105 -102
- data/lib/appsignal/demo.rb +2 -1
- data/lib/appsignal/environment.rb +2 -0
- data/lib/appsignal/event_formatter/action_view/render_formatter.rb +2 -1
- data/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb +13 -13
- data/lib/appsignal/event_formatter.rb +5 -4
- data/lib/appsignal/extension/jruby.rb +11 -9
- data/lib/appsignal/extension.rb +1 -1
- data/lib/appsignal/helpers/instrumentation.rb +50 -35
- data/lib/appsignal/hooks/action_cable.rb +6 -4
- data/lib/appsignal/hooks/action_mailer.rb +2 -0
- data/lib/appsignal/hooks/active_job.rb +11 -10
- data/lib/appsignal/hooks/active_support_notifications.rb +3 -4
- data/lib/appsignal/hooks/data_mapper.rb +1 -1
- data/lib/appsignal/hooks/gvl.rb +3 -0
- data/lib/appsignal/hooks/http.rb +1 -1
- data/lib/appsignal/hooks/mri.rb +2 -0
- data/lib/appsignal/hooks/net_http.rb +1 -1
- data/lib/appsignal/hooks/que.rb +1 -1
- data/lib/appsignal/hooks/rake.rb +1 -1
- data/lib/appsignal/hooks/redis.rb +1 -1
- data/lib/appsignal/hooks/resque.rb +1 -1
- data/lib/appsignal/hooks/shoryuken.rb +2 -4
- data/lib/appsignal/hooks/sidekiq.rb +1 -1
- data/lib/appsignal/hooks/unicorn.rb +2 -2
- data/lib/appsignal/hooks/webmachine.rb +1 -1
- data/lib/appsignal/hooks.rb +2 -2
- data/lib/appsignal/integrations/active_support_notifications.rb +1 -1
- data/lib/appsignal/integrations/capistrano/appsignal.cap +6 -3
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +5 -4
- data/lib/appsignal/integrations/delayed_job_plugin.rb +3 -5
- data/lib/appsignal/integrations/grape.rb +1 -1
- data/lib/appsignal/integrations/hanami.rb +1 -1
- data/lib/appsignal/integrations/object.rb +2 -3
- data/lib/appsignal/integrations/padrino.rb +2 -4
- data/lib/appsignal/integrations/que.rb +6 -6
- data/lib/appsignal/integrations/railtie.rb +72 -0
- data/lib/appsignal/integrations/sidekiq.rb +9 -11
- data/lib/appsignal/integrations/sinatra.rb +1 -3
- data/lib/appsignal/integrations/webmachine.rb +4 -6
- data/lib/appsignal/logger.rb +31 -6
- data/lib/appsignal/marker.rb +4 -5
- data/lib/appsignal/minutely.rb +7 -7
- data/lib/appsignal/probes/gvl.rb +9 -4
- data/lib/appsignal/probes/helpers.rb +4 -6
- data/lib/appsignal/probes/mri.rb +7 -5
- data/lib/appsignal/probes/sidekiq.rb +3 -0
- data/lib/appsignal/probes.rb +2 -0
- data/lib/appsignal/rack/generic_instrumentation.rb +1 -5
- data/lib/appsignal/rack/sinatra_instrumentation.rb +3 -5
- data/lib/appsignal/rack/streaming_listener.rb +11 -13
- data/lib/appsignal/span.rb +5 -5
- data/lib/appsignal/system.rb +10 -11
- data/lib/appsignal/transaction.rb +49 -25
- data/lib/appsignal/transmitter.rb +4 -2
- data/lib/appsignal/utils/deprecation_message.rb +2 -0
- data/lib/appsignal/utils/hash_sanitizer.rb +1 -1
- data/lib/appsignal/utils/integration_logger.rb +5 -3
- data/lib/appsignal/utils/json.rb +1 -1
- data/lib/appsignal/utils/query_params_sanitizer.rb +1 -1
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +5 -4
- data/lib/puma/plugin/appsignal.rb +16 -18
- data/script/lint_git +1 -1
- data/spec/lib/appsignal/capistrano2_spec.rb +6 -3
- data/spec/lib/appsignal/capistrano3_spec.rb +6 -3
- data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +1 -3
- data/spec/lib/appsignal/cli/diagnose_spec.rb +33 -30
- data/spec/lib/appsignal/cli/install_spec.rb +5 -6
- data/spec/lib/appsignal/cli_spec.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +43 -37
- data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +11 -5
- data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +4 -4
- data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +1 -4
- data/spec/lib/appsignal/event_formatter_spec.rb +11 -9
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +5 -2
- data/spec/lib/appsignal/hooks/action_mailer_spec.rb +2 -1
- data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +1 -1
- data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +1 -1
- data/spec/lib/appsignal/hooks/activejob_spec.rb +21 -12
- data/spec/lib/appsignal/hooks/data_mapper_spec.rb +1 -0
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +12 -12
- data/spec/lib/appsignal/hooks/excon_spec.rb +2 -2
- data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +3 -1
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +4 -2
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +2 -1
- data/spec/lib/appsignal/hooks_spec.rb +5 -4
- data/spec/lib/appsignal/integrations/grape_spec.rb +8 -4
- data/spec/lib/appsignal/integrations/hanami_spec.rb +16 -8
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +2 -4
- data/spec/lib/appsignal/integrations/object_spec.rb +6 -1
- data/spec/lib/appsignal/integrations/padrino_spec.rb +4 -2
- data/spec/lib/appsignal/integrations/railtie_spec.rb +213 -6
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +54 -41
- data/spec/lib/appsignal/logger_spec.rb +20 -4
- data/spec/lib/appsignal/marker_spec.rb +2 -2
- data/spec/lib/appsignal/minutely_spec.rb +3 -3
- data/spec/lib/appsignal/probes/gvl_spec.rb +60 -12
- data/spec/lib/appsignal/probes/mri_spec.rb +7 -4
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +2 -1
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +2 -1
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +10 -5
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +7 -5
- data/spec/lib/appsignal/transaction_spec.rb +20 -13
- data/spec/lib/appsignal/utils/data_spec.rb +10 -1
- data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +11 -11
- data/spec/lib/appsignal/utils/json_spec.rb +4 -2
- data/spec/lib/appsignal_spec.rb +49 -35
- data/spec/lib/puma/appsignal_spec.rb +9 -11
- data/spec/spec_helper.rb +14 -2
- data/spec/support/fixtures/projects/valid/config/appsignal.yml +1 -1
- data/spec/support/helpers/config_helpers.rb +2 -1
- data/spec/support/helpers/dependency_helper.rb +1 -9
- data/spec/support/helpers/std_streams_helper.rb +1 -3
- data/spec/support/helpers/wait_for_helper.rb +2 -3
- data/spec/support/mocks/appsignal_mock.rb +1 -1
- data/spec/support/mocks/fake_gvl_tools.rb +2 -10
- data/spec/support/testing.rb +4 -3
- metadata +9 -135
data/lib/appsignal/config.rb
CHANGED
@@ -11,39 +11,40 @@ module Appsignal
|
|
11
11
|
include Appsignal::Utils::DeprecationMessage
|
12
12
|
|
13
13
|
DEFAULT_CONFIG = {
|
14
|
-
:ca_file_path
|
15
|
-
:debug
|
16
|
-
:dns_servers
|
17
|
-
:enable_allocation_tracking
|
18
|
-
:enable_host_metrics
|
19
|
-
:enable_minutely_probes
|
20
|
-
:enable_statsd
|
21
|
-
:enable_nginx_metrics
|
22
|
-
:enable_gvl_global_timer
|
23
|
-
:enable_gvl_waiting_threads
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
14
|
+
:ca_file_path => File.expand_path(File.join("../../../resources/cacert.pem"), __FILE__),
|
15
|
+
:debug => false,
|
16
|
+
:dns_servers => [],
|
17
|
+
:enable_allocation_tracking => true,
|
18
|
+
:enable_host_metrics => true,
|
19
|
+
:enable_minutely_probes => true,
|
20
|
+
:enable_statsd => true,
|
21
|
+
:enable_nginx_metrics => false,
|
22
|
+
:enable_gvl_global_timer => true,
|
23
|
+
:enable_gvl_waiting_threads => true,
|
24
|
+
:enable_rails_error_reporter => true,
|
25
|
+
:endpoint => "https://push.appsignal.com",
|
26
|
+
:files_world_accessible => true,
|
27
|
+
:filter_parameters => [],
|
28
|
+
:filter_session_data => [],
|
29
|
+
:ignore_actions => [],
|
30
|
+
:ignore_errors => [],
|
31
|
+
:ignore_namespaces => [],
|
32
|
+
:instrument_http_rb => true,
|
33
|
+
:instrument_net_http => true,
|
34
|
+
:instrument_redis => true,
|
35
|
+
:instrument_sequel => true,
|
36
|
+
:log => "file",
|
37
|
+
:logging_endpoint => "https://appsignal-endpoint.net",
|
38
|
+
:request_headers => %w[
|
38
39
|
HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
|
39
40
|
HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_CONNECTION
|
40
41
|
CONTENT_LENGTH PATH_INFO HTTP_RANGE
|
41
42
|
REQUEST_METHOD REQUEST_URI SERVER_NAME SERVER_PORT
|
42
43
|
SERVER_PROTOCOL
|
43
44
|
],
|
44
|
-
:send_environment_metadata
|
45
|
-
:send_params
|
46
|
-
:transaction_debug_mode
|
45
|
+
:send_environment_metadata => true,
|
46
|
+
:send_params => true,
|
47
|
+
:transaction_debug_mode => false
|
47
48
|
}.freeze
|
48
49
|
|
49
50
|
# @api private
|
@@ -62,46 +63,47 @@ module Appsignal
|
|
62
63
|
}.freeze
|
63
64
|
|
64
65
|
ENV_TO_KEY_MAPPING = {
|
65
|
-
"APPSIGNAL_ACTIVE"
|
66
|
-
"APPSIGNAL_APP_NAME"
|
67
|
-
"APPSIGNAL_CA_FILE_PATH"
|
68
|
-
"APPSIGNAL_DEBUG"
|
69
|
-
"APPSIGNAL_DNS_SERVERS"
|
70
|
-
"APPSIGNAL_ENABLE_ALLOCATION_TRACKING"
|
71
|
-
"APPSIGNAL_ENABLE_HOST_METRICS"
|
72
|
-
"APPSIGNAL_ENABLE_MINUTELY_PROBES"
|
73
|
-
"APPSIGNAL_ENABLE_STATSD"
|
74
|
-
"APPSIGNAL_ENABLE_NGINX_METRICS"
|
75
|
-
"APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER"
|
76
|
-
"APPSIGNAL_ENABLE_GVL_WAITING_THREADS"
|
77
|
-
"
|
78
|
-
"
|
79
|
-
"
|
80
|
-
"
|
81
|
-
"
|
82
|
-
"
|
83
|
-
"
|
84
|
-
"
|
85
|
-
"
|
86
|
-
"
|
87
|
-
"
|
88
|
-
"
|
89
|
-
"
|
90
|
-
"
|
91
|
-
"
|
92
|
-
"
|
93
|
-
"
|
94
|
-
"
|
95
|
-
"
|
96
|
-
"
|
97
|
-
"
|
98
|
-
"
|
99
|
-
"
|
100
|
-
"
|
101
|
-
"
|
102
|
-
"
|
103
|
-
"
|
104
|
-
"
|
66
|
+
"APPSIGNAL_ACTIVE" => :active,
|
67
|
+
"APPSIGNAL_APP_NAME" => :name,
|
68
|
+
"APPSIGNAL_CA_FILE_PATH" => :ca_file_path,
|
69
|
+
"APPSIGNAL_DEBUG" => :debug,
|
70
|
+
"APPSIGNAL_DNS_SERVERS" => :dns_servers,
|
71
|
+
"APPSIGNAL_ENABLE_ALLOCATION_TRACKING" => :enable_allocation_tracking,
|
72
|
+
"APPSIGNAL_ENABLE_HOST_METRICS" => :enable_host_metrics,
|
73
|
+
"APPSIGNAL_ENABLE_MINUTELY_PROBES" => :enable_minutely_probes,
|
74
|
+
"APPSIGNAL_ENABLE_STATSD" => :enable_statsd,
|
75
|
+
"APPSIGNAL_ENABLE_NGINX_METRICS" => :enable_nginx_metrics,
|
76
|
+
"APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER" => :enable_gvl_global_timer,
|
77
|
+
"APPSIGNAL_ENABLE_GVL_WAITING_THREADS" => :enable_gvl_waiting_threads,
|
78
|
+
"APPSIGNAL_ENABLE_RAILS_ERROR_REPORTER" => :enable_rails_error_reporter,
|
79
|
+
"APPSIGNAL_FILES_WORLD_ACCESSIBLE" => :files_world_accessible,
|
80
|
+
"APPSIGNAL_FILTER_PARAMETERS" => :filter_parameters,
|
81
|
+
"APPSIGNAL_FILTER_SESSION_DATA" => :filter_session_data,
|
82
|
+
"APPSIGNAL_HOSTNAME" => :hostname,
|
83
|
+
"APPSIGNAL_HTTP_PROXY" => :http_proxy,
|
84
|
+
"APPSIGNAL_IGNORE_ACTIONS" => :ignore_actions,
|
85
|
+
"APPSIGNAL_IGNORE_ERRORS" => :ignore_errors,
|
86
|
+
"APPSIGNAL_IGNORE_NAMESPACES" => :ignore_namespaces,
|
87
|
+
"APPSIGNAL_INSTRUMENT_HTTP_RB" => :instrument_http_rb,
|
88
|
+
"APPSIGNAL_INSTRUMENT_NET_HTTP" => :instrument_net_http,
|
89
|
+
"APPSIGNAL_INSTRUMENT_REDIS" => :instrument_redis,
|
90
|
+
"APPSIGNAL_INSTRUMENT_SEQUEL" => :instrument_sequel,
|
91
|
+
"APPSIGNAL_LOG" => :log,
|
92
|
+
"APPSIGNAL_LOG_LEVEL" => :log_level,
|
93
|
+
"APPSIGNAL_LOG_PATH" => :log_path,
|
94
|
+
"APPSIGNAL_LOGGING_ENDPOINT" => :logging_endpoint,
|
95
|
+
"APPSIGNAL_PUSH_API_ENDPOINT" => :endpoint,
|
96
|
+
"APPSIGNAL_PUSH_API_KEY" => :push_api_key,
|
97
|
+
"APPSIGNAL_REQUEST_HEADERS" => :request_headers,
|
98
|
+
"APPSIGNAL_RUNNING_IN_CONTAINER" => :running_in_container,
|
99
|
+
"APPSIGNAL_SEND_ENVIRONMENT_METADATA" => :send_environment_metadata,
|
100
|
+
"APPSIGNAL_SEND_PARAMS" => :send_params,
|
101
|
+
"APPSIGNAL_SEND_SESSION_DATA" => :send_session_data,
|
102
|
+
"APPSIGNAL_SKIP_SESSION_DATA" => :skip_session_data,
|
103
|
+
"APPSIGNAL_TRANSACTION_DEBUG_MODE" => :transaction_debug_mode,
|
104
|
+
"APPSIGNAL_WORKING_DIRECTORY_PATH" => :working_directory_path,
|
105
|
+
"APPSIGNAL_WORKING_DIR_PATH" => :working_dir_path,
|
106
|
+
"APP_REVISION" => :revision
|
105
107
|
}.freeze
|
106
108
|
# @api private
|
107
109
|
ENV_STRING_KEYS = %w[
|
@@ -130,6 +132,7 @@ module Appsignal
|
|
130
132
|
APPSIGNAL_ENABLE_NGINX_METRICS
|
131
133
|
APPSIGNAL_ENABLE_GVL_GLOBAL_TIMER
|
132
134
|
APPSIGNAL_ENABLE_GVL_WAITING_THREADS
|
135
|
+
APPSIGNAL_ENABLE_RAILS_ERROR_REPORTER
|
133
136
|
APPSIGNAL_FILES_WORLD_ACCESSIBLE
|
134
137
|
APPSIGNAL_INSTRUMENT_HTTP_RB
|
135
138
|
APPSIGNAL_INSTRUMENT_NET_HTTP
|
@@ -218,16 +221,17 @@ module Appsignal
|
|
218
221
|
# Configuration load order
|
219
222
|
# @see https://docs.appsignal.com/ruby/instrumentation/integrating-appsignal.html
|
220
223
|
# How to integrate AppSignal manually
|
221
|
-
def initialize(root_path, env, initial_config = {}, logger = Appsignal.logger,
|
222
|
-
|
223
|
-
@
|
224
|
-
@
|
225
|
-
@
|
226
|
-
@
|
224
|
+
def initialize(root_path, env, initial_config = {}, logger = Appsignal.logger,
|
225
|
+
config_file = nil)
|
226
|
+
@root_path = root_path
|
227
|
+
@config_file = config_file
|
228
|
+
@logger = logger
|
229
|
+
@valid = false
|
230
|
+
@config_hash = DEFAULT_CONFIG.dup
|
227
231
|
env_loaded_from_initial = env.to_s
|
228
232
|
@env =
|
229
|
-
if ENV.key?("APPSIGNAL_APP_ENV"
|
230
|
-
env_loaded_from_env = ENV["APPSIGNAL_APP_ENV"
|
233
|
+
if ENV.key?("APPSIGNAL_APP_ENV")
|
234
|
+
env_loaded_from_env = ENV["APPSIGNAL_APP_ENV"]
|
231
235
|
else
|
232
236
|
env_loaded_from_initial
|
233
237
|
end
|
@@ -275,9 +279,7 @@ module Appsignal
|
|
275
279
|
end
|
276
280
|
|
277
281
|
def log_level
|
278
|
-
if config_hash[:debug] || config_hash[:transaction_debug_mode]
|
279
|
-
level = ::Logger::DEBUG
|
280
|
-
end
|
282
|
+
level = ::Logger::DEBUG if config_hash[:debug] || config_hash[:transaction_debug_mode]
|
281
283
|
option = config_hash[:log_level]
|
282
284
|
if option
|
283
285
|
log_level_option = LOG_LEVEL_MAP[option]
|
@@ -287,20 +289,18 @@ module Appsignal
|
|
287
289
|
end
|
288
290
|
|
289
291
|
def log_file_path
|
290
|
-
path = config_hash[:log_path] || root_path && File.join(root_path, "log")
|
291
|
-
if path && File.writable?(path)
|
292
|
-
return File.join(File.realpath(path), "appsignal.log")
|
293
|
-
end
|
292
|
+
path = config_hash[:log_path] || (root_path && File.join(root_path, "log"))
|
293
|
+
return File.join(File.realpath(path), "appsignal.log") if path && File.writable?(path)
|
294
294
|
|
295
295
|
system_tmp_dir = self.class.system_tmp_dir
|
296
296
|
if File.writable? system_tmp_dir
|
297
|
-
$stdout.puts "appsignal: Unable to log to '#{path}'. Logging to "\
|
298
|
-
"'#{system_tmp_dir}' instead. Please check the "\
|
297
|
+
$stdout.puts "appsignal: Unable to log to '#{path}'. Logging to " \
|
298
|
+
"'#{system_tmp_dir}' instead. Please check the " \
|
299
299
|
"permissions for the application's (log) directory."
|
300
300
|
File.join(system_tmp_dir, "appsignal.log")
|
301
301
|
else
|
302
|
-
$stdout.puts "appsignal: Unable to log to '#{path}' or the "\
|
303
|
-
"'#{system_tmp_dir}' fallback. Please check the permissions "\
|
302
|
+
$stdout.puts "appsignal: Unable to log to '#{path}' or the " \
|
303
|
+
"'#{system_tmp_dir}' fallback. Please check the permissions " \
|
304
304
|
"for the application's (log) directory."
|
305
305
|
end
|
306
306
|
end
|
@@ -315,7 +315,7 @@ module Appsignal
|
|
315
315
|
|
316
316
|
def write_to_environment # rubocop:disable Metrics/AbcSize
|
317
317
|
ENV["_APPSIGNAL_ACTIVE"] = active?.to_s
|
318
|
-
ENV["_APPSIGNAL_AGENT_PATH"] = File.expand_path("
|
318
|
+
ENV["_APPSIGNAL_AGENT_PATH"] = File.expand_path("../../ext", __dir__).to_s
|
319
319
|
ENV["_APPSIGNAL_APP_NAME"] = config_hash[:name]
|
320
320
|
ENV["_APPSIGNAL_APP_PATH"] = root_path.to_s
|
321
321
|
ENV["_APPSIGNAL_CA_FILE_PATH"] = config_hash[:ca_file_path].to_s
|
@@ -344,9 +344,13 @@ module Appsignal
|
|
344
344
|
ENV["_APPSIGNAL_RUNNING_IN_CONTAINER"] = config_hash[:running_in_container].to_s
|
345
345
|
ENV["_APPSIGNAL_SEND_ENVIRONMENT_METADATA"] = config_hash[:send_environment_metadata].to_s
|
346
346
|
ENV["_APPSIGNAL_TRANSACTION_DEBUG_MODE"] = config_hash[:transaction_debug_mode].to_s
|
347
|
-
|
348
|
-
|
349
|
-
|
347
|
+
if config_hash[:working_directory_path]
|
348
|
+
ENV["_APPSIGNAL_WORKING_DIRECTORY_PATH"] = config_hash[:working_directory_path]
|
349
|
+
end
|
350
|
+
if config_hash[:working_dir_path]
|
351
|
+
ENV["_APPSIGNAL_WORKING_DIR_PATH"] = config_hash[:working_dir_path]
|
352
|
+
end
|
353
|
+
ENV["_APP_REVISION"] = config_hash[:revision].to_s
|
350
354
|
end
|
351
355
|
|
352
356
|
def validate
|
@@ -392,12 +396,10 @@ module Appsignal
|
|
392
396
|
return if !config_file || !File.exist?(config_file)
|
393
397
|
|
394
398
|
read_options = YAML::VERSION >= "4.0.0" ? { :aliases => true } : {}
|
395
|
-
configurations = YAML.load(ERB.new(
|
399
|
+
configurations = YAML.load(ERB.new(File.read(config_file)).result, **read_options)
|
396
400
|
config_for_this_env = configurations[env]
|
397
401
|
if config_for_this_env
|
398
|
-
config_for_this_env.
|
399
|
-
hash[key.to_sym] = value # convert keys to symbols
|
400
|
-
end
|
402
|
+
config_for_this_env.transform_keys(&:to_sym)
|
401
403
|
else
|
402
404
|
logger.error "Not loading from config file: config for '#{env}' not found"
|
403
405
|
nil
|
@@ -428,8 +430,8 @@ module Appsignal
|
|
428
430
|
|
429
431
|
deprecation_message \
|
430
432
|
"The `working_dir_path` option is deprecated, please use " \
|
431
|
-
|
432
|
-
|
433
|
+
"`working_directory_path` instead and specify the " \
|
434
|
+
"full path to the working directory",
|
433
435
|
logger
|
434
436
|
end
|
435
437
|
|
@@ -438,22 +440,25 @@ module Appsignal
|
|
438
440
|
|
439
441
|
# Configuration with string type
|
440
442
|
ENV_STRING_KEYS.each do |var|
|
441
|
-
env_var = ENV
|
443
|
+
env_var = ENV.fetch(var, nil)
|
442
444
|
next unless env_var
|
445
|
+
|
443
446
|
config[ENV_TO_KEY_MAPPING[var]] = env_var
|
444
447
|
end
|
445
448
|
|
446
449
|
# Configuration with boolean type
|
447
450
|
ENV_BOOLEAN_KEYS.each do |var|
|
448
|
-
env_var = ENV
|
451
|
+
env_var = ENV.fetch(var, nil)
|
449
452
|
next unless env_var
|
453
|
+
|
450
454
|
config[ENV_TO_KEY_MAPPING[var]] = env_var.casecmp("true").zero?
|
451
455
|
end
|
452
456
|
|
453
457
|
# Configuration with array of strings type
|
454
458
|
ENV_ARRAY_KEYS.each do |var|
|
455
|
-
env_var = ENV
|
459
|
+
env_var = ENV.fetch(var, nil)
|
456
460
|
next unless env_var
|
461
|
+
|
457
462
|
config[ENV_TO_KEY_MAPPING[var]] = env_var.split(",")
|
458
463
|
end
|
459
464
|
|
@@ -487,9 +492,7 @@ module Appsignal
|
|
487
492
|
|
488
493
|
def merge(new_config)
|
489
494
|
new_config.each do |key, value|
|
490
|
-
unless config_hash[key].nil?
|
491
|
-
@logger.debug("Config key '#{key}' is being overwritten")
|
492
|
-
end
|
495
|
+
@logger.debug("Config key '#{key}' is being overwritten") unless config_hash[key].nil?
|
493
496
|
config_hash[key] = value
|
494
497
|
end
|
495
498
|
end
|
data/lib/appsignal/demo.rb
CHANGED
@@ -65,7 +65,8 @@ module Appsignal
|
|
65
65
|
Appsignal::Transaction::HTTP_REQUEST,
|
66
66
|
rack_request
|
67
67
|
)
|
68
|
-
Appsignal.instrument "action_view.render", "Render hello.html.erb",
|
68
|
+
Appsignal.instrument "action_view.render", "Render hello.html.erb",
|
69
|
+
"<h1>Hello world!</h1>" do
|
69
70
|
sleep 2
|
70
71
|
end
|
71
72
|
transaction.set_http_or_background_queue_start
|
@@ -5,7 +5,7 @@ module Appsignal
|
|
5
5
|
# @api private
|
6
6
|
module ActionView
|
7
7
|
class RenderFormatter
|
8
|
-
BLANK = ""
|
8
|
+
BLANK = ""
|
9
9
|
|
10
10
|
attr_reader :root_path
|
11
11
|
|
@@ -15,6 +15,7 @@ module Appsignal
|
|
15
15
|
|
16
16
|
def format(payload)
|
17
17
|
return nil unless payload[:identifier]
|
18
|
+
|
18
19
|
[payload[:identifier].sub(root_path, BLANK), nil]
|
19
20
|
end
|
20
21
|
end
|
@@ -7,7 +7,7 @@ module Appsignal
|
|
7
7
|
class QueryFormatter
|
8
8
|
ALLOWED = {
|
9
9
|
"find" => {
|
10
|
-
"find"
|
10
|
+
"find" => :allow,
|
11
11
|
"filter" => :sanitize_document
|
12
12
|
},
|
13
13
|
"count" => {
|
@@ -16,24 +16,24 @@ module Appsignal
|
|
16
16
|
},
|
17
17
|
"distinct" => {
|
18
18
|
"distinct" => :allow,
|
19
|
-
"key"
|
20
|
-
"query"
|
19
|
+
"key" => :allow,
|
20
|
+
"query" => :sanitize_document
|
21
21
|
},
|
22
22
|
"insert" => {
|
23
|
-
"insert"
|
23
|
+
"insert" => :allow,
|
24
24
|
"documents" => :sanitize_document,
|
25
|
-
"ordered"
|
25
|
+
"ordered" => :allow
|
26
26
|
},
|
27
27
|
"update" => {
|
28
|
-
"update"
|
28
|
+
"update" => :allow,
|
29
29
|
"updates" => :sanitize_document,
|
30
30
|
"ordered" => :allow
|
31
31
|
},
|
32
32
|
"findandmodify" => {
|
33
33
|
"findandmodify" => :allow,
|
34
|
-
"query"
|
35
|
-
"update"
|
36
|
-
"new"
|
34
|
+
"query" => :sanitize_document,
|
35
|
+
"update" => :sanitize_document,
|
36
|
+
"new" => :allow
|
37
37
|
},
|
38
38
|
"delete" => {
|
39
39
|
"delete" => :allow,
|
@@ -41,10 +41,10 @@ module Appsignal
|
|
41
41
|
"ordered" => :allow
|
42
42
|
},
|
43
43
|
"bulk" => {
|
44
|
-
"q"
|
45
|
-
"u"
|
46
|
-
"limit"
|
47
|
-
"multi"
|
44
|
+
"q" => :sanitize_document,
|
45
|
+
"u" => :sanitize_document,
|
46
|
+
"limit" => :allow,
|
47
|
+
"multi" => :allow,
|
48
48
|
"upsert" => :allow
|
49
49
|
}
|
50
50
|
}.freeze
|
@@ -27,8 +27,8 @@ module Appsignal
|
|
27
27
|
def register(name, formatter = nil)
|
28
28
|
if registered?(name, formatter)
|
29
29
|
logger.warn(
|
30
|
-
"Formatter for '#{name}' already registered, not registering "\
|
31
|
-
|
30
|
+
"Formatter for '#{name}' already registered, not registering " \
|
31
|
+
"'#{formatter.name}'"
|
32
32
|
)
|
33
33
|
return
|
34
34
|
end
|
@@ -53,7 +53,7 @@ module Appsignal
|
|
53
53
|
|
54
54
|
def format(name, payload)
|
55
55
|
formatter = formatters[name]
|
56
|
-
formatter
|
56
|
+
formatter&.format(payload)
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
@@ -63,6 +63,7 @@ module Appsignal
|
|
63
63
|
if !format_method || format_method.arity != 1
|
64
64
|
raise "#{formatter} does not have a format(payload) method"
|
65
65
|
end
|
66
|
+
|
66
67
|
formatter_classes[name] = formatter
|
67
68
|
formatters[name] = formatter.new
|
68
69
|
rescue => ex
|
@@ -83,6 +84,6 @@ module Appsignal
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
Dir.glob(File.expand_path("
|
87
|
+
Dir.glob(File.expand_path("event_formatter/**/*.rb", __dir__)).each do |file|
|
87
88
|
require file
|
88
89
|
end
|
@@ -23,9 +23,7 @@ module Appsignal
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def make_appsignal_string(ruby_string)
|
26
|
-
unless ruby_string.is_a?(String)
|
27
|
-
raise ArgumentError, "argument is not a string"
|
28
|
-
end
|
26
|
+
raise ArgumentError, "argument is not a string" unless ruby_string.is_a?(String)
|
29
27
|
|
30
28
|
AppsignalString.new.tap do |appsignal_string|
|
31
29
|
appsignal_string[:len] = ruby_string.bytesize
|
@@ -102,16 +100,19 @@ module Appsignal
|
|
102
100
|
[:pointer, :long],
|
103
101
|
:void
|
104
102
|
attach_function :appsignal_finish_event,
|
105
|
-
[:pointer, :appsignal_string, :appsignal_string, :appsignal_string, :int64,
|
103
|
+
[:pointer, :appsignal_string, :appsignal_string, :appsignal_string, :int64,
|
104
|
+
:long],
|
106
105
|
:void
|
107
106
|
attach_function :appsignal_finish_event_data,
|
108
107
|
[:pointer, :appsignal_string, :appsignal_string, :pointer, :int64, :long],
|
109
108
|
:void
|
110
109
|
attach_function :appsignal_record_event,
|
111
|
-
[:pointer, :appsignal_string, :appsignal_string, :appsignal_string, :int64,
|
110
|
+
[:pointer, :appsignal_string, :appsignal_string, :appsignal_string, :int64,
|
111
|
+
:long, :long],
|
112
112
|
:void
|
113
113
|
attach_function :appsignal_record_event_data,
|
114
|
-
[:pointer, :appsignal_string, :appsignal_string, :pointer, :int64, :long,
|
114
|
+
[:pointer, :appsignal_string, :appsignal_string, :pointer, :int64, :long,
|
115
|
+
:long],
|
115
116
|
:void
|
116
117
|
attach_function :appsignal_set_transaction_error,
|
117
118
|
[:pointer, :appsignal_string, :appsignal_string, :pointer],
|
@@ -291,6 +292,7 @@ module Appsignal
|
|
291
292
|
)
|
292
293
|
|
293
294
|
return if !transaction || transaction.null?
|
295
|
+
|
294
296
|
Transaction.new(transaction)
|
295
297
|
end
|
296
298
|
|
@@ -333,7 +335,7 @@ module Appsignal
|
|
333
335
|
appsignal_add_distribution_value(make_appsignal_string(key), value, tags.pointer)
|
334
336
|
end
|
335
337
|
|
336
|
-
class Transaction
|
338
|
+
class Transaction
|
337
339
|
include StringHelpers
|
338
340
|
|
339
341
|
attr_reader :pointer
|
@@ -447,7 +449,7 @@ module Appsignal
|
|
447
449
|
Extension.appsignal_complete_transaction(pointer)
|
448
450
|
end
|
449
451
|
|
450
|
-
def to_json
|
452
|
+
def to_json # rubocop:disable Lint/ToJSON
|
451
453
|
json = Extension.appsignal_transaction_to_json(pointer)
|
452
454
|
make_ruby_string(json) if json[:len] > 0
|
453
455
|
end
|
@@ -531,7 +533,7 @@ module Appsignal
|
|
531
533
|
)
|
532
534
|
end
|
533
535
|
|
534
|
-
def to_json
|
536
|
+
def to_json # rubocop:disable Lint/ToJSON
|
535
537
|
json = Extension.appsignal_span_to_json(pointer)
|
536
538
|
make_ruby_string(json) if json[:len] > 0
|
537
539
|
end
|
data/lib/appsignal/extension.rb
CHANGED