appsignal 3.13.1 → 4.0.0.beta.1
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 +499 -487
- data/CHANGELOG.md +104 -7
- data/Rakefile +31 -7
- data/benchmark.rake +4 -6
- data/build_matrix.yml +45 -39
- data/ext/agent.rb +27 -27
- data/ext/appsignal_extension.c +25 -0
- data/gemfiles/rails-7.2.gemfile +11 -0
- data/lib/appsignal/check_in/cron.rb +2 -15
- data/lib/appsignal/cli/diagnose.rb +37 -28
- data/lib/appsignal/cli/install.rb +5 -1
- data/lib/appsignal/config.rb +57 -119
- data/lib/appsignal/demo.rb +2 -2
- data/lib/appsignal/extension/jruby.rb +14 -0
- data/lib/appsignal/helpers/instrumentation.rb +139 -417
- data/lib/appsignal/helpers/metrics.rb +0 -16
- data/lib/appsignal/hooks/action_cable.rb +8 -8
- data/lib/appsignal/hooks/active_job.rb +2 -2
- data/lib/appsignal/hooks/at_exit.rb +37 -0
- data/lib/appsignal/hooks.rb +1 -16
- data/lib/appsignal/integrations/action_cable.rb +2 -2
- data/lib/appsignal/integrations/capistrano/appsignal.cap +2 -4
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +1 -4
- data/lib/appsignal/integrations/delayed_job_plugin.rb +3 -3
- data/lib/appsignal/integrations/que.rb +2 -2
- data/lib/appsignal/integrations/railtie.rb +26 -59
- data/lib/appsignal/integrations/rake.rb +2 -2
- data/lib/appsignal/integrations/resque.rb +2 -2
- data/lib/appsignal/integrations/shoryuken.rb +4 -4
- data/lib/appsignal/integrations/sidekiq.rb +3 -3
- data/lib/appsignal/integrations/webmachine.rb +2 -2
- data/lib/appsignal/loaders.rb +1 -1
- data/lib/appsignal/probes.rb +0 -9
- data/lib/appsignal/rack/abstract_middleware.rb +4 -26
- data/lib/appsignal/rack/body_wrapper.rb +0 -12
- data/lib/appsignal/rack/event_handler.rb +4 -4
- data/lib/appsignal/rack/rails_instrumentation.rb +1 -1
- data/lib/appsignal/rack.rb +0 -25
- data/lib/appsignal/sample_data.rb +95 -0
- data/lib/appsignal/transaction.rb +235 -361
- data/lib/appsignal/utils/rails_helper.rb +4 -0
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +19 -71
- data/spec/lib/appsignal/auth_check_spec.rb +1 -1
- data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
- data/spec/lib/appsignal/capistrano3_spec.rb +53 -13
- data/spec/lib/appsignal/check_in_spec.rb +1 -207
- data/spec/lib/appsignal/cli/demo_spec.rb +7 -27
- data/spec/lib/appsignal/cli/diagnose_spec.rb +145 -110
- data/spec/lib/appsignal/config_spec.rb +304 -379
- data/spec/lib/appsignal/extension_install_failure_spec.rb +5 -1
- data/spec/lib/appsignal/extension_spec.rb +5 -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 -2
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +1 -0
- data/spec/lib/appsignal/hooks/activejob_spec.rb +7 -12
- data/spec/lib/appsignal/hooks/at_exit_spec.rb +72 -0
- data/spec/lib/appsignal/hooks/gvl_spec.rb +10 -5
- data/spec/lib/appsignal/hooks/http_spec.rb +3 -3
- data/spec/lib/appsignal/hooks/net_http_spec.rb +3 -3
- data/spec/lib/appsignal/hooks/rake_spec.rb +6 -9
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +5 -10
- data/spec/lib/appsignal/hooks/redis_spec.rb +4 -7
- data/spec/lib/appsignal/hooks/resque_spec.rb +3 -5
- data/spec/lib/appsignal/hooks_spec.rb +0 -41
- data/spec/lib/appsignal/integrations/data_mapper_spec.rb +29 -20
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +4 -9
- data/spec/lib/appsignal/integrations/railtie_spec.rb +179 -157
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +3 -5
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +48 -62
- data/spec/lib/appsignal/loaders/hanami_spec.rb +6 -9
- data/spec/lib/appsignal/loaders/padrino_spec.rb +6 -10
- data/spec/lib/appsignal/loaders/sinatra_spec.rb +6 -9
- data/spec/lib/appsignal/loaders_spec.rb +8 -1
- data/spec/lib/appsignal/marker_spec.rb +1 -1
- data/spec/lib/appsignal/probes_spec.rb +4 -83
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +4 -63
- data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -48
- data/spec/lib/appsignal/rack/event_handler_spec.rb +18 -15
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +3 -11
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +4 -5
- data/spec/lib/appsignal/sample_data_spec.rb +174 -0
- data/spec/lib/appsignal/transaction_spec.rb +791 -1031
- data/spec/lib/appsignal/transmitter_spec.rb +6 -8
- data/spec/lib/appsignal_spec.rb +294 -643
- data/spec/spec_helper.rb +1 -3
- data/spec/support/fixtures/projects/valid/config/appsignal.yml +4 -7
- data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +16 -0
- data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +56 -0
- data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +5 -0
- data/spec/support/helpers/api_request_helper.rb +3 -2
- data/spec/support/helpers/config_helpers.rb +41 -11
- data/spec/support/helpers/dependency_helper.rb +8 -0
- data/spec/support/helpers/log_helpers.rb +1 -0
- data/spec/support/helpers/rails_helper.rb +6 -6
- data/spec/support/helpers/transaction_helpers.rb +2 -24
- data/spec/support/matchers/transaction.rb +3 -3
- data/spec/support/mocks/appsignal_mock.rb +3 -3
- data/spec/support/mocks/mock_probe.rb +2 -0
- data/spec/support/testing.rb +2 -2
- metadata +11 -21
- data/gemfiles/que_beta.gemfile +0 -5
- data/lib/appsignal/helpers/heartbeat.rb +0 -20
- data/lib/appsignal/integrations/grape.rb +0 -35
- data/lib/appsignal/integrations/hanami.rb +0 -13
- data/lib/appsignal/integrations/padrino.rb +0 -13
- data/lib/appsignal/integrations/sinatra.rb +0 -13
- data/lib/appsignal/rack/generic_instrumentation.rb +0 -22
- data/lib/appsignal/rack/streaming_listener.rb +0 -28
- data/spec/lib/appsignal/integrations/grape_spec.rb +0 -36
- data/spec/lib/appsignal/integrations/hanami_spec.rb +0 -17
- data/spec/lib/appsignal/integrations/padrino_spec.rb +0 -15
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +0 -15
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +0 -81
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +0 -69
- data/spec/support/fixtures/projects/valid/config/environments/development.rb +0 -0
- data/spec/support/fixtures/projects/valid/config/environments/production.rb +0 -0
- data/spec/support/fixtures/projects/valid/config/environments/test.rb +0 -0
- data/spec/support/rails/my_app.rb +0 -6
- /data/spec/support/fixtures/projects/{valid/config/application.rb → valid_with_rails_app/log/.gitkeep} +0 -0
@@ -14,22 +14,6 @@ module Appsignal
|
|
14
14
|
.warn("Gauge value #{value} for key '#{key}' is too big")
|
15
15
|
end
|
16
16
|
|
17
|
-
def set_host_gauge(_key, _value)
|
18
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
19
|
-
"The `set_host_gauge` method has been deprecated. " \
|
20
|
-
"Calling this method has no effect. " \
|
21
|
-
"Please remove method call in the following file to remove " \
|
22
|
-
"this message.\n#{caller.first}"
|
23
|
-
end
|
24
|
-
|
25
|
-
def set_process_gauge(_key, _value)
|
26
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
27
|
-
"The `set_process_gauge` method has been deprecated. " \
|
28
|
-
"Calling this method has no effect. " \
|
29
|
-
"Please remove method call in the following file to remove " \
|
30
|
-
"this message.\n#{caller.first}"
|
31
|
-
end
|
32
|
-
|
33
17
|
def increment_counter(key, value = 1.0, tags = {})
|
34
18
|
Appsignal::Extension.increment_counter(
|
35
19
|
key.to_s,
|
@@ -50,10 +50,10 @@ module Appsignal
|
|
50
50
|
transaction.set_action_if_nil("#{channel.class}#subscribed")
|
51
51
|
transaction.set_metadata("path", request.path)
|
52
52
|
transaction.set_metadata("method", "websocket")
|
53
|
-
transaction.
|
54
|
-
transaction.
|
55
|
-
transaction.
|
56
|
-
transaction.
|
53
|
+
transaction.add_params_if_nil { request.params }
|
54
|
+
transaction.add_headers_if_nil { request.env }
|
55
|
+
transaction.add_session_data { request.session if request.respond_to? :session }
|
56
|
+
transaction.add_tags(:request_id => request_id) if request_id
|
57
57
|
Appsignal::Transaction.complete_current!
|
58
58
|
end
|
59
59
|
end
|
@@ -86,10 +86,10 @@ module Appsignal
|
|
86
86
|
transaction.set_action_if_nil("#{channel.class}#unsubscribed")
|
87
87
|
transaction.set_metadata("path", request.path)
|
88
88
|
transaction.set_metadata("method", "websocket")
|
89
|
-
transaction.
|
90
|
-
transaction.
|
91
|
-
transaction.
|
92
|
-
transaction.
|
89
|
+
transaction.add_params_if_nil { request.params }
|
90
|
+
transaction.add_headers_if_nil { request.env }
|
91
|
+
transaction.add_session_data { request.session if request.respond_to? :session }
|
92
|
+
transaction.add_tags(:request_id => request_id) if request_id
|
93
93
|
Appsignal::Transaction.complete_current!
|
94
94
|
end
|
95
95
|
end
|
@@ -58,10 +58,10 @@ module Appsignal
|
|
58
58
|
end
|
59
59
|
|
60
60
|
if transaction
|
61
|
-
transaction.
|
61
|
+
transaction.add_params_if_nil(job["arguments"])
|
62
62
|
|
63
63
|
transaction_tags = ActiveJobHelpers.transaction_tags_for(job)
|
64
|
-
transaction.
|
64
|
+
transaction.add_tags(transaction_tags)
|
65
65
|
|
66
66
|
transaction.set_action(ActiveJobHelpers.action_name(job))
|
67
67
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Appsignal
|
4
|
+
class Hooks
|
5
|
+
# @api private
|
6
|
+
class AtExit < Appsignal::Hooks::Hook
|
7
|
+
register :at_exit
|
8
|
+
|
9
|
+
def dependencies_present?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def install
|
14
|
+
return unless Appsignal.config[:enable_at_exit_reporter]
|
15
|
+
|
16
|
+
Kernel.at_exit(&AtExitCallback.method(:call))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Report any unhandled errors and will crash the Ruby process.
|
20
|
+
#
|
21
|
+
# If this error was previously reported by any of our instrumentation,
|
22
|
+
# the error will not also be reported here. This way we don't report an
|
23
|
+
# error from a Rake task or instrumented script twice.
|
24
|
+
class AtExitCallback
|
25
|
+
def self.call
|
26
|
+
error = $! # rubocop:disable Style/SpecialGlobalVars
|
27
|
+
return if Appsignal::Transaction.last_errors.include?(error)
|
28
|
+
|
29
|
+
Appsignal.report_error(error) do |transaction|
|
30
|
+
transaction.set_namespace("unhandled")
|
31
|
+
end
|
32
|
+
Appsignal.stop("at_exit")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/appsignal/hooks.rb
CHANGED
@@ -69,25 +69,10 @@ module Appsignal
|
|
69
69
|
text.size > 200 ? "#{text[0...197]}..." : text
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
|
-
# Alias integration constants that have moved to their own module.
|
74
|
-
def self.const_missing(name)
|
75
|
-
case name
|
76
|
-
when :SidekiqPlugin
|
77
|
-
require "appsignal/integrations/sidekiq"
|
78
|
-
callers = caller
|
79
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
80
|
-
"The constant Appsignal::Hooks::SidekiqPlugin has been deprecated. " \
|
81
|
-
"Please update the constant name to Appsignal::Integrations::SidekiqMiddleware " \
|
82
|
-
"in the following file to remove this message.\n#{callers.first}"
|
83
|
-
Appsignal::Integrations::SidekiqMiddleware
|
84
|
-
else
|
85
|
-
super
|
86
|
-
end
|
87
|
-
end
|
88
72
|
end
|
89
73
|
end
|
90
74
|
|
75
|
+
require "appsignal/hooks/at_exit"
|
91
76
|
require "appsignal/hooks/action_cable"
|
92
77
|
require "appsignal/hooks/action_mailer"
|
93
78
|
require "appsignal/hooks/active_job"
|
@@ -19,11 +19,11 @@ module Appsignal
|
|
19
19
|
transaction.set_error(exception)
|
20
20
|
raise exception
|
21
21
|
ensure
|
22
|
-
transaction.set_params_if_nil(args.first)
|
23
22
|
transaction.set_action_if_nil("#{self.class}##{args.first["action"]}")
|
23
|
+
transaction.add_params_if_nil(args.first)
|
24
24
|
transaction.set_metadata("path", request.path)
|
25
25
|
transaction.set_metadata("method", "websocket")
|
26
|
-
transaction.
|
26
|
+
transaction.add_tags(:request_id => request_id) if request_id
|
27
27
|
Appsignal::Transaction.complete_current!
|
28
28
|
end
|
29
29
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Capistrano 3 integration
|
3
4
|
namespace :appsignal do
|
4
5
|
task :deploy do
|
5
6
|
appsignal_env = fetch(:appsignal_env,
|
@@ -10,12 +11,9 @@ namespace :appsignal do
|
|
10
11
|
appsignal_config = Appsignal::Config.new(
|
11
12
|
Dir.pwd,
|
12
13
|
appsignal_env,
|
13
|
-
{},
|
14
14
|
Logger.new(StringIO.new)
|
15
15
|
).tap do |c|
|
16
|
-
fetch(:appsignal_config, {})
|
17
|
-
c[key] = value
|
18
|
-
end
|
16
|
+
c.merge_dsl_options(fetch(:appsignal_config, {}))
|
19
17
|
c.validate
|
20
18
|
end
|
21
19
|
|
@@ -19,12 +19,9 @@ module Appsignal
|
|
19
19
|
appsignal_config = Appsignal::Config.new(
|
20
20
|
ENV.fetch("PWD", nil),
|
21
21
|
env,
|
22
|
-
{},
|
23
22
|
Appsignal::Utils::IntegrationLogger.new(StringIO.new)
|
24
23
|
).tap do |c|
|
25
|
-
fetch(:appsignal_config, {})
|
26
|
-
c[key] = value
|
27
|
-
end
|
24
|
+
c.merge_dsl_options(fetch(:appsignal_config, {}))
|
28
25
|
c.validate
|
29
26
|
end
|
30
27
|
|
@@ -32,14 +32,14 @@ module Appsignal
|
|
32
32
|
# ActiveJob
|
33
33
|
job_data = payload.job_data
|
34
34
|
transaction.set_action_if_nil("#{job_data["job_class"]}#perform")
|
35
|
-
transaction.
|
35
|
+
transaction.add_params_if_nil(job_data.fetch("arguments", {}))
|
36
36
|
else
|
37
37
|
# Delayed Job
|
38
38
|
transaction.set_action_if_nil(action_name_from_payload(payload, job.name))
|
39
|
-
transaction.
|
39
|
+
transaction.add_params_if_nil(extract_value(payload, :args, {}))
|
40
40
|
end
|
41
41
|
|
42
|
-
transaction.
|
42
|
+
transaction.add_tags(
|
43
43
|
:id => extract_value(job, :id, nil, true),
|
44
44
|
:queue => extract_value(job, :queue),
|
45
45
|
:priority => extract_value(job, :priority, 0),
|
@@ -16,8 +16,8 @@ module Appsignal
|
|
16
16
|
ensure
|
17
17
|
local_attrs = respond_to?(:que_attrs) ? que_attrs : attrs
|
18
18
|
transaction.set_action_if_nil("#{local_attrs[:job_class]}#run")
|
19
|
-
transaction.
|
20
|
-
transaction.
|
19
|
+
transaction.add_params_if_nil(local_attrs[:args])
|
20
|
+
transaction.add_tags(
|
21
21
|
"id" => local_attrs[:job_id] || local_attrs[:id],
|
22
22
|
"queue" => local_attrs[:queue],
|
23
23
|
"run_at" => local_attrs[:run_at].to_s,
|
@@ -27,6 +27,7 @@ module Appsignal
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.on_load(app)
|
30
|
+
load_default_config
|
30
31
|
Appsignal::Integrations::Railtie.add_instrumentation_middleware(app)
|
31
32
|
|
32
33
|
return unless app.config.appsignal.start_at == :on_load
|
@@ -38,17 +39,19 @@ module Appsignal
|
|
38
39
|
Appsignal::Integrations::Railtie.start if app.config.appsignal.start_at == :after_initialize
|
39
40
|
end
|
40
41
|
|
42
|
+
def self.load_default_config
|
43
|
+
Appsignal::Config.add_loader_defaults(
|
44
|
+
:rails,
|
45
|
+
:root_path => Rails.root,
|
46
|
+
:env => Rails.env,
|
47
|
+
:name => Appsignal::Utils::RailsHelper.detected_rails_app_name,
|
48
|
+
:log_path => Rails.root.join("log")
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
41
52
|
def self.start
|
42
|
-
unless Appsignal.config
|
43
|
-
Appsignal._config = Appsignal::Config.new(
|
44
|
-
Rails.root,
|
45
|
-
Rails.env,
|
46
|
-
:name => Appsignal::Utils::RailsHelper.detected_rails_app_name,
|
47
|
-
:log_path => Rails.root.join("log")
|
48
|
-
)
|
49
|
-
end
|
50
53
|
Appsignal.start
|
51
|
-
initialize_error_reporter
|
54
|
+
initialize_error_reporter if Appsignal.started?
|
52
55
|
end
|
53
56
|
|
54
57
|
def self.add_instrumentation_middleware(app)
|
@@ -71,31 +74,27 @@ module Appsignal
|
|
71
74
|
end
|
72
75
|
end
|
73
76
|
|
74
|
-
# Report errors reported by the Rails error reporter.
|
77
|
+
# Report errors reported by the Rails error reporter using {Appsignal.report_error}.
|
75
78
|
#
|
76
|
-
# We only report that are not reraised by the error reporter, using
|
77
|
-
# `Rails.error.handle`.
|
78
79
|
# @api private
|
79
80
|
class RailsErrorReporterSubscriber
|
80
81
|
class << self
|
81
|
-
def report(error, handled:, severity:, context: {}, source: nil)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
82
|
+
def report(error, handled:, severity:, context: {}, source: nil) # rubocop:disable Lint/UnusedMethodArgument
|
83
|
+
is_rails_runner = source == "application.runner.railties"
|
84
|
+
namespace, action_name, tags, custom_data = context_for(context.dup)
|
85
|
+
|
86
|
+
Appsignal.report_error(error) do |transaction|
|
87
|
+
if namespace
|
88
|
+
transaction.set_namespace(namespace)
|
89
|
+
elsif is_rails_runner
|
90
|
+
transaction.set_namespace("runner")
|
91
|
+
end
|
90
92
|
transaction.set_action(action_name) if action_name
|
91
|
-
transaction.
|
92
|
-
transaction.set_metadata("method", method)
|
93
|
-
transaction.set_params_if_nil(params)
|
94
|
-
transaction.set_custom_data(custom_data) if custom_data
|
93
|
+
transaction.add_custom_data(custom_data) if custom_data
|
95
94
|
|
96
95
|
tags[:severity] = severity
|
97
96
|
tags[:source] = source.to_s if source
|
98
|
-
transaction.
|
97
|
+
transaction.add_tags(tags)
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
@@ -103,40 +102,8 @@ module Appsignal
|
|
103
102
|
|
104
103
|
def context_for(context)
|
105
104
|
tags = {}
|
106
|
-
custom_data = nil
|
107
105
|
|
108
106
|
appsignal_context = context.delete(:appsignal)
|
109
|
-
# Fetch the namespace and action name based on the Rails execution
|
110
|
-
# context.
|
111
|
-
controller = context.delete(:controller)
|
112
|
-
path = nil
|
113
|
-
method = nil
|
114
|
-
params = nil
|
115
|
-
if controller
|
116
|
-
namespace = Appsignal::Transaction::HTTP_REQUEST
|
117
|
-
action_name = "#{controller.class.name}##{controller.action_name}"
|
118
|
-
unless controller.request.nil?
|
119
|
-
path = controller.request.path
|
120
|
-
method = controller.request.method
|
121
|
-
params = controller.request.filtered_parameters
|
122
|
-
end
|
123
|
-
end
|
124
|
-
# ActiveJob transaction naming relies on the current AppSignal
|
125
|
-
# transaction namespace and action name copying done after this.
|
126
|
-
context.delete(:job)
|
127
|
-
|
128
|
-
# Copy the transaction action name, namespace and other data from
|
129
|
-
# the currently active transaction, if not already set.
|
130
|
-
if Appsignal::Transaction.current?
|
131
|
-
current_transaction = Appsignal::Transaction.current
|
132
|
-
namespace = current_transaction.namespace
|
133
|
-
|
134
|
-
transaction_action = current_transaction.action
|
135
|
-
action_name = current_transaction.action if transaction_action
|
136
|
-
|
137
|
-
current_tags = current_transaction.tags
|
138
|
-
tags.merge!(current_tags) if current_tags
|
139
|
-
end
|
140
107
|
|
141
108
|
# Use the user override set in the context
|
142
109
|
if appsignal_context
|
@@ -151,7 +118,7 @@ module Appsignal
|
|
151
118
|
end
|
152
119
|
tags.merge!(context)
|
153
120
|
|
154
|
-
[namespace, action_name,
|
121
|
+
[namespace, action_name, tags, custom_data]
|
155
122
|
end
|
156
123
|
end
|
157
124
|
end
|
@@ -24,8 +24,8 @@ module Appsignal
|
|
24
24
|
# Format given arguments and cast to hash if possible
|
25
25
|
params, _ = args
|
26
26
|
params = params.to_hash if params.respond_to?(:to_hash)
|
27
|
-
transaction.set_params_if_nil(params)
|
28
27
|
transaction.set_action(name)
|
28
|
+
transaction.add_params_if_nil(params)
|
29
29
|
transaction.complete
|
30
30
|
end
|
31
31
|
end
|
@@ -33,7 +33,7 @@ module Appsignal
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def _appsignal_create_transaction
|
36
|
-
Appsignal::Transaction.create(
|
36
|
+
Appsignal::Transaction.create("rake")
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -21,8 +21,8 @@ module Appsignal
|
|
21
21
|
ResqueHelpers.arguments(payload),
|
22
22
|
Appsignal.config[:filter_parameters]
|
23
23
|
)
|
24
|
-
transaction.
|
25
|
-
transaction.
|
24
|
+
transaction.add_params_if_nil(args)
|
25
|
+
transaction.add_tags("queue" => queue)
|
26
26
|
|
27
27
|
Appsignal::Transaction.complete_current!
|
28
28
|
end
|
@@ -15,10 +15,10 @@ module Appsignal
|
|
15
15
|
batch = sqs_msg.is_a?(Array)
|
16
16
|
attributes = fetch_attributes(batch, sqs_msg)
|
17
17
|
transaction.set_action_if_nil("#{worker_instance.class.name}#perform")
|
18
|
-
transaction.
|
19
|
-
transaction.
|
20
|
-
transaction.
|
21
|
-
transaction.
|
18
|
+
transaction.add_params_if_nil { fetch_args(batch, sqs_msg, body) }
|
19
|
+
transaction.add_tags(attributes)
|
20
|
+
transaction.add_tags("queue" => queue)
|
21
|
+
transaction.add_tags("batch" => true) if batch
|
22
22
|
|
23
23
|
if attributes.key?("SentTimestamp")
|
24
24
|
transaction.set_queue_start(Time.at(attributes["SentTimestamp"].to_i).to_i)
|
@@ -41,7 +41,7 @@ module Appsignal
|
|
41
41
|
transaction = Appsignal::Transaction.create(Appsignal::Transaction::BACKGROUND_JOB)
|
42
42
|
transaction.set_action_if_nil("SidekiqInternal")
|
43
43
|
transaction.set_metadata("sidekiq_error", sidekiq_context[:context])
|
44
|
-
transaction.
|
44
|
+
transaction.add_params_if_nil(:jobstr => sidekiq_context[:jobstr])
|
45
45
|
transaction.set_error(exception)
|
46
46
|
end
|
47
47
|
|
@@ -73,10 +73,10 @@ module Appsignal
|
|
73
73
|
raise exception
|
74
74
|
ensure
|
75
75
|
if transaction
|
76
|
-
transaction.
|
76
|
+
transaction.add_params_if_nil { parse_arguments(item) }
|
77
77
|
queue_start = (item["enqueued_at"].to_f * 1000.0).to_i # Convert seconds to milliseconds
|
78
78
|
transaction.set_queue_start(queue_start)
|
79
|
-
transaction.
|
79
|
+
transaction.add_tags(:request_id => item["jid"])
|
80
80
|
Appsignal::Transaction.complete_current! unless exception
|
81
81
|
|
82
82
|
queue = item["queue"] || "unknown"
|
@@ -12,14 +12,14 @@ module Appsignal
|
|
12
12
|
else
|
13
13
|
Appsignal::Transaction.create(Appsignal::Transaction::HTTP_REQUEST)
|
14
14
|
end
|
15
|
+
transaction.add_params_if_nil { request.query }
|
16
|
+
transaction.add_headers_if_nil { request.headers if request.respond_to?(:headers) }
|
15
17
|
|
16
18
|
Appsignal.instrument("process_action.webmachine") do
|
17
19
|
super
|
18
20
|
end
|
19
21
|
ensure
|
20
22
|
transaction.set_action_if_nil("#{resource.class.name}##{request.method}")
|
21
|
-
transaction.set_params_if_nil(request.query)
|
22
|
-
transaction.set_headers_if_nil { request.headers if request.respond_to?(:headers) }
|
23
23
|
|
24
24
|
Appsignal::Transaction.complete_current! unless has_parent_transaction
|
25
25
|
end
|
data/lib/appsignal/loaders.rb
CHANGED
data/lib/appsignal/probes.rb
CHANGED
@@ -29,15 +29,6 @@ module Appsignal
|
|
29
29
|
probes[key]
|
30
30
|
end
|
31
31
|
|
32
|
-
# @deprecated Use {Appsignal::Probes.register} instead.
|
33
|
-
def register(name, probe)
|
34
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning(
|
35
|
-
"The method 'Appsignal::Probes.probes.register' is deprecated. " \
|
36
|
-
"Use 'Appsignal::Probes.register' instead."
|
37
|
-
)
|
38
|
-
Appsignal::Probes.register(name, probe)
|
39
|
-
end
|
40
|
-
|
41
32
|
# @api private
|
42
33
|
def internal_register(name, probe)
|
43
34
|
if probes.key?(name)
|
@@ -136,21 +136,19 @@ module Appsignal
|
|
136
136
|
# Override this method to set metadata after the app is called.
|
137
137
|
# Call `super` to also include the default set metadata.
|
138
138
|
def add_transaction_metadata_after(transaction, request)
|
139
|
-
default_action =
|
140
|
-
appsignal_route_env_value(request) || appsignal_action_env_value(request)
|
141
|
-
transaction.set_action_if_nil(default_action)
|
142
139
|
transaction.set_metadata("path", request.path)
|
143
140
|
|
144
141
|
request_method = request_method_for(request)
|
145
142
|
transaction.set_metadata("method", request_method) if request_method
|
146
143
|
|
147
|
-
transaction.
|
148
|
-
transaction.
|
144
|
+
transaction.add_params { params_for(request) }
|
145
|
+
transaction.add_session_data do
|
149
146
|
request.session if request.respond_to?(:session)
|
150
147
|
end
|
151
|
-
transaction.
|
148
|
+
transaction.add_headers do
|
152
149
|
request.env if request.respond_to?(:env)
|
153
150
|
end
|
151
|
+
|
154
152
|
queue_start = Appsignal::Rack::Utils.queue_start_from(request.env)
|
155
153
|
transaction.set_queue_start(queue_start) if queue_start
|
156
154
|
end
|
@@ -179,26 +177,6 @@ module Appsignal
|
|
179
177
|
def request_for(env)
|
180
178
|
@request_class.new(env)
|
181
179
|
end
|
182
|
-
|
183
|
-
def appsignal_route_env_value(request)
|
184
|
-
request.env["appsignal.route"].tap do |value|
|
185
|
-
next unless value
|
186
|
-
|
187
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
188
|
-
"Setting the action name with the request env 'appsignal.route' is deprecated. " \
|
189
|
-
"Please use `Appsignal.set_action` instead. "
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def appsignal_action_env_value(request)
|
194
|
-
request.env["appsignal.action"].tap do |value|
|
195
|
-
next unless value
|
196
|
-
|
197
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
198
|
-
"Setting the action name with the request env 'appsignal.action' is deprecated. " \
|
199
|
-
"Please use `Appsignal.set_action` instead. "
|
200
|
-
end
|
201
|
-
end
|
202
180
|
end
|
203
181
|
end
|
204
182
|
end
|
@@ -4,8 +4,6 @@ module Appsignal
|
|
4
4
|
module Rack
|
5
5
|
# @api private
|
6
6
|
class BodyWrapper
|
7
|
-
IGNORED_ERRORS = [Errno::EPIPE].freeze
|
8
|
-
|
9
7
|
def self.wrap(original_body, appsignal_transaction)
|
10
8
|
# The logic of how Rack treats a response body differs based on which methods
|
11
9
|
# the body responds to. This means that to support the Rack 3.x spec in full
|
@@ -51,8 +49,6 @@ module Appsignal
|
|
51
49
|
Appsignal.instrument("close_response_body.rack") { @body.close }
|
52
50
|
end
|
53
51
|
@body_already_closed = true
|
54
|
-
rescue *IGNORED_ERRORS # Do not report
|
55
|
-
raise
|
56
52
|
rescue Exception => error # rubocop:disable Lint/RescueException
|
57
53
|
@transaction.set_error(error)
|
58
54
|
raise error
|
@@ -79,8 +75,6 @@ module Appsignal
|
|
79
75
|
Appsignal.instrument("process_response_body.rack", "Process Rack response body (#each)") do
|
80
76
|
@body.each(&blk)
|
81
77
|
end
|
82
|
-
rescue *IGNORED_ERRORS # Do not report
|
83
|
-
raise
|
84
78
|
rescue Exception => error # rubocop:disable Lint/RescueException
|
85
79
|
@transaction.set_error(error)
|
86
80
|
raise error
|
@@ -100,8 +94,6 @@ module Appsignal
|
|
100
94
|
Appsignal.instrument("process_response_body.rack", "Process Rack response body (#call)") do
|
101
95
|
@body.call(stream)
|
102
96
|
end
|
103
|
-
rescue *IGNORED_ERRORS # Do not report
|
104
|
-
raise
|
105
97
|
rescue Exception => error # rubocop:disable Lint/RescueException
|
106
98
|
@transaction.set_error(error)
|
107
99
|
raise error
|
@@ -126,8 +118,6 @@ module Appsignal
|
|
126
118
|
) do
|
127
119
|
@body.to_ary
|
128
120
|
end
|
129
|
-
rescue *IGNORED_ERRORS # Do not report
|
130
|
-
raise
|
131
121
|
rescue Exception => error # rubocop:disable Lint/RescueException
|
132
122
|
@transaction.set_error(error)
|
133
123
|
raise error
|
@@ -144,8 +134,6 @@ module Appsignal
|
|
144
134
|
) do
|
145
135
|
@body.to_path
|
146
136
|
end
|
147
|
-
rescue *IGNORED_ERRORS # Do not report
|
148
|
-
raise
|
149
137
|
rescue Exception => error # rubocop:disable Lint/RescueException
|
150
138
|
@transaction.set_error(error)
|
151
139
|
raise error
|
@@ -110,9 +110,9 @@ module Appsignal
|
|
110
110
|
|
111
111
|
self.class.safe_execution("Appsignal::Rack::EventHandler#on_finish") do
|
112
112
|
transaction.finish_event("process_request.rack", "", "")
|
113
|
-
transaction.
|
114
|
-
transaction.
|
115
|
-
transaction.
|
113
|
+
transaction.add_params_if_nil { request.params }
|
114
|
+
transaction.add_headers_if_nil { request.env }
|
115
|
+
transaction.add_session_data_if_nil do
|
116
116
|
request.session if request.respond_to?(:session)
|
117
117
|
end
|
118
118
|
queue_start = Appsignal::Rack::Utils.queue_start_from(request.env)
|
@@ -124,7 +124,7 @@ module Appsignal
|
|
124
124
|
500
|
125
125
|
end
|
126
126
|
if response_status
|
127
|
-
transaction.
|
127
|
+
transaction.add_tags(:response_status => response_status)
|
128
128
|
Appsignal.increment_counter(
|
129
129
|
:response_status,
|
130
130
|
1,
|
@@ -19,7 +19,7 @@ module Appsignal
|
|
19
19
|
transaction.set_action_if_nil("#{controller.class}##{controller.action_name}") if controller
|
20
20
|
|
21
21
|
request_id = request.env["action_dispatch.request_id"]
|
22
|
-
transaction.
|
22
|
+
transaction.add_tags(:request_id => request_id) if request_id
|
23
23
|
|
24
24
|
super
|
25
25
|
end
|
data/lib/appsignal/rack.rb
CHANGED
@@ -37,30 +37,5 @@ module Appsignal
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
41
|
-
# Alias constants that have moved with a warning message that points to the
|
42
|
-
# place to update the reference.
|
43
|
-
def self.const_missing(name)
|
44
|
-
case name
|
45
|
-
when :GenericInstrumentation
|
46
|
-
require "appsignal/rack/generic_instrumentation"
|
47
|
-
|
48
|
-
callers = caller
|
49
|
-
Appsignal::Utils::StdoutAndLoggerMessage.warning \
|
50
|
-
"The constant Appsignal::Rack::GenericInstrumentation has been deprecated. " \
|
51
|
-
"Please use the new Appsignal::Rack::InstrumentationMiddleware middleware. " \
|
52
|
-
"This new middleware does not default the action name to 'unknown'. " \
|
53
|
-
"Set the action name for the endpoint using the Appsignal.set_action helper. " \
|
54
|
-
"Read our Rack docs for more information " \
|
55
|
-
"https://docs.appsignal.com/ruby/integrations/rack.html " \
|
56
|
-
"Update the constant name to " \
|
57
|
-
"Appsignal::Rack::InstrumentationMiddleware in the following file to " \
|
58
|
-
"remove this message.\n#{callers.first}"
|
59
|
-
# Return the alias so it can't ever get stuck in a recursive loop
|
60
|
-
Appsignal::Rack::GenericInstrumentationAlias
|
61
|
-
else
|
62
|
-
super
|
63
|
-
end
|
64
|
-
end
|
65
40
|
end
|
66
41
|
end
|