traceview 3.3.3 → 3.4.0

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.rb +26 -32
  25. data/lib/traceview/frameworks/rails/inst/action_controller.rb +3 -3
  26. data/lib/traceview/frameworks/rails/inst/action_view.rb +4 -2
  27. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +4 -2
  28. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +4 -2
  29. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +3 -3
  30. data/lib/traceview/frameworks/sinatra.rb +1 -1
  31. data/lib/traceview/frameworks/sinatra/templates.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
@@ -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
@@ -32,11 +32,10 @@ module TraceView
32
32
  report_kvs[:Args] = kv_args
33
33
  end
34
34
  end
35
-
36
35
  report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:resqueclient][:collect_backtraces]
37
36
  report_kvs[:Queue] = klass.instance_variable_get(:@queue)
38
37
  rescue => e
39
- TraceView.logger.debug "[traceview/resque] Error collecting resqueclient KVs: #{e.message}"
38
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
40
39
  end
41
40
 
42
41
  report_kvs
@@ -114,7 +113,8 @@ module TraceView
114
113
  end
115
114
 
116
115
  report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:resqueworker][:collect_backtraces]
117
- rescue
116
+ rescue => e
117
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
118
118
  end
119
119
 
120
120
  TraceView::API.start_trace('resque-worker', nil, report_kvs) do
@@ -16,7 +16,7 @@ module TraceView
16
16
  def execute_with_traceview & block
17
17
  kvs = {}
18
18
  kvs['Backtrace'] = TraceView::API.backtrace if TraceView::Config[:rest_client][:collect_backtraces]
19
- TraceView::API.log_entry("rest-client", kvs)
19
+ TraceView::API.log_entry('rest-client', kvs)
20
20
 
21
21
  # The core rest-client call
22
22
  execute_without_traceview(&block)
@@ -24,7 +24,7 @@ module TraceView
24
24
  TraceView::API.log_exception('rest-client', e)
25
25
  raise e
26
26
  ensure
27
- TraceView::API.log_exit("rest-client")
27
+ TraceView::API.log_exit('rest-client')
28
28
  end
29
29
  end
30
30
  end
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module TraceView
2
5
  class SidekiqClient
3
6
  def collect_kvs(args)
@@ -1,3 +1,6 @@
1
+ # Copyright (c) 2015 AppNeta, Inc.
2
+ # All rights reserved.
3
+
1
4
  module TraceView
2
5
  class SidekiqWorker
3
6
  def collect_kvs(args)
@@ -36,7 +36,8 @@ module TraceView
36
36
  end
37
37
  end
38
38
  end
39
- rescue
39
+ rescue => e
40
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
40
41
  end
41
42
 
42
43
  report_kvs
@@ -178,7 +179,8 @@ module TraceView
178
179
  report_kvs[:Keyspace] = keyspace.to_s
179
180
  report_kvs[:Column_name] = column_name.to_s
180
181
  report_kvs[:Validation_class] = validation_class.to_s
181
- rescue
182
+ rescue => e
183
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
182
184
  end
183
185
 
184
186
  TraceView::API.trace('cassandra', report_kvs) do
@@ -193,7 +195,8 @@ module TraceView
193
195
  begin
194
196
  report_kvs[:Keyspace] = keyspace.to_s
195
197
  report_kvs[:Column_name] = column_name.to_s
196
- rescue
198
+ rescue => e
199
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
197
200
  end
198
201
 
199
202
  TraceView::API.trace('cassandra', report_kvs) do
@@ -207,7 +210,8 @@ module TraceView
207
210
  report_kvs = extract_trace_details(:add_column_family, nil, nil, nil)
208
211
  begin
209
212
  report_kvs[:Cf] = cf_def[:name] if cf_def.is_a?(Hash) && cf_def.key?(:name)
210
- rescue
213
+ rescue => e
214
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
211
215
  end
212
216
 
213
217
  TraceView::API.trace('cassandra', report_kvs) do
@@ -4,9 +4,15 @@
4
4
  module TraceView
5
5
  module Test
6
6
  class << self
7
+ ##
8
+ # load_extras
9
+ #
10
+ # This method simply loads all the extras needed to run
11
+ # tests such as models, jobs etc...
12
+ #
7
13
  def load_extras
8
14
  # If we're using the libraries gemfile (with sidekiq and resque)
9
- if File.basename(ENV['BUNDLE_GEMFILE']) =~ /libraries/
15
+ if TV::Test.gemfile?(:libraries)
10
16
  # Load all of the test workers
11
17
  pattern = File.join(File.dirname(__FILE__), '../../test/jobs/**/', '*.rb')
12
18
  Dir.glob(pattern) do |f|
@@ -15,6 +21,29 @@ module TraceView
15
21
  end
16
22
  end
17
23
  end
24
+
25
+ ##
26
+ # gemfile?
27
+ #
28
+ # Method used to determine under which gemfile we're running.
29
+ # Pass <tt>name</tt> as the gemfile name only (without the
30
+ # .gemfile extension)
31
+ #
32
+ # returns true or fase depending on result
33
+ #
34
+ def gemfile?(name)
35
+ File.basename(ENV['BUNDLE_GEMFILE']) == (name.to_s + '.gemfile')
36
+ end
37
+
38
+ ##
39
+ # gemfile
40
+ #
41
+ # Used to determine under which gemfile we are running. This
42
+ # method will return the name of the active gemfile
43
+ #
44
+ def gemfile
45
+ File.basename(ENV['BUNDLE_GEMFILE']).split('.').first
46
+ end
18
47
  end
19
48
  end
20
49
  end
@@ -218,6 +218,13 @@ module TraceView
218
218
  platform_info['Ruby.Sidekiq.Version'] = "Sidekiq-#{::Sidekiq::VERSION}" if defined?(::Sidekiq::VERSION)
219
219
  platform_info['Ruby.Typhoeus.Version'] = "Typhoeus-#{::Typhoeus::VERSION}" if defined?(::Typhoeus::VERSION)
220
220
 
221
+ if Gem.loaded_specs.key?('delayed_job')
222
+ # Oddly, DelayedJob doesn't have an embedded version number so we get it from the loaded
223
+ # gem specs.
224
+ version = Gem.loaded_specs['delayed_job'].version.to_s
225
+ platform_info['Ruby.DelayedJob.Version'] = "DelayedJob-#{version}"
226
+ end
227
+
221
228
  # Special case since the Mongo 1.x driver doesn't embed the version number in the gem directly
222
229
  if ::Gem.loaded_specs.key?('mongo')
223
230
  platform_info['Ruby.Mongo.Version'] = "Mongo-#{::Gem.loaded_specs['mongo'].version}"
@@ -7,8 +7,8 @@ module TraceView
7
7
  # traceview.gemspec during gem build process
8
8
  module Version
9
9
  MAJOR = 3
10
- MINOR = 3
11
- PATCH = 3
10
+ MINOR = 4
11
+ PATCH = 0
12
12
  BUILD = nil
13
13
 
14
14
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')