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
@@ -35,7 +35,7 @@ module Appsignal
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# @api private
|
38
|
-
class SidekiqMiddleware
|
38
|
+
class SidekiqMiddleware
|
39
39
|
include Appsignal::Hooks::Helpers
|
40
40
|
|
41
41
|
EXCLUDED_JOB_KEYS = %w[
|
@@ -43,7 +43,7 @@ module Appsignal
|
|
43
43
|
error_message failed_at jid retried_at retry wrapped
|
44
44
|
].freeze
|
45
45
|
|
46
|
-
def call(_worker, item, _queue)
|
46
|
+
def call(_worker, item, _queue, &block)
|
47
47
|
job_status = nil
|
48
48
|
transaction = Appsignal::Transaction.create(
|
49
49
|
item["jid"],
|
@@ -52,23 +52,21 @@ module Appsignal
|
|
52
52
|
:queue_start => item["enqueued_at"]
|
53
53
|
)
|
54
54
|
)
|
55
|
+
transaction.set_action_if_nil(formatted_action_name(item))
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
formatted_metadata(item).each do |key, value|
|
58
|
+
transaction.set_metadata key, value
|
58
59
|
end
|
60
|
+
|
61
|
+
Appsignal.instrument "perform_job.sidekiq", &block
|
59
62
|
rescue Exception => exception # rubocop:disable Lint/RescueException
|
60
63
|
job_status = :failed
|
61
64
|
raise exception
|
62
65
|
ensure
|
63
66
|
if transaction
|
64
|
-
transaction.set_action_if_nil(formatted_action_name(item))
|
65
|
-
|
66
67
|
params = filtered_arguments(item)
|
67
68
|
transaction.params = params if params
|
68
69
|
|
69
|
-
formatted_metadata(item).each do |key, value|
|
70
|
-
transaction.set_metadata key, value
|
71
|
-
end
|
72
70
|
transaction.set_http_or_background_queue_start
|
73
71
|
Appsignal::Transaction.complete_current! unless exception
|
74
72
|
|
@@ -151,9 +149,9 @@ module Appsignal
|
|
151
149
|
else
|
152
150
|
# Sidekiq Enterprise argument encryption.
|
153
151
|
# More information: https://github.com/mperham/sidekiq/wiki/Ent-Encryption
|
154
|
-
if job["encrypt"
|
152
|
+
if job["encrypt"]
|
155
153
|
# No point in showing 150+ bytes of random garbage
|
156
|
-
args[-1] = "[encrypted data]"
|
154
|
+
args[-1] = "[encrypted data]"
|
157
155
|
end
|
158
156
|
args
|
159
157
|
end
|
@@ -14,6 +14,4 @@ Appsignal.config = Appsignal::Config.new(
|
|
14
14
|
Appsignal.start_logger
|
15
15
|
Appsignal.start
|
16
16
|
|
17
|
-
if Appsignal.active?
|
18
|
-
::Sinatra::Base.use(Appsignal::Rack::SinatraBaseInstrumentation)
|
19
|
-
end
|
17
|
+
::Sinatra::Base.use(Appsignal::Rack::SinatraBaseInstrumentation) if Appsignal.active?
|
@@ -25,12 +25,10 @@ module Appsignal
|
|
25
25
|
|
26
26
|
def handle_exceptions
|
27
27
|
super do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
raise e
|
33
|
-
end
|
28
|
+
yield
|
29
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
30
|
+
Appsignal.set_error(e)
|
31
|
+
raise e
|
34
32
|
end
|
35
33
|
end
|
36
34
|
end
|
data/lib/appsignal/logger.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require "logger"
|
4
4
|
require "set"
|
5
|
-
require "thread"
|
6
5
|
|
7
6
|
module Appsignal
|
8
7
|
# Logger that flushes logs to the AppSignal logging service
|
@@ -25,6 +24,7 @@ module Appsignal
|
|
25
24
|
# @return [void]
|
26
25
|
def initialize(group, level: INFO, format: PLAINTEXT)
|
27
26
|
raise TypeError, "group must be a string" unless group.is_a? String
|
27
|
+
|
28
28
|
@group = group
|
29
29
|
@level = level
|
30
30
|
@format = format
|
@@ -37,6 +37,7 @@ module Appsignal
|
|
37
37
|
def add(severity, message = nil, group = nil)
|
38
38
|
severity ||= UNKNOWN
|
39
39
|
return true if severity < level
|
40
|
+
|
40
41
|
group = @group if group.nil?
|
41
42
|
if message.nil?
|
42
43
|
if block_given?
|
@@ -47,6 +48,7 @@ module Appsignal
|
|
47
48
|
end
|
48
49
|
end
|
49
50
|
return if message.nil?
|
51
|
+
|
50
52
|
message = formatter.call(severity, Time.now, group, message) if formatter
|
51
53
|
|
52
54
|
Appsignal::Extension.log(
|
@@ -64,9 +66,11 @@ module Appsignal
|
|
64
66
|
# @param attributes Attributes to tag the log with
|
65
67
|
# @return [void]
|
66
68
|
def debug(message = nil, attributes = {})
|
67
|
-
return if
|
69
|
+
return if level > DEBUG
|
70
|
+
|
68
71
|
message = yield if message.nil? && block_given?
|
69
72
|
return if message.nil?
|
73
|
+
|
70
74
|
add_with_attributes(DEBUG, message, @group, attributes)
|
71
75
|
end
|
72
76
|
|
@@ -75,9 +79,11 @@ module Appsignal
|
|
75
79
|
# @param attributes Attributes to tag the log with
|
76
80
|
# @return [void]
|
77
81
|
def info(message = nil, attributes = {})
|
78
|
-
return if
|
82
|
+
return if level > INFO
|
83
|
+
|
79
84
|
message = yield if message.nil? && block_given?
|
80
85
|
return if message.nil?
|
86
|
+
|
81
87
|
add_with_attributes(INFO, message, @group, attributes)
|
82
88
|
end
|
83
89
|
|
@@ -86,9 +92,11 @@ module Appsignal
|
|
86
92
|
# @param attributes Attributes to tag the log with
|
87
93
|
# @return [void]
|
88
94
|
def warn(message = nil, attributes = {})
|
89
|
-
return if
|
95
|
+
return if level > WARN
|
96
|
+
|
90
97
|
message = yield if message.nil? && block_given?
|
91
98
|
return if message.nil?
|
99
|
+
|
92
100
|
add_with_attributes(WARN, message, @group, attributes)
|
93
101
|
end
|
94
102
|
|
@@ -97,9 +105,11 @@ module Appsignal
|
|
97
105
|
# @param attributes Attributes to tag the log with
|
98
106
|
# @return [void]
|
99
107
|
def error(message = nil, attributes = {})
|
100
|
-
return if
|
108
|
+
return if level > ERROR
|
109
|
+
|
101
110
|
message = yield if message.nil? && block_given?
|
102
111
|
return if message.nil?
|
112
|
+
|
103
113
|
add_with_attributes(ERROR, message, @group, attributes)
|
104
114
|
end
|
105
115
|
|
@@ -108,12 +118,27 @@ module Appsignal
|
|
108
118
|
# @param attributes Attributes to tag the log with
|
109
119
|
# @return [void]
|
110
120
|
def fatal(message = nil, attributes = {})
|
111
|
-
return if
|
121
|
+
return if level > FATAL
|
122
|
+
|
112
123
|
message = yield if message.nil? && block_given?
|
113
124
|
return if message.nil?
|
125
|
+
|
114
126
|
add_with_attributes(FATAL, message, @group, attributes)
|
115
127
|
end
|
116
128
|
|
129
|
+
# When using ActiveSupport::TaggedLogging without the broadcast feature,
|
130
|
+
# the passed logger is required to respond to the `silence` method.
|
131
|
+
# In our case it behaves as the broadcast feature of the Rails logger, but
|
132
|
+
# we don't have to check if the parent logger has the `silence` method defined
|
133
|
+
# as our logger directly inherits from Ruby base logger.
|
134
|
+
#
|
135
|
+
# Links:
|
136
|
+
# https://github.com/rails/rails/blob/e11ebc04cfbe41c06cdfb70ee5a9fdbbd98bb263/activesupport/lib/active_support/logger.rb#L60-L76
|
137
|
+
# https://github.com/rails/rails/blob/main/activesupport/e11ebc04cfbe41c06cdfb70ee5a9fdbbd98bb263/active_support/logger_silence.rb
|
138
|
+
def silence(_severity = ERROR, &block)
|
139
|
+
block.call
|
140
|
+
end
|
141
|
+
|
117
142
|
private
|
118
143
|
|
119
144
|
def add_with_attributes(severity, message, group, attributes)
|
data/lib/appsignal/marker.rb
CHANGED
@@ -24,7 +24,7 @@ module Appsignal
|
|
24
24
|
class Marker
|
25
25
|
# Path used on the AppSignal Push API
|
26
26
|
# https://push.appsignal.com/1/markers
|
27
|
-
ACTION = "markers"
|
27
|
+
ACTION = "markers"
|
28
28
|
|
29
29
|
attr_reader :marker_data, :config
|
30
30
|
|
@@ -49,13 +49,12 @@ module Appsignal
|
|
49
49
|
# @return [void]
|
50
50
|
def transmit
|
51
51
|
transmitter = Transmitter.new(ACTION, config)
|
52
|
-
puts "Notifying AppSignal of deploy with: "\
|
52
|
+
puts "Notifying AppSignal of deploy with: " \
|
53
53
|
"revision: #{marker_data[:revision]}, user: #{marker_data[:user]}"
|
54
54
|
|
55
55
|
response = transmitter.transmit(marker_data)
|
56
|
-
unless response.code == "200"
|
57
|
-
|
58
|
-
end
|
56
|
+
raise "#{response.code} at #{transmitter.uri}" unless response.code == "200"
|
57
|
+
|
59
58
|
puts "AppSignal has been notified of this deploy!"
|
60
59
|
rescue => e
|
61
60
|
puts "Something went wrong while trying to notify AppSignal: #{e}"
|
data/lib/appsignal/minutely.rb
CHANGED
@@ -135,13 +135,11 @@ module Appsignal
|
|
135
135
|
logger = Appsignal.logger
|
136
136
|
logger.debug("Gathering minutely metrics with #{probe_instances.count} probes")
|
137
137
|
probe_instances.each do |name, probe|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
logger.debug ex.backtrace.join("\n")
|
144
|
-
end
|
138
|
+
logger.debug("Gathering minutely metrics with '#{name}' probe")
|
139
|
+
probe.call
|
140
|
+
rescue => ex
|
141
|
+
logger.error "Error in minutely probe '#{name}': #{ex}"
|
142
|
+
logger.debug ex.backtrace.join("\n")
|
145
143
|
end
|
146
144
|
sleep wait_time
|
147
145
|
end
|
@@ -164,6 +162,7 @@ module Appsignal
|
|
164
162
|
def initial_wait_time
|
165
163
|
remaining_seconds = 60 - Time.now.sec
|
166
164
|
return remaining_seconds if remaining_seconds > 30
|
165
|
+
|
167
166
|
remaining_seconds + 60
|
168
167
|
end
|
169
168
|
|
@@ -195,6 +194,7 @@ module Appsignal
|
|
195
194
|
|
196
195
|
def dependencies_present?(probe)
|
197
196
|
return true unless probe.respond_to? :dependencies_present?
|
197
|
+
|
198
198
|
probe.dependencies_present?
|
199
199
|
end
|
200
200
|
|
data/lib/appsignal/probes/gvl.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Appsignal
|
2
4
|
module Probes
|
3
5
|
class GvlProbe
|
@@ -5,7 +7,8 @@ module Appsignal
|
|
5
7
|
|
6
8
|
# @api private
|
7
9
|
def self.dependencies_present?
|
8
|
-
defined?(::GVLTools) && gvltools_0_2_or_newer? && ruby_3_2_or_newer? &&
|
10
|
+
defined?(::GVLTools) && gvltools_0_2_or_newer? && ruby_3_2_or_newer? &&
|
11
|
+
!Appsignal::System.jruby?
|
9
12
|
end
|
10
13
|
|
11
14
|
# @api private
|
@@ -25,7 +28,7 @@ module Appsignal
|
|
25
28
|
end
|
26
29
|
|
27
30
|
def call
|
28
|
-
probe_global_timer
|
31
|
+
probe_global_timer
|
29
32
|
probe_waiting_threads if @gvl_tools::WaitingThreads.enabled?
|
30
33
|
end
|
31
34
|
|
@@ -34,8 +37,10 @@ module Appsignal
|
|
34
37
|
def probe_global_timer
|
35
38
|
monotonic_time_ns = @gvl_tools::GlobalTimer.monotonic_time
|
36
39
|
gauge_delta :gvl_global_timer, monotonic_time_ns do |time_delta_ns|
|
37
|
-
|
38
|
-
|
40
|
+
if time_delta_ns > 0
|
41
|
+
time_delta_ms = time_delta_ns / 1_000_000
|
42
|
+
set_gauge_with_hostname("gvl_global_timer", time_delta_ms)
|
43
|
+
end
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Appsignal
|
2
4
|
module Probes
|
3
5
|
module Helpers
|
@@ -42,13 +44,9 @@ module Appsignal
|
|
42
44
|
return @hostname if defined?(@hostname)
|
43
45
|
|
44
46
|
config = @appsignal.config
|
47
|
+
# Auto detect hostname as fallback. May be inaccurate.
|
45
48
|
@hostname =
|
46
|
-
|
47
|
-
config[:hostname]
|
48
|
-
else
|
49
|
-
# Auto detect hostname as fallback. May be inaccurate.
|
50
|
-
Socket.gethostname
|
51
|
-
end
|
49
|
+
config[:hostname] || Socket.gethostname
|
52
50
|
Appsignal.logger.debug "Probe helper: Using hostname config " \
|
53
51
|
"option '#{@hostname.inspect}' as hostname"
|
54
52
|
|
data/lib/appsignal/probes/mri.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Appsignal
|
2
4
|
module Probes
|
3
5
|
class MriProbe
|
@@ -37,9 +39,7 @@ module Appsignal
|
|
37
39
|
end
|
38
40
|
|
39
41
|
class_serial = stat[:class_serial]
|
40
|
-
if class_serial
|
41
|
-
set_gauge_with_hostname("ruby_vm", class_serial, :metric => :class_serial)
|
42
|
-
end
|
42
|
+
set_gauge_with_hostname("ruby_vm", class_serial, :metric => :class_serial) if class_serial
|
43
43
|
|
44
44
|
global_constant_state =
|
45
45
|
stat[:constant_cache] ? stat[:constant_cache].values.sum : stat[:global_constant_state]
|
@@ -76,8 +76,10 @@ module Appsignal
|
|
76
76
|
set_gauge_with_hostname("gc_count", major_gc_count, :metric => :major_gc_count)
|
77
77
|
end
|
78
78
|
|
79
|
-
set_gauge_with_hostname("heap_slots",
|
80
|
-
|
79
|
+
set_gauge_with_hostname("heap_slots",
|
80
|
+
gc_stats[:heap_live_slots] || gc_stats[:heap_live_slot], :metric => :heap_live)
|
81
|
+
set_gauge_with_hostname("heap_slots",
|
82
|
+
gc_stats[:heap_free_slots] || gc_stats[:heap_free_slot], :metric => :heap_free)
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Appsignal
|
2
4
|
module Probes
|
3
5
|
class SidekiqProbe
|
@@ -116,6 +118,7 @@ module Appsignal
|
|
116
118
|
|
117
119
|
def hostname
|
118
120
|
return @hostname if defined?(@hostname)
|
121
|
+
|
119
122
|
if config.key?(:hostname)
|
120
123
|
@hostname = config[:hostname]
|
121
124
|
Appsignal.logger.debug "Sidekiq probe: Using hostname config " \
|
data/lib/appsignal/probes.rb
CHANGED
@@ -35,11 +35,7 @@ module Appsignal
|
|
35
35
|
transaction.set_error(error)
|
36
36
|
raise error
|
37
37
|
ensure
|
38
|
-
|
39
|
-
transaction.set_action_if_nil(env["appsignal.route"])
|
40
|
-
else
|
41
|
-
transaction.set_action_if_nil("unknown")
|
42
|
-
end
|
38
|
+
transaction.set_action_if_nil(env["appsignal.route"] || "unknown")
|
43
39
|
transaction.set_metadata("path", request.path)
|
44
40
|
transaction.set_metadata("method", request.request_method)
|
45
41
|
transaction.set_http_or_background_queue_start
|
@@ -15,7 +15,7 @@ module Appsignal
|
|
15
15
|
def initialize(app, options = {})
|
16
16
|
@app = app
|
17
17
|
@options = options
|
18
|
-
Appsignal.logger.warn "Please remove Appsignal::Rack::SinatraInstrumentation "\
|
18
|
+
Appsignal.logger.warn "Please remove Appsignal::Rack::SinatraInstrumentation " \
|
19
19
|
"from your Sinatra::Base class. This is no longer needed."
|
20
20
|
end
|
21
21
|
|
@@ -47,9 +47,7 @@ module Appsignal
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def call_with_appsignal_monitoring(env)
|
50
|
-
if @options[:params_method]
|
51
|
-
env[:params_method] = @options[:params_method]
|
52
|
-
end
|
50
|
+
env[:params_method] = @options[:params_method] if @options[:params_method]
|
53
51
|
request = @options.fetch(:request_class, Sinatra::Request).new(env)
|
54
52
|
transaction = Appsignal::Transaction.create(
|
55
53
|
SecureRandom.uuid,
|
@@ -82,7 +80,7 @@ module Appsignal
|
|
82
80
|
return unless env["sinatra.route"]
|
83
81
|
|
84
82
|
if env["SCRIPT_NAME"]
|
85
|
-
method, route = env["sinatra.route"].split
|
83
|
+
method, route = env["sinatra.route"].split
|
86
84
|
"#{method} #{env["SCRIPT_NAME"]}#{route}"
|
87
85
|
else
|
88
86
|
env["sinatra.route"]
|
@@ -31,17 +31,15 @@ module Appsignal
|
|
31
31
|
# Instrument a `process_action`, to set params/action name
|
32
32
|
status, headers, body =
|
33
33
|
Appsignal.instrument("process_action.rack") do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
transaction.set_http_or_background_queue_start
|
44
|
-
end
|
34
|
+
@app.call(env)
|
35
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
36
|
+
transaction.set_error(e)
|
37
|
+
raise e
|
38
|
+
ensure
|
39
|
+
transaction.set_action_if_nil(env["appsignal.action"])
|
40
|
+
transaction.set_metadata("path", request.path)
|
41
|
+
transaction.set_metadata("method", request.request_method)
|
42
|
+
transaction.set_http_or_background_queue_start
|
45
43
|
end
|
46
44
|
|
47
45
|
# Wrap the result body with our StreamWrapper
|
@@ -56,8 +54,8 @@ module Appsignal
|
|
56
54
|
@transaction = transaction
|
57
55
|
end
|
58
56
|
|
59
|
-
def each
|
60
|
-
@stream.each
|
57
|
+
def each(&block)
|
58
|
+
@stream.each(&block)
|
61
59
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
62
60
|
@transaction.set_error(e)
|
63
61
|
raise e
|
data/lib/appsignal/span.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Appsignal
|
2
4
|
class Span
|
3
5
|
def initialize(namespace = nil, ext = nil)
|
4
|
-
@ext =
|
5
|
-
ext
|
6
|
-
else
|
7
|
-
Appsignal::Extension::Span.root(namespace || "")
|
8
|
-
end
|
6
|
+
@ext = ext || Appsignal::Extension::Span.root(namespace || "")
|
9
7
|
end
|
10
8
|
|
11
9
|
def child
|
@@ -34,6 +32,7 @@ module Appsignal
|
|
34
32
|
|
35
33
|
def set_sample_data(key, data)
|
36
34
|
return unless key && data && (data.is_a?(Array) || data.is_a?(Hash))
|
35
|
+
|
37
36
|
@ext.set_sample_data(
|
38
37
|
key.to_s,
|
39
38
|
Appsignal::Utils::Data.generate(data)
|
@@ -62,6 +61,7 @@ module Appsignal
|
|
62
61
|
def to_h
|
63
62
|
json = @ext.to_json
|
64
63
|
return unless json
|
64
|
+
|
65
65
|
JSON.parse(json)
|
66
66
|
end
|
67
67
|
|
data/lib/appsignal/system.rb
CHANGED
@@ -7,14 +7,14 @@ module Appsignal
|
|
7
7
|
#
|
8
8
|
# @api private
|
9
9
|
module System
|
10
|
-
LINUX_TARGET = "linux"
|
11
|
-
LINUX_ARM_ARCHITECTURE = "aarch64"
|
12
|
-
MUSL_TARGET = "linux-musl"
|
13
|
-
FREEBSD_TARGET = "freebsd"
|
14
|
-
GEM_EXT_PATH = File.expand_path("
|
10
|
+
LINUX_TARGET = "linux"
|
11
|
+
LINUX_ARM_ARCHITECTURE = "aarch64"
|
12
|
+
MUSL_TARGET = "linux-musl"
|
13
|
+
FREEBSD_TARGET = "freebsd"
|
14
|
+
GEM_EXT_PATH = File.expand_path("../../ext", __dir__).freeze
|
15
15
|
|
16
16
|
def self.heroku?
|
17
|
-
ENV.key? "DYNO"
|
17
|
+
ENV.key? "DYNO"
|
18
18
|
end
|
19
19
|
|
20
20
|
# Detect agent and extension platform build
|
@@ -48,10 +48,9 @@ module Appsignal
|
|
48
48
|
if local_os =~ /linux/
|
49
49
|
ldd_output = ldd_version_output
|
50
50
|
return MUSL_TARGET if ldd_output.include? "musl"
|
51
|
+
|
51
52
|
ldd_version = extract_ldd_version(ldd_output)
|
52
|
-
if ldd_version && versionify(ldd_version) < versionify("2.15")
|
53
|
-
return MUSL_TARGET
|
54
|
-
end
|
53
|
+
return MUSL_TARGET if ldd_version && versionify(ldd_version) < versionify("2.15")
|
55
54
|
end
|
56
55
|
|
57
56
|
local_os
|
@@ -77,14 +76,14 @@ module Appsignal
|
|
77
76
|
#
|
78
77
|
# @api private
|
79
78
|
def self.force_musl_build?
|
80
|
-
%w[true 1].include?(ENV
|
79
|
+
%w[true 1].include?(ENV.fetch("APPSIGNAL_BUILD_FOR_MUSL", nil))
|
81
80
|
end
|
82
81
|
|
83
82
|
# Returns whether or not the linux ARM build was selected by the user.
|
84
83
|
#
|
85
84
|
# @api private
|
86
85
|
def self.force_linux_arm_build?
|
87
|
-
%w[true 1].include?(ENV
|
86
|
+
%w[true 1].include?(ENV.fetch("APPSIGNAL_BUILD_FOR_LINUX_ARM", nil))
|
88
87
|
end
|
89
88
|
|
90
89
|
# @api private
|