oboe 2.7.1.7 → 2.7.2.fuchs1

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -0
  3. data/Gemfile +2 -0
  4. data/README.md +3 -3
  5. data/ext/oboe_metal/extconf.rb +11 -11
  6. data/lib/joboe_metal.rb +36 -42
  7. data/lib/oboe.rb +29 -26
  8. data/lib/oboe/api.rb +4 -0
  9. data/lib/oboe/api/layerinit.rb +7 -67
  10. data/lib/oboe/api/logging.rb +50 -28
  11. data/lib/oboe/api/memcache.rb +7 -5
  12. data/lib/oboe/api/profiling.rb +4 -4
  13. data/lib/oboe/api/tracing.rb +6 -5
  14. data/lib/oboe/api/util.rb +13 -9
  15. data/lib/oboe/base.rb +55 -16
  16. data/lib/oboe/config.rb +17 -15
  17. data/lib/oboe/frameworks/padrino.rb +0 -2
  18. data/lib/oboe/frameworks/padrino/templates.rb +5 -6
  19. data/lib/oboe/frameworks/rails.rb +0 -1
  20. data/lib/oboe/frameworks/rails/inst/action_controller.rb +4 -5
  21. data/lib/oboe/frameworks/rails/inst/action_view.rb +4 -4
  22. data/lib/oboe/frameworks/rails/inst/action_view_2x.rb +4 -4
  23. data/lib/oboe/frameworks/rails/inst/action_view_30.rb +2 -2
  24. data/lib/oboe/frameworks/rails/inst/active_record.rb +5 -5
  25. data/lib/oboe/frameworks/rails/inst/connection_adapters/mysql.rb +6 -6
  26. data/lib/oboe/frameworks/rails/inst/connection_adapters/mysql2.rb +3 -3
  27. data/lib/oboe/frameworks/rails/inst/connection_adapters/oracle.rb +1 -1
  28. data/lib/oboe/frameworks/rails/inst/connection_adapters/postgresql.rb +3 -3
  29. data/lib/oboe/frameworks/rails/inst/connection_adapters/utils.rb +18 -19
  30. data/lib/oboe/frameworks/sinatra.rb +4 -5
  31. data/lib/oboe/inst/cassandra.rb +17 -19
  32. data/lib/oboe/inst/dalli.rb +5 -5
  33. data/lib/oboe/inst/em-http-request.rb +13 -13
  34. data/lib/oboe/inst/faraday.rb +71 -0
  35. data/lib/oboe/inst/http.rb +4 -4
  36. data/lib/oboe/inst/memcache.rb +7 -10
  37. data/lib/oboe/inst/memcached.rb +7 -9
  38. data/lib/oboe/inst/mongo.rb +26 -28
  39. data/lib/oboe/inst/moped.rb +23 -24
  40. data/lib/oboe/inst/rack.rb +10 -11
  41. data/lib/oboe/inst/redis.rb +18 -20
  42. data/lib/oboe/inst/resque.rb +8 -9
  43. data/lib/oboe/instrumentation.rb +3 -0
  44. data/lib/oboe/loading.rb +19 -23
  45. data/lib/{method_profiling.rb → oboe/method_profiling.rb} +22 -8
  46. data/lib/oboe/ruby.rb +23 -3
  47. data/lib/oboe/support.rb +94 -0
  48. data/lib/oboe/thread_local.rb +9 -1
  49. data/lib/oboe/util.rb +90 -18
  50. data/lib/oboe/version.rb +5 -2
  51. data/lib/oboe/xtrace.rb +20 -24
  52. data/lib/oboe_metal.rb +16 -13
  53. data/lib/rails/generators/oboe/templates/oboe_initializer.rb +2 -0
  54. data/test/instrumentation/faraday_test.rb +142 -0
  55. data/test/instrumentation/moped_test.rb +2 -0
  56. data/test/minitest_helper.rb +0 -1
  57. data/test/support/config_test.rb +3 -1
  58. metadata +10 -5
@@ -2,6 +2,14 @@
2
2
  # All rights reserved.
3
3
 
4
4
  module Oboe
5
+ ##
6
+ # Provides thread local storage for Oboe.
7
+ #
8
+ # Example usage:
9
+ # module OboeBase
10
+ # extend ::Oboe::ThreadLocal
11
+ # thread_local :layer_op
12
+ # end
5
13
  module ThreadLocal
6
14
  def thread_local(name)
7
15
  key = "__#{self}_#{name}__".intern
@@ -10,7 +18,7 @@ module Oboe
10
18
  Thread.current[key]
11
19
  end
12
20
 
13
- define_method(name.to_s + "=") do |value|
21
+ define_method(name.to_s + '=') do |value|
14
22
  Thread.current[key] = value
15
23
  end
16
24
  end
@@ -2,6 +2,9 @@
2
2
  # All rights reserved.
3
3
 
4
4
  module Oboe
5
+ ##
6
+ # Provides utility methods for use while in the business
7
+ # of instrumenting code
5
8
  module Util
6
9
  class << self
7
10
  def contextual_name(cls)
@@ -11,10 +14,9 @@ module Oboe
11
14
  # ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.to_s.split(/::/).last
12
15
  # => "AbstractMysqlAdapter"
13
16
  #
14
- begin
15
- cls.to_s.split(/::/).last
16
- rescue
17
- end
17
+ cls.to_s.split(/::/).last
18
+ rescue
19
+ cls
18
20
  end
19
21
 
20
22
  ##
@@ -23,10 +25,10 @@ module Oboe
23
25
  # Centralized utility method to alias a method on an arbitrary
24
26
  # class or module.
25
27
  #
26
- def method_alias(cls, method, name=nil)
28
+ def method_alias(cls, method, name = nil)
27
29
  name ||= contextual_name(cls)
28
30
 
29
- if cls.method_defined? method.to_sym or cls.private_method_defined? method.to_sym
31
+ if cls.method_defined?(method.to_sym) || cls.private_method_defined?(method.to_sym)
30
32
 
31
33
  # Strip '!' or '?' from method if present
32
34
  safe_method_name = method.to_s.chop if method.to_s =~ /\?$|\!$/
@@ -36,8 +38,8 @@ module Oboe
36
38
  with_oboe = "#{safe_method_name}_with_oboe"
37
39
 
38
40
  # Only alias if we haven't done so already
39
- unless cls.method_defined? without_oboe.to_sym or
40
- cls.private_method_defined? without_oboe.to_sym
41
+ unless cls.method_defined?(without_oboe.to_sym) ||
42
+ cls.private_method_defined?(without_oboe.to_sym)
41
43
 
42
44
  cls.class_eval do
43
45
  alias_method without_oboe, "#{method}"
@@ -54,7 +56,7 @@ module Oboe
54
56
  # Centralized utility method to alias a class method on an arbitrary
55
57
  # class or module
56
58
  #
57
- def class_method_alias(cls, method, name=nil)
59
+ def class_method_alias(cls, method, name = nil)
58
60
  name ||= contextual_name(cls)
59
61
 
60
62
  if cls.singleton_methods.include? method.to_sym
@@ -81,9 +83,7 @@ module Oboe
81
83
  # Centralized utility method to send an extend call for an
82
84
  # arbitrary class
83
85
  def send_extend(target_cls, cls)
84
- if defined?(target_cls)
85
- target_cls.send(:extend, cls)
86
- end
86
+ target_cls.send(:extend, cls) if defined?(target_cls)
87
87
  end
88
88
 
89
89
  ##
@@ -92,9 +92,7 @@ module Oboe
92
92
  # Centralized utility method to send a include call for an
93
93
  # arbitrary class
94
94
  def send_include(target_cls, cls)
95
- if defined?(target_cls)
96
- target_cls.send(:include, cls)
97
- end
95
+ target_cls.send(:include, cls) if defined?(target_cls)
98
96
  end
99
97
 
100
98
  ##
@@ -104,7 +102,7 @@ module Oboe
104
102
  # solely on filename)
105
103
  #
106
104
  def static_asset?(path)
107
- return (path =~ /\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|ttf|woff|svg|less)$/i)
105
+ (path =~ /\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|ttf|woff|svg|less)$/i)
108
106
  end
109
107
 
110
108
  ##
@@ -112,7 +110,7 @@ module Oboe
112
110
  #
113
111
  # Even to my surprise, 'prettify' is a real word:
114
112
  # transitive v. To make pretty or prettier, especially in a superficial or insubstantial way.
115
- # from The American Heritage® Dictionary of the English Language, 4th Edition
113
+ # from The American Heritage Dictionary of the English Language, 4th Edition
116
114
  #
117
115
  # This method makes things 'purty' for reporting.
118
116
  def prettify(x)
@@ -123,7 +121,81 @@ module Oboe
123
121
  end
124
122
  end
125
123
 
124
+ ##
125
+ # build_report
126
+ #
127
+ # Internal: Build a hash of KVs that reports on the status of the
128
+ # running environment.
129
+ def build_report
130
+ platform_info = { '__Init' => 1 }
131
+
132
+ begin
133
+ platform_info['Force'] = true
134
+ platform_info['Ruby.Platform.Version'] = RUBY_PLATFORM
135
+ platform_info['Ruby.Version'] = RUBY_VERSION
136
+ platform_info['Ruby.Oboe.Version'] = ::Oboe::Version::STRING
137
+ platform_info['RubyHeroku.Oboe.Version'] = ::OboeHeroku::Version::STRING if defined?(::OboeHeroku)
138
+
139
+ # Report the framework in use
140
+ if defined?(::RailsLts)
141
+ platform_info['Ruby.RailsLts.Version'] = "RailsLts-#{::RailsLts::VERSION}"
142
+ elsif defined?(::Rails)
143
+ platform_info['Ruby.Rails.Version'] = "Rails-#{::Rails.version}"
144
+ end
145
+ platform_info['Ruby.Grape.Version'] = "Grape-#{::Grape::VERSION}" if defined?(::Grape)
146
+ platform_info['Ruby.Cramp.Version'] = "Cramp-#{::Cramp::VERSION}" if defined?(::Cramp)
147
+
148
+ if defined?(::Padrino)
149
+ platform_info['Ruby.Padrino.Version'] = "Padrino-#{::Padrino::VERSION}"
150
+ elsif defined?(::Sinatra)
151
+ platform_info['Ruby.Sinatra.Version'] = "Sinatra-#{::Sinatra::VERSION}"
152
+ end
153
+
154
+ # Report the instrumented libraries
155
+ platform_info['Ruby.Cassandra.Version'] = "Cassandra-#{::Cassandra.VERSION}" if defined?(::Cassandra)
156
+ platform_info['Ruby.Dalli.Version'] = "Dalli-#{::Dalli::VERSION}" if defined?(::Dalli)
157
+ platform_info['Ruby.MemCache.Version'] = "MemCache-#{::MemCache::VERSION}" if defined?(::MemCache)
158
+ platform_info['Ruby.Moped.Version'] = "Moped-#{::Moped::VERSION}" if defined?(::Moped)
159
+ platform_info['Ruby.Redis.Version'] = "Redis-#{::Redis::VERSION}" if defined?(::Redis)
160
+ platform_info['Ruby.Resque.Version'] = "Resque-#{::Resque::VERSION}" if defined?(::Resque)
161
+
162
+ # Special case since the Mongo 1.x driver doesn't embed the version number in the gem directly
163
+ if ::Gem.loaded_specs.key?('mongo')
164
+ platform_info['Ruby.Mongo.Version'] = "Mongo-#{::Gem.loaded_specs['mongo'].version}"
165
+ end
166
+
167
+ # Report the server in use (if possible)
168
+ if defined?(::Unicorn)
169
+ platform_info['Ruby.AppContainer.Version'] = "Unicorn-#{::Unicorn::Const::UNICORN_VERSION}"
170
+ elsif defined?(::Puma)
171
+ platform_info['Ruby.AppContainer.Version'] = "Puma-#{::Puma::Const::PUMA_VERSION} (#{::Puma::Const::CODE_NAME})"
172
+ elsif defined?(::PhusionPassenger)
173
+ platform_info['Ruby.AppContainer.Version'] = "#{::PhusionPassenger::PACKAGE_NAME}-#{::PhusionPassenger::VERSION_STRING}"
174
+ elsif defined?(::Thin)
175
+ platform_info['Ruby.AppContainer.Version'] = "Thin-#{::Thin::VERSION::STRING} (#{::Thin::VERSION::CODENAME})"
176
+ elsif defined?(::Mongrel)
177
+ platform_info['Ruby.AppContainer.Version'] = "Mongrel-#{::Mongrel::Const::MONGREL_VERSION}"
178
+ elsif defined?(::Mongrel2)
179
+ platform_info['Ruby.AppContainer.Version'] = "Mongrel2-#{::Mongrel2::VERSION}"
180
+ elsif defined?(::Trinidad)
181
+ platform_info['Ruby.AppContainer.Version'] = "Trinidad-#{::Trinidad::VERSION}"
182
+ elsif defined?(::WEBrick)
183
+ platform_info['Ruby.AppContainer.Version'] = "WEBrick-#{::WEBrick::VERSION}"
184
+ else
185
+ platform_info['Ruby.AppContainer.Version'] = File.basename($PROGRAM_NAME)
186
+ end
187
+
188
+ rescue StandardError, ScriptError => e
189
+ # Also rescue ScriptError (aka SyntaxError) in case one of the expected
190
+ # version defines don't exist
191
+
192
+ platform_info['Error'] = "Error in build_report: #{e.message}"
193
+
194
+ Oboe.logger.debug "Error in build_report: #{e.message}"
195
+ Oboe.logger.debug e.backtrace
196
+ end
197
+ platform_info
198
+ end
126
199
  end
127
200
  end
128
201
  end
129
-
@@ -2,11 +2,14 @@
2
2
  # All rights reserved.
3
3
 
4
4
  module Oboe
5
+ ##
6
+ # The current version of the gem. Used mainly by
7
+ # oboe.gemspec during gem build process
5
8
  module Version
6
9
  MAJOR = 2
7
10
  MINOR = 7
8
- PATCH = 1
9
- BUILD = 7
11
+ PATCH = 2
12
+ BUILD = "fuchs1"
10
13
 
11
14
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
12
15
  end
@@ -2,31 +2,31 @@
2
2
  # All rights reserved.
3
3
 
4
4
  module Oboe
5
+ ##
6
+ # Methods to act on, manipulate or investigate an X-Trace
7
+ # value
5
8
  module XTrace
6
9
  class << self
7
-
8
10
  ##
9
11
  # Oboe::XTrace.valid?
10
12
  #
11
13
  # Perform basic validation on a potential X-Trace ID
12
14
  #
13
15
  def valid?(xtrace)
14
- begin
15
- # Shouldn't be nil
16
- return false unless xtrace
16
+ # Shouldn't be nil
17
+ return false unless xtrace
17
18
 
18
- # The X-Trace ID shouldn't be an initialized empty ID
19
- return false if (xtrace =~ /^1b0000000/i) == 0
19
+ # The X-Trace ID shouldn't be an initialized empty ID
20
+ return false if (xtrace =~ /^1b0000000/i) == 0
20
21
 
21
- # Valid X-Trace IDs have a length of 58 bytes and start with '1b'
22
- return false unless xtrace.length == 58 and (xtrace =~ /^1b/i) == 0
22
+ # Valid X-Trace IDs have a length of 58 bytes and start with '1b'
23
+ return false unless xtrace.length == 58 && (xtrace =~ /^1b/i) == 0
23
24
 
24
- true
25
- rescue StandardError => e
26
- Oboe.logger.debug e.message
27
- Oboe.logger.debug e.backtrace
28
- false
29
- end
25
+ true
26
+ rescue StandardError => e
27
+ Oboe.logger.debug e.message
28
+ Oboe.logger.debug e.backtrace
29
+ false
30
30
  end
31
31
 
32
32
  ##
@@ -35,18 +35,14 @@ module Oboe
35
35
  # Extract and return the task_id portion of an X-Trace ID
36
36
  #
37
37
  def task_id(xtrace)
38
- begin
39
- return nil unless Oboe::XTrace.valid?(xtrace)
38
+ return nil unless Oboe::XTrace.valid?(xtrace)
40
39
 
41
- xtrace[2..41]
42
- rescue StandardError => e
43
- Oboe.logger.debug e.message
44
- Oboe.logger.debug e.backtrace
45
- return nil
46
- end
40
+ xtrace[2..41]
41
+ rescue StandardError => e
42
+ Oboe.logger.debug e.message
43
+ Oboe.logger.debug e.backtrace
44
+ return nil
47
45
  end
48
-
49
46
  end
50
47
  end
51
48
  end
52
-
@@ -1,6 +1,9 @@
1
1
  # Copyright (c) 2013 AppNeta, Inc.
2
2
  # All rights reserved.
3
3
 
4
+ # Disable docs and Camelcase warns since we're implementing
5
+ # an interface here. See OboeBase for details.
6
+ # rubocop:disable Style/Documentation, Style/MethodName
4
7
  module Oboe
5
8
  extend OboeBase
6
9
  include Oboe_metal
@@ -13,21 +16,21 @@ module Oboe
13
16
  return unless Oboe.loaded
14
17
 
15
18
  begin
16
- Oboe_metal::Context.init()
19
+ Oboe_metal::Context.init
17
20
 
18
- if ENV.has_key?("OBOE_GEM_TEST")
19
- Oboe.reporter = Oboe::FileReporter.new("/tmp/trace_output.bson")
21
+ if ENV.key?('OBOE_GEM_TEST')
22
+ Oboe.reporter = Oboe::FileReporter.new('/tmp/trace_output.bson')
20
23
  else
21
24
  Oboe.reporter = Oboe::UdpReporter.new(Oboe::Config[:reporter_host], Oboe::Config[:reporter_port])
22
25
  end
23
26
 
24
27
  # Only report __Init from here if we are not instrumenting a framework.
25
28
  # Otherwise, frameworks will handle reporting __Init after full initialization
26
- unless defined?(::Rails) or defined?(::Sinatra) or defined?(::Padrino) or defined?(::Grape)
29
+ unless defined?(::Rails) || defined?(::Sinatra) || defined?(::Padrino) || defined?(::Grape)
27
30
  Oboe::API.report_init
28
31
  end
29
32
 
30
- rescue Exception => e
33
+ rescue => e
31
34
  $stderr.puts e.message
32
35
  raise
33
36
  end
@@ -52,7 +55,7 @@ module Oboe
52
55
  # Retrieves all traces written to the trace file
53
56
  #
54
57
  def self.get_all_traces
55
- io = File.open($trace_file, "r")
58
+ io = File.open($trace_file, 'r')
56
59
  contents = io.readlines(nil)
57
60
 
58
61
  return contents if contents.empty?
@@ -75,7 +78,7 @@ module Oboe
75
78
 
76
79
  class Event
77
80
  def self.metadataString(evt)
78
- evt.metadataString()
81
+ evt.metadataString
79
82
  end
80
83
  end
81
84
 
@@ -92,7 +95,7 @@ module Oboe
92
95
  rv = Oboe::Context.sampleRequest(layer, xtrace, tv_meta)
93
96
 
94
97
  # For older liboboe that returns true/false, just return that.
95
- return rv if [TrueClass, FalseClass].include?(rv.class) or (rv == 0)
98
+ return rv if [TrueClass, FalseClass].include?(rv.class) || (rv == 0)
96
99
 
97
100
  # liboboe version > 1.3.1 returning a bit masked integer with SampleRate and
98
101
  # source embedded
@@ -126,13 +129,13 @@ module Oboe
126
129
  end
127
130
 
128
131
  def set_sample_rate(rate)
129
- if Oboe.loaded
130
- # Update liboboe with the new SampleRate value
131
- Oboe::Context.setDefaultSampleRate(rate.to_i)
132
- end
132
+ return unless Oboe.loaded
133
+
134
+ # Update liboboe with the new SampleRate value
135
+ Oboe::Context.setDefaultSampleRate(rate.to_i)
133
136
  end
134
137
  end
135
138
  end
139
+ # rubocop:enable Style/Documentation
136
140
 
137
141
  Oboe.loaded = true
138
-
@@ -52,6 +52,7 @@ if defined?(Oboe::Config)
52
52
  # Oboe::Config[:action_view][:enabled] = true
53
53
  # Oboe::Config[:cassandra][:enabled] = true
54
54
  # Oboe::Config[:dalli][:enabled] = true
55
+ # Oboe::Config[:faraday][:enabled] = true
55
56
  # Oboe::Config[:memcache][:enabled] = true
56
57
  # Oboe::Config[:memcached][:enabled] = true
57
58
  # Oboe::Config[:mongo][:enabled] = true
@@ -74,6 +75,7 @@ if defined?(Oboe::Config)
74
75
  # Oboe::Config[:action_view][:collect_backtraces] = true
75
76
  # Oboe::Config[:cassandra][:collect_backtraces] = true
76
77
  # Oboe::Config[:dalli][:collect_backtraces] = false
78
+ # Oboe::Config[:faraday][:collect_backtraces] = false
77
79
  # Oboe::Config[:memcache][:collect_backtraces] = false
78
80
  # Oboe::Config[:memcached][:collect_backtraces] = false
79
81
  # Oboe::Config[:mongo][:collect_backtraces] = true
@@ -0,0 +1,142 @@
1
+ require 'minitest_helper'
2
+
3
+ describe Oboe::Inst::FaradayConnection do
4
+ before do
5
+ clear_all_traces
6
+ @collect_backtraces = Oboe::Config[:faraday][:collect_backtraces]
7
+ end
8
+
9
+ after do
10
+ Oboe::Config[:faraday][:collect_backtraces] = @collect_backtraces
11
+ end
12
+
13
+ it 'Faraday should be defined and ready' do
14
+ defined?(::Faraday).wont_match nil
15
+ end
16
+
17
+ it 'Faraday should have oboe methods defined' do
18
+ [ :run_request_with_oboe ].each do |m|
19
+ ::Faraday::Connection.method_defined?(m).must_equal true
20
+ end
21
+ end
22
+
23
+ it "should trace a Faraday request to an instr'd app" do
24
+ Oboe::API.start_trace('faraday_test') do
25
+ conn = Faraday.new(:url => 'http://www.appneta.com') do |faraday|
26
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
27
+ end
28
+ response = conn.get '/?q=ruby_test_suite'
29
+ end
30
+
31
+ traces = get_all_traces
32
+ traces.count.must_equal 7
33
+
34
+ validate_outer_layers(traces, 'faraday_test')
35
+
36
+ traces[1]['Layer'].must_equal 'faraday'
37
+ traces[1].key?('Backtrace').must_equal Oboe::Config[:faraday][:collect_backtraces]
38
+
39
+ traces[3]['Layer'].must_equal 'net-http'
40
+ traces[3]['IsService'].must_equal '1'
41
+ traces[3]['RemoteProtocol'].must_equal 'HTTP'
42
+ traces[3]['RemoteHost'].must_equal 'www.appneta.com'
43
+ traces[3]['ServiceArg'].must_equal '/?q=ruby_test_suite'
44
+ traces[3]['HTTPMethod'].must_equal 'GET'
45
+ traces[3]['HTTPStatus'].must_equal '200'
46
+
47
+ traces[4]['Layer'].must_equal 'net-http'
48
+ traces[4]['Label'].must_equal 'exit'
49
+
50
+ traces[5]['Layer'].must_equal 'faraday'
51
+ traces[5]['Label'].must_equal 'exit'
52
+ end
53
+
54
+ it 'should trace a Faraday request' do
55
+ Oboe::API.start_trace('faraday_test') do
56
+ conn = Faraday.new(:url => 'http://www.google.com') do |faraday|
57
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
58
+ end
59
+ response = conn.get '/?q=ruby_test_suite'
60
+ end
61
+
62
+ traces = get_all_traces
63
+ traces.count.must_equal 7
64
+
65
+ validate_outer_layers(traces, 'faraday_test')
66
+
67
+ traces[1]['Layer'].must_equal 'faraday'
68
+ traces[1].key?('Backtrace').must_equal Oboe::Config[:faraday][:collect_backtraces]
69
+
70
+ traces[3]['Layer'].must_equal 'net-http'
71
+ traces[3]['IsService'].must_equal '1'
72
+ traces[3]['RemoteProtocol'].must_equal 'HTTP'
73
+ traces[3]['RemoteHost'].must_equal 'www.google.com'
74
+ traces[3]['ServiceArg'].must_equal '/?q=ruby_test_suite'
75
+ traces[3]['HTTPMethod'].must_equal 'GET'
76
+ traces[3]['HTTPStatus'].must_equal '200'
77
+
78
+ traces[4]['Layer'].must_equal 'net-http'
79
+ traces[4]['Label'].must_equal 'exit'
80
+
81
+ traces[5]['Layer'].must_equal 'faraday'
82
+ traces[5]['Label'].must_equal 'exit'
83
+ end
84
+
85
+ it 'should trace a Faraday with an alternate adapter' do
86
+ Oboe::API.start_trace('faraday_test') do
87
+ conn = Faraday.new(:url => 'http://www.google.com') do |faraday|
88
+ faraday.adapter :excon
89
+ end
90
+ response = conn.get '/?q=ruby_test_suite'
91
+ end
92
+
93
+ traces = get_all_traces
94
+ traces.count.must_equal 5
95
+
96
+ validate_outer_layers(traces, 'faraday_test')
97
+
98
+ traces[1]['Layer'].must_equal 'faraday'
99
+ traces[1].key?('Backtrace').must_equal Oboe::Config[:faraday][:collect_backtraces]
100
+
101
+ traces[1]['IsService'].must_equal '1'
102
+ traces[1]['RemoteProtocol'].must_equal 'HTTP'
103
+ traces[1]['RemoteHost'].must_equal 'www.google.com'
104
+ traces[1]['ServiceArg'].must_equal '/?q=ruby_test_suite'
105
+ traces[1]['HTTPMethod'].downcase.must_equal 'get'
106
+
107
+ traces[2]['Layer'].must_equal 'faraday'
108
+ traces[2]['Label'].must_equal 'info'
109
+ traces[2]['HTTPStatus'].must_equal '200'
110
+
111
+ traces[3]['Layer'].must_equal 'faraday'
112
+ traces[3]['Label'].must_equal 'exit'
113
+ end
114
+
115
+ it 'should obey :collect_backtraces setting when true' do
116
+ Oboe::Config[:faraday][:collect_backtraces] = true
117
+
118
+ Oboe::API.start_trace('faraday_test') do
119
+ conn = Faraday.new(:url => 'http://www.google.com') do |faraday|
120
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
121
+ end
122
+ response = conn.get '/?q=ruby_test_suite'
123
+ end
124
+
125
+ traces = get_all_traces
126
+ layer_has_key(traces, 'faraday', 'Backtrace')
127
+ end
128
+
129
+ it 'should obey :collect_backtraces setting when false' do
130
+ Oboe::Config[:faraday][:collect_backtraces] = false
131
+
132
+ Oboe::API.start_trace('faraday_test') do
133
+ conn = Faraday.new(:url => 'http://www.google.com') do |faraday|
134
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
135
+ end
136
+ response = conn.get '/?q=ruby_test_suite'
137
+ end
138
+
139
+ traces = get_all_traces
140
+ layer_doesnt_have_key(traces, 'faraday', 'Backtrace')
141
+ end
142
+ end