oboe 2.7.15.1-java → 2.7.16.1-java

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3afed3934fb8e52bc451c74b37953f4298626e0
4
- data.tar.gz: baf521941261128f4c8981ed13cb1f23e11c759e
3
+ metadata.gz: 11e535361d6ddf6ec6a8dca58b742b50f42ba114
4
+ data.tar.gz: ef8bc3bc820153012eba2de3fdbd3eb66c36f90c
5
5
  SHA512:
6
- metadata.gz: 5a848fd2ad12631d0fe146557c17c96a79bb1bb9ef362a328cf68adfd74ffe7cada93ad02e70c347666c774c47ebd6df72db8a7469f4ea6ce6c713a50d322688
7
- data.tar.gz: d6befaa4cbcd6804109bf02192a3c148be4d8bc3d5786b457b4b26372a2e3834c5d25dc9f7de24920193baf88336ef0728ede0440954bcb75d2ef9f22e42ecb2
6
+ metadata.gz: 0c7b74535912fea2bb7e7a431b1c8e6800fb042f46b43201ee39e8abd202944783cb4a8cd0edf70bb17d578959a4f6e51b214528071306946def97ef771e0d8e
7
+ data.tar.gz: dde645f8bdc7320d53cfabe2b2fda1deb2dacd5d107f4e81017e688a2402b4f065b1a63823c555ef29d1e8114a10b1744f040087bc301b595d05c2eda127282c
data/.travis.yml CHANGED
@@ -52,4 +52,7 @@ services:
52
52
 
53
53
  matrix:
54
54
  allow_failures:
55
+ # FIXME: Until the joboe test reporter supports cross thread
56
+ # event collection.
57
+ - rvm: jruby-19mode
55
58
 
data/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@ https://github.com/appneta/oboe-ruby/releases
4
4
 
5
5
  Dates in this file are in the format MM/DD/YYYY.
6
6
 
7
+ # oboe 2.7.16.1
8
+
9
+ This patch release includes:
10
+
11
+ * New rest-client instrumentation: #109
12
+ * New excon instrumentation: #114
13
+ * Fix `uninitialized constant` on unsupported platforms: #113
14
+
15
+ Pushed to Rubygems:
16
+
17
+ https://rubygems.org/gems/oboe/versions/2.7.16.1
18
+ https://rubygems.org/gems/oboe/versions/2.7.16.1-java
19
+
7
20
  # oboe 2.7.15.1
8
21
 
9
22
  This patch release includes:
data/Gemfile CHANGED
@@ -1,10 +1,18 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development, :test do
4
- gem 'minitest'
4
+ gem 'minitest', "5.5.1"
5
5
  gem 'minitest-reporters'
6
6
  gem 'rack-test'
7
- if RUBY_VERSION > '1.8.7'
7
+ gem 'puma'
8
+ if RUBY_VERSION < '1.9.3'
9
+ # i18n 0.7.0 dropped support for Ruby 1.9.2 and older. ActiveSupport
10
+ # depends on i18n 0.7.0 since v 4.0.5. For < 1.9.2 Ruby support, lock
11
+ # down to these versions to maintain functionality.
12
+ gem 'i18n', '< 0.7.0'
13
+ gem 'activesupport', '< 4.0.5'
14
+ gem 'appraisal'
15
+ else
8
16
  gem 'appraisal'
9
17
  end
10
18
  end
@@ -33,6 +41,11 @@ gem 'faraday'
33
41
  gem 'excon'
34
42
  gem 'typhoeus'
35
43
  gem 'sequel'
44
+ if RUBY_VERSION >= '1.9.3'
45
+ # rest-client depends on mime-types gem which only supports
46
+ # ruby 1.9.3 and up
47
+ gem 'rest-client'
48
+ end
36
49
 
37
50
  # Database adapter gems needed by sequel
38
51
  if defined?(JRUBY_VERSION)
data/Rakefile CHANGED
@@ -3,10 +3,7 @@
3
3
  require 'rubygems'
4
4
  require 'bundler/setup'
5
5
  require 'rake/testtask'
6
-
7
- if RUBY_VERSION > '1.8.7'
8
- require 'appraisal'
9
- end
6
+ require 'appraisal'
10
7
 
11
8
  Rake::TestTask.new do |t|
12
9
  t.libs << "test"
data/lib/oboe/config.rb CHANGED
@@ -12,9 +12,10 @@ module Oboe
12
12
  @@config = {}
13
13
 
14
14
  @@instrumentation = [:action_controller, :action_view, :active_record,
15
- :cassandra, :dalli, :em_http_request, :faraday, :grape, :nethttp,
16
- :memcached, :memcache, :mongo, :moped, :rack, :redis, :resque,
17
- :sequel, :typhoeus]
15
+ :cassandra, :dalli, :em_http_request, :excon, :faraday,
16
+ :grape, :nethttp, :memcached, :memcache, :mongo,
17
+ :moped, :rack, :redis, :resque, :rest_client, :sequel,
18
+ :typhoeus]
18
19
  ##
19
20
  # Return the raw nested hash.
20
21
  #
@@ -43,6 +44,7 @@ module Oboe
43
44
  Oboe::Config[:faraday][:collect_backtraces] = false
44
45
  Oboe::Config[:grape][:collect_backtraces] = true
45
46
  Oboe::Config[:em_http_request][:collect_backtraces] = false
47
+ Oboe::Config[:excon][:collect_backtraces] = true
46
48
  Oboe::Config[:memcache][:collect_backtraces] = false
47
49
  Oboe::Config[:memcached][:collect_backtraces] = false
48
50
  Oboe::Config[:mongo][:collect_backtraces] = true
@@ -50,6 +52,7 @@ module Oboe
50
52
  Oboe::Config[:nethttp][:collect_backtraces] = true
51
53
  Oboe::Config[:redis][:collect_backtraces] = false
52
54
  Oboe::Config[:resque][:collect_backtraces] = true
55
+ Oboe::Config[:rest_client][:collect_backtraces] = false
53
56
  Oboe::Config[:sequel][:collect_backtraces] = true
54
57
  Oboe::Config[:typhoeus][:collect_backtraces] = false
55
58
 
@@ -0,0 +1,110 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ module Inst
6
+ module ExconConnection
7
+ def self.included(klass)
8
+ ::Oboe::Util.method_alias(klass, :request, ::Excon::Connection)
9
+ ::Oboe::Util.method_alias(klass, :requests, ::Excon::Connection)
10
+ end
11
+
12
+ def oboe_collect(params)
13
+ kvs = {}
14
+ kvs['IsService'] = 1
15
+ kvs['RemoteProtocol'] = ::Oboe::Util.upcase(@data[:scheme])
16
+ kvs['RemoteHost'] = @data[:host]
17
+
18
+ if @data[:query] && @data[:query].length
19
+ kvs['ServiceArg'] = @data[:path] + '?' + @data[:query]
20
+ else
21
+ kvs['ServiceArg'] = @data[:path]
22
+ end
23
+
24
+ # In the case of HTTP pipelining, params could be an array of
25
+ # request hashes.
26
+ if params.is_a?(Array)
27
+ methods = []
28
+ params.each do |p|
29
+ methods << ::Oboe::Util.upcase(p[:method])
30
+ end
31
+ kvs['HTTPMethods'] = methods.join(', ')[0..1024]
32
+ kvs['Pipeline'] = true
33
+ else
34
+ kvs['HTTPMethod'] = ::Oboe::Util.upcase(params[:method])
35
+ end
36
+ kvs['Backtrace'] = Oboe::API.backtrace if Oboe::Config[:excon][:collect_backtraces]
37
+ kvs
38
+ rescue => e
39
+ Oboe.logger.debug "[oboe/debug] Error capturing excon KVs: #{e.message}"
40
+ Oboe.logger.debug e.backtrace.join('\n') if ::Oboe::Config[:verbose]
41
+ end
42
+
43
+ def requests_with_oboe(pipeline_params)
44
+ responses = nil
45
+ Oboe::API.trace('excon', oboe_collect(pipeline_params)) do
46
+ responses = requests_without_oboe(pipeline_params)
47
+ end
48
+ responses
49
+ end
50
+
51
+ def request_with_oboe(params={}, &block)
52
+ # If we're not tracing, just do a fast return.
53
+ # If making HTTP pipeline requests (ordered batched)
54
+ # then just return as we're tracing from parent
55
+ # <tt>requests</tt>
56
+ if !Oboe.tracing? || params[:pipeline]
57
+ return request_without_oboe(params, &block)
58
+ end
59
+
60
+ begin
61
+ response_context = nil
62
+
63
+ # Avoid cross host tracing for blacklisted domains
64
+ blacklisted = Oboe::API.blacklisted?(@data[:hostname])
65
+
66
+ req_context = Oboe::Context.toString()
67
+ @data[:headers]['X-Trace'] = req_context unless blacklisted
68
+
69
+ kvs = oboe_collect(params)
70
+ kvs['Blacklisted'] = true if blacklisted
71
+
72
+ Oboe::API.log_entry('excon', kvs)
73
+ kvs.clear
74
+
75
+ # The core excon call
76
+ response = request_without_oboe(params, &block)
77
+
78
+ # excon only passes back a hash (datum) for HTTP pipelining...
79
+ # In that case, we should never arrive here but for the OCD, double check
80
+ # the datatype before trying to extract pertinent info
81
+ if response.is_a?(Excon::Response)
82
+ response_context = response.headers['X-Trace']
83
+ kvs['HTTPStatus'] = response.status
84
+
85
+ # If we get a redirect, report the location header
86
+ if ((300..308).to_a.include? response.status.to_i) && response.headers.key?("Location")
87
+ kvs["Location"] = response.headers["Location"]
88
+ end
89
+
90
+ if response_context && !blacklisted
91
+ Oboe::XTrace.continue_service_context(req_context, response_context)
92
+ end
93
+ end
94
+
95
+ response
96
+ rescue => e
97
+ Oboe::API.log_exception('excon', e)
98
+ raise e
99
+ ensure
100
+ Oboe::API.log_exit('excon', kvs) unless params[:pipeline]
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ if Oboe::Config[:excon][:enabled] && defined?(::Excon)
108
+ ::Oboe.logger.info '[oboe/loading] Instrumenting excon' if Oboe::Config[:verbose]
109
+ ::Oboe::Util.send_include(::Excon::Connection, ::Oboe::Inst::ExconConnection)
110
+ end
@@ -8,13 +8,13 @@ module Oboe
8
8
  def run_request_with_oboe(method, url, body, headers, &block)
9
9
  # Only send service KVs if we're not using the Net::HTTP adapter
10
10
  # Otherwise, the Net::HTTP instrumentation will send the service KVs
11
- handle_service = !@builder.handlers.include?(Faraday::Adapter::NetHttp)
11
+ handle_service = !@builder.handlers.include?(Faraday::Adapter::NetHttp) &&
12
+ !@builder.handlers.include?(Faraday::Adapter::Excon)
12
13
  Oboe::API.log_entry('faraday')
13
14
 
14
15
  result = run_request_without_oboe(method, url, body, headers, &block)
15
16
 
16
17
  kvs = {}
17
- kvs[:HTTPStatus] = result.status
18
18
  kvs['Middleware'] = @builder.handlers
19
19
  kvs['Backtrace'] = Oboe::API.backtrace if Oboe::Config[:faraday][:collect_backtraces]
20
20
 
@@ -33,6 +33,7 @@ module Oboe
33
33
  kvs['RemotePort'] = @url_prefix.port
34
34
  kvs['ServiceArg'] = url
35
35
  kvs['HTTPMethod'] = method
36
+ kvs[:HTTPStatus] = result.status
36
37
  kvs['Blacklisted'] = true if blacklisted
37
38
 
38
39
  # Re-attach net::http edge unless it's blacklisted or if we don't have a
@@ -7,13 +7,13 @@ if Oboe::Config[:nethttp][:enabled]
7
7
 
8
8
  Net::HTTP.class_eval do
9
9
  def request_with_oboe(*args, &block)
10
- unless started?
10
+ # If we're not tracing, just do a fast return. Since
11
+ # net/http.request calls itself, only trace
12
+ # once the http session has been started.
13
+ if !Oboe.tracing? || !started?
11
14
  return request_without_oboe(*args, &block)
12
15
  end
13
16
 
14
- # If we're not tracing, just do a fast return
15
- return request_without_oboe(*args, &block) unless Oboe.tracing?
16
-
17
17
  # Avoid cross host tracing for blacklisted domains
18
18
  blacklisted = Oboe::API.blacklisted?(addr_port)
19
19
 
@@ -46,7 +46,7 @@ if Oboe::Config[:nethttp][:enabled]
46
46
  xtrace = resp.get_fields('X-Trace')
47
47
  xtrace = xtrace[0] if xtrace && xtrace.is_a?(Array)
48
48
 
49
- if Oboe::XTrace.valid?(xtrace) && Oboe.tracing?
49
+ if Oboe::XTrace.valid?(xtrace)
50
50
 
51
51
  # Assure that we received back a valid X-Trace with the same task_id
52
52
  if task_id == Oboe::XTrace.task_id(xtrace)
@@ -59,6 +59,11 @@ if Oboe::Config[:nethttp][:enabled]
59
59
 
60
60
  opts['HTTPStatus'] = resp.code
61
61
 
62
+ # If we get a redirect, report the location header
63
+ if ((300..308).to_a.include? resp.code.to_i) && resp.header["Location"]
64
+ opts["Location"] = resp.header["Location"]
65
+ end
66
+
62
67
  next resp
63
68
  ensure
64
69
  # Log the info event with the KVs in opts
@@ -0,0 +1,38 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
4
+ module Oboe
5
+ module Inst
6
+ module RestClientRequest
7
+ def self.included(klass)
8
+ ::Oboe::Util.method_alias(klass, :execute, ::RestClient::Request)
9
+ end
10
+
11
+ ##
12
+ # execute_with_oboe
13
+ #
14
+ # The wrapper method for RestClient::Request.execute
15
+ #
16
+ def execute_with_oboe & block
17
+ kvs = {}
18
+ kvs['Backtrace'] = Oboe::API.backtrace if Oboe::Config[:rest_client][:collect_backtraces]
19
+ Oboe::API.log_entry("rest-client", kvs)
20
+
21
+ # The core rest-client call
22
+ execute_without_oboe(&block)
23
+ rescue => e
24
+ Oboe::API.log_exception('rest-client', e)
25
+ raise e
26
+ ensure
27
+ Oboe::API.log_exit("rest-client")
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ if Oboe::Config[:rest_client][:enabled]
34
+ if defined?(::RestClient)
35
+ Oboe.logger.info '[oboe/loading] Instrumenting rest-client' if Oboe::Config[:verbose]
36
+ ::Oboe::Util.send_include(::RestClient::Request, ::Oboe::Inst::RestClientRequest)
37
+ end
38
+ end
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module Oboe
2
5
  module Inst
3
6
  module Sequel
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module Oboe
2
5
  module Inst
3
6
  module TyphoeusRequestOps
@@ -30,11 +33,11 @@ module Oboe
30
33
 
31
34
  uri = URI(response.effective_url)
32
35
  kvs['IsService'] = 1
33
- kvs['RemoteProtocol'] = uri.scheme
36
+ kvs['RemoteProtocol'] = ::Oboe::Util.upcase(uri.scheme)
34
37
  kvs['RemoteHost'] = uri.host
35
38
  kvs['RemotePort'] = uri.port ? uri.port : 80
36
39
  kvs['ServiceArg'] = uri.path
37
- kvs['HTTPMethod'] = options[:method]
40
+ kvs['HTTPMethod'] = ::Oboe::Util.upcase(options[:method])
38
41
  kvs['Blacklisted'] = true if blacklisted
39
42
 
40
43
  # Re-attach net::http edge unless it's blacklisted or if we don't have a
data/lib/oboe/ruby.rb CHANGED
@@ -19,8 +19,13 @@ module Oboe
19
19
  # will instead be detected at load time and initialization is
20
20
  # automatic.
21
21
  def load
22
- Oboe::Loading.load_access_key
23
- Oboe::Inst.load_instrumentation
22
+ # In case some apps call this manually, make sure
23
+ # that the gem is fully loaded and not in no-op
24
+ # mode (e.g. on unsupported platforms etc.)
25
+ if Oboe.loaded
26
+ Oboe::Loading.load_access_key
27
+ Oboe::Inst.load_instrumentation
28
+ end
24
29
  end
25
30
  end
26
31
  end
data/lib/oboe/util.rb CHANGED
@@ -122,6 +122,22 @@ module Oboe
122
122
  end
123
123
  end
124
124
 
125
+ ##
126
+ # upcase
127
+ #
128
+ # Occasionally, we want to send some values in all caps. This is true
129
+ # for things like HTTP scheme or method. This takes anything and does
130
+ # it's best to safely convert it to a string (if needed) and convert it
131
+ # to all uppercase.
132
+ def upcase(o)
133
+ if o.is_a?(String) || o.respond_to?(:to_s)
134
+ o.to_s.upcase
135
+ else
136
+ Oboe.logger.debug "[oboe/debug] Oboe::Util.upcase: could not convert #{o.class}"
137
+ "UNKNOWN"
138
+ end
139
+ end
140
+
125
141
  ##
126
142
  # build_report
127
143
  #
@@ -154,14 +170,16 @@ module Oboe
154
170
  end
155
171
 
156
172
  # Report the instrumented libraries
157
- platform_info['Ruby.Cassandra.Version'] = "Cassandra-#{::Cassandra.VERSION}" if defined?(::Cassandra)
158
- platform_info['Ruby.Dalli.Version'] = "Dalli-#{::Dalli::VERSION}" if defined?(::Dalli)
159
- platform_info['Ruby.Faraday.Version'] = "Faraday-#{::Faraday::VERSION}" if defined?(::Faraday)
160
- platform_info['Ruby.MemCache.Version'] = "MemCache-#{::MemCache::VERSION}" if defined?(::MemCache)
161
- platform_info['Ruby.Moped.Version'] = "Moped-#{::Moped::VERSION}" if defined?(::Moped)
162
- platform_info['Ruby.Redis.Version'] = "Redis-#{::Redis::VERSION}" if defined?(::Redis)
163
- platform_info['Ruby.Resque.Version'] = "Resque-#{::Resque::VERSION}" if defined?(::Resque)
164
- platform_info['Ruby.Typhoeus.Version'] = "Typhoeus-#{::Typhoeus::VERSION}" if defined?(::Typhoeus::VERSION)
173
+ platform_info['Ruby.Cassandra.Version'] = "Cassandra-#{::Cassandra.VERSION}" if defined?(::Cassandra)
174
+ platform_info['Ruby.Dalli.Version'] = "Dalli-#{::Dalli::VERSION}" if defined?(::Dalli)
175
+ platform_info['Ruby.Excon.Version'] = "Excon-#{::Excon::VERSION}" if defined?(::Excon::VERSION)
176
+ platform_info['Ruby.Faraday.Version'] = "Faraday-#{::Faraday::VERSION}" if defined?(::Faraday)
177
+ platform_info['Ruby.MemCache.Version'] = "MemCache-#{::MemCache::VERSION}" if defined?(::MemCache)
178
+ platform_info['Ruby.Moped.Version'] = "Moped-#{::Moped::VERSION}" if defined?(::Moped)
179
+ platform_info['Ruby.Redis.Version'] = "Redis-#{::Redis::VERSION}" if defined?(::Redis)
180
+ platform_info['Ruby.Resque.Version'] = "Resque-#{::Resque::VERSION}" if defined?(::Resque)
181
+ platform_info['Ruby.RestClient.Version'] = "RestClient-#{::RestClient::VERSION}" if defined?(::RestClient::VERSION)
182
+ platform_info['Ruby.Typhoeus.Version'] = "Typhoeus-#{::Typhoeus::VERSION}" if defined?(::Typhoeus::VERSION)
165
183
 
166
184
  # Special case since the Mongo 1.x driver doesn't embed the version number in the gem directly
167
185
  if ::Gem.loaded_specs.key?('mongo')
@@ -189,7 +207,7 @@ module Oboe
189
207
  platform_info['Ruby.AppContainer.Version'] = "Mongrel2-#{::Mongrel2::VERSION}"
190
208
  elsif defined?(::Trinidad)
191
209
  platform_info['Ruby.AppContainer.Version'] = "Trinidad-#{::Trinidad::VERSION}"
192
- elsif defined?(::WEBrick)
210
+ elsif defined?(::WEBrick::VERSION)
193
211
  platform_info['Ruby.AppContainer.Version'] = "WEBrick-#{::WEBrick::VERSION}"
194
212
  else
195
213
  platform_info['Ruby.AppContainer.Version'] = File.basename($PROGRAM_NAME)
data/lib/oboe/version.rb CHANGED
@@ -8,7 +8,7 @@ module Oboe
8
8
  module Version
9
9
  MAJOR = 2
10
10
  MINOR = 7
11
- PATCH = 15
11
+ PATCH = 16
12
12
  BUILD = 1
13
13
 
14
14
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')