traceview 3.3.3-java → 3.4.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +18 -18
  3. data/CHANGELOG.md +13 -0
  4. data/README.md +3 -1
  5. data/Rakefile +18 -9
  6. data/gemfiles/delayed_job.gemfile +38 -0
  7. data/gemfiles/frameworks.gemfile +1 -2
  8. data/gemfiles/libraries.gemfile +1 -2
  9. data/gemfiles/rails23.gemfile +1 -2
  10. data/gemfiles/rails30.gemfile +4 -2
  11. data/gemfiles/rails31.gemfile +4 -2
  12. data/gemfiles/rails32.gemfile +4 -2
  13. data/gemfiles/rails40.gemfile +4 -2
  14. data/gemfiles/rails41.gemfile +4 -2
  15. data/gemfiles/rails42.gemfile +4 -2
  16. data/lib/traceview/api/layerinit.rb +3 -5
  17. data/lib/traceview/api/logging.rb +63 -50
  18. data/lib/traceview/api/memcache.rb +10 -9
  19. data/lib/traceview/api/profiling.rb +6 -7
  20. data/lib/traceview/api/util.rb +1 -1
  21. data/lib/traceview/base.rb +21 -7
  22. data/lib/traceview/config.rb +8 -4
  23. data/lib/traceview/frameworks/padrino.rb +2 -2
  24. data/lib/traceview/frameworks/rails/inst/action_controller.rb +3 -3
  25. data/lib/traceview/frameworks/rails/inst/action_view.rb +4 -2
  26. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +4 -2
  27. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +4 -2
  28. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +3 -3
  29. data/lib/traceview/frameworks/rails.rb +26 -32
  30. data/lib/traceview/frameworks/sinatra/templates.rb +1 -1
  31. data/lib/traceview/frameworks/sinatra.rb +1 -1
  32. data/lib/traceview/inst/dalli.rb +4 -5
  33. data/lib/traceview/inst/delayed_job.rb +92 -0
  34. data/lib/traceview/inst/em-http-request.rb +3 -0
  35. data/lib/traceview/inst/excon.rb +3 -3
  36. data/lib/traceview/inst/faraday.rb +4 -1
  37. data/lib/traceview/inst/mongo.rb +10 -5
  38. data/lib/traceview/inst/moped.rb +4 -4
  39. data/lib/traceview/inst/redis.rb +5 -7
  40. data/lib/traceview/inst/resque.rb +3 -3
  41. data/lib/traceview/inst/rest-client.rb +2 -2
  42. data/lib/traceview/inst/sidekiq-client.rb +3 -0
  43. data/lib/traceview/inst/sidekiq-worker.rb +3 -0
  44. data/lib/traceview/inst/twitter-cassandra.rb +8 -4
  45. data/lib/traceview/test.rb +30 -1
  46. data/lib/traceview/util.rb +7 -0
  47. data/lib/traceview/version.rb +2 -2
  48. data/test/frameworks/rails3x_test.rb +12 -2
  49. data/test/frameworks/rails4x_test.rb +12 -2
  50. data/test/instrumentation/curb_test.rb +2 -2
  51. data/test/instrumentation/dalli_test.rb +121 -118
  52. data/test/instrumentation/httpclient_test.rb +0 -1
  53. data/test/jobs/delayed_job/db_worker_job.rb +29 -0
  54. data/test/jobs/delayed_job/error_worker_job.rb +10 -0
  55. data/test/jobs/delayed_job/remote_call_worker_job.rb +20 -0
  56. data/test/minitest_helper.rb +8 -3
  57. data/test/models/widget.rb +19 -0
  58. data/test/queues/delayed_job-client_test.rb +95 -0
  59. data/test/queues/delayed_job-worker_test.rb +91 -0
  60. data/test/servers/delayed_job.rb +102 -0
  61. data/test/servers/rails3x_8140.rb +17 -1
  62. data/test/servers/rails4x_8140.rb +18 -1
  63. data/test/support/auto_tracing.rb +40 -0
  64. data/test/support/config_test.rb +5 -1
  65. data/traceview.gemspec +1 -0
  66. metadata +34 -6
  67. data/test/instrumentation/delayed_job-client_test.rb +0 -128
  68. data/test/instrumentation/delayed_job-worker_test.rb +0 -177
@@ -106,7 +106,7 @@ module TraceView
106
106
  # Class
107
107
  kv['Class'] = klass.to_s
108
108
 
109
- elsif (!klass.is_a?(Class) && !klass.is_a?(Module))
109
+ elsif !klass.is_a?(Class) && !klass.is_a?(Module)
110
110
  # Class instance
111
111
  kv['Class'] = klass.class.to_s
112
112
 
@@ -75,7 +75,7 @@ module TraceViewBase
75
75
 
76
76
  # This gives us pretty accessors with questions marks at the end
77
77
  # e.g. is_continued_trace --> is_continued_trace?
78
- TraceView.methods.select{ |m| m =~ /^is_|^has_/ }.each do |c|
78
+ TraceView.methods.select { |m| m =~ /^is_|^has_/ }.each do |c|
79
79
  unless c =~ /\?$|=$/
80
80
  # TraceView.logger.debug "aliasing #{c}? to #{c}"
81
81
  alias_method "#{c}?", c
@@ -111,7 +111,7 @@ module TraceViewBase
111
111
  # operation tracing or one instrumented operation calling another.
112
112
  #
113
113
  def tracing_layer?(layer)
114
- return TraceView.layer == layer
114
+ TraceView.layer == layer
115
115
  end
116
116
 
117
117
  ##
@@ -131,6 +131,20 @@ module TraceViewBase
131
131
  end
132
132
  end
133
133
 
134
+ ##
135
+ # entry_layer?
136
+ #
137
+ # Determines if the passed layer is an entry only
138
+ # layer where we would want to use smart tracing.
139
+ #
140
+ # Entry only layers are layers that _only_ start traces
141
+ # and doesn't directly receive incoming context such as
142
+ # DelayedJob or Sidekiq workers.
143
+ #
144
+ def entry_layer?(layer)
145
+ %w(delayed_job-worker).include?(layer.to_s)
146
+ end
147
+
134
148
  ##
135
149
  # Returns true if the tracing_mode is set to always.
136
150
  # False otherwise
@@ -160,7 +174,7 @@ module TraceViewBase
160
174
  # False otherwise
161
175
  #
162
176
  def through?
163
- TraceView::Config[:tracing_mode] == 'through'
177
+ TraceView::Config[:tracing_mode].to_s == 'through'
164
178
  end
165
179
 
166
180
  ##
@@ -186,7 +200,7 @@ module TraceViewBase
186
200
  #
187
201
  def forking_webserver?
188
202
  if (defined?(::Unicorn) && ($PROGRAM_NAME =~ /unicorn/i)) ||
189
- (defined?(::Puma) && ($PROGRAM_NAME =~ /puma/i))
203
+ (defined?(::Puma) && ($PROGRAM_NAME =~ /puma/i))
190
204
  true
191
205
  else
192
206
  false
@@ -199,7 +213,7 @@ module TraceViewBase
199
213
  def pry!
200
214
  # Only valid for development or test environments
201
215
  env = ENV['RACK_ENV'] || ENV['RAILS_ENV']
202
- return unless [ "development", "test" ].include? env
216
+ return unless %w(development, test).include? env
203
217
 
204
218
  if RUBY_VERSION > '1.8.7'
205
219
  require 'pry-byebug'
@@ -210,7 +224,7 @@ module TraceViewBase
210
224
  Pry.commands.alias_command 'n', 'next'
211
225
  Pry.commands.alias_command 'f', 'finish'
212
226
 
213
- Pry::Commands.command /^$/, "repeat last command" do
227
+ Pry::Commands.command /^$/, 'repeat last command' do
214
228
  _pry_.run_command Pry.history.to_a.last
215
229
  end
216
230
  end
@@ -226,7 +240,7 @@ module TraceViewBase
226
240
  # or not
227
241
  #
228
242
  def framework?
229
- defined?(::Rails) or defined?(::Sinatra) or defined?(::Padrino) or defined?(::Grape)
243
+ defined?(::Rails) && defined?(::Sinatra) && defined?(::Padrino) && defined?(::Grape)
230
244
  end
231
245
 
232
246
  ##
@@ -12,10 +12,12 @@ module TraceView
12
12
  @@config = {}
13
13
 
14
14
  @@instrumentation = [:action_controller, :action_view, :active_record,
15
- :cassandra, :curb, :dalli, :em_http_request, :excon, :faraday,
16
- :grape, :httpclient, :nethttp, :memcached, :memcache, :mongo,
17
- :moped, :rack, :redis, :resqueclient, :resqueworker,
18
- :rest_client, :sequel, :sidekiqclient, :sidekiqworker, :typhoeus]
15
+ :cassandra, :curb, :dalli, :delayed_jobclient,
16
+ :delayed_jobworker, :em_http_request, :excon,
17
+ :faraday, :grape, :httpclient, :nethttp, :memcached,
18
+ :memcache, :mongo, :moped, :rack, :redis, :resqueclient,
19
+ :resqueworker, :rest_client, :sequel, :sidekiqclient,
20
+ :sidekiqworker, :typhoeus]
19
21
 
20
22
  # Subgrouping of instrumentation
21
23
  @@http_clients = [:curb, :excon, :em_http_request, :faraday, :httpclient, :nethttp, :rest_client, :typhoeus]
@@ -46,6 +48,8 @@ module TraceView
46
48
  TraceView::Config[:cassandra][:collect_backtraces] = true
47
49
  TraceView::Config[:curb][:collect_backtraces] = true
48
50
  TraceView::Config[:dalli][:collect_backtraces] = false
51
+ TraceView::Config[:delayed_jobclient][:collect_backtraces] = false
52
+ TraceView::Config[:delayed_jobworker][:collect_backtraces] = false
49
53
  TraceView::Config[:em_http_request][:collect_backtraces] = false
50
54
  TraceView::Config[:excon][:collect_backtraces] = true
51
55
  TraceView::Config[:faraday][:collect_backtraces] = false
@@ -22,7 +22,7 @@ module TraceView
22
22
  r = dispatch_without_traceview
23
23
 
24
24
  # Report Controller/Action as best possible
25
- if request.controller and not request.controller.empty?
25
+ if request.controller && !request.controller.empty?
26
26
  report_kvs[:Controller] = request.controller
27
27
  else
28
28
  report_kvs[:Controller] = self.class
@@ -44,7 +44,7 @@ end
44
44
  if defined?(::Padrino)
45
45
  # This instrumentation is a superset of the Sinatra instrumentation similar
46
46
  # to how Padrino is a superset of Sinatra itself.
47
- ::TraceView.logger.info "[traceview/loading] Instrumenting Padrino" if TraceView::Config[:verbose]
47
+ ::TraceView.logger.info '[traceview/loading] Instrumenting Padrino' if TraceView::Config[:verbose]
48
48
 
49
49
  require 'traceview/frameworks/padrino/templates'
50
50
 
@@ -19,12 +19,12 @@ module TraceView
19
19
  def has_handler?(exception)
20
20
  # Don't log exceptions if they have a rescue handler set
21
21
  has_handler = false
22
- rescue_handlers.detect { | klass_name, handler |
22
+ rescue_handlers.detect do |klass_name, _handler|
23
23
  # Rescue handlers can be specified as strings or constant names
24
24
  klass = self.class.const_get(klass_name) rescue nil
25
25
  klass ||= klass_name.constantize rescue nil
26
26
  has_handler = exception.is_a?(klass) if klass
27
- }
27
+ end
28
28
  has_handler
29
29
  rescue => e
30
30
  TraceView.logger.debug "[traceview/debug] Error searching Rails handlers: #{e.message}"
@@ -101,7 +101,7 @@ module TraceView
101
101
  def process_action_with_traceview(*args)
102
102
  report_kvs = {
103
103
  :Controller => self.class.name,
104
- :Action => self.action_name,
104
+ :Action => action_name,
105
105
  }
106
106
  TraceView::API.log(nil, 'info', report_kvs)
107
107
 
@@ -23,7 +23,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
23
23
  entry_kvs[:Module] = :ActionView
24
24
  entry_kvs[:File] = __FILE__
25
25
  entry_kvs[:LineNumber] = __LINE__
26
- rescue
26
+ rescue => e
27
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
27
28
  end
28
29
 
29
30
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -41,7 +42,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
41
42
  entry_kvs[:Module] = :ActionView
42
43
  entry_kvs[:File] = __FILE__
43
44
  entry_kvs[:LineNumber] = __LINE__
44
- rescue
45
+ rescue => e
46
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
45
47
  end
46
48
 
47
49
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -19,7 +19,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
19
19
  entry_kvs[:Module] = :ActionView
20
20
  entry_kvs[:File] = __FILE__
21
21
  entry_kvs[:LineNumber] = __LINE__
22
- rescue
22
+ rescue => e
23
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
23
24
  end
24
25
 
25
26
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -40,7 +41,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
40
41
  entry_kvs[:Module] = :ActionView
41
42
  entry_kvs[:File] = __FILE__
42
43
  entry_kvs[:LineNumber] = __LINE__
43
- rescue
44
+ rescue => e
45
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
44
46
  end
45
47
 
46
48
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -16,7 +16,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
16
16
  entry_kvs[:Module] = 'ActionView::Partials'
17
17
  entry_kvs[:File] = __FILE__
18
18
  entry_kvs[:LineNumber] = __LINE__
19
- rescue
19
+ rescue => e
20
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
20
21
  end
21
22
 
22
23
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -34,7 +35,8 @@ if defined?(ActionView::Base) && TraceView::Config[:action_view][:enabled]
34
35
  entry_kvs[:Module] = 'ActionView::Partials'
35
36
  entry_kvs[:File] = __FILE__
36
37
  entry_kvs[:LineNumber] = __LINE__
37
- rescue
38
+ rescue => e
39
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
38
40
  end
39
41
 
40
42
  TraceView::API.profile(name, entry_kvs, TraceView::Config[:action_view][:collect_backtraces]) do
@@ -28,9 +28,9 @@ module TraceView
28
28
  config = ::Rails.application.config.database_configuration[::Rails.env]
29
29
  end
30
30
 
31
- opts[:Database] = config['database'] if config.key?('database')
32
- opts[:RemoteHost] = config['host'] if config.key?('host')
33
- opts[:Flavor] = config['adapter'] if config.key?('adapter')
31
+ opts[:Database] = config['database'] if config && config.key?('database')
32
+ opts[:RemoteHost] = config['host'] if config && config.key?('host')
33
+ opts[:Flavor] = config['adapter'] if config && config.key?('adapter')
34
34
  rescue StandardError => e
35
35
  TraceView.logger.debug "Exception raised capturing ActiveRecord KVs: #{e.inspect}"
36
36
  TraceView.logger.debug e.backtrace.join('\n')
@@ -11,34 +11,30 @@ module TraceView
11
11
  @@rum_ftr_tmpl = File.read(File.dirname(__FILE__) + '/rails/helpers/rum/rum_footer.js.erb')
12
12
 
13
13
  def traceview_rum_header
14
- begin
15
- return unless TraceView::Config.rum_id
16
- if TraceView.tracing?
17
- if request.xhr?
18
- return raw(ERB.new(@@rum_xhr_tmpl).result)
19
- else
20
- return raw(ERB.new(@@rum_hdr_tmpl).result)
21
- end
14
+ return unless TraceView::Config.rum_id
15
+ if TraceView.tracing?
16
+ if request.xhr?
17
+ return raw(ERB.new(@@rum_xhr_tmpl).result)
18
+ else
19
+ return raw(ERB.new(@@rum_hdr_tmpl).result)
22
20
  end
23
- rescue StandardError => e
24
- TraceView.logger.warn "traceview_rum_header: #{e.message}."
25
- return ""
26
21
  end
22
+ rescue StandardError => e
23
+ TraceView.logger.warn "traceview_rum_header: #{e.message}."
24
+ return ''
27
25
  end
28
26
  alias_method :oboe_rum_header, :traceview_rum_header
29
27
 
30
28
  def traceview_rum_footer
31
- begin
32
- return unless TraceView::Config.rum_id
33
- if TraceView.tracing?
34
- # Even though the footer template is named xxxx.erb, there are no ERB tags in it so we'll
35
- # skip that step for now
36
- return raw(@@rum_ftr_tmpl)
37
- end
38
- rescue StandardError => e
39
- TraceView.logger.warn "traceview_rum_footer: #{e.message}."
40
- return ""
29
+ return unless TraceView::Config.rum_id
30
+ if TraceView.tracing?
31
+ # Even though the footer template is named xxxx.erb, there are no ERB tags in it so we'll
32
+ # skip that step for now
33
+ return raw(@@rum_ftr_tmpl)
41
34
  end
35
+ rescue StandardError => e
36
+ TraceView.logger.warn "traceview_rum_footer: #{e.message}."
37
+ return ''
42
38
  end
43
39
  alias_method :oboe_rum_footer, :traceview_rum_footer
44
40
  end # Helpers
@@ -47,7 +43,7 @@ module TraceView
47
43
  # Force load the TraceView Rails initializer if there is one
48
44
  # Prefer traceview.rb but give priority to the legacy tracelytics.rb if it exists
49
45
  if ::Rails::VERSION::MAJOR > 2
50
- rails_root = "#{::Rails.root.to_s}"
46
+ rails_root = "#{::Rails.root}"
51
47
  else
52
48
  rails_root = "#{RAILS_ROOT}"
53
49
  end
@@ -55,16 +51,16 @@ module TraceView
55
51
  #
56
52
  # We've been through 3 initializer names. Try each one.
57
53
  #
58
- if File.exists?("#{rails_root}/config/initializers/tracelytics.rb")
54
+ if File.exist?("#{rails_root}/config/initializers/tracelytics.rb")
59
55
  tr_initializer = "#{rails_root}/config/initializers/tracelytics.rb"
60
56
 
61
- elsif File.exists?("#{rails_root}/config/initializers/oboe.rb")
57
+ elsif File.exist?("#{rails_root}/config/initializers/oboe.rb")
62
58
  tr_initializer = "#{rails_root}/config/initializers/oboe.rb"
63
59
 
64
60
  else
65
61
  tr_initializer = "#{rails_root}/config/initializers/traceview.rb"
66
62
  end
67
- require tr_initializer if File.exists?(tr_initializer)
63
+ require tr_initializer if File.exist?(tr_initializer)
68
64
  end
69
65
 
70
66
  def self.load_instrumentation
@@ -94,7 +90,6 @@ module TraceView
94
90
  ActionView::Base.send :include, TraceView::Rails::Helpers
95
91
  end
96
92
  end
97
-
98
93
  end # Rails
99
94
  end # TraceView
100
95
 
@@ -104,18 +99,17 @@ if defined?(::Rails)
104
99
  if ::Rails::VERSION::MAJOR > 2
105
100
  module TraceView
106
101
  class Railtie < ::Rails::Railtie
107
-
108
102
  initializer 'traceview.helpers' do
109
103
  TraceView::Rails.include_helpers
110
104
  end
111
105
 
112
106
  initializer 'traceview.rack' do |app|
113
- TraceView.logger.info "[traceview/loading] Instrumenting rack" if TraceView::Config[:verbose]
114
- app.config.middleware.insert 0, "TraceView::Rack"
107
+ TraceView.logger.info '[traceview/loading] Instrumenting rack' if TraceView::Config[:verbose]
108
+ app.config.middleware.insert 0, 'TraceView::Rack'
115
109
  end
116
110
 
117
111
  config.after_initialize do
118
- TraceView.logger = ::Rails.logger if ::Rails.logger
112
+ TraceView.logger = ::Rails.logger if ::Rails.logger && !ENV.key?('TRACEVIEW_GEM_TEST')
119
113
 
120
114
  TraceView::Loading.load_access_key
121
115
  TraceView::Inst.load_instrumentation
@@ -133,8 +127,8 @@ if defined?(::Rails)
133
127
  TraceView::Loading.load_access_key
134
128
 
135
129
  Rails.configuration.after_initialize do
136
- TraceView.logger.info "[traceview/loading] Instrumenting rack" if TraceView::Config[:verbose]
137
- Rails.configuration.middleware.insert 0, "TraceView::Rack"
130
+ TraceView.logger.info '[traceview/loading] Instrumenting rack' if TraceView::Config[:verbose]
131
+ Rails.configuration.middleware.insert 0, 'TraceView::Rack'
138
132
 
139
133
  TraceView::Inst.load_instrumentation
140
134
  TraceView::Rails.load_instrumentation
@@ -27,7 +27,7 @@ module TraceView
27
27
  report_kvs[:LineNumber] = __LINE__
28
28
  rescue StandardError => e
29
29
  ::TraceView.logger.debug e.message
30
- ::TraceView.logger.debug e.backtrace.join(", ")
30
+ ::TraceView.logger.debug e.backtrace.join(', ')
31
31
  end
32
32
 
33
33
  TraceView::API.profile(name, report_kvs, false) do
@@ -85,7 +85,7 @@ if defined?(::Sinatra)
85
85
 
86
86
  # When in the gem TEST environment, we load this instrumentation regardless.
87
87
  # Otherwise, only when Padrino isn't around.
88
- unless defined?(::Padrino) and not (ENV.key?('TRACEVIEW_GEM_TEST'))
88
+ unless defined?(::Padrino) && !ENV.key?('TRACEVIEW_GEM_TEST')
89
89
  # Padrino has 'enhanced' routes and rendering so the Sinatra
90
90
  # instrumentation won't work anyways. Only load for pure Sinatra apps.
91
91
  ::TraceView::Util.send_include(::Sinatra::Base, ::TraceView::Sinatra::Base)
@@ -50,7 +50,7 @@ module TraceView
50
50
  end
51
51
 
52
52
  def get_multi_with_traceview(*keys)
53
- return get_multi_without_traceview(keys) unless TraceView.tracing?
53
+ return get_multi_without_traceview(*keys) unless TraceView.tracing?
54
54
 
55
55
  info_kvs = {}
56
56
 
@@ -60,13 +60,12 @@ module TraceView
60
60
  if @servers.is_a?(Array) && !@servers.empty?
61
61
  info_kvs[:RemoteHost] = @servers.join(", ")
62
62
  end
63
- rescue
64
- TraceView.logger.debug "[traceview/debug] Error collecting info keys: #{e.message}"
65
- TraceView.logger.debug e.backtrace
63
+ rescue => e
64
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
66
65
  end
67
66
 
68
67
  TraceView::API.trace('memcache', { :KVOp => :get_multi }, :get_multi) do
69
- values = get_multi_without_traceview(keys)
68
+ values = get_multi_without_traceview(*keys)
70
69
 
71
70
  info_kvs[:KVHitCount] = values.length
72
71
  info_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:dalli][:collect_backtraces]
@@ -0,0 +1,92 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ if defined?(::Delayed)
5
+ module TraceView
6
+ module Inst
7
+ module DelayedJob
8
+ ##
9
+ # ForkHandler
10
+ #
11
+ # Since delayed job doesn't offer a hook into `after_fork`, we alias the method
12
+ # here to do our magic after a fork happens.
13
+ #
14
+ module ForkHandler
15
+ def self.extended(klass)
16
+ ::TraceView::Util.class_method_alias(klass, :after_fork, ::Delayed::Worker)
17
+ end
18
+
19
+ def after_fork_with_traceview
20
+ ::TraceView.logger.info '[traceview/delayed_job] Detected fork. Restarting TraceView reporter.' if TraceView::Config[:verbose]
21
+ ::TraceView::Reporter.restart unless ENV.key?('TRACEVIEW_GEM_TEST')
22
+
23
+ after_fork_without_traceview
24
+ end
25
+ end
26
+
27
+ ##
28
+ # TraceView::Inst::DelayedJob::Plugin
29
+ #
30
+ # The TraceView DelayedJob plugin. Here we wrap `enqueue` and
31
+ # `perform` to capture the timing of the bits we're interested
32
+ # in.
33
+ #
34
+ class Plugin < Delayed::Plugin
35
+ callbacks do |lifecycle|
36
+
37
+ # enqueue
38
+ if TraceView::Config[:delayed_jobclient][:enabled]
39
+ lifecycle.around(:enqueue) do |job, &block|
40
+ begin
41
+ report_kvs = {}
42
+ report_kvs[:Spec] = :pushq
43
+ report_kvs[:Flavor] = :DelayedJob
44
+ report_kvs[:JobName] = job.name
45
+ report_kvs[:MsgID] = job.id
46
+ report_kvs[:Queue] = job.queue if job.queue
47
+ report_kvs['Backtrace'] = TV::API.backtrace if TV::Config[:delayed_jobclient][:collect_backtraces]
48
+
49
+ TraceView::API.trace('delayed_job-client', report_kvs) do
50
+ block.call(job)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ # invoke_job
57
+ if TraceView::Config[:delayed_jobworker][:enabled]
58
+ lifecycle.around(:perform) do |worker, job, &block|
59
+ begin
60
+ report_kvs = {}
61
+ report_kvs[:Spec] = :job
62
+ report_kvs[:Flavor] = :DelayedJob
63
+ report_kvs[:JobName] = job.name
64
+ report_kvs[:MsgID] = job.id
65
+ report_kvs[:Queue] = job.queue if job.queue
66
+ report_kvs['Backtrace'] = TV::API.backtrace if TV::Config[:delayed_jobworker][:collect_backtraces]
67
+
68
+ # DelayedJob Specific KVs
69
+ report_kvs[:priority] = job.priority
70
+ report_kvs[:attempts] = job.attempts
71
+ report_kvs[:WorkerName] = job.locked_by
72
+ rescue => e
73
+ TV.logger.warn "[traceview/warning] inst/delayed_job.rb: #{e.message}"
74
+ end
75
+
76
+ result = TraceView::API.start_trace('delayed_job-worker', nil, report_kvs) do
77
+ block.call(worker, job)
78
+ TV::API.log_exception(nil, job.error) if job.error
79
+ end
80
+ result[0]
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ ::TraceView.logger.info '[traceview/loading] Instrumenting delayed_job' if TraceView::Config[:verbose]
90
+ ::TraceView::Util.send_extend(::Delayed::Worker, ::TraceView::Inst::DelayedJob::ForkHandler)
91
+ ::Delayed::Worker.plugins << ::TraceView::Inst::DelayedJob::Plugin
92
+ end
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2013 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module TraceView
2
5
  module Inst
3
6
  module EventMachine
@@ -64,7 +64,7 @@ module TraceView
64
64
  # Avoid cross host tracing for blacklisted domains
65
65
  blacklisted = TraceView::API.blacklisted?(@data[:hostname])
66
66
 
67
- req_context = TraceView::Context.toString()
67
+ req_context = TraceView::Context.toString
68
68
  @data[:headers]['X-Trace'] = req_context unless blacklisted
69
69
 
70
70
  kvs = traceview_collect(params)
@@ -84,8 +84,8 @@ module TraceView
84
84
  kvs['HTTPStatus'] = response.status
85
85
 
86
86
  # If we get a redirect, report the location header
87
- if ((300..308).to_a.include? response.status.to_i) && response.headers.key?("Location")
88
- kvs["Location"] = response.headers["Location"]
87
+ if ((300..308).to_a.include? response.status.to_i) && response.headers.key?('Location')
88
+ kvs['Location'] = response.headers['Location']
89
89
  end
90
90
 
91
91
  if response_context && !blacklisted
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2014 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module TraceView
2
5
  module Inst
3
6
  module FaradayConnection
@@ -9,7 +12,7 @@ module TraceView
9
12
  # Only send service KVs if we're not using the Net::HTTP adapter
10
13
  # Otherwise, the Net::HTTP instrumentation will send the service KVs
11
14
  handle_service = !@builder.handlers.include?(Faraday::Adapter::NetHttp) &&
12
- !@builder.handlers.include?(Faraday::Adapter::Excon)
15
+ !@builder.handlers.include?(Faraday::Adapter::Excon)
13
16
  TraceView::API.log_entry('faraday')
14
17
 
15
18
  result = run_request_without_traceview(method, url, body, headers, &block)
@@ -56,7 +56,8 @@ if defined?(::Mongo) && TraceView::Config[:mongo][:enabled]
56
56
  report_kvs[:Collection] = args[0] if m == :drop_collection
57
57
 
58
58
  report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:mongo][:collect_backtraces]
59
- rescue
59
+ rescue => e
60
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
60
61
  end
61
62
 
62
63
  TraceView::API.trace('mongo', report_kvs) do
@@ -97,7 +98,8 @@ if defined?(::Mongo) && TraceView::Config[:mongo][:enabled]
97
98
  end
98
99
  report_kvs[:Limit] = @limit if @limit != 0
99
100
  end
100
- rescue
101
+ rescue => e
102
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
101
103
  end
102
104
 
103
105
  TraceView::API.trace('mongo', report_kvs) do
@@ -162,7 +164,8 @@ if defined?(::Mongo) && TraceView::Config[:mongo][:enabled]
162
164
  report_kvs[:Multi] = args[2][:multi] if args[2] && args[2].key?(:multi)
163
165
  end
164
166
  end
165
- rescue
167
+ rescue => e
168
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
166
169
  end
167
170
 
168
171
  TraceView::API.trace('mongo', report_kvs) do
@@ -200,7 +203,8 @@ if defined?(::Mongo) && TraceView::Config[:mongo][:enabled]
200
203
  end
201
204
  end
202
205
  end
203
- rescue
206
+ rescue => e
207
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
204
208
  end
205
209
 
206
210
  TraceView::API.trace('mongo', report_kvs) do
@@ -221,7 +225,8 @@ if defined?(::Mongo) && TraceView::Config[:mongo][:enabled]
221
225
  if [:create_index, :ensure_index, :drop_index].include?(m) && !args.empty?
222
226
  report_kvs[:Index] = args[0].to_json
223
227
  end
224
- rescue
228
+ rescue => e
229
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
225
230
  end
226
231
 
227
232
  TraceView::API.trace('mongo', report_kvs) do
@@ -58,7 +58,7 @@ if defined?(::Moped) && TraceView::Config[:moped][:enabled]
58
58
  report_kvs = extract_trace_details(:map_reduce)
59
59
  report_kvs[:Map_Function] = command[:map]
60
60
  report_kvs[:Reduce_Function] = command[:reduce]
61
- rescue StandardError => e
61
+ rescue => e
62
62
  TraceView.logger.debug "[traceview/debug] Moped KV collection error: #{e.inspect}"
63
63
  end
64
64
 
@@ -117,7 +117,7 @@ if defined?(::Moped) && TraceView::Config[:moped][:enabled]
117
117
  end
118
118
 
119
119
  def create_with_traceview(key, options = {})
120
- return create_without_traceview(key, options = {}) unless TraceView.tracing?
120
+ return create_without_traceview(key, options) unless TraceView.tracing?
121
121
 
122
122
  begin
123
123
  # We report :create_index here to be consistent
@@ -135,7 +135,7 @@ if defined?(::Moped) && TraceView::Config[:moped][:enabled]
135
135
  end
136
136
 
137
137
  def drop_with_traceview(key = nil)
138
- return drop_without_traceview(key = nil) unless TraceView.tracing?
138
+ return drop_without_traceview(key) unless TraceView.tracing?
139
139
 
140
140
  begin
141
141
  # We report :drop_indexes here to be consistent
@@ -451,7 +451,7 @@ if defined?(::Moped) && TraceView::Config[:moped][:enabled]
451
451
  end
452
452
 
453
453
  def aggregate_with_traceview(*pipeline)
454
- return aggregate_without_traceview(pipeline) unless TraceView.tracing?
454
+ return aggregate_without_traceview(*pipeline) unless TraceView.tracing?
455
455
 
456
456
  report_kvs = extract_trace_details(:aggregate)
457
457
  report_kvs[:Query] = pipeline
@@ -88,9 +88,7 @@ module TraceView
88
88
 
89
89
  if KV_COLLECT_MAP[op]
90
90
  # Extract KVs from command for this op
91
- KV_COLLECT_MAP[op].each { |k, v|
92
- kvs[k] = command[v]
93
- }
91
+ KV_COLLECT_MAP[op].each { |k, v| kvs[k] = command[v] }
94
92
  else
95
93
  # This case statement handle special cases not handled
96
94
  # by KV_COLLECT_MAP
@@ -107,10 +105,10 @@ module TraceView
107
105
  options = command[3..-1]
108
106
  until (opts = options.shift(2)).empty?
109
107
  case opts[0]
110
- when "EX"; kvs[:ex] = opts[1]
111
- when "PX"; kvs[:px] = opts[1]
112
- when "NX"; kvs[:nx] = opts[1]
113
- when "XX"; kvs[:xx] = opts[1]
108
+ when 'EX' then; kvs[:ex] = opts[1]
109
+ when 'PX' then; kvs[:px] = opts[1]
110
+ when 'NX' then; kvs[:nx] = opts[1]
111
+ when 'XX' then; kvs[:xx] = opts[1]
114
112
  end
115
113
  end
116
114
  end