traceview 3.0.0

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 (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