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,251 @@
1
+ require 'minitest_helper'
2
+ require 'memcache'
3
+
4
+ describe "Memcache" do
5
+ before do
6
+ clear_all_traces
7
+ @mc = ::MemCache.new('127.0.0.1')
8
+
9
+ # These are standard entry/exit KVs that are passed up with all mongo operations
10
+ @entry_kvs = {
11
+ 'Layer' => 'memcache',
12
+ 'Label' => 'entry' }
13
+
14
+ @info_kvs = {
15
+ 'Layer' => 'memcache',
16
+ 'Label' => 'info' }
17
+
18
+ @exit_kvs = { 'Layer' => 'memcache', 'Label' => 'exit' }
19
+ @collect_backtraces = TraceView::Config[:memcache][:collect_backtraces]
20
+ end
21
+
22
+ after do
23
+ TraceView::Config[:memcache][:collect_backtraces] = @collect_backtraces
24
+ end
25
+
26
+ it 'Stock MemCache should be loaded, defined and ready' do
27
+ defined?(::MemCache).wont_match nil
28
+ end
29
+
30
+ it 'MemCache should have traceview methods defined' do
31
+ TraceView::API::Memcache::MEMCACHE_OPS.each do |m|
32
+ if ::MemCache.method_defined?(m)
33
+ ::MemCache.method_defined?("#{m}_with_traceview").must_equal true
34
+ end
35
+ ::MemCache.method_defined?(:request_setup_with_traceview).must_equal true
36
+ ::MemCache.method_defined?(:cache_get_with_traceview).must_equal true
37
+ ::MemCache.method_defined?(:get_multi_with_traceview).must_equal true
38
+ end
39
+ end
40
+
41
+ it "should trace set" do
42
+ TraceView::API.start_trace('memcache_test', '', {}) do
43
+ @mc.set('msg', 'blah')
44
+ end
45
+
46
+ traces = get_all_traces
47
+
48
+ traces.count.must_equal 5
49
+ validate_outer_layers(traces, 'memcache_test')
50
+
51
+ validate_event_keys(traces[1], @entry_kvs)
52
+
53
+ traces[1]['KVOp'].must_equal "set"
54
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
55
+
56
+ validate_event_keys(traces[2], @info_kvs)
57
+ traces[2]['KVKey'].must_equal "msg"
58
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
59
+
60
+ validate_event_keys(traces[3], @exit_kvs)
61
+ end
62
+
63
+ it "should trace get" do
64
+ TraceView::API.start_trace('memcache_test', '', {}) do
65
+ @mc.get('msg')
66
+ end
67
+
68
+ traces = get_all_traces
69
+
70
+ traces.count.must_equal 6
71
+ validate_outer_layers(traces, 'memcache_test')
72
+
73
+ validate_event_keys(traces[1], @entry_kvs)
74
+
75
+ traces[1]['KVOp'].must_equal "get"
76
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
77
+
78
+ validate_event_keys(traces[2], @info_kvs)
79
+ traces[2]['KVKey'].must_equal "msg"
80
+ traces[2]['RemoteHost'].must_equal "127.0.0.1"
81
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
82
+
83
+ traces[3].has_key?('KVHit').must_equal true
84
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
85
+
86
+ validate_event_keys(traces[4], @exit_kvs)
87
+ end
88
+
89
+ it "should trace get_multi" do
90
+ TraceView::API.start_trace('memcache_test', '', {}) do
91
+ @mc.get_multi(['one', 'two', 'three', 'four', 'five', 'six'])
92
+ end
93
+
94
+ traces = get_all_traces
95
+
96
+ traces.count.must_equal 5
97
+ validate_outer_layers(traces, 'memcache_test')
98
+
99
+ validate_event_keys(traces[1], @entry_kvs)
100
+
101
+ traces[1]['KVOp'].must_equal "get_multi"
102
+
103
+ validate_event_keys(traces[2], @info_kvs)
104
+ traces[2]['KVKeyCount'].must_equal 6
105
+ traces[2].has_key?('KVHitCount').must_equal true
106
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
107
+
108
+ validate_event_keys(traces[3], @exit_kvs)
109
+ end
110
+
111
+ it "should trace add for existing key" do
112
+ @mc.set('testKey', 'x', 1200)
113
+ TraceView::API.start_trace('memcache_test', '', {}) do
114
+ @mc.add('testKey', 'x', 1200)
115
+ end
116
+
117
+ traces = get_all_traces
118
+
119
+ traces.count.must_equal 5
120
+ validate_outer_layers(traces, 'memcache_test')
121
+
122
+ validate_event_keys(traces[1], @entry_kvs)
123
+
124
+ traces[1]['KVOp'].must_equal "add"
125
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
126
+
127
+ validate_event_keys(traces[2], @info_kvs)
128
+ traces[2]['KVKey'].must_equal "testKey"
129
+
130
+ validate_event_keys(traces[3], @exit_kvs)
131
+ end
132
+
133
+ it "should trace append" do
134
+ @mc.set('rawKey', "Peanut Butter ", 600, :raw => true)
135
+ TraceView::API.start_trace('memcache_test', '', {}) do
136
+ @mc.append('rawKey', "Jelly")
137
+ end
138
+
139
+ traces = get_all_traces
140
+
141
+ traces.count.must_equal 5
142
+ validate_outer_layers(traces, 'memcache_test')
143
+
144
+ validate_event_keys(traces[1], @entry_kvs)
145
+
146
+ traces[1]['KVOp'].must_equal "append"
147
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
148
+
149
+ validate_event_keys(traces[2], @info_kvs)
150
+
151
+ traces[2]['KVKey'].must_equal "rawKey"
152
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
153
+
154
+ validate_event_keys(traces[3], @exit_kvs)
155
+ end
156
+
157
+ it "should trace decrement" do
158
+ TraceView::API.start_trace('memcache_test', '', {}) do
159
+ @mc.decr('memcache_key_counter', 1)
160
+ end
161
+
162
+ traces = get_all_traces
163
+
164
+ traces.count.must_equal 5
165
+ validate_outer_layers(traces, 'memcache_test')
166
+
167
+ validate_event_keys(traces[1], @entry_kvs)
168
+
169
+ traces[1]['KVOp'].must_equal "decr"
170
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
171
+
172
+ traces[2]['KVKey'].must_equal "memcache_key_counter"
173
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:memcache][:collect_backtraces]
174
+
175
+ validate_event_keys(traces[3], @exit_kvs)
176
+ end
177
+
178
+ it "should trace increment" do
179
+ TraceView::API.start_trace('memcache_test', '', {}) do
180
+ @mc.incr("memcache_key_counter", 1)
181
+ end
182
+
183
+ traces = get_all_traces
184
+
185
+ traces.count.must_equal 5
186
+ validate_outer_layers(traces, 'memcache_test')
187
+
188
+ validate_event_keys(traces[1], @entry_kvs)
189
+ traces[1]['KVOp'].must_equal "incr"
190
+ validate_event_keys(traces[2], @info_kvs)
191
+ traces[2]['KVKey'].must_equal "memcache_key_counter"
192
+ validate_event_keys(traces[3], @exit_kvs)
193
+ end
194
+
195
+ it "should trace replace" do
196
+ @mc.set("some_key", "blah")
197
+ TraceView::API.start_trace('memcache_test', '', {}) do
198
+ @mc.replace("some_key", "woop")
199
+ end
200
+
201
+ traces = get_all_traces
202
+
203
+ traces.count.must_equal 5
204
+ validate_outer_layers(traces, 'memcache_test')
205
+
206
+ validate_event_keys(traces[1], @entry_kvs)
207
+ traces[1]['KVOp'].must_equal "replace"
208
+ traces[2]['KVKey'].must_equal "some_key"
209
+ validate_event_keys(traces[2], @info_kvs)
210
+ validate_event_keys(traces[3], @exit_kvs)
211
+ end
212
+
213
+ it "should trace delete" do
214
+ TraceView::API.start_trace('memcache_test', '', {}) do
215
+ @mc.delete("some_key")
216
+ end
217
+
218
+ traces = get_all_traces
219
+
220
+ traces.count.must_equal 5
221
+ validate_outer_layers(traces, 'memcache_test')
222
+
223
+ validate_event_keys(traces[1], @entry_kvs)
224
+ traces[1]['KVOp'].must_equal "delete"
225
+ traces[2]['KVKey'].must_equal "some_key"
226
+ validate_event_keys(traces[2], @info_kvs)
227
+ validate_event_keys(traces[3], @exit_kvs)
228
+ end
229
+
230
+ it "should obey :collect_backtraces setting when true" do
231
+ TraceView::Config[:memcache][:collect_backtraces] = true
232
+
233
+ TraceView::API.start_trace('memcache_test', '', {}) do
234
+ @mc.set('some_key', 1)
235
+ end
236
+
237
+ traces = get_all_traces
238
+ layer_has_key(traces, 'memcache', 'Backtrace')
239
+ end
240
+
241
+ it "should obey :collect_backtraces setting when false" do
242
+ TraceView::Config[:memcache][:collect_backtraces] = false
243
+
244
+ TraceView::API.start_trace('memcache_test', '', {}) do
245
+ @mc.set('some_key', 1)
246
+ end
247
+
248
+ traces = get_all_traces
249
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
250
+ end
251
+ end
@@ -0,0 +1,226 @@
1
+ require 'minitest_helper'
2
+
3
+ if RUBY_VERSION < '2.0' and not defined?(JRUBY_VERSION)
4
+ describe "Memcached" do
5
+ require 'memcached'
6
+ require 'memcached/rails'
7
+
8
+ before do
9
+ clear_all_traces
10
+ @mc = ::Memcached::Rails.new(:servers => ['127.0.0.1'])
11
+
12
+ # These are standard entry/exit KVs that are passed up with all mongo operations
13
+ @entry_kvs = {
14
+ 'Layer' => 'memcache',
15
+ 'Label' => 'entry' }
16
+
17
+ @info_kvs = {
18
+ 'Layer' => 'memcache',
19
+ 'Label' => 'info' }
20
+
21
+ @exit_kvs = { 'Layer' => 'memcache', 'Label' => 'exit' }
22
+ @collect_backtraces = TraceView::Config[:memcached][:collect_backtraces]
23
+ end
24
+
25
+ after do
26
+ TraceView::Config[:memcached][:collect_backtraces] = @collect_backtraces
27
+ end
28
+
29
+ it 'Stock Memcached should be loaded, defined and ready' do
30
+ defined?(::Memcached).wont_match nil
31
+ defined?(::Memcached::Rails).wont_match nil
32
+ end
33
+
34
+ it 'Memcached should have traceview methods defined' do
35
+ TraceView::API::Memcache::MEMCACHE_OPS.each do |m|
36
+ if ::Memcached.method_defined?(m)
37
+ ::Memcached.method_defined?("#{m}_with_traceview").must_equal true
38
+ end
39
+ ::Memcached::Rails.method_defined?(:get_multi_with_traceview).must_equal true
40
+ end
41
+ end
42
+
43
+ it "should trace set" do
44
+ TraceView::API.start_trace('memcached_test', '', {}) do
45
+ @mc.set('testKey', 'blah')
46
+ end
47
+
48
+ traces = get_all_traces
49
+ traces.count.must_equal 4
50
+
51
+ validate_outer_layers(traces, 'memcached_test')
52
+ validate_event_keys(traces[1], @entry_kvs)
53
+ validate_event_keys(traces[2], @exit_kvs)
54
+
55
+ traces[1]['KVOp'].must_equal "set"
56
+ traces[1]['KVKey'].must_equal "testKey"
57
+ end
58
+
59
+ it "should trace get" do
60
+ @mc.set('testKey', 'blah')
61
+
62
+ TraceView::API.start_trace('memcached_test', '', {}) do
63
+ @mc.get('testKey')
64
+ end
65
+
66
+ traces = get_all_traces
67
+ traces.count.must_equal 4
68
+
69
+ validate_outer_layers(traces, 'memcached_test')
70
+ validate_event_keys(traces[1], @entry_kvs)
71
+ validate_event_keys(traces[2], @exit_kvs)
72
+
73
+ traces[1]['KVOp'].must_equal "get"
74
+ traces[1]['KVKey'].must_equal "testKey"
75
+ end
76
+
77
+ it "should trace get_multi" do
78
+ TraceView::API.start_trace('memcached_test', '', {}) do
79
+ @mc.get_multi(['one', 'two', 'three', 'four', 'five', 'six'])
80
+ end
81
+
82
+ traces = get_all_traces
83
+ traces.count.must_equal 5
84
+
85
+ validate_outer_layers(traces, 'memcached_test')
86
+ validate_event_keys(traces[1], @entry_kvs)
87
+ validate_event_keys(traces[2], @info_kvs)
88
+ validate_event_keys(traces[3], @exit_kvs)
89
+
90
+ traces[1]['KVOp'].must_equal "get_multi"
91
+
92
+ traces[2]['KVKeyCount'].must_equal 6
93
+ traces[2].has_key?('KVHitCount').must_equal true
94
+ end
95
+
96
+ it "should trace add for existing key" do
97
+ @mc.set('testKey', 'x', 1200)
98
+
99
+ TraceView::API.start_trace('memcached_test', '', {}) do
100
+ @mc.add('testKey', 'x', 1200)
101
+ end
102
+
103
+ traces = get_all_traces
104
+ traces.count.must_equal 5
105
+
106
+ validate_outer_layers(traces, 'memcached_test')
107
+ validate_event_keys(traces[1], @entry_kvs)
108
+ validate_event_keys(traces[3], @exit_kvs)
109
+
110
+ traces[1]['KVOp'].must_equal "add"
111
+ traces[1]['KVKey'].must_equal "testKey"
112
+
113
+ traces[2]['ErrorClass'].must_equal "Memcached::NotStored"
114
+ traces[2]['ErrorMsg'].must_equal "Memcached::NotStored"
115
+ end
116
+
117
+ it "should trace append" do
118
+ @mc.set('rawKey', "Peanut Butter ", 600, :raw => true)
119
+ TraceView::API.start_trace('memcached_test', '', {}) do
120
+ @mc.append('rawKey', "Jelly")
121
+ end
122
+
123
+ traces = get_all_traces
124
+ traces.count.must_equal 4
125
+
126
+ validate_outer_layers(traces, 'memcached_test')
127
+ validate_event_keys(traces[1], @entry_kvs)
128
+ validate_event_keys(traces[2], @exit_kvs)
129
+
130
+ traces[1]['KVOp'].must_equal "append"
131
+ traces[1]['KVKey'].must_equal "rawKey"
132
+ end
133
+
134
+ it "should trace decr" do
135
+ @mc.set('some_key_counter', "100", 0, false)
136
+
137
+ TraceView::API.start_trace('memcached_test', '', {}) do
138
+ @mc.decr('some_key_counter', 1)
139
+ end
140
+
141
+ traces = get_all_traces
142
+ traces.count.must_equal 4
143
+
144
+ validate_outer_layers(traces, 'memcached_test')
145
+ validate_event_keys(traces[1], @entry_kvs)
146
+ validate_event_keys(traces[2], @exit_kvs)
147
+
148
+ traces[1]['KVOp'].must_equal "decr"
149
+ traces[1]['KVKey'].must_equal "some_key_counter"
150
+ end
151
+
152
+ it "should trace increment" do
153
+ @mc.set('some_key_counter', "100", 0, false)
154
+
155
+ TraceView::API.start_trace('memcached_test', '', {}) do
156
+ @mc.incr("some_key_counter", 1)
157
+ end
158
+
159
+ traces = get_all_traces
160
+ traces.count.must_equal 4
161
+
162
+ validate_outer_layers(traces, 'memcached_test')
163
+ validate_event_keys(traces[1], @entry_kvs)
164
+ validate_event_keys(traces[2], @exit_kvs)
165
+
166
+ traces[1]['KVOp'].must_equal "incr"
167
+ traces[1]['KVKey'].must_equal "some_key_counter"
168
+ end
169
+
170
+ it "should trace replace" do
171
+ @mc.set('some_key', 'blah')
172
+ TraceView::API.start_trace('memcached_test', '', {}) do
173
+ @mc.replace("some_key", "woop")
174
+ end
175
+
176
+ traces = get_all_traces
177
+ traces.count.must_equal 4
178
+
179
+ validate_outer_layers(traces, 'memcached_test')
180
+ validate_event_keys(traces[1], @entry_kvs)
181
+ validate_event_keys(traces[2], @exit_kvs)
182
+
183
+ traces[1]['KVOp'].must_equal "replace"
184
+ traces[1]['KVKey'].must_equal "some_key"
185
+ end
186
+
187
+ it "should trace delete" do
188
+ @mc.set('some_key', 'blah')
189
+ TraceView::API.start_trace('memcached_test', '', {}) do
190
+ @mc.delete("some_key")
191
+ end
192
+
193
+ traces = get_all_traces
194
+ traces.count.must_equal 4
195
+
196
+ validate_outer_layers(traces, 'memcached_test')
197
+ validate_event_keys(traces[1], @entry_kvs)
198
+ validate_event_keys(traces[2], @exit_kvs)
199
+
200
+ traces[1]['KVOp'].must_equal "delete"
201
+ traces[1]['KVKey'].must_equal "some_key"
202
+ end
203
+
204
+ it "should obey :collect_backtraces setting when true" do
205
+ TraceView::Config[:memcached][:collect_backtraces] = true
206
+
207
+ TraceView::API.start_trace('memcached_test', '', {}) do
208
+ @mc.set('some_key', 1)
209
+ end
210
+
211
+ traces = get_all_traces
212
+ layer_has_key(traces, 'memcache', 'Backtrace')
213
+ end
214
+
215
+ it "should obey :collect_backtraces setting when false" do
216
+ TraceView::Config[:memcached][:collect_backtraces] = false
217
+
218
+ TraceView::API.start_trace('memcached_test', '', {}) do
219
+ @mc.set('some_key', 1)
220
+ end
221
+
222
+ traces = get_all_traces
223
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
224
+ end
225
+ end
226
+ end