scout_apm 0.1.6 → 0.1.7

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.
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