traceview 3.8.1-java → 3.8.2-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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +43 -0
  3. data/.travis.yml +5 -4
  4. data/CHANGELOG.md +114 -114
  5. data/Gemfile +5 -6
  6. data/README.md +3 -3
  7. data/Rakefile +18 -21
  8. data/examples/DNT.md +3 -3
  9. data/examples/carrying_context.rb +26 -31
  10. data/examples/instrumenting_metal_controller.rb +1 -1
  11. data/examples/puma_on_heroku_config.rb +3 -3
  12. data/examples/tracing_async_threads.rb +9 -9
  13. data/examples/tracing_background_jobs.rb +5 -7
  14. data/examples/tracing_forked_processes.rb +13 -14
  15. data/examples/unicorn_on_heroku_config.rb +4 -4
  16. data/gemfiles/rails50.gemfile +1 -1
  17. data/lib/joboe_metal.rb +2 -5
  18. data/lib/oboe/backward_compatibility.rb +3 -5
  19. data/lib/oboe_metal.rb +37 -43
  20. data/lib/traceview/api/logging.rb +1 -2
  21. data/lib/traceview/base.rb +3 -0
  22. data/lib/traceview/config.rb +19 -3
  23. data/lib/traceview/frameworks/rails/inst/action_controller.rb +2 -2
  24. data/lib/traceview/frameworks/rails/inst/{action_controller5_api.rb → action_controller_api.rb} +0 -0
  25. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +2 -2
  26. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils5x.rb +3 -4
  27. data/lib/traceview/inst/httpclient.rb +12 -12
  28. data/lib/traceview/inst/mongo2.rb +7 -8
  29. data/lib/traceview/inst/moped.rb +334 -343
  30. data/lib/traceview/inst/rack.rb +14 -2
  31. data/lib/traceview/inst/redis.rb +104 -110
  32. data/lib/traceview/inst/sequel.rb +43 -37
  33. data/lib/traceview/inst/twitter-cassandra.rb +12 -6
  34. data/lib/traceview/support.rb +34 -32
  35. data/lib/traceview/util.rb +7 -4
  36. data/lib/traceview/version.rb +1 -1
  37. data/test/instrumentation/curb_test.rb +2 -24
  38. data/test/instrumentation/httpclient_test.rb +7 -18
  39. data/test/instrumentation/{cassandra_test.rb → twitter-cassandra_test.rb} +32 -0
  40. data/test/minitest_helper.rb +0 -3
  41. data/test/settings +0 -0
  42. data/test/support/avw_handling_test.rb +13 -23
  43. data/test/support/config_test.rb +1 -1
  44. data/test/support/tracing_mode_test.rb +44 -0
  45. metadata +21 -17
@@ -7,15 +7,14 @@ if RUBY_VERSION >= '1.9' && TraceView::Config[:mongo][:enabled]
7
7
  if defined?(::Mongo) && (Gem.loaded_specs['mongo'].version.to_s >= '2.0.0')
8
8
  ::TraceView.logger.info '[traceview/loading] Instrumenting mongo' if TraceView::Config[:verbose]
9
9
 
10
-
11
10
  # Collection Related Operations
12
- COLL_OTHER_OPS = [:create, :drop, :insert_one, :insert_many, :bulk_write, :map_reduce]
11
+ COLL_OTHER_OPS = [:create, :drop, :insert_one, :insert_many, :bulk_write, :map_reduce].freeze
13
12
 
14
13
  # Mongo 2.2 only ops
15
14
  if Mongo::VERSION >= '2.1'
16
- COLL_QUERY_OPS = [ :find, :find_one_and_delete, :find_one_and_update, :find_one_and_replace, :update_one, :update_many, :delete_one, :delete_many, :replace_one ]
15
+ COLL_QUERY_OPS = [:find, :find_one_and_delete, :find_one_and_update, :find_one_and_replace, :update_one, :update_many, :delete_one, :delete_many, :replace_one].freeze
17
16
  else
18
- COLL_QUERY_OPS = [ :find, :update_many, :delete_one ]
17
+ COLL_QUERY_OPS = [:find, :update_many, :delete_one].freeze
19
18
  end
20
19
 
21
20
  COLL_OPS = COLL_QUERY_OPS + COLL_OTHER_OPS
@@ -92,9 +91,9 @@ if RUBY_VERSION >= '1.9' && TraceView::Config[:mongo][:enabled]
92
91
  #
93
92
 
94
93
  # Collection View Related Operations
95
- VIEW_QUERY_OPS = [ :delete_one, :delete_many, :count, :distinct, :find_one_and_delete, :find_one_and_update,
96
- :replace_one, :update_one, :update_many ]
97
- VIEW_OTHER_OPS = [ :aggregate, :map_reduce ]
94
+ VIEW_QUERY_OPS = [:delete_one, :delete_many, :count, :distinct, :find_one_and_delete, :find_one_and_update,
95
+ :replace_one, :update_one, :update_many].freeze
96
+ VIEW_OTHER_OPS = [:aggregate, :map_reduce ].freeze
98
97
  VIEW_OPS = VIEW_QUERY_OPS + VIEW_OTHER_OPS
99
98
 
100
99
  module Mongo
@@ -170,7 +169,7 @@ if RUBY_VERSION >= '1.9' && TraceView::Config[:mongo][:enabled]
170
169
  #
171
170
 
172
171
  # Collection Index View Related Operations
173
- INDEX_OPS = [ :create_one, :create_many, :drop_one, :drop_all ]
172
+ INDEX_OPS = [:create_one, :create_many, :drop_one, :drop_all].freeze
174
173
 
175
174
  module Mongo
176
175
  module Index
@@ -5,471 +5,462 @@ require 'json'
5
5
 
6
6
  module TraceView
7
7
  module Inst
8
+ ##
9
+ # Moped
10
+ #
8
11
  module Moped
9
12
  FLAVOR = :mongodb
10
13
 
11
14
  # Moped::Database
12
- DB_OPS = [:command, :drop]
15
+ DB_OPS = [:command, :drop].freeze
13
16
 
14
17
  # Moped::Indexes
15
- INDEX_OPS = [:create, :drop]
18
+ INDEX_OPS = [:create, :drop].freeze
16
19
 
17
20
  # Moped::Query
18
21
  QUERY_OPS = [:count, :sort, :limit, :distinct, :update, :update_all, :upsert,
19
- :explain, :modify, :remove, :remove_all]
22
+ :explain, :modify, :remove, :remove_all].freeze
20
23
 
21
24
  # Moped::Collection
22
- COLLECTION_OPS = [:drop, :find, :indexes, :insert, :aggregate]
25
+ COLLECTION_OPS = [:drop, :find, :indexes, :insert, :aggregate].freeze
26
+
27
+ ##
28
+ # remote_host
29
+ #
30
+ # This utility method converts the server into a host:port
31
+ # pair for reporting
32
+ #
33
+ def remote_host(server)
34
+ if ::Moped::VERSION < '2.0.0'
35
+ server
36
+ else
37
+ "#{server.address.host}:#{server.address.port}"
38
+ end
39
+ end
23
40
  end
24
- end
25
- end
26
41
 
27
- if defined?(::Moped) && TraceView::Config[:moped][:enabled]
28
- TraceView.logger.info '[traceview/loading] Instrumenting moped' if TraceView::Config[:verbose]
42
+ ##
43
+ # MopedDatabase
44
+ #
45
+ module MopedDatabase
46
+ include TraceView::Inst::Moped
29
47
 
30
- if defined?(::Moped::Database)
31
- module ::Moped
32
- class Database
33
- include TraceView::Inst::Moped
48
+ def self.included(klass)
49
+ TraceView::Inst::Moped::DB_OPS.each do |m|
50
+ ::TraceView::Util.method_alias(klass, m)
51
+ end
52
+ end
53
+
54
+ def extract_trace_details(op)
55
+ report_kvs = {}
56
+ report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
57
+ # FIXME: We're only grabbing the first of potentially multiple servers here
58
+ report_kvs[:RemoteHost] = remote_host(session.cluster.seeds.first)
59
+ report_kvs[:Database] = name
60
+ report_kvs[:QueryOp] = op.to_s
61
+ report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
62
+ rescue StandardError => e
63
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
64
+ ensure
65
+ return report_kvs
66
+ end
34
67
 
35
- def extract_trace_details(op)
36
- report_kvs = {}
68
+ def command_with_traceview(command)
69
+ if TraceView.tracing? && !TraceView.layer_op && command.key?(:mapreduce)
37
70
  begin
38
- report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
39
- # FIXME: We're only grabbing the first of potentially multiple servers here
40
- first = session.cluster.seeds.first
41
- if ::Moped::VERSION < '2.0.0'
42
- report_kvs[:RemoteHost] = first
43
- else
44
- report_kvs[:RemoteHost] = "#{first.address.host}:#{first.address.port}"
45
- end
46
- report_kvs[:Database] = name
47
- report_kvs[:QueryOp] = op.to_s
48
- report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
49
- rescue StandardError => e
50
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
71
+ report_kvs = extract_trace_details(:map_reduce)
72
+ report_kvs[:Map_Function] = command[:map]
73
+ report_kvs[:Reduce_Function] = command[:reduce]
74
+ rescue => e
75
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
51
76
  end
52
- report_kvs
53
- end
54
-
55
- def command_with_traceview(command)
56
- if TraceView.tracing? && !TraceView.layer_op && command.key?(:mapreduce)
57
- begin
58
- report_kvs = extract_trace_details(:map_reduce)
59
- report_kvs[:Map_Function] = command[:map]
60
- report_kvs[:Reduce_Function] = command[:reduce]
61
- rescue => e
62
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
63
- end
64
-
65
- TraceView::API.trace(:mongo, report_kvs) do
66
- command_without_traceview(command)
67
- end
68
- else
77
+
78
+ TraceView::API.trace(:mongo, report_kvs) do
69
79
  command_without_traceview(command)
70
80
  end
81
+ else
82
+ command_without_traceview(command)
71
83
  end
84
+ end
72
85
 
73
- def drop_with_traceview
74
- return drop_without_traceview unless TraceView.tracing?
86
+ def drop_with_traceview
87
+ return drop_without_traceview unless TraceView.tracing?
75
88
 
76
- report_kvs = extract_trace_details(:drop_database)
89
+ report_kvs = extract_trace_details(:drop_database)
77
90
 
78
- TraceView::API.trace(:mongo, report_kvs) do
79
- drop_without_traceview
80
- end
81
- end
82
-
83
- TraceView::Inst::Moped::DB_OPS.each do |m|
84
- if method_defined?(m)
85
- class_eval "alias #{m}_without_traceview #{m}"
86
- class_eval "alias #{m} #{m}_with_traceview"
87
- else TraceView.logger.warn "[traceview/loading] Couldn't properly instrument moped (#{m}). Partial traces may occur."
88
- end
91
+ TraceView::API.trace(:mongo, report_kvs) do
92
+ drop_without_traceview
89
93
  end
90
94
  end
91
95
  end
92
- end
93
96
 
94
- if defined?(::Moped::Indexes)
95
- module ::Moped
96
- class Indexes
97
- include TraceView::Inst::Moped
97
+ ##
98
+ # MopedIndexes
99
+ #
100
+ module MopedIndexes
101
+ include TraceView::Inst::Moped
98
102
 
99
- def extract_trace_details(op)
100
- report_kvs = {}
101
- begin
102
- report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
103
-
104
- # FIXME: We're only grabbing the first of potentially multiple servers here
105
- first = database.session.cluster.seeds.first
106
- if ::Moped::VERSION < '2.0.0'
107
- report_kvs[:RemoteHost] = first
108
- else
109
- report_kvs[:RemoteHost] = "#{first.address.host}:#{first.address.port}"
110
- end
111
- report_kvs[:Database] = database.name
112
- report_kvs[:QueryOp] = op.to_s
113
- report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
114
- rescue StandardError => e
115
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
116
- end
117
- report_kvs
103
+ def self.included(klass)
104
+ TraceView::Inst::Moped::INDEX_OPS.each do |m|
105
+ ::TraceView::Util.method_alias(klass, m)
118
106
  end
107
+ end
119
108
 
120
- def create_with_traceview(key, options = {})
121
- return create_without_traceview(key, options) unless TraceView.tracing?
109
+ def extract_trace_details(op)
110
+ report_kvs = {}
111
+ report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
122
112
 
123
- begin
124
- # We report :create_index here to be consistent
125
- # with other mongo implementations
126
- report_kvs = extract_trace_details(:create_index)
127
- report_kvs[:Key] = key.to_json
128
- report_kvs[:Options] = options.to_json
129
- rescue StandardError => e
130
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
131
- end
113
+ # FIXME: We're only grabbing the first of potentially multiple servers here
114
+ first = database.session.cluster.seeds.first
115
+ if ::Moped::VERSION < '2.0.0'
116
+ report_kvs[:RemoteHost] = first
117
+ else
118
+ report_kvs[:RemoteHost] = "#{first.address.host}:#{first.address.port}"
119
+ end
120
+ report_kvs[:Database] = database.name
121
+ report_kvs[:QueryOp] = op.to_s
122
+ report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
123
+ rescue StandardError => e
124
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
125
+ ensure
126
+ return report_kvs
127
+ end
132
128
 
133
- TraceView::API.trace(:mongo, report_kvs, :create_index) do
134
- create_without_traceview(key, options = {})
135
- end
129
+ def create_with_traceview(key, options = {})
130
+ return create_without_traceview(key, options) unless TraceView.tracing?
131
+
132
+ begin
133
+ # We report :create_index here to be consistent
134
+ # with other mongo implementations
135
+ report_kvs = extract_trace_details(:create_index)
136
+ report_kvs[:Key] = key.to_json
137
+ report_kvs[:Options] = options.to_json
138
+ rescue StandardError => e
139
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
136
140
  end
137
141
 
138
- def drop_with_traceview(key = nil)
139
- return drop_without_traceview(key) unless TraceView.tracing?
142
+ TraceView::API.trace(:mongo, report_kvs, :create_index) do
143
+ create_without_traceview(key, options = {})
144
+ end
145
+ end
140
146
 
141
- begin
142
- # We report :drop_indexes here to be consistent
143
- # with other mongo implementations
144
- report_kvs = extract_trace_details(:drop_indexes)
145
- report_kvs[:Key] = key.nil? ? :all : key.to_json
146
- rescue StandardError => e
147
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
148
- end
147
+ def drop_with_traceview(key = nil)
148
+ return drop_without_traceview(key) unless TraceView.tracing?
149
149
 
150
- TraceView::API.trace(:mongo, report_kvs) do
151
- drop_without_traceview(key = nil)
152
- end
150
+ begin
151
+ # We report :drop_indexes here to be consistent
152
+ # with other mongo implementations
153
+ report_kvs = extract_trace_details(:drop_indexes)
154
+ report_kvs[:Key] = key.nil? ? :all : key.to_json
155
+ rescue StandardError => e
156
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
153
157
  end
154
158
 
155
- TraceView::Inst::Moped::INDEX_OPS.each do |m|
156
- if method_defined?(m)
157
- class_eval "alias #{m}_without_traceview #{m}"
158
- class_eval "alias #{m} #{m}_with_traceview"
159
- else TraceView.logger.warn "[traceview/loading] Couldn't properly instrument moped (#{m}). Partial traces may occur."
160
- end
159
+ TraceView::API.trace(:mongo, report_kvs) do
160
+ drop_without_traceview(key = nil)
161
161
  end
162
162
  end
163
163
  end
164
- end
165
164
 
166
- if defined?(::Moped::Query)
167
- module ::Moped
168
- class Query
169
- include TraceView::Inst::Moped
165
+ ##
166
+ # MopedQuery
167
+ #
168
+ module MopedQuery
169
+ include TraceView::Inst::Moped
170
170
 
171
- def extract_trace_details(op)
172
- report_kvs = {}
173
- begin
174
- report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
175
- # FIXME: We're only grabbing the first of potentially multiple servers here
176
- first = collection.database.session.cluster.seeds.first
177
- if ::Moped::VERSION < '2.0.0'
178
- report_kvs[:RemoteHost] = first
179
- else
180
- report_kvs[:RemoteHost] = "#{first.address.host}:#{first.address.port}"
181
- end
182
- report_kvs[:Database] = collection.database.name
183
- report_kvs[:Collection] = collection.name
184
- report_kvs[:QueryOp] = op.to_s
185
- report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
186
- rescue StandardError => e
187
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
188
- end
189
- report_kvs
171
+ def self.included(klass)
172
+ TraceView::Inst::Moped::QUERY_OPS.each do |m|
173
+ ::TraceView::Util.method_alias(klass, m)
190
174
  end
175
+ end
191
176
 
192
- def count_with_traceview
193
- return count_without_traceview unless TraceView.tracing?
177
+ def extract_trace_details(op)
178
+ report_kvs = {}
179
+ report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
180
+ # FIXME: We're only grabbing the first of potentially multiple servers here
181
+ first = collection.database.session.cluster.seeds.first
182
+ report_kvs[:RemoteHost] = remote_host(first)
183
+ report_kvs[:Database] = collection.database.name
184
+ report_kvs[:Collection] = collection.name
185
+ report_kvs[:QueryOp] = op.to_s
186
+ report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
187
+ rescue StandardError => e
188
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
189
+ ensure
190
+ return report_kvs
191
+ end
194
192
 
195
- begin
196
- report_kvs = extract_trace_details(:count)
197
- report_kvs[:Query] = selector.empty? ? :all : selector.to_json
198
- rescue StandardError => e
199
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
200
- end
193
+ def count_with_traceview
194
+ return count_without_traceview unless TraceView.tracing?
201
195
 
202
- TraceView::API.trace(:mongo, report_kvs) do
203
- count_without_traceview
204
- end
196
+ begin
197
+ report_kvs = extract_trace_details(:count)
198
+ report_kvs[:Query] = selector.empty? ? :all : selector.to_json
199
+ rescue StandardError => e
200
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
205
201
  end
206
202
 
207
- def sort_with_traceview(sort)
208
- return sort_without_traceview(sort) unless TraceView.tracing?
203
+ TraceView::API.trace(:mongo, report_kvs) do
204
+ count_without_traceview
205
+ end
206
+ end
209
207
 
210
- begin
211
- report_kvs = extract_trace_details(:sort)
212
- report_kvs[:Query] = selector.empty? ? :all : selector.to_json
213
- report_kvs[:Order] = sort.to_s
214
- rescue StandardError => e
215
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
216
- end
208
+ def sort_with_traceview(sort)
209
+ return sort_without_traceview(sort) unless TraceView.tracing?
217
210
 
218
- TraceView::API.trace(:mongo, report_kvs) do
219
- sort_without_traceview(sort)
220
- end
211
+ begin
212
+ report_kvs = extract_trace_details(:sort)
213
+ report_kvs[:Query] = selector.empty? ? :all : selector.to_json
214
+ report_kvs[:Order] = sort.to_s
215
+ rescue StandardError => e
216
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
221
217
  end
222
218
 
223
- def limit_with_traceview(limit)
224
- if TraceView.tracing? && !TraceView.tracing_layer_op?(:explain)
225
- begin
226
- report_kvs = extract_trace_details(:limit)
227
- report_kvs[:Query] = selector.empty? ? :all : selector.to_json
228
- report_kvs[:Limit] = limit.to_s
229
- rescue StandardError => e
230
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
231
- end
232
-
233
- TraceView::API.trace(:mongo, report_kvs) do
234
- limit_without_traceview(limit)
235
- end
236
- else
237
- limit_without_traceview(limit)
238
- end
219
+ TraceView::API.trace(:mongo, report_kvs) do
220
+ sort_without_traceview(sort)
239
221
  end
222
+ end
240
223
 
241
- def distinct_with_traceview(key)
242
- return distinct_without_traceview(key) unless TraceView.tracing?
243
-
224
+ def limit_with_traceview(limit)
225
+ if TraceView.tracing? && !TraceView.tracing_layer_op?(:explain)
244
226
  begin
245
- report_kvs = extract_trace_details(:distinct)
227
+ report_kvs = extract_trace_details(:limit)
246
228
  report_kvs[:Query] = selector.empty? ? :all : selector.to_json
247
- report_kvs[:Key] = key.to_s
229
+ report_kvs[:Limit] = limit.to_s
248
230
  rescue StandardError => e
249
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
231
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
250
232
  end
251
233
 
252
234
  TraceView::API.trace(:mongo, report_kvs) do
253
- distinct_without_traceview(key)
235
+ limit_without_traceview(limit)
254
236
  end
237
+ else
238
+ limit_without_traceview(limit)
255
239
  end
240
+ end
256
241
 
257
- def update_with_traceview(change, flags = nil)
258
- if TraceView.tracing? && !TraceView.tracing_layer_op?([:update_all, :upsert])
259
- begin
260
- report_kvs = extract_trace_details(:update)
261
- report_kvs[:Flags] = flags.to_s if flags
262
- report_kvs[:Update_Document] = change.to_json
263
- rescue StandardError => e
264
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
265
- end
266
-
267
- TraceView::API.trace(:mongo, report_kvs) do
268
- update_without_traceview(change, flags)
269
- end
270
- else
271
- update_without_traceview(change, flags)
272
- end
242
+ def distinct_with_traceview(key)
243
+ return distinct_without_traceview(key) unless TraceView.tracing?
244
+
245
+ begin
246
+ report_kvs = extract_trace_details(:distinct)
247
+ report_kvs[:Query] = selector.empty? ? :all : selector.to_json
248
+ report_kvs[:Key] = key.to_s
249
+ rescue StandardError => e
250
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
273
251
  end
274
252
 
275
- def update_all_with_traceview(change)
276
- return update_all_without_traceview(change) unless TraceView.tracing?
253
+ TraceView::API.trace(:mongo, report_kvs) do
254
+ distinct_without_traceview(key)
255
+ end
256
+ end
277
257
 
258
+ def update_with_traceview(change, flags = nil)
259
+ if TraceView.tracing? && !TraceView.tracing_layer_op?([:update_all, :upsert])
278
260
  begin
279
- report_kvs = extract_trace_details(:update_all)
261
+ report_kvs = extract_trace_details(:update)
262
+ report_kvs[:Flags] = flags.to_s if flags
280
263
  report_kvs[:Update_Document] = change.to_json
281
264
  rescue StandardError => e
282
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
265
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
283
266
  end
284
267
 
285
- TraceView::API.trace(:mongo, report_kvs, :update_all) do
286
- update_all_without_traceview(change)
268
+ TraceView::API.trace(:mongo, report_kvs) do
269
+ update_without_traceview(change, flags)
287
270
  end
271
+ else
272
+ update_without_traceview(change, flags)
288
273
  end
274
+ end
289
275
 
290
- def upsert_with_traceview(change)
291
- return upsert_without_traceview(change) unless TraceView.tracing?
276
+ def update_all_with_traceview(change)
277
+ return update_all_without_traceview(change) unless TraceView.tracing?
292
278
 
293
- begin
294
- report_kvs = extract_trace_details(:upsert)
295
- report_kvs[:Query] = selector.to_json
296
- report_kvs[:Update_Document] = change.to_json
297
- rescue StandardError => e
298
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
299
- end
279
+ begin
280
+ report_kvs = extract_trace_details(:update_all)
281
+ report_kvs[:Update_Document] = change.to_json
282
+ rescue StandardError => e
283
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
284
+ end
300
285
 
301
- TraceView::API.trace(:mongo, report_kvs, :upsert) do
302
- upsert_without_traceview(change)
303
- end
286
+ TraceView::API.trace(:mongo, report_kvs, :update_all) do
287
+ update_all_without_traceview(change)
304
288
  end
289
+ end
305
290
 
306
- def explain_with_traceview
307
- return explain_without_traceview unless TraceView.tracing?
291
+ def upsert_with_traceview(change)
292
+ return upsert_without_traceview(change) unless TraceView.tracing?
308
293
 
309
- begin
310
- report_kvs = extract_trace_details(:explain)
311
- report_kvs[:Query] = selector.empty? ? :all : selector.to_json
312
- rescue StandardError => e
313
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
314
- end
294
+ begin
295
+ report_kvs = extract_trace_details(:upsert)
296
+ report_kvs[:Query] = selector.to_json
297
+ report_kvs[:Update_Document] = change.to_json
298
+ rescue StandardError => e
299
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
300
+ end
315
301
 
316
- TraceView::API.trace(:mongo, report_kvs, :explain) do
317
- explain_without_traceview
318
- end
302
+ TraceView::API.trace(:mongo, report_kvs, :upsert) do
303
+ upsert_without_traceview(change)
319
304
  end
305
+ end
320
306
 
321
- def modify_with_traceview(change, options = {})
322
- return modify_without_traceview(change, options) unless TraceView.tracing?
307
+ def explain_with_traceview
308
+ return explain_without_traceview unless TraceView.tracing?
323
309
 
324
- begin
325
- report_kvs = extract_trace_details(:modify)
326
- report_kvs[:Update_Document] = selector.empty? ? :all : selector.to_json
327
- report_kvs[:Change] = change.to_json
328
- report_kvs[:Options] = options.to_json
329
- rescue StandardError => e
330
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
331
- end
310
+ begin
311
+ report_kvs = extract_trace_details(:explain)
312
+ report_kvs[:Query] = selector.empty? ? :all : selector.to_json
313
+ rescue StandardError => e
314
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
315
+ end
332
316
 
333
- TraceView::API.trace(:mongo, report_kvs) do
334
- modify_without_traceview(change, options)
335
- end
317
+ TraceView::API.trace(:mongo, report_kvs, :explain) do
318
+ explain_without_traceview
336
319
  end
320
+ end
337
321
 
338
- def remove_with_traceview
339
- return remove_without_traceview unless TraceView.tracing?
322
+ def modify_with_traceview(change, options = {})
323
+ return modify_without_traceview(change, options) unless TraceView.tracing?
340
324
 
341
- begin
342
- report_kvs = extract_trace_details(:remove)
343
- report_kvs[:Query] = selector.to_json
344
- rescue StandardError => e
345
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
346
- end
325
+ begin
326
+ report_kvs = extract_trace_details(:modify)
327
+ report_kvs[:Update_Document] = selector.empty? ? :all : selector.to_json
328
+ report_kvs[:Change] = change.to_json
329
+ report_kvs[:Options] = options.to_json
330
+ rescue StandardError => e
331
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
332
+ end
347
333
 
348
- TraceView::API.trace(:mongo, report_kvs) do
349
- remove_without_traceview
350
- end
334
+ TraceView::API.trace(:mongo, report_kvs) do
335
+ modify_without_traceview(change, options)
351
336
  end
337
+ end
352
338
 
353
- def remove_all_with_traceview
354
- return remove_all_without_traceview unless TraceView.tracing?
339
+ def remove_with_traceview
340
+ return remove_without_traceview unless TraceView.tracing?
355
341
 
356
- begin
357
- report_kvs = extract_trace_details(:remove_all)
358
- report_kvs[:Query] = selector.to_json
359
- rescue StandardError => e
360
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
361
- end
342
+ begin
343
+ report_kvs = extract_trace_details(:remove)
344
+ report_kvs[:Query] = selector.to_json
345
+ rescue StandardError => e
346
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
347
+ end
362
348
 
363
- TraceView::API.trace(:mongo, report_kvs) do
364
- remove_all_without_traceview
365
- end
349
+ TraceView::API.trace(:mongo, report_kvs) do
350
+ remove_without_traceview
351
+ end
352
+ end
353
+
354
+ def remove_all_with_traceview
355
+ return remove_all_without_traceview unless TraceView.tracing?
356
+
357
+ begin
358
+ report_kvs = extract_trace_details(:remove_all)
359
+ report_kvs[:Query] = selector.to_json
360
+ rescue StandardError => e
361
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
366
362
  end
367
363
 
368
- TraceView::Inst::Moped::QUERY_OPS.each do |m|
369
- if method_defined?(m)
370
- class_eval "alias #{m}_without_traceview #{m}"
371
- class_eval "alias #{m} #{m}_with_traceview"
372
- else TraceView.logger.warn "[traceview/loading] Couldn't properly instrument moped (#{m}). Partial traces may occur."
373
- end
364
+ TraceView::API.trace(:mongo, report_kvs) do
365
+ remove_all_without_traceview
374
366
  end
375
367
  end
376
368
  end
377
- end # ::Moped::Query
378
369
 
379
- if defined?(::Moped::Collection)
380
- module ::Moped
381
- class Collection
382
- include TraceView::Inst::Moped
370
+ ##
371
+ # MopedCollection
372
+ #
373
+ module MopedCollection
374
+ include TraceView::Inst::Moped
383
375
 
384
- def extract_trace_details(op)
385
- report_kvs = {}
386
- begin
387
- report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
388
- # FIXME: We're only grabbing the first of potentially multiple servers here
389
- first = database.session.cluster.seeds.first
390
- if ::Moped::VERSION < '2.0.0'
391
- report_kvs[:RemoteHost] = first
392
- else
393
- report_kvs[:RemoteHost] = "#{first.address.host}:#{first.address.port}"
394
- end
395
- report_kvs[:Database] = database.name
396
- report_kvs[:Collection] = name
397
- report_kvs[:QueryOp] = op.to_s
398
- report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
399
- rescue StandardError => e
400
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
401
- end
402
- report_kvs
376
+ def self.included(klass)
377
+ TraceView::Inst::Moped::COLLECTION_OPS.each do |m|
378
+ ::TraceView::Util.method_alias(klass, m)
403
379
  end
380
+ end
404
381
 
405
- def drop_with_traceview
406
- return drop_without_traceview unless TraceView.tracing?
382
+ def extract_trace_details(op)
383
+ report_kvs = {}
384
+ report_kvs[:Flavor] = TraceView::Inst::Moped::FLAVOR
385
+ # FIXME: We're only grabbing the first of potentially multiple servers here
386
+ report_kvs[:RemoteHost] = remote_host(database.session.cluster.seeds.first)
387
+ report_kvs[:Database] = database.name
388
+ report_kvs[:Collection] = name
389
+ report_kvs[:QueryOp] = op.to_s
390
+ report_kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:moped][:collect_backtraces]
391
+ rescue StandardError => e
392
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
393
+ ensure
394
+ return report_kvs
395
+ end
407
396
 
408
- # We report :drop_collection here to be consistent
409
- # with other mongo implementations
410
- report_kvs = extract_trace_details(:drop_collection)
397
+ def drop_with_traceview
398
+ return drop_without_traceview unless TraceView.tracing?
411
399
 
412
- TraceView::API.trace(:mongo, report_kvs) do
413
- drop_without_traceview
414
- end
400
+ # We report :drop_collection here to be consistent
401
+ # with other mongo implementations
402
+ report_kvs = extract_trace_details(:drop_collection)
403
+
404
+ TraceView::API.trace(:mongo, report_kvs) do
405
+ drop_without_traceview
415
406
  end
407
+ end
416
408
 
417
- def find_with_traceview(selector = {})
418
- return find_without_traceview(selector) unless TraceView.tracing?
409
+ def find_with_traceview(selector = {})
410
+ return find_without_traceview(selector) unless TraceView.tracing?
419
411
 
420
- begin
421
- report_kvs = extract_trace_details(:find)
422
- report_kvs[:Query] = selector.empty? ? 'all' : selector.to_json
423
- rescue StandardError => e
424
- TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if TraceView::Config[:verbose]
425
- end
412
+ begin
413
+ report_kvs = extract_trace_details(:find)
414
+ report_kvs[:Query] = selector.empty? ? 'all' : selector.to_json
415
+ rescue StandardError => e
416
+ TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
417
+ end
426
418
 
427
- TraceView::API.trace(:mongo, report_kvs) do
428
- find_without_traceview(selector)
429
- end
419
+ TraceView::API.trace(:mongo, report_kvs) do
420
+ find_without_traceview(selector)
430
421
  end
422
+ end
431
423
 
432
- def indexes_with_traceview
433
- return indexes_without_traceview unless TraceView.tracing?
424
+ def indexes_with_traceview
425
+ return indexes_without_traceview unless TraceView.tracing?
434
426
 
435
- report_kvs = extract_trace_details(:indexes)
427
+ report_kvs = extract_trace_details(:indexes)
436
428
 
437
- TraceView::API.trace(:mongo, report_kvs) do
438
- indexes_without_traceview
439
- end
429
+ TraceView::API.trace(:mongo, report_kvs) do
430
+ indexes_without_traceview
440
431
  end
432
+ end
441
433
 
442
- def insert_with_traceview(documents, flags = nil)
443
- if TraceView.tracing? && !TraceView.tracing_layer_op?(:create_index)
444
- report_kvs = extract_trace_details(:insert)
434
+ def insert_with_traceview(documents, flags = nil)
435
+ if TraceView.tracing? && !TraceView.tracing_layer_op?(:create_index)
436
+ report_kvs = extract_trace_details(:insert)
445
437
 
446
- TraceView::API.trace(:mongo, report_kvs) do
447
- insert_without_traceview(documents, flags)
448
- end
449
- else
438
+ TraceView::API.trace(:mongo, report_kvs) do
450
439
  insert_without_traceview(documents, flags)
451
440
  end
441
+ else
442
+ insert_without_traceview(documents, flags)
452
443
  end
444
+ end
453
445
 
454
- def aggregate_with_traceview(*pipeline)
455
- return aggregate_without_traceview(*pipeline) unless TraceView.tracing?
446
+ def aggregate_with_traceview(*pipeline)
447
+ return aggregate_without_traceview(*pipeline) unless TraceView.tracing?
456
448
 
457
- report_kvs = extract_trace_details(:aggregate)
458
- report_kvs[:Query] = pipeline
449
+ report_kvs = extract_trace_details(:aggregate)
450
+ report_kvs[:Query] = pipeline
459
451
 
460
- TraceView::API.trace(:mongo, report_kvs) do
461
- aggregate_without_traceview(pipeline)
462
- end
463
- end
464
-
465
- TraceView::Inst::Moped::COLLECTION_OPS.each do |m|
466
- if method_defined?(m)
467
- class_eval "alias #{m}_without_traceview #{m}"
468
- class_eval "alias #{m} #{m}_with_traceview"
469
- else TraceView.logger.warn "[traceview/loading] Couldn't properly instrument moped (#{m}). Partial traces may occur."
470
- end
452
+ TraceView::API.trace(:mongo, report_kvs) do
453
+ aggregate_without_traceview(pipeline)
471
454
  end
472
455
  end
473
456
  end
474
- end # ::Moped::Collection
457
+ end
458
+ end
459
+
460
+ if defined?(::Moped) && TraceView::Config[:moped][:enabled]
461
+ ::TraceView.logger.info '[traceview/loading] Instrumenting moped' if TraceView::Config[:verbose]
462
+ ::TraceView::Util.send_include(::Moped::Database, ::TraceView::Inst::MopedDatabase)
463
+ ::TraceView::Util.send_include(::Moped::Collection, ::TraceView::Inst::MopedCollection)
464
+ ::TraceView::Util.send_include(::Moped::Query, ::TraceView::Inst::MopedQuery)
465
+ ::TraceView::Util.send_include(::Moped::Indexes, ::TraceView::Inst::MopedIndexes)
475
466
  end