scout_apm 3.0.0.pre13 → 3.0.0.pre14
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/lib/scout_apm.rb +20 -10
- data/lib/scout_apm/agent.rb +114 -319
- data/lib/scout_apm/agent/exit_handler.rb +66 -0
- data/lib/scout_apm/agent/preconditions.rb +69 -0
- data/lib/scout_apm/agent_context.rb +234 -0
- data/lib/scout_apm/app_server_load.rb +24 -14
- data/lib/scout_apm/background_job_integrations/resque.rb +7 -8
- data/lib/scout_apm/background_job_integrations/sidekiq.rb +2 -2
- data/lib/scout_apm/background_recorder.rb +8 -3
- data/lib/scout_apm/background_worker.rb +14 -7
- data/lib/scout_apm/config.rb +35 -26
- data/lib/scout_apm/context.rb +11 -4
- data/lib/scout_apm/db_query_metric_set.rb +17 -5
- data/lib/scout_apm/debug.rb +1 -1
- data/lib/scout_apm/environment.rb +10 -14
- data/lib/scout_apm/framework_integrations/sinatra.rb +1 -1
- data/lib/scout_apm/git_revision.rb +13 -8
- data/lib/scout_apm/histogram.rb +1 -1
- data/lib/scout_apm/instant/middleware.rb +7 -7
- data/lib/scout_apm/instant_reporting.rb +7 -7
- data/lib/scout_apm/instrument_manager.rb +87 -0
- data/lib/scout_apm/instruments/action_controller_rails_2.rb +12 -7
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +17 -12
- data/lib/scout_apm/instruments/action_view.rb +11 -7
- data/lib/scout_apm/instruments/active_record.rb +25 -11
- data/lib/scout_apm/instruments/elasticsearch.rb +10 -6
- data/lib/scout_apm/instruments/grape.rb +12 -8
- data/lib/scout_apm/instruments/http_client.rb +10 -6
- data/lib/scout_apm/instruments/influxdb.rb +10 -6
- data/lib/scout_apm/instruments/middleware_detailed.rb +11 -5
- data/lib/scout_apm/instruments/middleware_summary.rb +11 -5
- data/lib/scout_apm/instruments/mongoid.rb +10 -5
- data/lib/scout_apm/instruments/moped.rb +11 -6
- data/lib/scout_apm/instruments/net_http.rb +10 -6
- data/lib/scout_apm/instruments/percentile_sampler.rb +8 -6
- data/lib/scout_apm/instruments/process/process_cpu.rb +8 -4
- data/lib/scout_apm/instruments/process/process_memory.rb +15 -10
- data/lib/scout_apm/instruments/rails_router.rb +12 -6
- data/lib/scout_apm/instruments/redis.rb +10 -6
- data/lib/scout_apm/instruments/samplers.rb +11 -0
- data/lib/scout_apm/instruments/sinatra.rb +5 -4
- data/lib/scout_apm/layaway.rb +21 -20
- data/lib/scout_apm/layaway_file.rb +8 -3
- data/lib/scout_apm/layer.rb +3 -3
- data/lib/scout_apm/layer_converters/converter_base.rb +6 -7
- data/lib/scout_apm/layer_converters/database_converter.rb +1 -1
- data/lib/scout_apm/layer_converters/histograms.rb +2 -2
- data/lib/scout_apm/layer_converters/slow_job_converter.rb +4 -3
- data/lib/scout_apm/layer_converters/slow_request_converter.rb +5 -4
- data/lib/scout_apm/logger.rb +143 -0
- data/lib/scout_apm/middleware.rb +7 -9
- data/lib/scout_apm/periodic_work.rb +28 -0
- data/lib/scout_apm/reporter.rb +14 -8
- data/lib/scout_apm/reporting.rb +135 -0
- data/lib/scout_apm/request_manager.rb +4 -6
- data/lib/scout_apm/serializers/payload_serializer.rb +1 -1
- data/lib/scout_apm/slow_job_policy.rb +6 -2
- data/lib/scout_apm/slow_job_record.rb +5 -5
- data/lib/scout_apm/slow_request_policy.rb +6 -2
- data/lib/scout_apm/slow_transaction.rb +5 -5
- data/lib/scout_apm/store.rb +22 -16
- data/lib/scout_apm/synchronous_recorder.rb +7 -3
- data/lib/scout_apm/tasks/doctor.rb +75 -0
- data/lib/scout_apm/tasks/support.rb +22 -0
- data/lib/scout_apm/tracer.rb +5 -5
- data/lib/scout_apm/tracked_request.rb +43 -19
- data/lib/scout_apm/utils/active_record_metric_name.rb +66 -8
- data/lib/scout_apm/utils/backtrace_parser.rb +1 -1
- data/lib/scout_apm/utils/installed_gems.rb +7 -3
- data/lib/scout_apm/utils/klass_helper.rb +8 -2
- data/lib/scout_apm/utils/scm.rb +1 -1
- data/lib/scout_apm/utils/sql_sanitizer.rb +3 -3
- data/lib/scout_apm/version.rb +1 -1
- data/lib/tasks/doctor.rake +11 -0
- data/scout_apm.gemspec +1 -0
- data/test/test_helper.rb +17 -2
- data/test/unit/agent_test.rb +1 -54
- data/test/unit/config_test.rb +9 -5
- data/test/unit/context_test.rb +4 -4
- data/test/unit/db_query_metric_set_test.rb +11 -4
- data/test/unit/fake_store_test.rb +1 -1
- data/test/unit/git_revision_test.rb +3 -3
- data/test/unit/instruments/net_http_test.rb +2 -1
- data/test/unit/instruments/percentile_sampler_test.rb +5 -9
- data/test/unit/layaway_test.rb +10 -5
- data/test/unit/layer_converters/metric_converter_test.rb +2 -2
- data/test/unit/slow_request_policy_test.rb +7 -3
- data/test/unit/sql_sanitizer_test.rb +0 -6
- data/test/unit/store_test.rb +11 -8
- data/test/unit/utils/active_record_metric_name_test.rb +45 -7
- metadata +27 -5
- data/lib/scout_apm/agent/logging.rb +0 -74
- data/lib/scout_apm/agent/reporting.rb +0 -129
- data/lib/scout_apm/utils/null_logger.rb +0 -13
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module ScoutApm
|
|
2
|
+
class Agent
|
|
3
|
+
class ExitHandler
|
|
4
|
+
attr_reader :context
|
|
5
|
+
|
|
6
|
+
def initialize(context)
|
|
7
|
+
@context = context
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def install
|
|
11
|
+
logger.debug "Shutdown handler not supported" and return unless exit_handler_supported?
|
|
12
|
+
logger.debug "Installing Shutdown Handler"
|
|
13
|
+
|
|
14
|
+
at_exit do
|
|
15
|
+
logger.info "Shutting down Scout Agent"
|
|
16
|
+
# MRI 1.9 bug drops exit codes.
|
|
17
|
+
# http://bugs.ruby-lang.org/issues/5218
|
|
18
|
+
if environment.ruby_19?
|
|
19
|
+
status = $!.status if $!.is_a?(SystemExit)
|
|
20
|
+
shutdown
|
|
21
|
+
exit status if status
|
|
22
|
+
else
|
|
23
|
+
shutdown
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# Called via the at_exit handler, it:
|
|
31
|
+
# (1) Stops the background worker
|
|
32
|
+
# (2) Stores metrics locally (forcing current-minute metrics to be written)
|
|
33
|
+
# It does not attempt to actually report metrics.
|
|
34
|
+
def shutdown
|
|
35
|
+
logger.info "Shutting down ScoutApm"
|
|
36
|
+
return if !context.started?
|
|
37
|
+
context.shutting_down!
|
|
38
|
+
ScoutApm::Instruments::Stacks.uninstall
|
|
39
|
+
::ScoutApm::Agent.instance.stop_background_worker
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def exit_handler_supported?
|
|
43
|
+
if environment.sinatra?
|
|
44
|
+
logger.debug "Exit handler not supported for Sinatra"
|
|
45
|
+
false
|
|
46
|
+
elsif environment.jruby?
|
|
47
|
+
logger.debug "Exit handler not supported for JRuby"
|
|
48
|
+
false
|
|
49
|
+
elsif environment.rubinius?
|
|
50
|
+
logger.debug "Exit handler not supported for Rubinius"
|
|
51
|
+
false
|
|
52
|
+
else
|
|
53
|
+
true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def logger
|
|
58
|
+
context.logger
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def environment
|
|
62
|
+
context.environment
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module ScoutApm
|
|
2
|
+
class Agent
|
|
3
|
+
class Preconditions
|
|
4
|
+
# The preconditions here must be a 2 element hash, with :message and :check.
|
|
5
|
+
# message: Proc that takes the environment, and returns a string
|
|
6
|
+
# check: Proc that takes an AgentContext and returns true if precondition was met, if false, we shouldn't start.
|
|
7
|
+
PRECONDITIONS = [
|
|
8
|
+
PRECONDITION_ENABLED = {
|
|
9
|
+
:message => proc {|environ| "Monitoring isn't enabled for the [#{environ.env}] environment." },
|
|
10
|
+
:check => proc { |context| context.config.value('monitor') },
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
PRECONDITION_APP_NAME = {
|
|
14
|
+
:message => proc {|environ| "An application name could not be determined. Specify the :name value in scout_apm.yml." },
|
|
15
|
+
:check => proc { |context| context.environment.application_name },
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
PRECONDITION_INTERACTIVE = {
|
|
19
|
+
:message => proc {|environ| "Agent attempting to load in interactive mode." },
|
|
20
|
+
:check => proc { |context| ! context.environment.interactive? },
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
PRECONDITION_DETECTED_SERVER = {
|
|
24
|
+
:message => proc {|environ| "Deferring agent start. Standing by for first request" },
|
|
25
|
+
:check => proc { |context| !app_server_missing?(context) && !background_job_missing?(context) },
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
PRECONDITION_ALREADY_STARTED = {
|
|
29
|
+
:message => proc {|environ| "Already started agent." },
|
|
30
|
+
:check => proc { |context| !context.started? },
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
PRECONDITION_OLD_SCOUT_RAILS = {
|
|
34
|
+
:message => proc {|environ| "ScoutAPM is incompatible with the old Scout Rails plugin. Please remove scout_rails from your Gemfile" },
|
|
35
|
+
:check => proc { !defined?(::ScoutRails) },
|
|
36
|
+
},
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
def self.check?(context)
|
|
40
|
+
failed_preconditions = PRECONDITIONS.inject(Array.new) { |errors, condition|
|
|
41
|
+
met = condition[:check].call(context)
|
|
42
|
+
errors << condition[:message].call(context.environment) unless met
|
|
43
|
+
errors
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if failed_preconditions.any?
|
|
47
|
+
failed_preconditions.each {|msg| context.logger.warn(msg) }
|
|
48
|
+
force? # if forced, return true anyway
|
|
49
|
+
else
|
|
50
|
+
# No errors, we met preconditions
|
|
51
|
+
true
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# XXX: Wire up options here and below in the appserver & bg server detections
|
|
56
|
+
def self.force?
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.app_server_missing?(context)
|
|
61
|
+
!context.environment.app_server_integration(true).found? # && !options[:skip_app_server_check]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.background_job_missing?(context)
|
|
65
|
+
context.environment.background_job_integrations.length == 0
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
module ScoutApm
|
|
2
|
+
class AgentContext
|
|
3
|
+
# Initially start up without attempting to load a configuration file. We
|
|
4
|
+
# need to be able to lookup configuration options like "application_root"
|
|
5
|
+
# which would then in turn influence where the yaml configuration file is
|
|
6
|
+
# located
|
|
7
|
+
#
|
|
8
|
+
# Later in initialization, we set config= to include the file.
|
|
9
|
+
def initialize()
|
|
10
|
+
@logger = LoggerFactory.build_minimal_logger
|
|
11
|
+
@process_start_time = Time.now
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def marshal_dump
|
|
15
|
+
[]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def marshal_load(*args)
|
|
19
|
+
@logger = LoggerFactory.build_minimal_logger
|
|
20
|
+
@process_start_time = Time.now
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
#####################################
|
|
24
|
+
# Lifecycle: Remote Server/Client
|
|
25
|
+
#
|
|
26
|
+
# This allows short lived forked processes to communicate back to the parent process.
|
|
27
|
+
# Used in the Resque instrumentation
|
|
28
|
+
#
|
|
29
|
+
# Parent Pre-fork: start_remote_server! once
|
|
30
|
+
# Child Post-fork: become_remote_client! after each fork
|
|
31
|
+
#
|
|
32
|
+
# TODO: Figure out where to extract this to
|
|
33
|
+
#####################################
|
|
34
|
+
|
|
35
|
+
def start_remote_server!(bind, port)
|
|
36
|
+
return if @remote_server && @remote_server.running?
|
|
37
|
+
|
|
38
|
+
logger.info("Starting Remote Agent Server")
|
|
39
|
+
|
|
40
|
+
# Start the listening web server only in parent process.
|
|
41
|
+
@remote_server = ScoutApm::Remote::Server.new(
|
|
42
|
+
bind,
|
|
43
|
+
port,
|
|
44
|
+
ScoutApm::Remote::Router.new(ScoutApm::SynchronousRecorder.new(logger), logger),
|
|
45
|
+
logger
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
@remote_server.start
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Execute this in the child process of a remote agent. The parent is
|
|
52
|
+
# expected to have its accepting webserver up and running
|
|
53
|
+
def become_remote_client!(host, port)
|
|
54
|
+
logger.debug("Becoming Remote Agent (reporting to: #{host}:#{port})")
|
|
55
|
+
recorder = ScoutApm::Remote::Recorder.new(host, port, logger)
|
|
56
|
+
store = ScoutApm::FakeStore.new
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
###############
|
|
61
|
+
# Accessors #
|
|
62
|
+
###############
|
|
63
|
+
|
|
64
|
+
attr_reader :process_start_time
|
|
65
|
+
|
|
66
|
+
def config
|
|
67
|
+
@config ||= ScoutApm::Config.without_file(self)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def environment
|
|
71
|
+
@environment ||= ScoutApm::Environment.instance
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def started?
|
|
75
|
+
@started
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def shutting_down?
|
|
79
|
+
@shutting_down
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def installed?
|
|
83
|
+
@installed
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def logger
|
|
87
|
+
@logger ||= LoggerFactory.build(config, environment)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def ignored_uris
|
|
91
|
+
@ignored_uris ||= ScoutApm::IgnoredUris.new(config.value('ignore'))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def slow_request_policy
|
|
95
|
+
@slow_request_policy ||= ScoutApm::SlowRequestPolicy.new(self)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def slow_job_policy
|
|
99
|
+
@slow_job_policy ||= ScoutApm::SlowJobPolicy.new(self)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Histogram of the cumulative requests since the start of the process
|
|
103
|
+
def request_histograms
|
|
104
|
+
@request_histograms ||= ScoutApm::RequestHistograms.new
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Histogram of the requests, distinct by reporting period (minute)
|
|
108
|
+
# { StoreReportingPeriodTimestamp => RequestHistograms }
|
|
109
|
+
def request_histograms_by_time
|
|
110
|
+
@request_histograms_by_time ||= Hash.new { |h, k| h[k] = ScoutApm::RequestHistograms.new }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def store
|
|
114
|
+
return @store if @store
|
|
115
|
+
self.store = ScoutApm::Store.new(self)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def layaway
|
|
119
|
+
@layaway ||= ScoutApm::Layaway.new(self)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def recorder
|
|
123
|
+
@recorder ||= RecorderFactory.build(self)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def dev_trace_enabled?
|
|
127
|
+
config.value('dev_trace') && environment.env == "development"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
#############
|
|
131
|
+
# Setters #
|
|
132
|
+
#############
|
|
133
|
+
|
|
134
|
+
# When we set the config for any reason, there are some values we must
|
|
135
|
+
# reinitialize, since the config could have changed their settings, so nil
|
|
136
|
+
# them out here, then let them get lazily reset as needed
|
|
137
|
+
#
|
|
138
|
+
# Don't use this in initializer, since it'll attempt to log immediately
|
|
139
|
+
def config=(config)
|
|
140
|
+
@config = config
|
|
141
|
+
|
|
142
|
+
@logger = nil
|
|
143
|
+
|
|
144
|
+
log_configuration_settings
|
|
145
|
+
|
|
146
|
+
@ignored_uris = nil
|
|
147
|
+
@slow_request_policy = nil
|
|
148
|
+
@slow_job_policy = nil
|
|
149
|
+
@request_histograms = nil
|
|
150
|
+
@request_histograms_by_time = nil
|
|
151
|
+
@store = nil
|
|
152
|
+
@layaway = nil
|
|
153
|
+
@recorder = nil
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def installed!
|
|
157
|
+
@installed = true
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def started!
|
|
161
|
+
@started = true
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def shutting_down!
|
|
165
|
+
@shutting_down = true
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def store=(store)
|
|
169
|
+
@store = store
|
|
170
|
+
|
|
171
|
+
# Installs the default samplers
|
|
172
|
+
# Don't install samplers on nil stores
|
|
173
|
+
if store
|
|
174
|
+
ScoutApm::Instruments::Samplers::DEFAULT_SAMPLERS.each { |s| store.add_sampler(s) }
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def recorder=(recorder)
|
|
179
|
+
@recorder = recorder
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# I believe this is only useful for testing?
|
|
183
|
+
def environment=(env)
|
|
184
|
+
@environment = env
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#########################
|
|
188
|
+
# Callbacks & helpers #
|
|
189
|
+
#
|
|
190
|
+
# Should find ways to remove these into external spots
|
|
191
|
+
#########################
|
|
192
|
+
|
|
193
|
+
# Called after config is reset and loaded from file
|
|
194
|
+
def log_configuration_settings
|
|
195
|
+
@config.log_settings(logger)
|
|
196
|
+
|
|
197
|
+
if !@config.any_keys_found?
|
|
198
|
+
logger.info("No configuration file loaded, and no configuration found in ENV. " +
|
|
199
|
+
"For assistance configuring Scout, visit " +
|
|
200
|
+
"http://help.apm.scoutapp.com/#configuration-options")
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
class RecorderFactory
|
|
206
|
+
def self.build(context)
|
|
207
|
+
if context.config.value("async_recording")
|
|
208
|
+
context.logger.debug("Using asynchronous recording")
|
|
209
|
+
ScoutApm::BackgroundRecorder.new(context).start
|
|
210
|
+
else
|
|
211
|
+
context.logger.debug("Using synchronous recording")
|
|
212
|
+
ScoutApm::SynchronousRecorder.new(context).start
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
class LoggerFactory
|
|
218
|
+
def self.build(config, environment)
|
|
219
|
+
ScoutApm::Logger.new(environment.root,
|
|
220
|
+
{
|
|
221
|
+
:log_level => config.value('log_level'),
|
|
222
|
+
:log_file_path => config.value('log_file_path'),
|
|
223
|
+
:stdout => config.value('log_stdout'),
|
|
224
|
+
:stderr => config.value('log_stderr'),
|
|
225
|
+
:logger_class => config.value('log_class'),
|
|
226
|
+
}
|
|
227
|
+
)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def self.build_minimal_logger
|
|
231
|
+
ScoutApm::Logger.new(nil, :stdout => true)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
module ScoutApm
|
|
2
2
|
class AppServerLoad
|
|
3
3
|
attr_reader :logger
|
|
4
|
+
attr_reader :context
|
|
4
5
|
|
|
5
|
-
def initialize(
|
|
6
|
-
@
|
|
6
|
+
def initialize(context)
|
|
7
|
+
@context = context
|
|
8
|
+
@logger = context.logger
|
|
7
9
|
end
|
|
8
10
|
|
|
9
11
|
def run
|
|
@@ -13,7 +15,7 @@ module ScoutApm
|
|
|
13
15
|
logger.debug("Full Application Startup Info: #{data.inspect}")
|
|
14
16
|
|
|
15
17
|
payload = ScoutApm::Serializers::AppServerLoadSerializer.serialize(data)
|
|
16
|
-
reporter = Reporter.new(:app_server_load)
|
|
18
|
+
reporter = Reporter.new(context, :app_server_load)
|
|
17
19
|
reporter.report(payload)
|
|
18
20
|
|
|
19
21
|
logger.debug("Finished sending Startup Info")
|
|
@@ -28,19 +30,23 @@ module ScoutApm
|
|
|
28
30
|
|
|
29
31
|
def data
|
|
30
32
|
{ :server_time => to_s_safe(Time.now),
|
|
31
|
-
:framework => to_s_safe(
|
|
32
|
-
:framework_version => to_s_safe(
|
|
33
|
-
:environment => to_s_safe(
|
|
34
|
-
:app_server => to_s_safe(
|
|
33
|
+
:framework => to_s_safe(environment.framework_integration.human_name),
|
|
34
|
+
:framework_version => to_s_safe(environment.framework_integration.version),
|
|
35
|
+
:environment => to_s_safe(environment.framework_integration.env),
|
|
36
|
+
:app_server => to_s_safe(environment.app_server),
|
|
35
37
|
:ruby_version => RUBY_VERSION,
|
|
36
|
-
:hostname => to_s_safe(
|
|
37
|
-
:database_engine => to_s_safe(
|
|
38
|
-
:database_adapter => to_s_safe(
|
|
39
|
-
:application_name => to_s_safe(
|
|
40
|
-
:libraries => ScoutApm::Utils::InstalledGems.new.run,
|
|
41
|
-
:paas => to_s_safe(
|
|
42
|
-
:git_sha => to_s_safe(
|
|
38
|
+
:hostname => to_s_safe(environment.hostname),
|
|
39
|
+
:database_engine => to_s_safe(environment.database_engine), # Detected
|
|
40
|
+
:database_adapter => to_s_safe(environment.raw_database_adapter), # Raw
|
|
41
|
+
:application_name => to_s_safe(environment.application_name),
|
|
42
|
+
:libraries => ScoutApm::Utils::InstalledGems.new(context).run,
|
|
43
|
+
:paas => to_s_safe(environment.platform_integration.name),
|
|
44
|
+
:git_sha => to_s_safe(environment.git_revision.sha)
|
|
43
45
|
}
|
|
46
|
+
ensure
|
|
47
|
+
# Sometimes :database_engine and :database_adapter can cause a reference to an AR connection.
|
|
48
|
+
# Make sure we release all AR connections held by this thread.
|
|
49
|
+
ActiveRecord::Base.clear_active_connections! if Utils::KlassHelper.defined?("ActiveRecord::Base")
|
|
44
50
|
end
|
|
45
51
|
|
|
46
52
|
# Calls `.to_s` on the object passed in.
|
|
@@ -52,5 +58,9 @@ module ScoutApm
|
|
|
52
58
|
'to_s error'
|
|
53
59
|
end
|
|
54
60
|
end
|
|
61
|
+
|
|
62
|
+
def environment
|
|
63
|
+
context.environment
|
|
64
|
+
end
|
|
55
65
|
end
|
|
56
66
|
end
|
|
@@ -26,13 +26,12 @@ module ScoutApm
|
|
|
26
26
|
def install_before_fork
|
|
27
27
|
::Resque.before_first_fork do
|
|
28
28
|
begin
|
|
29
|
-
ScoutApm::Agent.instance.start
|
|
30
|
-
ScoutApm::Agent.instance.
|
|
31
|
-
ScoutApm::Agent.instance.start_remote_server(bind, port)
|
|
29
|
+
ScoutApm::Agent.instance.start
|
|
30
|
+
ScoutApm::Agent.instance.context.start_remote_server!(bind, port)
|
|
32
31
|
rescue Errno::EADDRINUSE
|
|
33
|
-
ScoutApm::Agent.instance.logger.warn "Error while Installing Resque Instruments, Port #{port} already in use. Set via the `remote_agent_port` configuration option"
|
|
32
|
+
ScoutApm::Agent.instance.context.logger.warn "Error while Installing Resque Instruments, Port #{port} already in use. Set via the `remote_agent_port` configuration option"
|
|
34
33
|
rescue => e
|
|
35
|
-
ScoutApm::Agent.instance.logger.warn "Error while Installing Resque before_first_fork: #{e.inspect}"
|
|
34
|
+
ScoutApm::Agent.instance.context.logger.warn "Error while Installing Resque before_first_fork: #{e.inspect}"
|
|
36
35
|
end
|
|
37
36
|
end
|
|
38
37
|
end
|
|
@@ -40,10 +39,10 @@ module ScoutApm
|
|
|
40
39
|
def install_after_fork
|
|
41
40
|
::Resque.after_fork do
|
|
42
41
|
begin
|
|
43
|
-
ScoutApm::Agent.instance.
|
|
42
|
+
ScoutApm::Agent.instance.context.become_remote_client!(bind, port)
|
|
44
43
|
inject_job_instrument
|
|
45
44
|
rescue => e
|
|
46
|
-
ScoutApm::Agent.instance.logger.warn "Error while Installing Resque after_fork: #{e.inspect}"
|
|
45
|
+
ScoutApm::Agent.instance.context.logger.warn "Error while Installing Resque after_fork: #{e.inspect}"
|
|
47
46
|
end
|
|
48
47
|
end
|
|
49
48
|
end
|
|
@@ -77,7 +76,7 @@ module ScoutApm
|
|
|
77
76
|
end
|
|
78
77
|
|
|
79
78
|
def config
|
|
80
|
-
@config || ScoutApm::Agent.instance.config
|
|
79
|
+
@config || ScoutApm::Agent.instance.context.config
|
|
81
80
|
end
|
|
82
81
|
end
|
|
83
82
|
end
|