appoptics_apm 4.4.0 → 4.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/examples/carrying_context.rb +1 -1
  4. data/lib/appoptics_apm/api/logging.rb +1 -1
  5. data/lib/appoptics_apm/api/profiling.rb +2 -2
  6. data/lib/appoptics_apm/api/tracing.rb +0 -1
  7. data/lib/appoptics_apm/base.rb +1 -1
  8. data/lib/appoptics_apm/config.rb +2 -2
  9. data/lib/appoptics_apm/frameworks/grape.rb +13 -12
  10. data/lib/appoptics_apm/frameworks/padrino.rb +67 -14
  11. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +3 -3
  12. data/lib/appoptics_apm/frameworks/rails/inst/action_controller3.rb +4 -7
  13. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +1 -1
  14. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +1 -1
  15. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +2 -2
  16. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +14 -14
  17. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +9 -9
  18. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +8 -8
  19. data/lib/appoptics_apm/frameworks/sinatra.rb +62 -11
  20. data/lib/appoptics_apm/inst/bunny-client.rb +12 -10
  21. data/lib/appoptics_apm/inst/bunny-consumer.rb +54 -56
  22. data/lib/appoptics_apm/inst/curb.rb +11 -11
  23. data/lib/appoptics_apm/inst/dalli.rb +3 -4
  24. data/lib/appoptics_apm/inst/delayed_job.rb +7 -7
  25. data/lib/appoptics_apm/inst/em-http-request.rb +6 -9
  26. data/lib/appoptics_apm/inst/excon.rb +10 -9
  27. data/lib/appoptics_apm/inst/faraday.rb +6 -8
  28. data/lib/appoptics_apm/inst/grpc_client.rb +8 -9
  29. data/lib/appoptics_apm/inst/httpclient.rb +10 -10
  30. data/lib/appoptics_apm/inst/memcached.rb +9 -13
  31. data/lib/appoptics_apm/inst/mongo.rb +14 -10
  32. data/lib/appoptics_apm/inst/mongo2.rb +5 -5
  33. data/lib/appoptics_apm/inst/moped.rb +10 -10
  34. data/lib/appoptics_apm/inst/rack.rb +11 -14
  35. data/lib/appoptics_apm/inst/redis.rb +10 -10
  36. data/lib/appoptics_apm/inst/resque.rb +9 -9
  37. data/lib/appoptics_apm/inst/rest-client.rb +4 -6
  38. data/lib/appoptics_apm/inst/sequel.rb +10 -10
  39. data/lib/appoptics_apm/inst/sidekiq-client.rb +5 -5
  40. data/lib/appoptics_apm/inst/sidekiq-worker.rb +5 -5
  41. data/lib/appoptics_apm/inst/twitter-cassandra.rb +3 -3
  42. data/lib/appoptics_apm/inst/typhoeus.rb +8 -9
  43. data/lib/appoptics_apm/legacy_method_profiling.rb +1 -1
  44. data/lib/appoptics_apm/ruby.rb +1 -1
  45. data/lib/appoptics_apm/sdk/custom_metrics.rb +1 -1
  46. data/lib/appoptics_apm/sdk/tracing.rb +3 -0
  47. data/lib/appoptics_apm/support.rb +2 -2
  48. data/lib/appoptics_apm/thread_local.rb +1 -1
  49. data/lib/appoptics_apm/util.rb +4 -4
  50. data/lib/appoptics_apm/version.rb +1 -1
  51. data/lib/oboe/backward_compatibility.rb +3 -3
  52. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +11 -4
  53. metadata +2 -4
  54. data/lib/appoptics_apm/frameworks/padrino/templates.rb +0 -58
  55. data/lib/appoptics_apm/frameworks/sinatra/templates.rb +0 -56
@@ -50,17 +50,19 @@ if AppOpticsAPM.loaded
50
50
  report_kvs = {}
51
51
 
52
52
  begin
53
- report_kvs[:'HTTP-Host'] = req.host
53
+ report_kvs[:'HTTP-Host'] = req.host
54
54
  report_kvs[:Port] = req.port
55
55
  report_kvs[:Proto] = req.scheme
56
- report_kvs[:Method] = req.request_method
56
+ report_kvs[:Method] = req.request_method
57
57
  report_kvs[:AJAX] = true if req.xhr?
58
58
  report_kvs[:ClientIP] = req.ip
59
59
 
60
60
  if AppOpticsAPM::Config[:rack][:log_args]
61
- report_kvs[:'Query-String'] = ::CGI.unescape(req.query_string) unless req.query_string.empty?
61
+ report_kvs[:'Query-String'] = ::CGI.unescape(req.query_string) unless req.query_string.empty?
62
62
  end
63
63
 
64
+ report_kvs[:Backtrace] = AppOpticsAPM::API.backtrace if AppOpticsAPM::Config[:rack][:collect_backtraces]
65
+
64
66
  # Report any request queue'ing headers. Report as 'Request-Start' or the summed Queue-Time
65
67
  report_kvs[:'Request-Start'] = env['HTTP_X_REQUEST_START'] if env.key?('HTTP_X_REQUEST_START')
66
68
  report_kvs[:'Request-Start'] = env['HTTP_X_QUEUE_START'] if env.key?('HTTP_X_QUEUE_START')
@@ -71,7 +73,7 @@ if AppOpticsAPM.loaded
71
73
  report_kvs[:'Forwarded-Proto'] = env['HTTP_X_FORWARDED_PROTO'] if env.key?('HTTP_X_FORWARDED_PROTO')
72
74
  report_kvs[:'Forwarded-Port'] = env['HTTP_X_FORWARDED_PORT'] if env.key?('HTTP_X_FORWARDED_PORT')
73
75
 
74
- report_kvs[:'Ruby.AppOptics.Version'] = ::AppOpticsAPM::Version::STRING
76
+ report_kvs[:'Ruby.AppOptics.Version'] = AppOpticsAPM::Version::STRING
75
77
  report_kvs[:ProcessID] = Process.pid
76
78
  report_kvs[:ThreadID] = Thread.current.to_s[/0x\w*/]
77
79
  rescue StandardError => e
@@ -111,7 +113,7 @@ if AppOpticsAPM.loaded
111
113
  req_url = req.url # saving it here because rails3.2 overrides it when there is a 500 error
112
114
  status = 500 # initialize with 500
113
115
 
114
- report_kvs = {}
116
+ report_kvs = collect(req, env)
115
117
  report_kvs[:URL] = AppOpticsAPM::Config[:rack][:log_args] ? ::CGI.unescape(req.fullpath) : ::CGI.unescape(req.path)
116
118
 
117
119
  # Check for and validate X-Trace request header to pick up tracing context
@@ -125,13 +127,7 @@ if AppOpticsAPM.loaded
125
127
  # AppOpticsAPM.has_xtrace_header = xtrace
126
128
  # AppOpticsAPM.is_continued_trace = AppOpticsAPM.has_incoming_context || AppOpticsAPM.has_xtrace_header
127
129
 
128
- AppOpticsAPM::API.log_start(:rack, xtrace, report_kvs) unless ::AppOpticsAPM::Util.static_asset?(env['PATH_INFO'])
129
-
130
- # We log an info event with the HTTP KVs found in AppOpticsAPM::Rack.collect
131
- # This is done here so in the case of stacks that try/catch/abort
132
- # (looking at you Grape) we're sure the KVs get reported now as
133
- # this code may not be returned to later.
134
- AppOpticsAPM::API.log_info(:rack, collect(req, env))
130
+ AppOpticsAPM::API.log_start(:rack, xtrace, report_kvs) unless AppOpticsAPM::Util.static_asset?(env['PATH_INFO'])
135
131
 
136
132
  status, headers, response = @app.call(env)
137
133
  confirmed_transaction_name = send_metrics(env, req, req_url, start, status)
@@ -157,12 +153,13 @@ if AppOpticsAPM.loaded
157
153
 
158
154
 
159
155
  def send_metrics(env, req, req_url, start, status)
160
- return if ::AppOpticsAPM::Util.static_asset?(env['PATH_INFO'])
156
+ return if AppOpticsAPM::Util.static_asset?(env['PATH_INFO'])
161
157
 
162
158
  status = status.to_i
163
159
  error = status.between?(500,599) ? 1 : 0
164
160
  duration =(1000 * 1000 * (Time.now - start)).round(0)
165
- AppOpticsAPM::Span.createHttpSpan(transaction_name(env), req_url, domain(req), duration, status, req.request_method, error) || ''
161
+ method = req.request_method
162
+ AppOpticsAPM::Span.createHttpSpan(transaction_name(env), req_url, domain(req), duration, status, method, error) || ''
166
163
  end
167
164
 
168
165
  def domain(req)
@@ -59,8 +59,8 @@ module AppOpticsAPM
59
59
  def self.included(klass)
60
60
  # We wrap two of the Redis methods to instrument
61
61
  # operations
62
- ::AppOpticsAPM::Util.method_alias(klass, :call, ::Redis::Client)
63
- ::AppOpticsAPM::Util.method_alias(klass, :call_pipeline, ::Redis::Client)
62
+ AppOpticsAPM::Util.method_alias(klass, :call, ::Redis::Client)
63
+ AppOpticsAPM::Util.method_alias(klass, :call_pipeline, ::Redis::Client)
64
64
  end
65
65
 
66
66
  # Given any Redis operation command array, this method
@@ -218,17 +218,17 @@ module AppOpticsAPM
218
218
  #
219
219
  def call_with_appoptics(command, &block)
220
220
  if AppOpticsAPM.tracing?
221
- ::AppOpticsAPM::API.log_entry(:redis, {})
221
+ AppOpticsAPM::API.log_entry(:redis, {})
222
222
 
223
223
  begin
224
224
  r = call_without_appoptics(command, &block)
225
225
  report_kvs = extract_trace_details(command, r)
226
226
  r
227
227
  rescue StandardError => e
228
- ::AppOpticsAPM::API.log_exception(:redis, e)
228
+ AppOpticsAPM::API.log_exception(:redis, e)
229
229
  raise
230
230
  ensure
231
- ::AppOpticsAPM::API.log_exit(:redis, report_kvs)
231
+ AppOpticsAPM::API.log_exit(:redis, report_kvs)
232
232
  end
233
233
 
234
234
  else
@@ -246,17 +246,17 @@ module AppOpticsAPM
246
246
  # back on exit (a limitation of the AppOpticsAPM::API.trace
247
247
  # block method) This removes the need for an info
248
248
  # event to send additonal KVs
249
- ::AppOpticsAPM::API.log_entry(:redis, {})
249
+ AppOpticsAPM::API.log_entry(:redis, {})
250
250
 
251
251
  report_kvs = extract_pipeline_details(pipeline)
252
252
 
253
253
  begin
254
254
  call_pipeline_without_appoptics(pipeline)
255
255
  rescue StandardError => e
256
- ::AppOpticsAPM::API.log_exception(:redis, e)
256
+ AppOpticsAPM::API.log_exception(:redis, e)
257
257
  raise
258
258
  ensure
259
- ::AppOpticsAPM::API.log_exit(:redis, report_kvs)
259
+ AppOpticsAPM::API.log_exit(:redis, report_kvs)
260
260
  end
261
261
  else
262
262
  call_pipeline_without_appoptics(pipeline)
@@ -268,8 +268,8 @@ module AppOpticsAPM
268
268
  end
269
269
 
270
270
  if AppOpticsAPM::Config[:redis][:enabled]
271
- if defined?(::Redis) && Gem::Version.new(::Redis::VERSION) >= Gem::Version.new('3.0.0')
271
+ if defined?(Redis) && Gem::Version.new(Redis::VERSION) >= Gem::Version.new('3.0.0')
272
272
  AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting redis' if AppOpticsAPM::Config[:verbose]
273
- ::AppOpticsAPM::Util.send_include(::Redis::Client, ::AppOpticsAPM::Inst::Redis::Client)
273
+ AppOpticsAPM::Util.send_include(Redis::Client, AppOpticsAPM::Inst::Redis::Client)
274
274
  end
275
275
  end
@@ -9,9 +9,9 @@ module AppOpticsAPM
9
9
  module ResqueClient
10
10
  def self.included(klass)
11
11
  klass.send :extend, ::Resque
12
- ::AppOpticsAPM::Util.method_alias(klass, :enqueue, ::Resque)
13
- ::AppOpticsAPM::Util.method_alias(klass, :enqueue_to, ::Resque)
14
- ::AppOpticsAPM::Util.method_alias(klass, :dequeue, ::Resque)
12
+ AppOpticsAPM::Util.method_alias(klass, :enqueue, ::Resque)
13
+ AppOpticsAPM::Util.method_alias(klass, :enqueue_to, ::Resque)
14
+ AppOpticsAPM::Util.method_alias(klass, :dequeue, ::Resque)
15
15
  end
16
16
 
17
17
  def extract_trace_details(op, klass, args)
@@ -81,7 +81,7 @@ module AppOpticsAPM
81
81
 
82
82
  module ResqueWorker
83
83
  def self.included(klass)
84
- ::AppOpticsAPM::Util.method_alias(klass, :perform, ::Resque::Worker)
84
+ AppOpticsAPM::Util.method_alias(klass, :perform, ::Resque::Worker)
85
85
  end
86
86
 
87
87
  def perform_with_appoptics(job)
@@ -125,7 +125,7 @@ module AppOpticsAPM
125
125
 
126
126
  module ResqueJob
127
127
  def self.included(klass)
128
- ::AppOpticsAPM::Util.method_alias(klass, :fail, ::Resque::Job)
128
+ AppOpticsAPM::Util.method_alias(klass, :fail, ::Resque::Job)
129
129
  end
130
130
 
131
131
  def fail_with_appoptics(exception)
@@ -138,13 +138,13 @@ module AppOpticsAPM
138
138
  end
139
139
  end
140
140
 
141
- if defined?(::Resque)
141
+ if defined?(Resque)
142
142
  AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting resque' if AppOpticsAPM::Config[:verbose]
143
143
 
144
- ::AppOpticsAPM::Util.send_include(::Resque, ::AppOpticsAPM::Inst::ResqueClient) if AppOpticsAPM::Config[:resqueclient][:enabled]
145
- ::AppOpticsAPM::Util.send_include(::Resque::Worker, ::AppOpticsAPM::Inst::ResqueWorker) if AppOpticsAPM::Config[:resqueworker][:enabled]
144
+ AppOpticsAPM::Util.send_include(Resque, AppOpticsAPM::Inst::ResqueClient) if AppOpticsAPM::Config[:resqueclient][:enabled]
145
+ AppOpticsAPM::Util.send_include(Resque::Worker, AppOpticsAPM::Inst::ResqueWorker) if AppOpticsAPM::Config[:resqueworker][:enabled]
146
146
  if AppOpticsAPM::Config[:resqueclient][:enabled] || AppOpticsAPM::Config[:resqueworker][:enabled]
147
- ::AppOpticsAPM::Util.send_include(::Resque::Job, ::AppOpticsAPM::Inst::ResqueJob)
147
+ AppOpticsAPM::Util.send_include(Resque::Job, AppOpticsAPM::Inst::ResqueJob)
148
148
  end
149
149
  end
150
150
 
@@ -5,7 +5,7 @@ module AppOpticsAPM
5
5
  module Inst
6
6
  module RestClientRequest
7
7
  def self.included(klass)
8
- ::AppOpticsAPM::Util.method_alias(klass, :execute, ::RestClient::Request)
8
+ AppOpticsAPM::Util.method_alias(klass, :execute, ::RestClient::Request)
9
9
  end
10
10
 
11
11
  ##
@@ -42,9 +42,7 @@ module AppOpticsAPM
42
42
  end
43
43
  end
44
44
 
45
- if AppOpticsAPM::Config[:rest_client][:enabled]
46
- if defined?(::RestClient)
47
- AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting rest-client' if AppOpticsAPM::Config[:verbose]
48
- ::AppOpticsAPM::Util.send_include(::RestClient::Request, ::AppOpticsAPM::Inst::RestClientRequest)
49
- end
45
+ if defined?(RestClient) && AppOpticsAPM::Config[:rest_client][:enabled]
46
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting rest-client' if AppOpticsAPM::Config[:verbose]
47
+ AppOpticsAPM::Util.send_include(RestClient::Request, AppOpticsAPM::Inst::RestClientRequest)
50
48
  end
@@ -86,10 +86,10 @@ module AppOpticsAPM
86
86
  include AppOpticsAPM::Inst::Sequel
87
87
 
88
88
  def self.included(klass)
89
- ::AppOpticsAPM::Util.method_alias(klass, :run, ::Sequel::Database)
90
- ::AppOpticsAPM::Util.method_alias(klass, :execute_ddl, ::Sequel::Database)
91
- ::AppOpticsAPM::Util.method_alias(klass, :execute_dui, ::Sequel::Database)
92
- ::AppOpticsAPM::Util.method_alias(klass, :execute_insert, ::Sequel::Database)
89
+ AppOpticsAPM::Util.method_alias(klass, :run, ::Sequel::Database)
90
+ AppOpticsAPM::Util.method_alias(klass, :execute_ddl, ::Sequel::Database)
91
+ AppOpticsAPM::Util.method_alias(klass, :execute_dui, ::Sequel::Database)
92
+ AppOpticsAPM::Util.method_alias(klass, :execute_insert, ::Sequel::Database)
93
93
  end
94
94
 
95
95
  def run_with_appoptics(sql, opts = ::Sequel::OPTS)
@@ -135,10 +135,10 @@ module AppOpticsAPM
135
135
  include AppOpticsAPM::Inst::Sequel
136
136
 
137
137
  def self.included(klass)
138
- ::AppOpticsAPM::Util.method_alias(klass, :execute, ::Sequel::Dataset)
139
- ::AppOpticsAPM::Util.method_alias(klass, :execute_ddl, ::Sequel::Dataset)
140
- ::AppOpticsAPM::Util.method_alias(klass, :execute_dui, ::Sequel::Dataset)
141
- ::AppOpticsAPM::Util.method_alias(klass, :execute_insert, ::Sequel::Dataset)
138
+ AppOpticsAPM::Util.method_alias(klass, :execute, ::Sequel::Dataset)
139
+ AppOpticsAPM::Util.method_alias(klass, :execute_ddl, ::Sequel::Dataset)
140
+ AppOpticsAPM::Util.method_alias(klass, :execute_dui, ::Sequel::Dataset)
141
+ AppOpticsAPM::Util.method_alias(klass, :execute_insert, ::Sequel::Dataset)
142
142
  end
143
143
 
144
144
  def execute_with_appoptics(sql, opts = ::Sequel::OPTS, &block)
@@ -172,7 +172,7 @@ if AppOpticsAPM::Config[:sequel][:enabled]
172
172
 
173
173
  if defined?(::Sequel)
174
174
  AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting sequel' if AppOpticsAPM::Config[:verbose]
175
- ::AppOpticsAPM::Util.send_include(::Sequel::Database, ::AppOpticsAPM::Inst::SequelDatabase)
176
- ::AppOpticsAPM::Util.send_include(::Sequel::Dataset, ::AppOpticsAPM::Inst::SequelDataset)
175
+ AppOpticsAPM::Util.send_include(::Sequel::Database, AppOpticsAPM::Inst::SequelDatabase)
176
+ AppOpticsAPM::Util.send_include(::Sequel::Dataset, AppOpticsAPM::Inst::SequelDataset)
177
177
  end
178
178
  end
@@ -43,13 +43,13 @@ module AppOpticsAPM
43
43
  end
44
44
  end
45
45
 
46
- if defined?(::Sidekiq) && AppOpticsAPM::Config[:sidekiqclient][:enabled]
47
- ::AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting sidekiq client' if AppOpticsAPM::Config[:verbose]
46
+ if defined?(Sidekiq) && AppOpticsAPM::Config[:sidekiqclient][:enabled]
47
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting sidekiq client' if AppOpticsAPM::Config[:verbose]
48
48
 
49
- ::Sidekiq.configure_client do |config|
49
+ Sidekiq.configure_client do |config|
50
50
  config.client_middleware do |chain|
51
- ::AppOpticsAPM.logger.info '[appoptics_apm/loading] Adding Sidekiq client middleware' if AppOpticsAPM::Config[:verbose]
52
- chain.add ::AppOpticsAPM::SidekiqClient
51
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Adding Sidekiq client middleware' if AppOpticsAPM::Config[:verbose]
52
+ chain.add AppOpticsAPM::SidekiqClient
53
53
  end
54
54
  end
55
55
  end
@@ -53,13 +53,13 @@ module AppOpticsAPM
53
53
  end
54
54
  end
55
55
 
56
- if defined?(::Sidekiq) && AppOpticsAPM::Config[:sidekiqworker][:enabled]
57
- ::AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting sidekiq worker' if AppOpticsAPM::Config[:verbose]
56
+ if defined?(Sidekiq) && AppOpticsAPM::Config[:sidekiqworker][:enabled]
57
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting sidekiq worker' if AppOpticsAPM::Config[:verbose]
58
58
 
59
- ::Sidekiq.configure_server do |config|
59
+ Sidekiq.configure_server do |config|
60
60
  config.server_middleware do |chain|
61
- ::AppOpticsAPM.logger.info '[appoptics_apm/loading] Adding Sidekiq worker middleware' if AppOpticsAPM::Config[:verbose]
62
- chain.add ::AppOpticsAPM::SidekiqWorker
61
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Adding Sidekiq worker middleware' if AppOpticsAPM::Config[:verbose]
62
+ chain.add AppOpticsAPM::SidekiqWorker
63
63
  end
64
64
  end
65
65
  end
@@ -261,14 +261,14 @@ module AppOpticsAPM
261
261
  end
262
262
 
263
263
  # There are two main Cassandra clients for Ruby. This one from Twitter
264
- # and the other from datastax. This one defined ::Cassandra as a class
264
+ # and the other from datastax. This one defined Cassandra as a class
265
265
  # and datastax defines it as a module. We use this to detect
266
266
  # and differentiate between the client in use.
267
267
 
268
- if defined?(::Cassandra) && ::Cassandra.is_a?(Class) && AppOpticsAPM::Config[:cassandra][:enabled]
268
+ if defined?(Cassandra) && Cassandra.is_a?(Class) && AppOpticsAPM::Config[:cassandra][:enabled]
269
269
  AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting cassandra' if AppOpticsAPM::Config[:verbose]
270
270
 
271
- class ::Cassandra
271
+ class Cassandra
272
272
  include AppOpticsAPM::Inst::Cassandra
273
273
 
274
274
  [:insert, :remove, :count_columns, :get_columns, :multi_get_columns, :get,
@@ -7,7 +7,7 @@ module AppOpticsAPM
7
7
  module TyphoeusRequestOps
8
8
 
9
9
  def self.included(klass)
10
- ::AppOpticsAPM::Util.method_alias(klass, :run, ::Typhoeus::Request::Operations)
10
+ AppOpticsAPM::Util.method_alias(klass, :run, ::Typhoeus::Request::Operations)
11
11
  end
12
12
 
13
13
  def run_with_appoptics
@@ -28,7 +28,7 @@ module AppOpticsAPM
28
28
  kvs = {}
29
29
  kvs[:Spec] = 'rsc'
30
30
  kvs[:IsService] = 1
31
- kvs[:HTTPMethod] = ::AppOpticsAPM::Util.upcase(options[:method])
31
+ kvs[:HTTPMethod] = AppOpticsAPM::Util.upcase(options[:method])
32
32
 
33
33
  response = run_without_appoptics
34
34
 
@@ -64,7 +64,7 @@ module AppOpticsAPM
64
64
 
65
65
  module TyphoeusHydraRunnable
66
66
  def self.included(klass)
67
- ::AppOpticsAPM::Util.method_alias(klass, :run, ::Typhoeus::Hydra)
67
+ AppOpticsAPM::Util.method_alias(klass, :run, ::Typhoeus::Hydra)
68
68
  end
69
69
 
70
70
  def run_with_appoptics
@@ -82,6 +82,7 @@ module AppOpticsAPM
82
82
  kvs[:queued_requests] = queued_requests.count
83
83
  kvs[:max_concurrency] = max_concurrency
84
84
  kvs[:Async] = 1
85
+ kvs[:Backtrace] = AppOpticsAPM::API.backtrace if AppOpticsAPM::Config[:typhoeus][:collect_backtraces]
85
86
 
86
87
  # FIXME: Until we figure out a strategy to deal with libcurl internal
87
88
  # threading and Ethon's use of easy handles, here we just do a simple
@@ -100,10 +101,8 @@ module AppOpticsAPM
100
101
  end
101
102
  end
102
103
 
103
- if AppOpticsAPM::Config[:typhoeus][:enabled]
104
- if defined?(::Typhoeus)
105
- AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting typhoeus' if AppOpticsAPM::Config[:verbose]
106
- ::AppOpticsAPM::Util.send_include(::Typhoeus::Request::Operations, ::AppOpticsAPM::Inst::TyphoeusRequestOps)
107
- ::AppOpticsAPM::Util.send_include(::Typhoeus::Hydra, ::AppOpticsAPM::Inst::TyphoeusHydraRunnable)
108
- end
104
+ if defined?(Typhoeus) && AppOpticsAPM::Config[:typhoeus][:enabled]
105
+ AppOpticsAPM.logger.info '[appoptics_apm/loading] Instrumenting typhoeus' if AppOpticsAPM::Config[:verbose]
106
+ AppOpticsAPM::Util.send_include(Typhoeus::Request::Operations, AppOpticsAPM::Inst::TyphoeusRequestOps)
107
+ AppOpticsAPM::Util.send_include(Typhoeus::Hydra, AppOpticsAPM::Inst::TyphoeusHydraRunnable)
109
108
  end
@@ -51,7 +51,7 @@ module AppOpticsAPMMethodProfiling
51
51
  entry_kvs['File'] = '#{file}'
52
52
  entry_kvs['LineNumber'] = '#{line}'
53
53
  entry_kvs['Args'] = AppOpticsAPM::API.pps(*args) if #{store_args}
54
- entry_kvs.merge!(::AppOpticsAPM::API.get_class_name(self))
54
+ entry_kvs.merge!(AppOpticsAPM::API.get_class_name(self))
55
55
 
56
56
  AppOpticsAPM::API.log(nil, 'profile_entry', entry_kvs)
57
57
 
@@ -31,5 +31,5 @@ module AppOpticsAPM
31
31
  end
32
32
 
33
33
  if AppOpticsAPM.loaded && !AppOpticsAPM.framework?
34
- ::AppOpticsAPM::Ruby.load
34
+ AppOpticsAPM::Ruby.load
35
35
  end
@@ -56,7 +56,7 @@ module AppOpticsAPM
56
56
  # start = Time.now
57
57
  # yield # yield to where work is done
58
58
  # duration = Time.now - start
59
- # AppOpticsAPM::SDK.increment_metric(name, duration, 1, false, tags)
59
+ # AppOpticsAPM::SDK.summary_metric(name, duration, 1, false, tags)
60
60
  # end
61
61
  # end
62
62
  #
@@ -94,6 +94,7 @@ module AppOpticsAPM
94
94
  opts.delete('TransactionName')
95
95
 
96
96
  AppOpticsAPM::API.log_entry(span, opts, protect_op)
97
+ opts[:Backtrace] && opts.delete(:Backtrace) # to avoid sending backtrace twice (faster to check presence here)
97
98
  begin
98
99
  yield
99
100
  rescue Exception => e
@@ -182,6 +183,8 @@ module AppOpticsAPM
182
183
  AppOpticsAPM.transaction_name = opts.delete('TransactionName') || opts.delete(:TransactionName)
183
184
 
184
185
  AppOpticsAPM::API.log_start(span, xtrace, opts)
186
+ opts[:Backtrace] && opts.delete(:Backtrace) # to avoid sending backtrace twice (faster to check presence here)
187
+
185
188
  # AppOpticsAPM::Event.startTrace creates an Event without an Edge
186
189
  exit_evt = AppOpticsAPM::Event.startTrace(AppOpticsAPM::Context.get)
187
190
  result = begin
@@ -57,8 +57,8 @@ module AppOpticsAPM
57
57
  using_rails = defined?(::Rails)
58
58
  AppOpticsAPM.logger.warn "Using Rails?: #{yesno(using_rails)}"
59
59
  if using_rails
60
- AppOpticsAPM.logger.warn "AppOpticsAPM::Rails loaded?: #{yesno(defined?(::AppOpticsAPM::Rails))}"
61
- if defined?(::AppOpticsAPM::Rack)
60
+ AppOpticsAPM.logger.warn "AppOpticsAPM::Rails loaded?: #{yesno(defined?(AppOpticsAPM::Rails))}"
61
+ if defined?(AppOpticsAPM::Rack)
62
62
  AppOpticsAPM.logger.warn "AppOpticsAPM::Rack middleware loaded?: #{yesno(::Rails.configuration.middleware.include? AppOpticsAPM::Rack)}"
63
63
  end
64
64
  end
@@ -7,7 +7,7 @@ module AppOpticsAPM
7
7
  #
8
8
  # Example usage:
9
9
  # module AppOpticsAPMBase
10
- # extend ::AppOpticsAPM::ThreadLocal
10
+ # extend AppOpticsAPM::ThreadLocal
11
11
  # thread_local :layer_op
12
12
  # end
13
13
  module ThreadLocal
@@ -170,7 +170,7 @@ module AppOpticsAPM
170
170
  return sql unless AppOpticsAPM::Config[:sanitize_sql]
171
171
 
172
172
  regexp = Regexp.new(AppOpticsAPM::Config[:sanitize_sql_regexp], AppOpticsAPM::Config[:sanitize_sql_opts])
173
- sql.gsub(regexp, '?')
173
+ sql.gsub(/\\\'/,'').gsub(regexp, '?')
174
174
  end
175
175
 
176
176
  ##
@@ -265,12 +265,12 @@ module AppOpticsAPM
265
265
  platform_info['Force'] = true
266
266
  platform_info['Ruby.Platform.Version'] = RUBY_PLATFORM
267
267
  platform_info['Ruby.Version'] = RUBY_VERSION
268
- platform_info['Ruby.AppOptics.Version'] = ::AppOpticsAPM::Version::STRING
268
+ platform_info['Ruby.AppOptics.Version'] = AppOpticsAPM::Version::STRING
269
269
 
270
270
  clib_version_file = File.join(Gem::Specification.find_by_name('appoptics_apm').gem_dir, 'ext', 'oboe_metal', 'src', 'VERSION')
271
271
  platform_info['Ruby.clib.Version'] = File.read(clib_version_file).chomp
272
- platform_info['RubyHeroku.AppOpticsAPM.Version'] = ::AppOpticsAPMHeroku::Version::STRING if defined?(::AppOpticsAPMHeroku)
273
- platform_info['Ruby.TraceMode.Version'] = ::AppOpticsAPM::Config[:tracing_mode]
272
+ platform_info['RubyHeroku.AppOpticsAPM.Version'] = AppOpticsAPMHeroku::Version::STRING if defined?(AppOpticsAPMHeroku)
273
+ platform_info['Ruby.TraceMode.Version'] = AppOpticsAPM::Config[:tracing_mode]
274
274
 
275
275
  # Collect up the loaded gems
276
276
  if defined?(Gem) && Gem.respond_to?(:loaded_specs)
@@ -8,7 +8,7 @@ module AppOpticsAPM
8
8
  module Version
9
9
  MAJOR = 4
10
10
  MINOR = 4
11
- PATCH = 0
11
+ PATCH = 1
12
12
 
13
13
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
14
14
  end