oboe 2.7.15.1-java → 2.7.16.1-java

Sign up to get free protection for your applications and to get access to all the features.
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('.')