appsignal 2.11.1-java → 3.0.0.beta.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -1
- data/.semaphore/semaphore.yml +197 -23
- data/CHANGELOG.md +25 -0
- data/README.md +9 -0
- data/Rakefile +9 -6
- data/build_matrix.yml +13 -4
- data/ext/agent.yml +17 -17
- data/ext/base.rb +12 -9
- data/gemfiles/no_dependencies.gemfile +7 -0
- data/gemfiles/resque-2.gemfile +0 -1
- data/gemfiles/webmachine.gemfile +1 -0
- data/lib/appsignal.rb +1 -27
- data/lib/appsignal/auth_check.rb +2 -8
- data/lib/appsignal/cli.rb +1 -23
- data/lib/appsignal/cli/diagnose/utils.rb +8 -11
- data/lib/appsignal/cli/install.rb +5 -8
- data/lib/appsignal/config.rb +0 -24
- data/lib/appsignal/event_formatter.rb +0 -25
- data/lib/appsignal/helpers/instrumentation.rb +32 -0
- data/lib/appsignal/hooks.rb +0 -23
- data/lib/appsignal/hooks/action_cable.rb +3 -34
- data/lib/appsignal/hooks/active_support_notifications.rb +7 -86
- data/lib/appsignal/hooks/celluloid.rb +5 -9
- data/lib/appsignal/hooks/net_http.rb +2 -12
- data/lib/appsignal/hooks/puma.rb +3 -5
- data/lib/appsignal/hooks/que.rb +1 -1
- data/lib/appsignal/hooks/rake.rb +2 -24
- data/lib/appsignal/hooks/redis.rb +2 -13
- data/lib/appsignal/hooks/resque.rb +2 -43
- data/lib/appsignal/hooks/shoryuken.rb +43 -4
- data/lib/appsignal/hooks/unicorn.rb +3 -24
- data/lib/appsignal/hooks/webmachine.rb +1 -7
- data/lib/appsignal/integrations/action_cable.rb +34 -0
- data/lib/appsignal/integrations/active_support_notifications.rb +77 -0
- data/lib/appsignal/integrations/net_http.rb +16 -0
- data/lib/appsignal/integrations/object.rb +44 -17
- data/lib/appsignal/integrations/padrino.rb +5 -7
- data/lib/appsignal/integrations/que.rb +26 -33
- data/lib/appsignal/integrations/railtie.rb +1 -4
- data/lib/appsignal/integrations/rake.rb +26 -2
- data/lib/appsignal/integrations/redis.rb +17 -0
- data/lib/appsignal/integrations/resque.rb +39 -10
- data/lib/appsignal/integrations/unicorn.rb +28 -0
- data/lib/appsignal/integrations/webmachine.rb +22 -24
- data/lib/appsignal/minutely.rb +0 -12
- data/lib/appsignal/system.rb +4 -0
- data/lib/appsignal/transaction.rb +30 -2
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/auth_check_spec.rb +1 -24
- data/spec/lib/appsignal/cli_spec.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +0 -66
- data/spec/lib/appsignal/event_formatter_spec.rb +0 -37
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +6 -1
- data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
- data/spec/lib/appsignal/hooks/redis_spec.rb +50 -15
- data/spec/lib/appsignal/hooks/resque_spec.rb +10 -2
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +151 -104
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +4 -2
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +14 -3
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +2 -13
- data/spec/lib/appsignal/hooks_spec.rb +0 -57
- data/spec/lib/appsignal/integrations/object_spec.rb +25 -10
- data/spec/lib/appsignal/integrations/padrino_spec.rb +2 -3
- data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -45
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +26 -8
- data/spec/lib/appsignal/minutely_spec.rb +0 -19
- data/spec/lib/appsignal/transaction_spec.rb +56 -14
- data/spec/lib/appsignal/transmitter_spec.rb +1 -1
- data/spec/lib/appsignal_spec.rb +30 -69
- data/spec/spec_helper.rb +1 -15
- metadata +13 -22
- data/lib/appsignal/cli/notify_of_deploy.rb +0 -131
- data/lib/appsignal/integrations/resque_active_job.rb +0 -19
- data/lib/appsignal/js_exception_transaction.rb +0 -56
- data/lib/appsignal/rack/js_exception_catcher.rb +0 -80
- data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +0 -180
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +0 -28
- data/spec/lib/appsignal/integrations/resque_spec.rb +0 -28
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -128
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -170
data/ext/base.rb
CHANGED
@@ -119,30 +119,33 @@ def download_archive(type)
|
|
119
119
|
|
120
120
|
version = AGENT_CONFIG["version"]
|
121
121
|
filename = ARCH_CONFIG[type]["filename"]
|
122
|
-
|
122
|
+
download_errors = []
|
123
123
|
|
124
124
|
AGENT_CONFIG["mirrors"].each do |mirror|
|
125
125
|
download_url = [mirror, version, filename].join("/")
|
126
|
-
attempted_mirror_urls << download_url
|
127
126
|
report["download"]["download_url"] = download_url
|
128
127
|
|
129
128
|
begin
|
130
|
-
|
129
|
+
args = [
|
131
130
|
download_url,
|
132
131
|
:ssl_ca_cert => CA_CERT_PATH,
|
133
132
|
:proxy => http_proxy
|
134
|
-
|
135
|
-
|
133
|
+
]
|
134
|
+
if URI.respond_to?(:open) # rubocop:disable Style/GuardClause
|
135
|
+
return URI.open(*args)
|
136
|
+
else
|
137
|
+
return open(*args)
|
138
|
+
end
|
139
|
+
rescue => error
|
140
|
+
download_errors << "- URL: #{download_url}\n Error: #{error.class}: #{error.message}"
|
136
141
|
next
|
137
142
|
end
|
138
143
|
end
|
139
144
|
|
140
|
-
attempted_mirror_urls_mapped = attempted_mirror_urls.map { |mirror| "- #{mirror}" }
|
141
145
|
abort_installation(
|
142
146
|
"Could not download archive from any of our mirrors. " \
|
143
|
-
"
|
144
|
-
"#{
|
145
|
-
"Please make sure your network allows access to any of these mirrors."
|
147
|
+
"Please make sure your network allows access to any of these mirrors.\n" \
|
148
|
+
"Attempted to download the archive from the following urls:\n#{download_errors.join("\n")}"
|
146
149
|
)
|
147
150
|
end
|
148
151
|
|
@@ -2,4 +2,11 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'rack', '~> 1.6'
|
4
4
|
|
5
|
+
ruby_version = Gem::Version.new(RUBY_VERSION)
|
6
|
+
if ruby_version < Gem::Version.new("2.0.0")
|
7
|
+
# Newer versions of this gem have rexml as a dependency which doesn't work on
|
8
|
+
# Ruby 1.9
|
9
|
+
gem "crack", "0.4.4"
|
10
|
+
end
|
11
|
+
|
5
12
|
gemspec :path => '../'
|
data/gemfiles/resque-2.gemfile
CHANGED
data/gemfiles/webmachine.gemfile
CHANGED
data/lib/appsignal.rb
CHANGED
@@ -129,7 +129,6 @@ module Appsignal
|
|
129
129
|
config.write_to_environment
|
130
130
|
Appsignal::Extension.start
|
131
131
|
Appsignal::Hooks.load_hooks
|
132
|
-
Appsignal::EventFormatter.initialize_deprecated_formatters
|
133
132
|
initialize_extensions
|
134
133
|
|
135
134
|
if config[:enable_allocation_tracking] && !Appsignal::System.jruby?
|
@@ -222,15 +221,9 @@ module Appsignal
|
|
222
221
|
# Sets the log level and sets the logger. Uses a file-based logger or the
|
223
222
|
# STDOUT-based logger. See the `:log` configuration option.
|
224
223
|
#
|
225
|
-
# @param path_arg [nil] Deprecated param. Use the `:log_path`
|
226
|
-
# configuration option instead.
|
227
224
|
# @return [void]
|
228
225
|
# @since 0.7.0
|
229
|
-
def start_logger
|
230
|
-
if path_arg
|
231
|
-
logger.info("Setting the path in start_logger has no effect anymore, set it in the config instead")
|
232
|
-
end
|
233
|
-
|
226
|
+
def start_logger
|
234
227
|
if config && config[:log] == "file" && config.log_file_path
|
235
228
|
start_file_logger(config.log_file_path)
|
236
229
|
else
|
@@ -285,21 +278,6 @@ module Appsignal
|
|
285
278
|
config && config.active? && extension_loaded?
|
286
279
|
end
|
287
280
|
|
288
|
-
# @deprecated No replacement
|
289
|
-
def is_ignored_error?(error) # rubocop:disable Naming/PredicateName
|
290
|
-
deprecation_message "Appsignal.is_ignored_error? is deprecated " \
|
291
|
-
"with no replacement and will be removed in version 3.0."
|
292
|
-
Appsignal.config[:ignore_errors].include?(error.class.name)
|
293
|
-
end
|
294
|
-
alias :is_ignored_exception? :is_ignored_error?
|
295
|
-
|
296
|
-
# @deprecated No replacement
|
297
|
-
def is_ignored_action?(action) # rubocop:disable Naming/PredicateName
|
298
|
-
deprecation_message "Appsignal.is_ignored_action? is deprecated " \
|
299
|
-
"with no replacement and will be removed in version 3.0."
|
300
|
-
Appsignal.config[:ignore_actions].include?(action)
|
301
|
-
end
|
302
|
-
|
303
281
|
private
|
304
282
|
|
305
283
|
def start_stdout_logger
|
@@ -344,11 +322,7 @@ require "appsignal/marker"
|
|
344
322
|
require "appsignal/minutely"
|
345
323
|
require "appsignal/garbage_collection_profiler"
|
346
324
|
require "appsignal/integrations/railtie" if defined?(::Rails)
|
347
|
-
require "appsignal/integrations/resque"
|
348
|
-
require "appsignal/integrations/resque_active_job"
|
349
325
|
require "appsignal/transaction"
|
350
326
|
require "appsignal/version"
|
351
327
|
require "appsignal/rack/generic_instrumentation"
|
352
|
-
require "appsignal/rack/js_exception_catcher"
|
353
|
-
require "appsignal/js_exception_transaction"
|
354
328
|
require "appsignal/transmitter"
|
data/lib/appsignal/auth_check.rb
CHANGED
@@ -20,16 +20,10 @@ module Appsignal
|
|
20
20
|
# https://push.appsignal.com/1/auth
|
21
21
|
ACTION = "auth".freeze
|
22
22
|
|
23
|
-
attr_reader :config
|
23
|
+
attr_reader :config
|
24
24
|
|
25
|
-
def initialize(config
|
25
|
+
def initialize(config)
|
26
26
|
@config = config
|
27
|
-
if logger # rubocop:disable Style/GuardClause
|
28
|
-
Appsignal::Utils::DeprecationMessage.message \
|
29
|
-
"`Appsignal::AuthCheck.new`'s `logger` argument will be removed " \
|
30
|
-
"in the next major version. Please configure the logger " \
|
31
|
-
"using `Appsignal.logger`."
|
32
|
-
end
|
33
27
|
end
|
34
28
|
|
35
29
|
# Perform push api validation request and return response status code.
|
data/lib/appsignal/cli.rb
CHANGED
@@ -7,12 +7,11 @@ require "appsignal/cli/helpers"
|
|
7
7
|
require "appsignal/cli/demo"
|
8
8
|
require "appsignal/cli/diagnose"
|
9
9
|
require "appsignal/cli/install"
|
10
|
-
require "appsignal/cli/notify_of_deploy"
|
11
10
|
|
12
11
|
module Appsignal
|
13
12
|
# @api private
|
14
13
|
class CLI
|
15
|
-
AVAILABLE_COMMANDS = %w[demo diagnose install
|
14
|
+
AVAILABLE_COMMANDS = %w[demo diagnose install].freeze
|
16
15
|
|
17
16
|
class << self
|
18
17
|
attr_accessor :options
|
@@ -33,8 +32,6 @@ module Appsignal
|
|
33
32
|
Appsignal::CLI::Diagnose.run(options)
|
34
33
|
when :install
|
35
34
|
Appsignal::CLI::Install.run(argv.shift, options)
|
36
|
-
when :notify_of_deploy
|
37
|
-
Appsignal::CLI::NotifyOfDeploy.run(options)
|
38
35
|
end
|
39
36
|
else
|
40
37
|
puts "Command '#{command}' does not exist, run appsignal -h to "\
|
@@ -93,25 +90,6 @@ module Appsignal
|
|
93
90
|
o.on "--[no-]color", "Colorize the output of the diagnose command" do |arg|
|
94
91
|
options[:color] = arg
|
95
92
|
end
|
96
|
-
end,
|
97
|
-
"notify_of_deploy" => OptionParser.new do |o|
|
98
|
-
o.banner = "Usage: appsignal notify_of_deploy [options]"
|
99
|
-
|
100
|
-
o.on "--revision=<revision>", "The revision you're deploying" do |arg|
|
101
|
-
options[:revision] = arg
|
102
|
-
end
|
103
|
-
|
104
|
-
o.on "--user=<user>", "The name of the user that's deploying" do |arg|
|
105
|
-
options[:user] = arg
|
106
|
-
end
|
107
|
-
|
108
|
-
o.on "--environment=<app_env>", "The environment you're deploying to" do |arg|
|
109
|
-
options[:environment] = arg
|
110
|
-
end
|
111
|
-
|
112
|
-
o.on "--name=<name>", "The name of the app (optional)" do |arg|
|
113
|
-
options[:name] = arg
|
114
|
-
end
|
115
93
|
end
|
116
94
|
}
|
117
95
|
end
|
@@ -34,20 +34,17 @@ module Appsignal
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.parse_yaml(contents)
|
37
|
-
arguments = [contents]
|
38
37
|
if YAML.respond_to? :safe_load
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
[Time]
|
46
|
-
end
|
38
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
|
39
|
+
# Use keyword params for Ruby 2.6 and up
|
40
|
+
YAML.safe_load(contents, :permitted_classes => [Time])
|
41
|
+
else
|
42
|
+
YAML.safe_load(contents, [Time])
|
43
|
+
end
|
47
44
|
else
|
48
|
-
|
45
|
+
# Support for Ruby versions without YAML.safe_load
|
46
|
+
YAML.load(contents) # rubocop:disable Security/YAMLLoad
|
49
47
|
end
|
50
|
-
YAML.send(method, *arguments)
|
51
48
|
end
|
52
49
|
end
|
53
50
|
end
|
@@ -278,14 +278,11 @@ module Appsignal
|
|
278
278
|
"../../../resources/appsignal.yml.erb"
|
279
279
|
)
|
280
280
|
file_contents = File.read(filename)
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
arguments << "-"
|
287
|
-
end
|
288
|
-
template = ERB.new(*arguments)
|
281
|
+
template = if ruby_2_6_or_up?
|
282
|
+
ERB.new(file_contents, :trim_mode => "-")
|
283
|
+
else
|
284
|
+
ERB.new(file_contents, nil, "-")
|
285
|
+
end
|
289
286
|
config = template.result(OpenStruct.new(data).instance_eval { binding })
|
290
287
|
|
291
288
|
FileUtils.mkdir_p(File.join(Dir.pwd, "config"))
|
data/lib/appsignal/config.rb
CHANGED
@@ -32,8 +32,6 @@ module Appsignal
|
|
32
32
|
:instrument_redis => true,
|
33
33
|
:instrument_sequel => true,
|
34
34
|
:skip_session_data => false,
|
35
|
-
:enable_frontend_error_catching => false,
|
36
|
-
:frontend_error_catching_path => "/appsignal_error_catcher",
|
37
35
|
:enable_allocation_tracking => true,
|
38
36
|
:enable_gc_instrumentation => false,
|
39
37
|
:enable_host_metrics => true,
|
@@ -49,7 +47,6 @@ module Appsignal
|
|
49
47
|
"APPSIGNAL_PUSH_API_KEY" => :push_api_key,
|
50
48
|
"APPSIGNAL_APP_NAME" => :name,
|
51
49
|
"APPSIGNAL_PUSH_API_ENDPOINT" => :endpoint,
|
52
|
-
"APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH" => :frontend_error_catching_path,
|
53
50
|
"APPSIGNAL_DEBUG" => :debug,
|
54
51
|
"APPSIGNAL_LOG" => :log,
|
55
52
|
"APPSIGNAL_LOG_PATH" => :log_path,
|
@@ -57,7 +54,6 @@ module Appsignal
|
|
57
54
|
"APPSIGNAL_INSTRUMENT_REDIS" => :instrument_redis,
|
58
55
|
"APPSIGNAL_INSTRUMENT_SEQUEL" => :instrument_sequel,
|
59
56
|
"APPSIGNAL_SKIP_SESSION_DATA" => :skip_session_data,
|
60
|
-
"APPSIGNAL_ENABLE_FRONTEND_ERROR_CATCHING" => :enable_frontend_error_catching,
|
61
57
|
"APPSIGNAL_IGNORE_ACTIONS" => :ignore_actions,
|
62
58
|
"APPSIGNAL_IGNORE_ERRORS" => :ignore_errors,
|
63
59
|
"APPSIGNAL_IGNORE_NAMESPACES" => :ignore_namespaces,
|
@@ -86,7 +82,6 @@ module Appsignal
|
|
86
82
|
APPSIGNAL_APP_NAME
|
87
83
|
APPSIGNAL_CA_FILE_PATH
|
88
84
|
APPSIGNAL_DNS_SERVERS
|
89
|
-
APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH
|
90
85
|
APPSIGNAL_HOSTNAME
|
91
86
|
APPSIGNAL_HTTP_PROXY
|
92
87
|
APPSIGNAL_LOG
|
@@ -102,7 +97,6 @@ module Appsignal
|
|
102
97
|
APPSIGNAL_ACTIVE
|
103
98
|
APPSIGNAL_DEBUG
|
104
99
|
APPSIGNAL_ENABLE_ALLOCATION_TRACKING
|
105
|
-
APPSIGNAL_ENABLE_FRONTEND_ERROR_CATCHING
|
106
100
|
APPSIGNAL_ENABLE_GC_INSTRUMENTATION
|
107
101
|
APPSIGNAL_ENABLE_HOST_METRICS
|
108
102
|
APPSIGNAL_ENABLE_MINUTELY_PROBES
|
@@ -126,12 +120,6 @@ module Appsignal
|
|
126
120
|
APPSIGNAL_REQUEST_HEADERS
|
127
121
|
].freeze
|
128
122
|
|
129
|
-
# Mapping of old and deprecated AppSignal configuration keys
|
130
|
-
DEPRECATED_CONFIG_KEY_MAPPING = {
|
131
|
-
:api_key => :push_api_key,
|
132
|
-
:ignore_exceptions => :ignore_errors
|
133
|
-
}.freeze
|
134
|
-
|
135
123
|
# @attribute [r] system_config
|
136
124
|
# Config detected on the system level.
|
137
125
|
# Used in diagnose report.
|
@@ -376,18 +364,6 @@ module Appsignal
|
|
376
364
|
# Used by {#load_from_disk}. No compatibility for env variables or initial config currently.
|
377
365
|
def maintain_backwards_compatibility(configuration)
|
378
366
|
configuration.tap do |config|
|
379
|
-
DEPRECATED_CONFIG_KEY_MAPPING.each do |old_key, new_key|
|
380
|
-
old_config_value = config.delete(old_key)
|
381
|
-
next unless old_config_value
|
382
|
-
deprecation_message \
|
383
|
-
"Old configuration key found. Please update the "\
|
384
|
-
"'#{old_key}' to '#{new_key}'.",
|
385
|
-
logger
|
386
|
-
|
387
|
-
next if config[new_key] # Skip if new key is already in use
|
388
|
-
config[new_key] = old_config_value
|
389
|
-
end
|
390
|
-
|
391
367
|
if config.include?(:working_dir_path)
|
392
368
|
deprecation_message \
|
393
369
|
"'working_dir_path' is deprecated, please use " \
|
@@ -20,20 +20,11 @@ module Appsignal
|
|
20
20
|
@formatters ||= {}
|
21
21
|
end
|
22
22
|
|
23
|
-
def deprecated_formatter_classes
|
24
|
-
@deprecated_formatter_classes ||= {}
|
25
|
-
end
|
26
|
-
|
27
23
|
def formatter_classes
|
28
24
|
@formatter_classes ||= {}
|
29
25
|
end
|
30
26
|
|
31
27
|
def register(name, formatter = nil)
|
32
|
-
unless formatter
|
33
|
-
register_deprecated_formatter(name)
|
34
|
-
return
|
35
|
-
end
|
36
|
-
|
37
28
|
if registered?(name, formatter)
|
38
29
|
logger.warn(
|
39
30
|
"Formatter for '#{name}' already registered, not registering "\
|
@@ -45,12 +36,6 @@ module Appsignal
|
|
45
36
|
initialize_formatter name, formatter
|
46
37
|
end
|
47
38
|
|
48
|
-
def initialize_deprecated_formatters
|
49
|
-
deprecated_formatter_classes.each do |name, formatter|
|
50
|
-
register(name, formatter)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
39
|
def unregister(name, formatter = self)
|
55
40
|
return unless formatter_classes[name] == formatter
|
56
41
|
|
@@ -86,16 +71,6 @@ module Appsignal
|
|
86
71
|
logger.error("'#{ex.message}' when initializing #{name} event formatter")
|
87
72
|
end
|
88
73
|
|
89
|
-
def register_deprecated_formatter(name)
|
90
|
-
deprecation_message \
|
91
|
-
"Formatter for '#{name}' is using a deprecated registration " \
|
92
|
-
"method. This event formatter will not be loaded. " \
|
93
|
-
"Please update the formatter according to the documentation at: " \
|
94
|
-
"https://docs.appsignal.com/ruby/instrumentation/event-formatters.html"
|
95
|
-
|
96
|
-
EventFormatter.deprecated_formatter_classes[name] = self
|
97
|
-
end
|
98
|
-
|
99
74
|
def logger
|
100
75
|
Appsignal.logger
|
101
76
|
end
|
@@ -380,6 +380,38 @@ module Appsignal
|
|
380
380
|
end
|
381
381
|
alias :tag_job :tag_request
|
382
382
|
|
383
|
+
# Add breadcrumbs to the transaction.
|
384
|
+
#
|
385
|
+
# Breadcrumbs can be used to trace what path a user has taken
|
386
|
+
# before encounterin an error.
|
387
|
+
#
|
388
|
+
# Only the last 20 added breadcrumbs will be saved.
|
389
|
+
#
|
390
|
+
# @example
|
391
|
+
# Appsignal.add_breadcrumb("Navigation", "http://blablabla.com", "", { :response => 200 }, Time.now.utc)
|
392
|
+
# Appsignal.add_breadcrumb("Network", "[GET] http://blablabla.com", "", { :response => 500 })
|
393
|
+
# Appsignal.add_breadcrumb("UI", "closed modal(change_password)", "User closed modal without actions")
|
394
|
+
#
|
395
|
+
# @param category [String] category of breadcrumb
|
396
|
+
# e.g. "UI", "Network", "Navigation", "Console".
|
397
|
+
# @param action [String] name of breadcrumb
|
398
|
+
# e.g "The user clicked a button", "HTTP 500 from http://blablabla.com"
|
399
|
+
# @option message [String] optional message in string format
|
400
|
+
# @option metadata [Hash<String,String>] key/value metadata in <string, string> format
|
401
|
+
# @option time [Time] time of breadcrumb, should respond to `.to_i` defaults to `Time.now.utc`
|
402
|
+
# @return [void]
|
403
|
+
#
|
404
|
+
# @see Transaction#add_breadcrumb
|
405
|
+
# @see http://docs.appsignal.com/ruby/instrumentation/breadcrumbs.html
|
406
|
+
# Breadcrumb reference
|
407
|
+
# @since 2.12.0
|
408
|
+
def add_breadcrumb(category, action, message = "", metadata = {}, time = Time.now.utc)
|
409
|
+
return unless active?
|
410
|
+
transaction = Appsignal::Transaction.current
|
411
|
+
return false unless transaction
|
412
|
+
transaction.add_breadcrumb(category, action, message, metadata, time)
|
413
|
+
end
|
414
|
+
|
383
415
|
# Instrument helper for AppSignal.
|
384
416
|
#
|
385
417
|
# For more help, read our custom instrumentation guide, listed under "See
|
data/lib/appsignal/hooks.rb
CHANGED
@@ -69,29 +69,6 @@ module Appsignal
|
|
69
69
|
text.size > 200 ? "#{text[0...197]}..." : text
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
|
-
# Alias Probes constants that have moved to their own module in version
|
74
|
-
# 2.11.0.
|
75
|
-
def self.const_missing(name)
|
76
|
-
case name
|
77
|
-
when :SidekiqProbe
|
78
|
-
callers = caller
|
79
|
-
Appsignal::Utils::DeprecationMessage.message \
|
80
|
-
"The constant Appsignal::Hooks::SidekiqProbe has been deprecated. " \
|
81
|
-
"Please update the constant name to Appsignal::Probes::SidekiqProbe " \
|
82
|
-
"in the following file to remove this message.\n#{callers.first}"
|
83
|
-
Appsignal::Probes::SidekiqProbe
|
84
|
-
when :PumaProbe
|
85
|
-
callers = caller
|
86
|
-
Appsignal::Utils::DeprecationMessage.message \
|
87
|
-
"The constant Appsignal::Hooks::PumaProbe has been deprecated. " \
|
88
|
-
"Please update the constant name to Appsignal::Probes::PumaProbe " \
|
89
|
-
"in the following file to remove this message.\n#{callers.first}"
|
90
|
-
Appsignal::Probes::PumaProbe
|
91
|
-
else
|
92
|
-
super
|
93
|
-
end
|
94
|
-
end
|
95
72
|
end
|
96
73
|
end
|
97
74
|
|
@@ -14,45 +14,14 @@ module Appsignal
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def install
|
17
|
-
|
17
|
+
require "appsignal/integrations/action_cable"
|
18
|
+
ActionCable::Channel::Base.send(:prepend, Appsignal::Integrations::ActionCableIntegration)
|
19
|
+
|
18
20
|
install_callbacks
|
19
21
|
end
|
20
22
|
|
21
23
|
private
|
22
24
|
|
23
|
-
def patch_perform_action
|
24
|
-
ActionCable::Channel::Base.class_eval do
|
25
|
-
alias_method :original_perform_action, :perform_action
|
26
|
-
|
27
|
-
def perform_action(*args, &block)
|
28
|
-
# The request is only the original websocket request
|
29
|
-
env = connection.env
|
30
|
-
request = ActionDispatch::Request.new(env)
|
31
|
-
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID] ||=
|
32
|
-
request.request_id || SecureRandom.uuid
|
33
|
-
|
34
|
-
transaction = Appsignal::Transaction.create(
|
35
|
-
env[Appsignal::Hooks::ActionCableHook::REQUEST_ID],
|
36
|
-
Appsignal::Transaction::ACTION_CABLE,
|
37
|
-
request
|
38
|
-
)
|
39
|
-
|
40
|
-
begin
|
41
|
-
original_perform_action(*args, &block)
|
42
|
-
rescue Exception => exception # rubocop:disable Lint/RescueException
|
43
|
-
transaction.set_error(exception)
|
44
|
-
raise exception
|
45
|
-
ensure
|
46
|
-
transaction.params = args.first
|
47
|
-
transaction.set_action_if_nil("#{self.class}##{args.first["action"]}")
|
48
|
-
transaction.set_metadata("path", request.path)
|
49
|
-
transaction.set_metadata("method", "websocket")
|
50
|
-
Appsignal::Transaction.complete_current!
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
25
|
def install_callbacks
|
57
26
|
ActionCable::Channel::Base.set_callback :subscribe, :around, :prepend => true do |channel, inner|
|
58
27
|
# The request is only the original websocket request
|