traceview 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rubocop.yml +5 -0
  4. data/.travis.yml +58 -0
  5. data/Appraisals +10 -0
  6. data/CHANGELOG.md +490 -0
  7. data/CONFIG.md +16 -0
  8. data/Gemfile +95 -0
  9. data/LICENSE +199 -0
  10. data/README.md +380 -0
  11. data/Rakefile +109 -0
  12. data/examples/DNT.md +35 -0
  13. data/examples/carrying_context.rb +225 -0
  14. data/examples/instrumenting_metal_controller.rb +8 -0
  15. data/examples/puma_on_heroku_config.rb +17 -0
  16. data/examples/tracing_async_threads.rb +125 -0
  17. data/examples/tracing_background_jobs.rb +52 -0
  18. data/examples/tracing_forked_processes.rb +100 -0
  19. data/examples/unicorn_on_heroku_config.rb +28 -0
  20. data/ext/oboe_metal/extconf.rb +61 -0
  21. data/ext/oboe_metal/noop/noop.c +7 -0
  22. data/ext/oboe_metal/src/bson/bson.h +221 -0
  23. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  24. data/ext/oboe_metal/src/oboe.h +275 -0
  25. data/ext/oboe_metal/src/oboe.hpp +352 -0
  26. data/ext/oboe_metal/src/oboe_wrap.cxx +3886 -0
  27. data/ext/oboe_metal/tests/test.rb +11 -0
  28. data/gemfiles/mongo.gemfile +33 -0
  29. data/gemfiles/moped.gemfile +33 -0
  30. data/get_version.rb +5 -0
  31. data/init.rb +4 -0
  32. data/lib/joboe_metal.rb +206 -0
  33. data/lib/oboe.rb +7 -0
  34. data/lib/oboe/README +2 -0
  35. data/lib/oboe/backward_compatibility.rb +59 -0
  36. data/lib/oboe/inst/rack.rb +11 -0
  37. data/lib/oboe_metal.rb +151 -0
  38. data/lib/rails/generators/traceview/install_generator.rb +76 -0
  39. data/lib/rails/generators/traceview/templates/traceview_initializer.rb +159 -0
  40. data/lib/traceview.rb +62 -0
  41. data/lib/traceview/api.rb +18 -0
  42. data/lib/traceview/api/layerinit.rb +51 -0
  43. data/lib/traceview/api/logging.rb +209 -0
  44. data/lib/traceview/api/memcache.rb +31 -0
  45. data/lib/traceview/api/profiling.rb +50 -0
  46. data/lib/traceview/api/tracing.rb +135 -0
  47. data/lib/traceview/api/util.rb +121 -0
  48. data/lib/traceview/base.rb +225 -0
  49. data/lib/traceview/config.rb +238 -0
  50. data/lib/traceview/frameworks/grape.rb +97 -0
  51. data/lib/traceview/frameworks/padrino.rb +64 -0
  52. data/lib/traceview/frameworks/padrino/templates.rb +58 -0
  53. data/lib/traceview/frameworks/rails.rb +145 -0
  54. data/lib/traceview/frameworks/rails/helpers/rum/rum_ajax_header.js.erb +5 -0
  55. data/lib/traceview/frameworks/rails/helpers/rum/rum_footer.js.erb +1 -0
  56. data/lib/traceview/frameworks/rails/helpers/rum/rum_header.js.erb +3 -0
  57. data/lib/traceview/frameworks/rails/inst/action_controller.rb +216 -0
  58. data/lib/traceview/frameworks/rails/inst/action_view.rb +56 -0
  59. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +54 -0
  60. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +48 -0
  61. data/lib/traceview/frameworks/rails/inst/active_record.rb +24 -0
  62. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  63. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  64. data/lib/traceview/frameworks/rails/inst/connection_adapters/oracle.rb +18 -0
  65. data/lib/traceview/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  66. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +117 -0
  67. data/lib/traceview/frameworks/sinatra.rb +95 -0
  68. data/lib/traceview/frameworks/sinatra/templates.rb +56 -0
  69. data/lib/traceview/inst/cassandra.rb +279 -0
  70. data/lib/traceview/inst/dalli.rb +86 -0
  71. data/lib/traceview/inst/em-http-request.rb +99 -0
  72. data/lib/traceview/inst/excon.rb +111 -0
  73. data/lib/traceview/inst/faraday.rb +73 -0
  74. data/lib/traceview/inst/http.rb +87 -0
  75. data/lib/traceview/inst/httpclient.rb +173 -0
  76. data/lib/traceview/inst/memcache.rb +102 -0
  77. data/lib/traceview/inst/memcached.rb +94 -0
  78. data/lib/traceview/inst/mongo.rb +238 -0
  79. data/lib/traceview/inst/moped.rb +474 -0
  80. data/lib/traceview/inst/rack.rb +122 -0
  81. data/lib/traceview/inst/redis.rb +271 -0
  82. data/lib/traceview/inst/resque.rb +192 -0
  83. data/lib/traceview/inst/rest-client.rb +38 -0
  84. data/lib/traceview/inst/sequel.rb +162 -0
  85. data/lib/traceview/inst/typhoeus.rb +102 -0
  86. data/lib/traceview/instrumentation.rb +21 -0
  87. data/lib/traceview/loading.rb +94 -0
  88. data/lib/traceview/logger.rb +41 -0
  89. data/lib/traceview/method_profiling.rb +84 -0
  90. data/lib/traceview/ruby.rb +36 -0
  91. data/lib/traceview/support.rb +113 -0
  92. data/lib/traceview/thread_local.rb +26 -0
  93. data/lib/traceview/util.rb +250 -0
  94. data/lib/traceview/version.rb +16 -0
  95. data/lib/traceview/xtrace.rb +90 -0
  96. data/test/frameworks/apps/grape_nested.rb +30 -0
  97. data/test/frameworks/apps/grape_simple.rb +24 -0
  98. data/test/frameworks/apps/padrino_simple.rb +45 -0
  99. data/test/frameworks/apps/sinatra_simple.rb +24 -0
  100. data/test/frameworks/grape_test.rb +142 -0
  101. data/test/frameworks/padrino_test.rb +30 -0
  102. data/test/frameworks/sinatra_test.rb +30 -0
  103. data/test/instrumentation/cassandra_test.rb +380 -0
  104. data/test/instrumentation/dalli_test.rb +171 -0
  105. data/test/instrumentation/em_http_request_test.rb +86 -0
  106. data/test/instrumentation/excon_test.rb +207 -0
  107. data/test/instrumentation/faraday_test.rb +235 -0
  108. data/test/instrumentation/http_test.rb +140 -0
  109. data/test/instrumentation/httpclient_test.rb +296 -0
  110. data/test/instrumentation/memcache_test.rb +251 -0
  111. data/test/instrumentation/memcached_test.rb +226 -0
  112. data/test/instrumentation/mongo_test.rb +462 -0
  113. data/test/instrumentation/moped_test.rb +496 -0
  114. data/test/instrumentation/rack_test.rb +116 -0
  115. data/test/instrumentation/redis_hashes_test.rb +265 -0
  116. data/test/instrumentation/redis_keys_test.rb +318 -0
  117. data/test/instrumentation/redis_lists_test.rb +310 -0
  118. data/test/instrumentation/redis_misc_test.rb +160 -0
  119. data/test/instrumentation/redis_sets_test.rb +293 -0
  120. data/test/instrumentation/redis_sortedsets_test.rb +325 -0
  121. data/test/instrumentation/redis_strings_test.rb +333 -0
  122. data/test/instrumentation/resque_test.rb +62 -0
  123. data/test/instrumentation/rest-client_test.rb +294 -0
  124. data/test/instrumentation/sequel_mysql2_test.rb +326 -0
  125. data/test/instrumentation/sequel_mysql_test.rb +326 -0
  126. data/test/instrumentation/sequel_pg_test.rb +330 -0
  127. data/test/instrumentation/typhoeus_test.rb +285 -0
  128. data/test/minitest_helper.rb +187 -0
  129. data/test/profiling/method_test.rb +198 -0
  130. data/test/servers/rackapp_8101.rb +22 -0
  131. data/test/support/backcompat_test.rb +269 -0
  132. data/test/support/config_test.rb +128 -0
  133. data/test/support/dnt_test.rb +73 -0
  134. data/test/support/liboboe_settings_test.rb +104 -0
  135. data/test/support/xtrace_test.rb +35 -0
  136. data/traceview.gemspec +29 -0
  137. metadata +250 -0
@@ -0,0 +1,496 @@
1
+ require 'minitest_helper'
2
+
3
+ if RUBY_VERSION >= '1.9.3'
4
+ # Moped is tested against MRI 1.9.3, 2.0.0, and JRuby (1.9).
5
+
6
+ describe "Moped" do
7
+ before do
8
+ clear_all_traces
9
+ @session = Moped::Session.new([ "127.0.0.1:27017" ])
10
+ @session.use :moped_test
11
+ @users = @session[:users]
12
+ @users.insert({ :name => "Syd", :city => "Boston" })
13
+
14
+ # These are standard entry/exit KVs that are passed up with all moped operations
15
+ @entry_kvs = {
16
+ 'Layer' => 'mongo',
17
+ 'Label' => 'entry',
18
+ 'Flavor' => 'mongodb',
19
+ 'Database' => 'moped_test',
20
+ 'RemoteHost' => '127.0.0.1',
21
+ 'RemotePort' => 27017 }
22
+
23
+ @exit_kvs = { 'Layer' => 'mongo', 'Label' => 'exit' }
24
+ @collect_backtraces = TraceView::Config[:moped][:collect_backtraces]
25
+ end
26
+
27
+ after do
28
+ TraceView::Config[:moped][:collect_backtraces] = @collect_backtraces
29
+ end
30
+
31
+ it 'Stock Moped should be loaded, defined and ready' do
32
+ defined?(::Moped).wont_match nil
33
+ defined?(::Moped::Database).wont_match nil
34
+ defined?(::Moped::Indexes).wont_match nil
35
+ defined?(::Moped::Query).wont_match nil
36
+ defined?(::Moped::Collection).wont_match nil
37
+ end
38
+
39
+ it 'Moped should have traceview methods defined' do
40
+ #::Moped::Database
41
+ TraceView::Inst::Moped::DB_OPS.each do |m|
42
+ ::Moped::Database.method_defined?("#{m}_with_traceview").must_equal true
43
+ end
44
+ ::Moped::Database.method_defined?(:extract_trace_details).must_equal true
45
+ ::Moped::Database.method_defined?(:command_with_traceview).must_equal true
46
+ ::Moped::Database.method_defined?(:drop_with_traceview).must_equal true
47
+
48
+ #::Moped::Indexes
49
+ TraceView::Inst::Moped::INDEX_OPS.each do |m|
50
+ ::Moped::Indexes.method_defined?("#{m}_with_traceview").must_equal true
51
+ end
52
+ ::Moped::Indexes.method_defined?(:extract_trace_details).must_equal true
53
+ ::Moped::Indexes.method_defined?(:create_with_traceview).must_equal true
54
+ ::Moped::Indexes.method_defined?(:drop_with_traceview).must_equal true
55
+
56
+ #::Moped::Query
57
+ TraceView::Inst::Moped::QUERY_OPS.each do |m|
58
+ ::Moped::Query.method_defined?("#{m}_with_traceview").must_equal true
59
+ end
60
+ ::Moped::Query.method_defined?(:extract_trace_details).must_equal true
61
+
62
+ #::Moped::Collection
63
+ TraceView::Inst::Moped::COLLECTION_OPS.each do |m|
64
+ ::Moped::Collection.method_defined?("#{m}_with_traceview").must_equal true
65
+ end
66
+ ::Moped::Collection.method_defined?(:extract_trace_details).must_equal true
67
+ end
68
+
69
+ it 'should trace command' do
70
+ # TODO: This randomly fails for a yet unknown reason.
71
+ skip
72
+ TraceView::API.start_trace('moped_test', '', {}) do
73
+ command = {}
74
+ command[:mapreduce] = "users"
75
+ command[:map] = "function() { emit(this.name, 1); }"
76
+ command[:reduce] = "function(k, vals) { var sum = 0;" +
77
+ " for(var i in vals) sum += vals[i]; return sum; }"
78
+ command[:out] = "inline: 1"
79
+ @session.command(command)
80
+ end
81
+
82
+ traces = get_all_traces
83
+
84
+ traces.count.must_equal 4
85
+ validate_outer_layers(traces, 'moped_test')
86
+
87
+ validate_event_keys(traces[1], @entry_kvs)
88
+ traces[1]['QueryOp'].must_equal "map_reduce"
89
+ traces[1]['Map_Function'].must_equal "function() { emit(this.name, 1); }"
90
+ traces[1]['Reduce_Function'].must_equal "function(k, vals) { var sum = 0;" +
91
+ " for(var i in vals) sum += vals[i]; return sum; }"
92
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
93
+ validate_event_keys(traces[2], @exit_kvs)
94
+ end
95
+
96
+ it 'should trace drop_collection' do
97
+ TraceView::API.start_trace('moped_test', '', {}) do
98
+ @users.drop
99
+ @session.drop
100
+ end
101
+
102
+ traces = get_all_traces
103
+
104
+ traces.count.must_equal 6
105
+ validate_outer_layers(traces, 'moped_test')
106
+
107
+ validate_event_keys(traces[1], @entry_kvs)
108
+ traces[1]['QueryOp'].must_equal "drop_collection"
109
+ traces[1]['Collection'].must_equal "users"
110
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
111
+ validate_event_keys(traces[2], @exit_kvs)
112
+
113
+ validate_event_keys(traces[3], @entry_kvs)
114
+ traces[3]['QueryOp'].must_equal "drop_database"
115
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
116
+ validate_event_keys(traces[4], @exit_kvs)
117
+ end
118
+
119
+ it 'should trace create_index, indexes and drop_indexes' do
120
+ TraceView::API.start_trace('moped_test', '', {}) do
121
+ @users.indexes.create({:name => 1}, {:unique => true})
122
+ @users.indexes.drop
123
+ end
124
+
125
+ traces = get_all_traces
126
+
127
+ traces.count.must_equal 10
128
+ validate_outer_layers(traces, 'moped_test')
129
+
130
+ validate_event_keys(traces[1], @entry_kvs)
131
+ traces[1]['QueryOp'].must_equal "indexes"
132
+ traces[1]['Collection'].must_equal "users"
133
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
134
+ validate_event_keys(traces[2], @exit_kvs)
135
+
136
+ validate_event_keys(traces[3], @entry_kvs)
137
+ traces[3]['QueryOp'].must_equal "create_index"
138
+ traces[3]['Key'].must_equal "{\"name\":1}"
139
+ traces[3]['Options'].must_equal "{\"unique\":true}"
140
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
141
+ validate_event_keys(traces[4], @exit_kvs)
142
+
143
+ validate_event_keys(traces[5], @entry_kvs)
144
+ traces[5]['QueryOp'].must_equal "indexes"
145
+ traces[5]['Collection'].must_equal "users"
146
+ traces[5].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
147
+ validate_event_keys(traces[6], @exit_kvs)
148
+
149
+ validate_event_keys(traces[7], @entry_kvs)
150
+ traces[7]['QueryOp'].must_equal "drop_indexes"
151
+ traces[7]['Key'].must_equal "all"
152
+ traces[7].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
153
+ validate_event_keys(traces[8], @exit_kvs)
154
+ end
155
+
156
+ it 'should trace find and count' do
157
+ TraceView::API.start_trace('moped_test', '', {}) do
158
+ @users.find.count
159
+ end
160
+
161
+ traces = get_all_traces
162
+
163
+ traces.count.must_equal 6
164
+ validate_outer_layers(traces, 'moped_test')
165
+
166
+ validate_event_keys(traces[1], @entry_kvs)
167
+ traces[1]['QueryOp'].must_equal "find"
168
+ traces[1]['Collection'].must_equal "users"
169
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
170
+ validate_event_keys(traces[2], @exit_kvs)
171
+
172
+ validate_event_keys(traces[3], @entry_kvs)
173
+ traces[3]['QueryOp'].must_equal "count"
174
+ traces[3]['Query'].must_equal "all"
175
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
176
+ validate_event_keys(traces[4], @exit_kvs)
177
+ end
178
+
179
+ it 'should trace find and sort' do
180
+ TraceView::API.start_trace('moped_test', '', {}) do
181
+ @users.find(:name => "Mary").sort(:city => 1, :created_at => -1)
182
+ end
183
+
184
+ traces = get_all_traces
185
+
186
+ traces.count.must_equal 6
187
+ validate_outer_layers(traces, 'moped_test')
188
+
189
+ validate_event_keys(traces[1], @entry_kvs)
190
+ traces[1]['QueryOp'].must_equal "find"
191
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
192
+ traces[1]['Collection'].must_equal "users"
193
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
194
+ validate_event_keys(traces[2], @exit_kvs)
195
+
196
+ validate_event_keys(traces[3], @entry_kvs)
197
+ traces[3]['QueryOp'].must_equal "sort"
198
+ traces[3]['Query'].must_equal "{\"name\":\"Mary\"}"
199
+ traces[3]['Order'].must_equal "{:city=>1, :created_at=>-1}"
200
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
201
+ validate_event_keys(traces[4], @exit_kvs)
202
+ end
203
+
204
+ it 'should trace find with limit' do
205
+ TraceView::API.start_trace('moped_test', '', {}) do
206
+ @users.find(:name => "Mary").limit(1)
207
+ end
208
+
209
+ traces = get_all_traces
210
+
211
+ traces.count.must_equal 6
212
+ validate_outer_layers(traces, 'moped_test')
213
+
214
+ validate_event_keys(traces[1], @entry_kvs)
215
+ traces[1]['QueryOp'].must_equal "find"
216
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
217
+ traces[1]['Collection'].must_equal "users"
218
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
219
+ validate_event_keys(traces[2], @exit_kvs)
220
+
221
+ validate_event_keys(traces[3], @entry_kvs)
222
+ traces[3]['QueryOp'].must_equal "limit"
223
+ traces[3]['Query'].must_equal "{\"name\":\"Mary\"}"
224
+ traces[3]['Limit'].must_equal "1"
225
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
226
+ validate_event_keys(traces[4], @exit_kvs)
227
+ end
228
+
229
+ it 'should trace find with distinct' do
230
+ TraceView::API.start_trace('moped_test', '', {}) do
231
+ @users.find(:name => "Mary").distinct(:city)
232
+ end
233
+
234
+ traces = get_all_traces
235
+
236
+ traces.count.must_equal 6
237
+ validate_outer_layers(traces, 'moped_test')
238
+
239
+ validate_event_keys(traces[1], @entry_kvs)
240
+ traces[1]['QueryOp'].must_equal "find"
241
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
242
+ traces[1]['Collection'].must_equal "users"
243
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
244
+ validate_event_keys(traces[2], @exit_kvs)
245
+
246
+ validate_event_keys(traces[3], @entry_kvs)
247
+ traces[3]['QueryOp'].must_equal "distinct"
248
+ traces[3]['Query'].must_equal "{\"name\":\"Mary\"}"
249
+ traces[3]['Key'].must_equal "city"
250
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
251
+ validate_event_keys(traces[4], @exit_kvs)
252
+ end
253
+
254
+ it 'should trace find and update' do
255
+ TraceView::API.start_trace('moped_test', '', {}) do
256
+ @users.find(:name => "Mary").update({:name => "Tool"}, [:multi])
257
+ end
258
+
259
+ traces = get_all_traces
260
+
261
+ traces.count.must_equal 6
262
+ validate_outer_layers(traces, 'moped_test')
263
+
264
+ validate_event_keys(traces[1], @entry_kvs)
265
+ traces[1]['QueryOp'].must_equal "find"
266
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
267
+ traces[1]['Collection'].must_equal "users"
268
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
269
+ validate_event_keys(traces[2], @exit_kvs)
270
+
271
+ validate_event_keys(traces[3], @entry_kvs)
272
+ traces[3]['QueryOp'].must_equal "update"
273
+ traces[3]['Update_Document'].must_equal "{\"name\":\"Tool\"}"
274
+ traces[3]['Flags'].must_equal "[:multi]"
275
+ traces[3]['Collection'].must_equal "users"
276
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
277
+ validate_event_keys(traces[4], @exit_kvs)
278
+ end
279
+
280
+ it 'should trace find and update_all' do
281
+ TraceView::API.start_trace('moped_test', '', {}) do
282
+ @users.find(:name => "Mary").update_all({:name => "Tool"})
283
+ end
284
+
285
+ traces = get_all_traces
286
+
287
+ traces.count.must_equal 6
288
+ validate_outer_layers(traces, 'moped_test')
289
+
290
+ validate_event_keys(traces[1], @entry_kvs)
291
+ traces[1]['QueryOp'].must_equal "find"
292
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
293
+ traces[1]['Collection'].must_equal "users"
294
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
295
+ validate_event_keys(traces[2], @exit_kvs)
296
+
297
+ validate_event_keys(traces[3], @entry_kvs)
298
+ traces[3]['QueryOp'].must_equal "update_all"
299
+ traces[3]['Update_Document'].must_equal "{\"name\":\"Tool\"}"
300
+ traces[3]['Collection'].must_equal "users"
301
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
302
+ validate_event_keys(traces[4], @exit_kvs)
303
+ end
304
+
305
+ it 'should trace find and upsert' do
306
+ TraceView::API.start_trace('moped_test', '', {}) do
307
+ @users.find(:name => "Tool").upsert({:name => "Mary"})
308
+ end
309
+
310
+ traces = get_all_traces
311
+
312
+ traces.count.must_equal 6
313
+ validate_outer_layers(traces, 'moped_test')
314
+
315
+ validate_event_keys(traces[1], @entry_kvs)
316
+ traces[1]['QueryOp'].must_equal "find"
317
+ traces[1]['Query'].must_equal "{\"name\":\"Tool\"}"
318
+ traces[1]['Collection'].must_equal "users"
319
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
320
+ validate_event_keys(traces[2], @exit_kvs)
321
+
322
+ validate_event_keys(traces[3], @entry_kvs)
323
+ traces[3]['QueryOp'].must_equal "upsert"
324
+ traces[3]['Query'].must_equal "{\"name\":\"Tool\"}"
325
+ traces[3]['Update_Document'].must_equal "{\"name\":\"Mary\"}"
326
+ traces[3]['Collection'].must_equal "users"
327
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
328
+ validate_event_keys(traces[4], @exit_kvs)
329
+ end
330
+
331
+ it 'should trace find and explain' do
332
+ TraceView::API.start_trace('moped_test', '', {}) do
333
+ @users.find(:name => "Mary").explain
334
+ end
335
+
336
+ traces = get_all_traces
337
+
338
+ traces.count.must_equal 6
339
+ validate_outer_layers(traces, 'moped_test')
340
+
341
+ validate_event_keys(traces[1], @entry_kvs)
342
+ traces[1]['QueryOp'].must_equal "find"
343
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
344
+ traces[1]['Collection'].must_equal "users"
345
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
346
+ validate_event_keys(traces[2], @exit_kvs)
347
+
348
+ validate_event_keys(traces[3], @entry_kvs)
349
+ traces[3]['QueryOp'].must_equal "explain"
350
+ traces[3]['Query'].must_equal "{\"name\":\"Mary\"}"
351
+ traces[3]['Collection'].must_equal "users"
352
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
353
+ validate_event_keys(traces[4], @exit_kvs)
354
+ end
355
+
356
+ it 'should trace 3 types of find and modify calls' do
357
+ TraceView::API.start_trace('moped_test', '', {}) do
358
+ @users.find(:likes => 1).modify({ "$set" => { :name => "Tool" }}, :upsert => true)
359
+ @users.find.modify({:query => { "$inc" => { :likes => 1 }}}, :new => true)
360
+ @users.find.modify({:query => {}}, :remove => true)
361
+ end
362
+
363
+ traces = get_all_traces
364
+
365
+ traces.count.must_equal 14
366
+ validate_outer_layers(traces, 'moped_test')
367
+
368
+ validate_event_keys(traces[1], @entry_kvs)
369
+ traces[1]['QueryOp'].must_equal "find"
370
+ traces[1]['Query'].must_equal "{\"likes\":1}"
371
+ traces[1]['Collection'].must_equal "users"
372
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
373
+ validate_event_keys(traces[2], @exit_kvs)
374
+
375
+ validate_event_keys(traces[3], @entry_kvs)
376
+ traces[3]['QueryOp'].must_equal "modify"
377
+ traces[3]['Update_Document'].must_equal "{\"likes\":1}"
378
+ traces[3]['Collection'].must_equal "users"
379
+ traces[3]['Options'].must_equal "{\"upsert\":true}"
380
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
381
+ validate_event_keys(traces[4], @exit_kvs)
382
+
383
+ validate_event_keys(traces[7], @entry_kvs)
384
+ traces[7]['QueryOp'].must_equal "modify"
385
+ traces[7]['Update_Document'].must_equal "all"
386
+ traces[7]['Collection'].must_equal "users"
387
+ traces[7]['Options'].must_equal "{\"new\":true}"
388
+ traces[7]['Change'].must_equal "{\"query\":{\"$inc\":{\"likes\":1}}}"
389
+ traces[7].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
390
+ validate_event_keys(traces[8], @exit_kvs)
391
+
392
+ validate_event_keys(traces[11], @entry_kvs)
393
+ traces[11]['Collection'].must_equal "users"
394
+ traces[11]['QueryOp'].must_equal "modify"
395
+ traces[11]['Update_Document'].must_equal "all"
396
+ traces[11]['Change'].must_equal "{\"query\":{}}"
397
+ traces[11]['Options'].must_equal "{\"remove\":true}"
398
+ traces[11].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
399
+ validate_event_keys(traces[12], @exit_kvs)
400
+ end
401
+
402
+ it 'should trace remove' do
403
+ TraceView::API.start_trace('moped_test', '', {}) do
404
+ @users.find(:name => "Tool").remove
405
+ end
406
+
407
+ traces = get_all_traces
408
+
409
+ traces.count.must_equal 6
410
+ validate_outer_layers(traces, 'moped_test')
411
+
412
+ validate_event_keys(traces[1], @entry_kvs)
413
+ traces[1]['QueryOp'].must_equal "find"
414
+ traces[1]['Query'].must_equal "{\"name\":\"Tool\"}"
415
+ traces[1]['Collection'].must_equal "users"
416
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
417
+ validate_event_keys(traces[2], @exit_kvs)
418
+
419
+ validate_event_keys(traces[3], @entry_kvs)
420
+ traces[3]['QueryOp'].must_equal "remove"
421
+ traces[3]['Query'].must_equal "{\"name\":\"Tool\"}"
422
+ traces[3]['Collection'].must_equal "users"
423
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
424
+ validate_event_keys(traces[4], @exit_kvs)
425
+ end
426
+
427
+ it 'should trace remove_all' do
428
+ TraceView::API.start_trace('moped_test', '', {}) do
429
+ @users.find(:name => "Mary").remove_all
430
+ end
431
+
432
+ traces = get_all_traces
433
+
434
+ traces.count.must_equal 6
435
+ validate_outer_layers(traces, 'moped_test')
436
+
437
+ validate_event_keys(traces[1], @entry_kvs)
438
+ traces[1]['QueryOp'].must_equal "find"
439
+ traces[1]['Query'].must_equal "{\"name\":\"Mary\"}"
440
+ traces[1]['Collection'].must_equal "users"
441
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
442
+ validate_event_keys(traces[2], @exit_kvs)
443
+
444
+ validate_event_keys(traces[3], @entry_kvs)
445
+ traces[3]['QueryOp'].must_equal "remove_all"
446
+ traces[3]['Query'].must_equal "{\"name\":\"Mary\"}"
447
+ traces[3]['Collection'].must_equal "users"
448
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
449
+ validate_event_keys(traces[4], @exit_kvs)
450
+ end
451
+
452
+ it 'should trace aggregate' do
453
+ TraceView::API.start_trace('moped_test', '', {}) do
454
+ @users.aggregate(
455
+ {'$match' => {:name => "Mary"}},
456
+ {'$group' => {"_id" => "$name"}}
457
+ )
458
+ end
459
+
460
+ traces = get_all_traces
461
+
462
+ traces.count.must_equal 4
463
+ validate_outer_layers(traces, 'moped_test')
464
+
465
+ validate_event_keys(traces[1], @entry_kvs)
466
+ traces[1]['QueryOp'].must_equal "aggregate"
467
+ traces[1]['Query'].must_equal "[{\"$match\"=>{:name=>\"Mary\"}}, {\"$group\"=>{\"_id\"=>\"$name\"}}]"
468
+ traces[1]['Collection'].must_equal "users"
469
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:moped][:collect_backtraces]
470
+ validate_event_keys(traces[2], @exit_kvs)
471
+ end
472
+
473
+ it "should obey :collect_backtraces setting when true" do
474
+ TraceView::Config[:moped][:collect_backtraces] = true
475
+
476
+ TraceView::API.start_trace('moped_test', '', {}) do
477
+ @users.find(:name => "Mary").limit(1)
478
+ end
479
+
480
+ traces = get_all_traces
481
+ layer_has_key(traces, 'mongo', 'Backtrace')
482
+ end
483
+
484
+ it "should obey :collect_backtraces setting when false" do
485
+ TraceView::Config[:moped][:collect_backtraces] = false
486
+
487
+ TraceView::API.start_trace('moped_test', '', {}) do
488
+ @users.find(:name => "Mary").limit(1)
489
+ end
490
+
491
+ traces = get_all_traces
492
+ layer_doesnt_have_key(traces, 'mongo', 'Backtrace')
493
+ end
494
+ end
495
+
496
+ end