traceview 3.0.0-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 (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/README +2 -0
  34. data/lib/oboe/backward_compatibility.rb +59 -0
  35. data/lib/oboe/inst/rack.rb +11 -0
  36. data/lib/oboe.rb +7 -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/api/layerinit.rb +51 -0
  41. data/lib/traceview/api/logging.rb +209 -0
  42. data/lib/traceview/api/memcache.rb +31 -0
  43. data/lib/traceview/api/profiling.rb +50 -0
  44. data/lib/traceview/api/tracing.rb +135 -0
  45. data/lib/traceview/api/util.rb +121 -0
  46. data/lib/traceview/api.rb +18 -0
  47. data/lib/traceview/base.rb +225 -0
  48. data/lib/traceview/config.rb +238 -0
  49. data/lib/traceview/frameworks/grape.rb +97 -0
  50. data/lib/traceview/frameworks/padrino/templates.rb +58 -0
  51. data/lib/traceview/frameworks/padrino.rb +64 -0
  52. data/lib/traceview/frameworks/rails/helpers/rum/rum_ajax_header.js.erb +5 -0
  53. data/lib/traceview/frameworks/rails/helpers/rum/rum_footer.js.erb +1 -0
  54. data/lib/traceview/frameworks/rails/helpers/rum/rum_header.js.erb +3 -0
  55. data/lib/traceview/frameworks/rails/inst/action_controller.rb +216 -0
  56. data/lib/traceview/frameworks/rails/inst/action_view.rb +56 -0
  57. data/lib/traceview/frameworks/rails/inst/action_view_2x.rb +54 -0
  58. data/lib/traceview/frameworks/rails/inst/action_view_30.rb +48 -0
  59. data/lib/traceview/frameworks/rails/inst/active_record.rb +24 -0
  60. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  61. data/lib/traceview/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  62. data/lib/traceview/frameworks/rails/inst/connection_adapters/oracle.rb +18 -0
  63. data/lib/traceview/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  64. data/lib/traceview/frameworks/rails/inst/connection_adapters/utils.rb +117 -0
  65. data/lib/traceview/frameworks/rails.rb +145 -0
  66. data/lib/traceview/frameworks/sinatra/templates.rb +56 -0
  67. data/lib/traceview/frameworks/sinatra.rb +95 -0
  68. data/lib/traceview/inst/cassandra.rb +279 -0
  69. data/lib/traceview/inst/dalli.rb +86 -0
  70. data/lib/traceview/inst/em-http-request.rb +99 -0
  71. data/lib/traceview/inst/excon.rb +111 -0
  72. data/lib/traceview/inst/faraday.rb +73 -0
  73. data/lib/traceview/inst/http.rb +87 -0
  74. data/lib/traceview/inst/httpclient.rb +173 -0
  75. data/lib/traceview/inst/memcache.rb +102 -0
  76. data/lib/traceview/inst/memcached.rb +94 -0
  77. data/lib/traceview/inst/mongo.rb +238 -0
  78. data/lib/traceview/inst/moped.rb +474 -0
  79. data/lib/traceview/inst/rack.rb +122 -0
  80. data/lib/traceview/inst/redis.rb +271 -0
  81. data/lib/traceview/inst/resque.rb +192 -0
  82. data/lib/traceview/inst/rest-client.rb +38 -0
  83. data/lib/traceview/inst/sequel.rb +162 -0
  84. data/lib/traceview/inst/typhoeus.rb +102 -0
  85. data/lib/traceview/instrumentation.rb +21 -0
  86. data/lib/traceview/loading.rb +94 -0
  87. data/lib/traceview/logger.rb +41 -0
  88. data/lib/traceview/method_profiling.rb +84 -0
  89. data/lib/traceview/ruby.rb +36 -0
  90. data/lib/traceview/support.rb +113 -0
  91. data/lib/traceview/thread_local.rb +26 -0
  92. data/lib/traceview/util.rb +250 -0
  93. data/lib/traceview/version.rb +16 -0
  94. data/lib/traceview/xtrace.rb +90 -0
  95. data/lib/traceview.rb +62 -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 +248 -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
@@ -0,0 +1,116 @@
1
+ require 'minitest_helper'
2
+ require 'rack/test'
3
+ require 'rack/lobster'
4
+ require 'traceview/inst/rack'
5
+
6
+ class RackTestApp < Minitest::Test
7
+ include Rack::Test::Methods
8
+
9
+ def app
10
+ @app = Rack::Builder.new {
11
+ use Rack::CommonLogger
12
+ use Rack::ShowExceptions
13
+ use TraceView::Rack
14
+ map "/lobster" do
15
+ use Rack::Lint
16
+ run Rack::Lobster.new
17
+ end
18
+ }
19
+ end
20
+
21
+ def test_get_the_lobster
22
+ clear_all_traces
23
+
24
+ get "/lobster"
25
+
26
+ traces = get_all_traces
27
+ traces.count.must_equal 3
28
+
29
+ validate_outer_layers(traces, 'rack')
30
+
31
+ kvs = {}
32
+ kvs["Label"] = "entry"
33
+ kvs["URL"] = "/lobster"
34
+ validate_event_keys(traces[0], kvs)
35
+
36
+ kvs.clear
37
+ kvs["Layer"] = "rack"
38
+ kvs["Label"] = "info"
39
+ kvs["HTTP-Host"] = "example.org"
40
+ kvs["Port"] = 80
41
+ kvs["Proto"] = "http"
42
+ kvs["Method"] = "GET"
43
+ kvs["ClientIP"] = "127.0.0.1"
44
+ validate_event_keys(traces[1], kvs)
45
+
46
+ assert traces[0].has_key?('SampleRate')
47
+ assert traces[0].has_key?('SampleSource')
48
+ assert traces[1].has_key?('ProcessID')
49
+ assert traces[1].has_key?('ThreadID')
50
+
51
+ assert traces[2]["Label"] == 'exit'
52
+ assert traces[2]["Status"] == 200
53
+
54
+ assert last_response.ok?
55
+
56
+ assert last_response['X-Trace']
57
+ end
58
+
59
+ def test_dont_trace_static_assets
60
+ clear_all_traces
61
+
62
+ get "/assets/static_asset.png"
63
+
64
+ traces = get_all_traces
65
+ assert traces.empty?
66
+
67
+ assert last_response.status == 404
68
+ end
69
+
70
+ def test_must_return_xtrace_header
71
+ clear_all_traces
72
+ get "/lobster"
73
+ xtrace = last_response['X-Trace']
74
+ assert xtrace
75
+ assert TraceView::XTrace.valid?(xtrace)
76
+ end
77
+
78
+ def test_log_args_when_false
79
+ clear_all_traces
80
+
81
+ @log_args = TraceView::Config[:rack][:log_args]
82
+ TraceView::Config[:rack][:log_args] = false
83
+
84
+ get "/lobster?blah=1"
85
+
86
+ traces = get_all_traces
87
+
88
+ xtrace = last_response['X-Trace']
89
+ assert xtrace
90
+ assert TraceView::XTrace.valid?(xtrace)
91
+
92
+ traces[0]['URL'].must_equal "/lobster"
93
+
94
+ TraceView::Config[:rack][:log_args] = @log_args
95
+ end
96
+
97
+ def test_log_args_when_true
98
+ clear_all_traces
99
+
100
+ @log_args = TraceView::Config[:rack][:log_args]
101
+ TraceView::Config[:rack][:log_args] = true
102
+
103
+ get "/lobster?blah=1"
104
+
105
+ traces = get_all_traces
106
+
107
+ xtrace = last_response['X-Trace']
108
+ assert xtrace
109
+ assert TraceView::XTrace.valid?(xtrace)
110
+
111
+ traces[0]['URL'].must_equal "/lobster?blah=1"
112
+
113
+ TraceView::Config[:rack][:log_args] = @log_args
114
+ end
115
+ end
116
+