scout_apm 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.markdown +4 -0
  3. data/lib/scout_apm.rb +48 -23
  4. data/lib/scout_apm/agent.rb +93 -130
  5. data/lib/scout_apm/agent/reporting.rb +34 -63
  6. data/lib/scout_apm/app_server_load.rb +29 -0
  7. data/lib/scout_apm/background_worker.rb +6 -6
  8. data/lib/scout_apm/capacity.rb +48 -48
  9. data/lib/scout_apm/config.rb +5 -5
  10. data/lib/scout_apm/context.rb +3 -3
  11. data/lib/scout_apm/environment.rb +64 -100
  12. data/lib/scout_apm/framework_integrations/rails_2.rb +32 -0
  13. data/lib/scout_apm/framework_integrations/rails_3_or_4.rb +33 -0
  14. data/lib/scout_apm/framework_integrations/ruby.rb +26 -0
  15. data/lib/scout_apm/framework_integrations/sinatra.rb +27 -0
  16. data/lib/scout_apm/instruments/active_record_instruments.rb +1 -1
  17. data/lib/scout_apm/instruments/mongoid_instruments.rb +1 -1
  18. data/lib/scout_apm/instruments/moped_instruments.rb +3 -3
  19. data/lib/scout_apm/instruments/net_http.rb +2 -2
  20. data/lib/scout_apm/instruments/process/process_cpu.rb +41 -20
  21. data/lib/scout_apm/instruments/process/process_memory.rb +45 -30
  22. data/lib/scout_apm/instruments/rails/action_controller_instruments.rb +20 -18
  23. data/lib/scout_apm/instruments/rails3_or_4/action_controller_instruments.rb +17 -14
  24. data/lib/scout_apm/layaway.rb +12 -12
  25. data/lib/scout_apm/layaway_file.rb +1 -1
  26. data/lib/scout_apm/metric_meta.rb +9 -9
  27. data/lib/scout_apm/metric_stats.rb +8 -8
  28. data/lib/scout_apm/reporter.rb +83 -0
  29. data/lib/scout_apm/serializers/app_server_load_serializer.rb +15 -0
  30. data/lib/scout_apm/serializers/directive_serializer.rb +15 -0
  31. data/lib/scout_apm/serializers/payload_serializer.rb +14 -0
  32. data/lib/scout_apm/server_integrations/null.rb +30 -0
  33. data/lib/scout_apm/server_integrations/passenger.rb +35 -0
  34. data/lib/scout_apm/server_integrations/puma.rb +30 -0
  35. data/lib/scout_apm/server_integrations/rainbows.rb +36 -0
  36. data/lib/scout_apm/server_integrations/thin.rb +41 -0
  37. data/lib/scout_apm/server_integrations/unicorn.rb +35 -0
  38. data/lib/scout_apm/server_integrations/webrick.rb +25 -0
  39. data/lib/scout_apm/slow_transaction.rb +3 -3
  40. data/lib/scout_apm/stack_item.rb +19 -17
  41. data/lib/scout_apm/store.rb +35 -35
  42. data/lib/scout_apm/tracer.rb +121 -110
  43. data/lib/scout_apm/utils/sql_sanitizer.rb +2 -2
  44. data/lib/scout_apm/version.rb +2 -1
  45. data/test/unit/environment_test.rb +5 -5
  46. metadata +18 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e79b5f288da544777712971294bf8c37adf7bf64
4
- data.tar.gz: 5ca3cb606fee63ad83d31b48458c815024d10a91
3
+ metadata.gz: 91a0c14d41ab0d56bce566a96e08014a452ba693
4
+ data.tar.gz: 8b1f7239c3f43bfaa1cb6191ff20d8bcc29bd288
5
5
  SHA512:
6
- metadata.gz: 388a1865dbcd8dd8be6a93d8a6229ac1560e8b235af4599f58a6c75f69815b186dff72ebbb5d3ad60cac25a59bb7e88827e7e820e703ef6ebd7ece760ac96e68
7
- data.tar.gz: 57785a9a9027acbbb5c6c6c6b4a8b7659dd3df47ded3b29705d3b215fb27dcf0613a6880a8f98a6247c165e3b60b8b044e2b676a0a2f4d019c5d2489797901ef
6
+ metadata.gz: 0f11acf434f45f02d92106f76d7976aa13c86808a10e5716d6698660f82889a9de4a374060acaa5c170df182b60eb9943226da10478f76c33e6ac02bebd4bde6
7
+ data.tar.gz: baa5db394ee68a07b26fae9a493a96f0e512c6dbc0c583082b2eb5974dfdbd946632c11d83b914cd8033c60f85b3cebc94bccb44b18153f3f95d478fa801c487
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.1.7
2
+
3
+ * Ability to ignore child calls in instrumentation.
4
+
1
5
  # 0.1.6
2
6
 
3
7
  * Fix issues with Ruby 1.8.7 regexes
data/lib/scout_apm.rb CHANGED
@@ -1,32 +1,57 @@
1
1
  module ScoutApm
2
2
  end
3
- require 'socket'
4
- require 'set'
3
+
4
+ require 'cgi'
5
+ require 'logger'
5
6
  require 'net/http'
6
7
  require 'openssl'
7
- require 'logger'
8
+ require 'set'
9
+ require 'socket'
8
10
  require 'yaml'
9
- require 'cgi'
10
11
 
11
- require File.expand_path('../scout_apm/version.rb', __FILE__)
12
- require File.expand_path('../scout_apm/agent.rb', __FILE__)
13
- require File.expand_path('../scout_apm/agent/logging.rb', __FILE__)
14
- require File.expand_path('../scout_apm/agent/reporting.rb', __FILE__)
15
- require File.expand_path('../scout_apm/layaway.rb', __FILE__)
16
- require File.expand_path('../scout_apm/layaway_file.rb', __FILE__)
17
- require File.expand_path('../scout_apm/config.rb', __FILE__)
18
- require File.expand_path('../scout_apm/background_worker.rb', __FILE__)
19
- require File.expand_path('../scout_apm/environment.rb', __FILE__)
20
- require File.expand_path('../scout_apm/metric_meta.rb', __FILE__)
21
- require File.expand_path('../scout_apm/metric_stats.rb', __FILE__)
22
- require File.expand_path('../scout_apm/stack_item.rb', __FILE__)
23
- require File.expand_path('../scout_apm/store.rb', __FILE__)
24
- require File.expand_path('../scout_apm/tracer.rb', __FILE__)
25
- require File.expand_path('../scout_apm/context.rb', __FILE__)
26
- require File.expand_path('../scout_apm/slow_transaction.rb', __FILE__)
27
- require File.expand_path('../scout_apm/capacity.rb', __FILE__)
28
- require File.expand_path('../scout_apm/instruments/process/process_cpu.rb', __FILE__)
29
- require File.expand_path('../scout_apm/instruments/process/process_memory.rb', __FILE__)
12
+ require 'scout_apm/version'
13
+
14
+ require 'scout_apm/server_integrations/passenger'
15
+ require 'scout_apm/server_integrations/puma'
16
+ require 'scout_apm/server_integrations/rainbows'
17
+ require 'scout_apm/server_integrations/thin'
18
+ require 'scout_apm/server_integrations/unicorn'
19
+ require 'scout_apm/server_integrations/webrick'
20
+ require 'scout_apm/server_integrations/null'
21
+
22
+ require 'scout_apm/framework_integrations/rails_2'
23
+ require 'scout_apm/framework_integrations/rails_3_or_4'
24
+ require 'scout_apm/framework_integrations/sinatra'
25
+ require 'scout_apm/framework_integrations/ruby'
26
+
27
+ require 'scout_apm/app_server_load'
28
+
29
+ require 'scout_apm/utils/sql_sanitizer'
30
+ require 'scout_apm/utils/null_logger'
31
+ require 'scout_apm/config'
32
+ require 'scout_apm/environment'
33
+ require 'scout_apm/agent'
34
+ require 'scout_apm/agent/logging'
35
+ require 'scout_apm/agent/reporting'
36
+ require 'scout_apm/layaway'
37
+ require 'scout_apm/layaway_file'
38
+ require 'scout_apm/reporter'
39
+ require 'scout_apm/background_worker'
40
+ require 'scout_apm/metric_meta'
41
+ require 'scout_apm/metric_stats'
42
+ require 'scout_apm/stack_item'
43
+ require 'scout_apm/store'
44
+ require 'scout_apm/tracer'
45
+ require 'scout_apm/context'
46
+ require 'scout_apm/slow_transaction'
47
+ require 'scout_apm/capacity'
48
+ require 'scout_apm/instruments/process/process_cpu'
49
+ require 'scout_apm/instruments/process/process_memory'
50
+
51
+
52
+ require 'scout_apm/serializers/payload_serializer'
53
+ require 'scout_apm/serializers/directive_serializer'
54
+ require 'scout_apm/serializers/app_server_load_serializer'
30
55
 
31
56
  if defined?(Rails) and Rails.respond_to?(:version) and Rails.version >= '3'
32
57
  module ScoutApm
@@ -1,8 +1,8 @@
1
1
  module ScoutApm
2
- # The agent gathers performance data from a Ruby application. One Agent instance is created per-Ruby process.
2
+ # The agent gathers performance data from a Ruby application. One Agent instance is created per-Ruby process.
3
3
  #
4
- # Each Agent object creates a worker thread (unless monitoring is disabled or we're forking).
5
- # The worker thread wakes up every +Agent#period+, merges in-memory metrics w/those saved to disk,
4
+ # Each Agent object creates a worker thread (unless monitoring is disabled or we're forking).
5
+ # The worker thread wakes up every +Agent#period+, merges in-memory metrics w/those saved to disk,
6
6
  # saves tshe merged data to disk, and sends it to the Scout server.
7
7
  class Agent
8
8
  # see self.instance
@@ -12,19 +12,18 @@ module ScoutApm
12
12
  attr_accessor :store
13
13
  attr_accessor :layaway
14
14
  attr_accessor :config
15
- attr_accessor :environment
16
15
  attr_accessor :capacity
17
16
  attr_accessor :logger
18
17
  attr_accessor :log_file # path to the log file
19
18
  attr_accessor :options # options passed to the agent when +#start+ is called.
20
19
  attr_accessor :metric_lookup # Hash used to lookup metric ids based on their name and scope
21
20
 
22
- # All access to the agent is thru this class method to ensure multiple Agent instances are not initialized per-Ruby process.
21
+ # All access to the agent is thru this class method to ensure multiple Agent instances are not initialized per-Ruby process.
23
22
  def self.instance(options = {})
24
23
  @@instance ||= self.new(options)
25
24
  end
26
25
 
27
- # Note - this doesn't start instruments or the worker thread. This is handled via +#start+ as we don't
26
+ # Note - this doesn't start instruments or the worker thread. This is handled via +#start+ as we don't
28
27
  # want to start the worker thread or install instrumentation if (1) disabled for this environment (2) a worker thread shouldn't
29
28
  # be started (when forking).
30
29
  def initialize(options = {})
@@ -32,74 +31,108 @@ module ScoutApm
32
31
  @options ||= options
33
32
  @config = ScoutApm::Config.new(options[:config_path])
34
33
 
35
- @store = ScoutApm::Store.new
36
- @layaway = ScoutApm::Layaway.new
37
- @metric_lookup = Hash.new
38
- @process_cpu = ScoutApm::Instruments::Process::ProcessCpu.new(environment.processors)
39
- @process_memory = ScoutApm::Instruments::Process::ProcessMemory.new
40
- @capacity = ScoutApm::Capacity.new
34
+ @store = ScoutApm::Store.new
35
+ @layaway = ScoutApm::Layaway.new
36
+ @metric_lookup = Hash.new
37
+
38
+ @capacity = ScoutApm::Capacity.new
41
39
  end
42
40
 
43
41
  def environment
44
- @environment ||= ScoutApm::Environment.new
42
+ ScoutApm::Environment.instance
45
43
  end
46
44
 
47
- # This is called via +ScoutApm::Agent.instance.start+ when ScoutApm is required in a Ruby application.
48
- # It initializes the agent and starts the worker thread (if appropiate).
49
- def start(options = {})
50
- @options.merge!(options)
51
- init_logger
52
- logger.info "Attempting to start Scout Agent [#{ScoutApm::VERSION}] on [#{environment.hostname}]"
53
- if !config.value('monitor') and !@options[:force]
45
+ def apm_enabled?
46
+ config.value('monitor') and !@options[:force]
47
+ end
48
+
49
+ def preconditions_met?
50
+ if !apm_enabled?
54
51
  logger.warn "Monitoring isn't enabled for the [#{environment.env}] environment."
55
52
  return false
56
- elsif !config.value('name')
53
+ end
54
+
55
+ if !Environment.instance.application_name
57
56
  logger.warn "An application name is required. Specify the :name value in scout_apm.yml. Not starting agent."
58
57
  return false
59
- elsif !environment.app_server
58
+ end
59
+
60
+ if !environment.app_server
60
61
  logger.warn "Couldn't find a supported app server. Not starting agent."
61
62
  return false
62
- elsif started?
63
+ end
64
+
65
+ if started?
63
66
  logger.warn "Already started agent."
64
67
  return false
65
68
  end
69
+
70
+ true
71
+ end
72
+
73
+ # This is called via +ScoutApm::Agent.instance.start+ when ScoutApm is required in a Ruby application.
74
+ # It initializes the agent and starts the worker thread (if appropiate).
75
+ def start(options = {})
76
+ @options.merge!(options)
77
+ init_logger
78
+ logger.info "Attempting to start Scout Agent [#{ScoutApm::VERSION}] on [#{environment.hostname}]"
79
+
80
+ return false unless preconditions_met?
81
+
66
82
  @started = true
67
- logger.info "Starting monitoring for [#{config.value('name')}]. Framework [#{environment.framework}] App Server [#{environment.app_server}]."
83
+
84
+ logger.info "Starting monitoring for [#{environment.application_name}]. Framework [#{environment.framework}] App Server [#{environment.app_server}]."
85
+
68
86
  load_instruments
69
- if !start_background_worker?
87
+ @samplers = [
88
+ ScoutApm::Instruments::Process::ProcessCpu.new(environment.processors, logger),
89
+ ScoutApm::Instruments::Process::ProcessMemory.new(logger)
90
+ ]
91
+
92
+ app_server_load_hook
93
+
94
+ if start_background_worker? # TODO: Clarify name. This is not the path that unicorn workers take....
95
+ # This branch fires only on non-forking servers, directly starts the
96
+ # background thread and then requests are served.
97
+ start_background_worker
98
+ handle_exit
99
+ logger.info "Scout Agent [#{ScoutApm::VERSION}] Initialized"
100
+ else
101
+ # This branch fires on.... master only? of forking servers
70
102
  logger.debug "Not starting worker thread. Will start worker loops after forking."
71
- install_passenger_events if environment.app_server == :passenger
72
- install_unicorn_worker_loop if environment.app_server == :unicorn
73
- install_rainbows_worker_loop if environment.app_server == :rainbows
74
- install_puma_worker_loop if environment.app_server == :puma
75
- return
103
+ environment.app_server_integration.install
76
104
  end
77
- start_background_worker
78
- handle_exit
79
- logger.info "Scout Agent [#{ScoutApm::VERSION}] Initialized"
80
105
  end
81
-
106
+
107
+ # Sends a ping to APM right away, smoothes out onboarding
108
+ # Collects up any relevant info (framework, app server, system time, ruby version, etc)
109
+ def app_server_load_hook
110
+ AppServerLoad.new.run
111
+ end
112
+
113
+ def exit_handler_unsupported?
114
+ environment.sinatra? || environment.jruby? || environment.rubinius?
115
+ end
116
+
82
117
  # at_exit, calls Agent#shutdown to wrapup metric reporting.
83
118
  def handle_exit
84
- if environment.sinatra? || environment.jruby? || environment.rubinius?
85
- logger.debug "Exit handler not supported"
86
- else
87
- at_exit do
88
- logger.debug "Shutdown!"
89
- # MRI 1.9 bug drops exit codes.
90
- # http://bugs.ruby-lang.org/issues/5218
91
- if environment.ruby_19?
92
- status = $!.status if $!.is_a?(SystemExit)
93
- shutdown
94
- exit status if status
95
- else
96
- shutdown
97
- end
98
- end # at_exit
119
+ logger.debug "Exit handler not supported" and return if exit_handler_unsupported?
120
+
121
+ at_exit do
122
+ logger.debug "Shutdown!"
123
+ # MRI 1.9 bug drops exit codes.
124
+ # http://bugs.ruby-lang.org/issues/5218
125
+ if environment.ruby_19?
126
+ status = $!.status if $!.is_a?(SystemExit)
127
+ shutdown
128
+ exit status if status
129
+ else
130
+ shutdown
131
+ end
99
132
  end
100
133
  end
101
-
102
- # Called via an at_exit handler, it (1) stops the background worker and (2) runs it a final time.
134
+
135
+ # Called via an at_exit handler, it (1) stops the background worker and (2) runs it a final time.
103
136
  # The final run ensures metrics are stored locally to the layaway / reported to scoutapp.com. Otherwise,
104
137
  # in-memory metrics would be lost and a gap would appear on restarts.
105
138
  def shutdown
@@ -107,68 +140,21 @@ module ScoutApm
107
140
  @background_worker.stop
108
141
  @background_worker.run_once
109
142
  end
110
-
143
+
111
144
  def started?
112
145
  @started
113
146
  end
114
-
115
- def gem_root
116
- File.expand_path(File.join("..","..",".."), __FILE__)
117
- end
118
-
147
+
119
148
  # The worker thread will automatically start UNLESS:
120
149
  # * A supported application server isn't detected (example: running via Rails console)
121
- # * A supported application server is detected, but it forks. In this case,
150
+ # * A supported application server is detected, but it forks. In this case,
122
151
  # the agent is started in the forked process.
123
152
  def start_background_worker?
124
- !environment.forking? or environment.app_server == :thin # clarify why Thin is here but not WEBrick
125
- end
126
-
127
- ## TODO - Likely possible to unify starting the worker loop in forking servers by listening for the first transaction
128
- ## to start and starting the background worker then in that process.
129
-
130
- def install_passenger_events
131
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
132
- logger.debug "Passenger is starting a worker process. Starting worker thread."
133
- self.class.instance.start_background_worker
134
- end
135
- # The agent's at_exit hook doesn't run when a Passenger process stops.
136
- # This does run when a process stops.
137
- PhusionPassenger.on_event(:stopping_worker_process) do
138
- logger.debug "Passenger is stopping a worker process, shutting down the agent."
139
- ScoutApm::Agent.instance.shutdown
140
- end
141
- end
142
-
143
- def install_unicorn_worker_loop
144
- logger.debug "Installing Unicorn worker loop."
145
- Unicorn::HttpServer.class_eval do
146
- old = instance_method(:worker_loop)
147
- define_method(:worker_loop) do |worker|
148
- ScoutApm::Agent.instance.start_background_worker
149
- old.bind(self).call(worker)
150
- end
151
- end
152
- end
153
-
154
- def install_rainbows_worker_loop
155
- logger.debug "Installing Rainbows worker loop."
156
- Rainbows::HttpServer.class_eval do
157
- old = instance_method(:worker_loop)
158
- define_method(:worker_loop) do |worker|
159
- ScoutApm::Agent.instance.start_background_worker
160
- old.bind(self).call(worker)
161
- end
162
- end
163
- end
153
+ return true if environment.app_server == :thin
154
+ return true if environment.app_server == :webrick
155
+ return false if environment.forking?
164
156
 
165
- def install_puma_worker_loop
166
- Puma.cli_config.options[:before_worker_boot] << Proc.new do
167
- logger.debug "Installing Puma worker loop."
168
- ScoutApm::Agent.instance.start_background_worker
169
- end
170
- rescue
171
- logger.warn "Unable to install Puma worker loop: #{$!.message}"
157
+ false
172
158
  end
173
159
 
174
160
  # Creates the worker thread. The worker thread is a loop that runs continuously. It sleeps for +Agent#period+ and when it wakes,
@@ -182,29 +168,6 @@ module ScoutApm
182
168
  logger.debug "Done creating worker thread."
183
169
  end
184
170
 
185
- # Called from #process_metrics, which is run via the background worker.
186
- def run_samplers
187
- begin
188
- cpu_util=@process_cpu.run # returns a hash
189
- logger.debug "Process CPU: #{cpu_util.inspect} [#{environment.processors} CPU(s)]"
190
- store.track!("CPU/Utilization",cpu_util,:scope => nil) if cpu_util
191
- rescue => e
192
- logger.info "Error reading ProcessCpu"
193
- logger.debug e.message
194
- logger.debug e.backtrace.join("\n")
195
- end
196
-
197
- begin
198
- mem_usage=@process_memory.run # returns a single number, in MB
199
- logger.debug "Process Memory: #{mem_usage}MB"
200
- store.track!("Memory/Physical",mem_usage,:scope => nil) if mem_usage
201
- rescue => e
202
- logger.info "Error reading ProcessMemory"
203
- logger.debug e.message
204
- logger.debug e.backtrace.join("\n")
205
- end
206
- end
207
-
208
171
  # Loads the instrumention logic.
209
172
  def load_instruments
210
173
  logger.debug "Installing instrumentation"
@@ -223,5 +186,5 @@ module ScoutApm
223
186
  logger.warn $!.message
224
187
  logger.warn $!.backtrace
225
188
  end
226
- end # class Agent
227
- end # module ScoutApm
189
+ end
190
+ end
@@ -2,8 +2,9 @@
2
2
  module ScoutApm
3
3
  class Agent
4
4
  module Reporting
5
- CA_FILE = File.join( File.dirname(__FILE__), *%w[.. .. .. data cacert.pem] )
6
- VERIFY_MODE = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
5
+ def reporter
6
+ @reporter ||= ScoutApm::Reporter.new(config, logger)
7
+ end
7
8
 
8
9
  # Called in the worker thread. Merges in-memory metrics w/those on disk and reports metrics
9
10
  # to the server.
@@ -12,26 +13,35 @@ module ScoutApm
12
13
  run_samplers
13
14
  capacity.process
14
15
  payload = layaway.deposit_and_deliver
16
+
15
17
  metrics = payload[:metrics]
16
18
  slow_transactions = payload[:slow_transactions]
19
+
17
20
  if payload.any?
18
- add_metric_ids(metrics)
21
+ add_metric_ids(metrics)
22
+
19
23
  logger.warn "Some data may be lost - metric size is at limit" if metrics.size == ScoutApm::Store::MAX_SIZE
20
- # for debugging, count the total number of requests
24
+ # for debugging, count the total number of requests
21
25
  controller_count = 0
26
+
22
27
  metrics.each do |meta,stats|
23
28
  if meta.metric_name =~ /\AController/
24
29
  controller_count += stats.call_count
25
30
  end
26
31
  end
27
- payload = Marshal.dump(:metrics => metrics, :slow_transactions => slow_transactions)
32
+
33
+ logger.debug("Metrics: #{metrics}")
34
+ logger.debug("SlowTrans: #{slow_transactions}")
35
+
36
+ payload = ScoutApm::Serializers::PayloadSerializer.serialize(metrics, slow_transactions)
28
37
  slow_transactions_kb = Marshal.dump(slow_transactions).size/1024 # just for performance debugging
29
- logger.debug "#{config.value('name')} Delivering total payload [#{payload.size/1024} KB] for #{controller_count} requests and slow transactions [#{slow_transactions_kb} KB] for #{slow_transactions.size} transactions of durations: #{slow_transactions.map(&:total_call_time).join(',')}."
30
- response = post( checkin_uri,
31
- payload,
32
- "Content-Type" => "application/octet-stream" )
38
+ logger.debug "#{config.value('name')} Delivering total payload [#{payload.size/1024} KB] for #{controller_count} requests and slow transactions [#{slow_transactions_kb} KB] for #{slow_transactions.size} transactions of durations: #{slow_transactions.map(&:total_call_time).join(',')}."
39
+
40
+ response = reporter.report(payload)
41
+
33
42
  if response and response.is_a?(Net::HTTPSuccess)
34
- directives = Marshal.load(response.body)
43
+ directives = ScoutApm::Serializers::DirectiveSerializer.deserialize(response.body)
44
+
35
45
  self.metric_lookup.merge!(directives[:metric_lookup])
36
46
  if directives[:reset]
37
47
  logger.info "Resetting metric_lookup."
@@ -39,16 +49,16 @@ module ScoutApm
39
49
  end
40
50
  logger.debug "Metric Cache Size: #{metric_lookup.size}"
41
51
  elsif response
42
- logger.warn "Error on checkin to #{checkin_uri.to_s}: #{response.inspect}"
52
+ logger.warn "Error on checkin to #{reporter.uri.to_s}: #{response.inspect}"
43
53
  end
44
54
  end
45
55
  rescue
46
- logger.warn "Error on checkin to #{checkin_uri.to_s}"
56
+ logger.warn "Error on checkin to #{reporter.uri.to_s}"
47
57
  logger.info $!.message
48
58
  logger.debug $!.backtrace
49
59
  end
50
60
 
51
- # Before reporting, lookup metric_id for each MetricMeta. This speeds up
61
+ # Before reporting, lookup metric_id for each MetricMeta. This speeds up
52
62
  # reporting on the server-side.
53
63
  def add_metric_ids(metrics)
54
64
  metrics.each do |meta,stats|
@@ -58,57 +68,18 @@ module ScoutApm
58
68
  end
59
69
  end
60
70
 
61
- def checkin_uri
62
- URI.parse("#{config.value('host')}/apps/checkin.scout?key=#{config.value('key')}&name=#{CGI.escape(config.value('name'))}")
63
- end
64
-
65
- def post(uri, body, headers = Hash.new)
66
- response = nil
67
- request(uri) do |connection|
68
- post = Net::HTTP::Post.new( uri.path +
69
- (uri.query ? ('?' + uri.query) : ''),
70
- http_headers.merge(headers) )
71
- post.body = body
72
- response=connection.request(post)
73
- end
74
- response
75
- end
76
-
77
- def request(uri, &connector)
78
- response = nil
79
- response = http(uri).start(&connector)
80
- logger.debug "got response: #{response.inspect}"
81
- case response
82
- when Net::HTTPSuccess, Net::HTTPNotModified
83
- logger.debug "/checkin OK"
84
- when Net::HTTPBadRequest
85
- logger.warn "/checkin FAILED: The Account Key [#{config.value('key')}] is invalid."
86
- else
87
- logger.debug "/checkin FAILED: #{response.inspect}"
88
- end
89
- rescue Exception
90
- logger.debug "Exception sending request to server: #{$!.message}\n#{$!.backtrace}"
91
- ensure
92
- response
93
- end
94
-
95
- # Headers passed up with all API requests.
96
- def http_headers
97
- @http_headers ||= { "Agent-Hostname" => environment.hostname }
98
- end
99
-
100
- # Take care of the http proxy, if specified in config.
101
- # Given a blank string, the proxy_uri URI instance's host/port/user/pass will be nil.
102
- # Net::HTTP::Proxy returns a regular Net::HTTP class if the first argument (host) is nil.
103
- def http(url)
104
- proxy_uri = URI.parse(config.value('proxy').to_s)
105
- http = Net::HTTP::Proxy(proxy_uri.host,proxy_uri.port,proxy_uri.user,proxy_uri.password).new(url.host, url.port)
106
- if url.is_a?(URI::HTTPS)
107
- http.use_ssl = true
108
- http.ca_file = CA_FILE
109
- http.verify_mode = VERIFY_MODE
71
+ # Called from #process_metrics, which is run via the background worker.
72
+ def run_samplers
73
+ @samplers.each do |sampler|
74
+ begin
75
+ result = sampler.run
76
+ store.track!(sampler.metric_name, result, scope: nil) if result
77
+ rescue => e
78
+ logger.info "Error reading #{sampler.human_name}"
79
+ logger.debug e.message
80
+ logger.debug e.backtrace.join("\n")
81
+ end
110
82
  end
111
- http
112
83
  end
113
84
  end # module Reporting
114
85
  include Reporting