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,30 @@
1
+ if RUBY_VERSION >= '1.9.3'
2
+ require "minitest_helper"
3
+ require File.expand_path(File.dirname(__FILE__) + '/apps/padrino_simple')
4
+
5
+ describe Padrino do
6
+ before do
7
+ clear_all_traces
8
+ end
9
+
10
+ it "should trace a request to a simple padrino stack" do
11
+ @app = SimpleDemo
12
+
13
+ r = get "/render"
14
+
15
+ traces = get_all_traces
16
+
17
+ traces.count.must_equal 9
18
+ valid_edges?(traces).must_equal true
19
+ validate_outer_layers(traces, 'rack')
20
+
21
+ traces[2]['Layer'].must_equal "padrino"
22
+ traces[7]['Controller'].must_equal "SimpleDemo"
23
+ traces[8]['Label'].must_equal "exit"
24
+
25
+ # Validate the existence of the response header
26
+ r.headers.key?('X-Trace').must_equal true
27
+ r.headers['X-Trace'].must_equal traces[8]['X-Trace']
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require "minitest_helper"
2
+ require File.expand_path(File.dirname(__FILE__) + '/apps/sinatra_simple')
3
+
4
+ describe Sinatra do
5
+ before do
6
+ clear_all_traces
7
+ end
8
+
9
+ it "should trace a request to a simple sinatra stack" do
10
+ @app = SinatraSimple
11
+
12
+ r = get "/render"
13
+
14
+ traces = get_all_traces
15
+
16
+ traces.count.must_equal 9
17
+ valid_edges?(traces).must_equal true
18
+ validate_outer_layers(traces, 'rack')
19
+
20
+ traces[2]['Layer'].must_equal "sinatra"
21
+ traces[4]['Label'].must_equal "profile_entry"
22
+ traces[7]['Controller'].must_equal "SinatraSimple"
23
+ traces[8]['Label'].must_equal "exit"
24
+
25
+ # Validate the existence of the response header
26
+ r.headers.key?('X-Trace').must_equal true
27
+ r.headers['X-Trace'].must_equal traces[8]['X-Trace']
28
+ end
29
+ end
30
+
@@ -0,0 +1,380 @@
1
+ require 'minitest_helper'
2
+
3
+ # The cassandra-rb client doesn't support JRuby
4
+ # https://github.com/cassandra-rb/cassandra
5
+ unless defined?(JRUBY_VERSION)
6
+ describe "Cassandra" do
7
+ before do
8
+ clear_all_traces
9
+
10
+ @client = Cassandra.new("system", "127.0.0.1:9160", { :timeout => 10 })
11
+ @client.disable_node_auto_discovery!
12
+
13
+ @ks_name = "AppNetaCassandraTest"
14
+
15
+ ks_def = CassandraThrift::KsDef.new(:name => @ks_name,
16
+ :strategy_class => "SimpleStrategy",
17
+ :strategy_options => { 'replication_factor' => '2' },
18
+ :cf_defs => [])
19
+
20
+ @client.add_keyspace(ks_def) unless @client.keyspaces.include? @ks_name
21
+ @client.keyspace = @ks_name
22
+
23
+ unless @client.column_families.include? "Users"
24
+ cf_def = CassandraThrift::CfDef.new(:keyspace => @ks_name, :name => "Users")
25
+ @client.add_column_family(cf_def)
26
+ end
27
+
28
+ unless @client.column_families.include? "Statuses"
29
+ cf_def = CassandraThrift::CfDef.new(:keyspace => @ks_name, :name => "Statuses")
30
+ @client.add_column_family(cf_def)
31
+ end
32
+
33
+ # These are standard entry/exit KVs that are passed up with all mongo operations
34
+ @entry_kvs = {
35
+ 'Layer' => 'cassandra',
36
+ 'Label' => 'entry',
37
+ 'RemoteHost' => '127.0.0.1',
38
+ 'RemotePort' => '9160' }
39
+
40
+ @exit_kvs = { 'Layer' => 'cassandra', 'Label' => 'exit' }
41
+ @collect_backtraces = TraceView::Config[:cassandra][:collect_backtraces]
42
+ end
43
+
44
+ after do
45
+ TraceView::Config[:cassandra][:collect_backtraces] = @collect_backtraces
46
+ @client.disconnect!
47
+ end
48
+
49
+ it 'Stock Cassandra should be loaded, defined and ready' do
50
+ defined?(::Cassandra).wont_match nil
51
+ end
52
+
53
+ it 'Cassandra should have traceview methods defined' do
54
+ [ :insert, :remove, :count_columns, :get_columns, :multi_get_columns, :get,
55
+ :multi_get, :get_range_single, :get_range_batch, :get_indexed_slices,
56
+ :create_index, :drop_index, :add_column_family, :drop_column_family,
57
+ :add_keyspace, :drop_keyspace ].each do |m|
58
+ ::Cassandra.method_defined?("#{m}_with_traceview").must_equal true
59
+ end
60
+ # Special 'exists?' case
61
+ ::Cassandra.method_defined?("exists_with_traceview?").must_equal true
62
+ end
63
+
64
+ it 'should trace insert' do
65
+ TraceView::API.start_trace('cassandra_test', '', {}) do
66
+ user = {'screen_name' => 'larry', "blah" => "ok"}
67
+ @client.insert(:Users, '5', user, { :ttl => 600, :consistency => 1})
68
+ end
69
+
70
+ traces = get_all_traces
71
+
72
+ traces.count.must_equal 4
73
+ validate_outer_layers(traces, 'cassandra_test')
74
+
75
+ validate_event_keys(traces[1], @entry_kvs)
76
+ traces[1]['Op'].must_equal "insert"
77
+ traces[1]['Cf'].must_equal "Users"
78
+ traces[1]['Key'].must_equal "\"5\""
79
+ traces[1]['Consistency'].must_equal 1
80
+ traces[1]['Ttl'].must_equal 600
81
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
82
+ validate_event_keys(traces[2], @exit_kvs)
83
+ end
84
+
85
+ it 'should trace remove' do
86
+ TraceView::API.start_trace('cassandra_test', '', {}) do
87
+ @client.remove(:Users, '5', 'blah')
88
+ end
89
+
90
+ traces = get_all_traces
91
+
92
+ traces.count.must_equal 4
93
+ validate_outer_layers(traces, 'cassandra_test')
94
+
95
+ validate_event_keys(traces[1], @entry_kvs)
96
+ traces[1]['Op'].must_equal "remove"
97
+ traces[1]['Cf'].must_equal "Users"
98
+ traces[1]['Key'].must_equal "\"5\""
99
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
100
+ validate_event_keys(traces[2], @exit_kvs)
101
+ end
102
+
103
+ it 'should trace count_columns' do
104
+ @client.insert(:Statuses, '12', {'body' => 'v1', 'user' => 'v2'})
105
+
106
+ TraceView::API.start_trace('cassandra_test', '', {}) do
107
+ @client.count_columns(:Statuses, '12', :count => 50)
108
+ end
109
+
110
+ traces = get_all_traces
111
+
112
+ traces.count.must_equal 4
113
+ validate_outer_layers(traces, 'cassandra_test')
114
+
115
+ validate_event_keys(traces[1], @entry_kvs)
116
+ traces[1]['Op'].must_equal "count_columns"
117
+ traces[1]['Cf'].must_equal "Statuses"
118
+ traces[1]['Key'].must_equal "\"12\""
119
+ traces[1]['Count'].must_equal 50
120
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
121
+ validate_event_keys(traces[2], @exit_kvs)
122
+ end
123
+
124
+ it 'should trace get_columns' do
125
+ TraceView::API.start_trace('cassandra_test', '', {}) do
126
+ @client.get_columns(:Statuses, '12', ['body'])
127
+ end
128
+
129
+ traces = get_all_traces
130
+
131
+ traces.count.must_equal 4
132
+ validate_outer_layers(traces, 'cassandra_test')
133
+
134
+ validate_event_keys(traces[1], @entry_kvs)
135
+ traces[1]['Op'].must_equal "get_columns"
136
+ traces[1]['Cf'].must_equal "Statuses"
137
+ traces[1]['Key'].must_equal "\"12\""
138
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
139
+ validate_event_keys(traces[2], @exit_kvs)
140
+ end
141
+
142
+ it 'should trace multi_get_columns' do
143
+ TraceView::API.start_trace('cassandra_test', '', {}) do
144
+ @client.multi_get_columns(:Users, ['12', '5'], ['body'])
145
+ end
146
+
147
+ traces = get_all_traces
148
+
149
+ traces.count.must_equal 4
150
+ validate_outer_layers(traces, 'cassandra_test')
151
+
152
+ validate_event_keys(traces[1], @entry_kvs)
153
+ traces[1]['Op'].must_equal "multi_get_columns"
154
+ traces[1]['Cf'].must_equal "Users"
155
+ traces[1]['Key'].must_equal "[\"12\", \"5\"]"
156
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
157
+ validate_event_keys(traces[2], @exit_kvs)
158
+ end
159
+
160
+ it 'should trace get' do
161
+ TraceView::API.start_trace('cassandra_test', '', {}) do
162
+ @client.get(:Statuses, '12', :reversed => true)
163
+ end
164
+
165
+ traces = get_all_traces
166
+
167
+ traces.count.must_equal 4
168
+ validate_outer_layers(traces, 'cassandra_test')
169
+
170
+ validate_event_keys(traces[1], @entry_kvs)
171
+ traces[1]['Op'].must_equal "get"
172
+ traces[1]['Cf'].must_equal "Statuses"
173
+ traces[1]['Key'].must_equal "\"12\""
174
+ traces[1]['Reversed'].must_equal "true"
175
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
176
+ validate_event_keys(traces[2], @exit_kvs)
177
+ end
178
+
179
+ it 'should trace exists?' do
180
+ TraceView::API.start_trace('cassandra_test', '', {}) do
181
+ @client.exists?(:Statuses, '12')
182
+ @client.exists?(:Statuses, '12', 'body')
183
+ end
184
+
185
+ traces = get_all_traces
186
+
187
+ traces.count.must_equal 6
188
+ validate_outer_layers(traces, 'cassandra_test')
189
+
190
+ validate_event_keys(traces[1], @entry_kvs)
191
+ traces[1]['Op'].must_equal "exists?"
192
+ traces[1]['Cf'].must_equal "Statuses"
193
+ traces[1]['Key'].must_equal "\"12\""
194
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
195
+ validate_event_keys(traces[2], @exit_kvs)
196
+
197
+ traces[3]['Op'].must_equal "exists?"
198
+ traces[3]['Cf'].must_equal "Statuses"
199
+ traces[3]['Key'].must_equal "\"12\""
200
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
201
+ end
202
+
203
+ it 'should trace get_range_keys' do
204
+ TraceView::API.start_trace('cassandra_test', '', {}) do
205
+ @client.get_range_keys(:Statuses, :key_count => 4)
206
+ end
207
+
208
+ traces = get_all_traces
209
+
210
+ traces.count.must_equal 4
211
+ validate_outer_layers(traces, 'cassandra_test')
212
+
213
+ validate_event_keys(traces[1], @entry_kvs)
214
+ traces[1]['Op'].must_equal "get_range_batch"
215
+ traces[1]['Cf'].must_equal "Statuses"
216
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
217
+ validate_event_keys(traces[2], @exit_kvs)
218
+ end
219
+
220
+ it 'should trace create_index' do
221
+ TraceView::API.start_trace('cassandra_test', '', {}) do
222
+ @client.create_index(@ks_name, 'Statuses', 'column_name', 'LongType')
223
+ end
224
+
225
+ traces = get_all_traces
226
+
227
+ traces.count.must_equal 4
228
+ validate_outer_layers(traces, 'cassandra_test')
229
+
230
+ validate_event_keys(traces[1], @entry_kvs)
231
+ traces[1]['Op'].must_equal "create_index"
232
+ traces[1]['Cf'].must_equal "Statuses"
233
+ traces[1]['Keyspace'].must_equal @ks_name
234
+ traces[1]['Column_name'].must_equal "column_name"
235
+ traces[1]['Validation_class'].must_equal "LongType"
236
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
237
+ validate_event_keys(traces[2], @exit_kvs)
238
+
239
+ # Clean up
240
+ @client.drop_index(@ks_name, 'Statuses', 'column_name')
241
+ end
242
+
243
+ it 'should trace drop_index' do
244
+ # Prep
245
+ @client.create_index(@ks_name, 'Statuses', 'column_name', 'LongType')
246
+
247
+ TraceView::API.start_trace('cassandra_test', '', {}) do
248
+ @client.drop_index(@ks_name, 'Statuses', 'column_name')
249
+ end
250
+
251
+ traces = get_all_traces
252
+
253
+ traces.count.must_equal 4
254
+ validate_outer_layers(traces, 'cassandra_test')
255
+
256
+ validate_event_keys(traces[1], @entry_kvs)
257
+ traces[1]['Op'].must_equal "drop_index"
258
+ traces[1]['Cf'].must_equal "Statuses"
259
+ traces[1]['Keyspace'].must_equal @ks_name
260
+ traces[1]['Column_name'].must_equal "column_name"
261
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
262
+ validate_event_keys(traces[2], @exit_kvs)
263
+ end
264
+
265
+ it 'should trace get_indexed_slices' do
266
+ @client.create_index(@ks_name, 'Statuses', 'x', 'LongType')
267
+ TraceView::API.start_trace('cassandra_test', '', {}) do
268
+ expressions = [
269
+ { :column_name => 'x',
270
+ :value => [0,20].pack("NN"),
271
+ :comparison => "=="},
272
+ { :column_name => 'non_indexed',
273
+ :value => [5].pack("N*"),
274
+ :comparison => ">"} ]
275
+ @client.get_indexed_slices(:Statuses, expressions).length
276
+ end
277
+
278
+ traces = get_all_traces
279
+
280
+ traces.count.must_equal 4
281
+ validate_outer_layers(traces, 'cassandra_test')
282
+
283
+ validate_event_keys(traces[1], @entry_kvs)
284
+ traces[1]['Op'].must_equal "get_indexed_slices"
285
+ traces[1]['Cf'].must_equal "Statuses"
286
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
287
+ validate_event_keys(traces[2], @exit_kvs)
288
+ end
289
+
290
+ it 'should trace add and remove of column family' do
291
+ cf_name = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
292
+ cf_def = CassandraThrift::CfDef.new(:keyspace => @ks_name, :name => cf_name)
293
+
294
+ TraceView::API.start_trace('cassandra_test', '', {}) do
295
+ @client.add_column_family(cf_def)
296
+ @client.drop_column_family(cf_name)
297
+ end
298
+
299
+ traces = get_all_traces
300
+
301
+ traces.count.must_equal 6
302
+ validate_outer_layers(traces, 'cassandra_test')
303
+
304
+ validate_event_keys(traces[1], @entry_kvs)
305
+ traces[1]['Op'].must_equal "add_column_family"
306
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
307
+ validate_event_keys(traces[2], @exit_kvs)
308
+
309
+ traces[3]['Op'].must_equal "drop_column_family"
310
+ traces[3]['Cf'].must_equal cf_name
311
+ traces[3].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
312
+ end
313
+
314
+ it 'should trace adding a keyspace' do
315
+ ks_name = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
316
+ ks_def = CassandraThrift::KsDef.new(:name => ks_name,
317
+ :strategy_class => "org.apache.cassandra.locator.SimpleStrategy",
318
+ :strategy_options => { 'replication_factor' => '2' },
319
+ :cf_defs => [])
320
+
321
+ TraceView::API.start_trace('cassandra_test', '', {}) do
322
+ @client.add_keyspace(ks_def)
323
+ @client.keyspace = ks_name
324
+ end
325
+
326
+ traces = get_all_traces
327
+
328
+ traces.count.must_equal 4
329
+ validate_outer_layers(traces, 'cassandra_test')
330
+
331
+ validate_event_keys(traces[1], @entry_kvs)
332
+ traces[1]['Op'].must_equal "add_keyspace"
333
+ traces[1]['Name'].must_equal ks_name
334
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
335
+ validate_event_keys(traces[2], @exit_kvs)
336
+ end
337
+
338
+ it 'should trace the removal of a keyspace' do
339
+ TraceView::API.start_trace('cassandra_test', '', {}) do
340
+ @client.drop_keyspace(@ks_name)
341
+ end
342
+
343
+ traces = get_all_traces
344
+
345
+ traces.count.must_equal 4
346
+ validate_outer_layers(traces, 'cassandra_test')
347
+
348
+ validate_event_keys(traces[1], @entry_kvs)
349
+ traces[1]['Op'].must_equal "drop_keyspace"
350
+ traces[1]['Name'].must_equal @ks_name
351
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:cassandra][:collect_backtraces]
352
+ validate_event_keys(traces[2], @exit_kvs)
353
+ end
354
+
355
+ it "should obey :collect_backtraces setting when true" do
356
+ TraceView::Config[:cassandra][:collect_backtraces] = true
357
+
358
+ TraceView::API.start_trace('cassandra_test', '', {}) do
359
+ user = {'screen_name' => 'larry', "blah" => "ok"}
360
+ @client.insert(:Users, '5', user, { :ttl => 600, :consistency => 1})
361
+ end
362
+
363
+ traces = get_all_traces
364
+ layer_has_key(traces, 'cassandra', 'Backtrace')
365
+ end
366
+
367
+ it "should obey :collect_backtraces setting when false" do
368
+ TraceView::Config[:cassandra][:collect_backtraces] = false
369
+
370
+ TraceView::API.start_trace('cassandra_test', '', {}) do
371
+ user = {'screen_name' => 'larry', "blah" => "ok"}
372
+ @client.insert(:Users, '5', user, { :ttl => 600, :consistency => 1})
373
+ end
374
+
375
+ traces = get_all_traces
376
+ layer_doesnt_have_key(traces, 'cassandra', 'Backtrace')
377
+ end
378
+
379
+ end
380
+ end
@@ -0,0 +1,171 @@
1
+ require 'minitest_helper'
2
+
3
+ describe "Dalli" do
4
+ before do
5
+ clear_all_traces
6
+ @dc = Dalli::Client.new
7
+ @collect_backtraces = TraceView::Config[:dalli][:collect_backtraces]
8
+ end
9
+
10
+ after do
11
+ TraceView::Config[:dalli][:collect_backtraces] = @collect_backtraces
12
+ end
13
+
14
+ it 'Stock Dalli should be loaded, defined and ready' do
15
+ defined?(::Dalli).wont_match nil
16
+ defined?(::Dalli::Client).wont_match nil
17
+ end
18
+
19
+ it 'should have traceview methods defined' do
20
+ [ :perform_with_traceview, :get_multi_with_traceview].each do |m|
21
+ ::Dalli::Client.method_defined?(m).must_equal true
22
+ end
23
+ end
24
+
25
+ it 'should trace set' do
26
+ TraceView::API.start_trace('dalli_test', '', {}) do
27
+ @dc.set('some_key', 1234)
28
+ end
29
+
30
+ traces = get_all_traces
31
+ traces.count.must_equal 4
32
+
33
+ validate_outer_layers(traces, 'dalli_test')
34
+
35
+ traces[1].has_key?("KVOp").must_equal true
36
+ traces[1].has_key?("KVKey").must_equal true
37
+ traces[1]['Layer'].must_equal "memcache"
38
+ traces[1]['KVKey'].must_equal "some_key"
39
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
40
+ end
41
+
42
+ it 'should trace get' do
43
+ TraceView::API.start_trace('dalli_test', '', {}) do
44
+ @dc.get('some_key')
45
+ end
46
+
47
+ traces = get_all_traces
48
+ traces.count.must_equal 5
49
+
50
+ validate_outer_layers(traces, 'dalli_test')
51
+
52
+ traces[1]['KVOp'].must_equal "get"
53
+ traces[1]['KVKey'].must_equal "some_key"
54
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
55
+ traces[2]['Label'].must_equal "info"
56
+ traces[2].has_key?('KVHit').must_equal true
57
+ traces[3]['Label'].must_equal "exit"
58
+ end
59
+
60
+ it 'should trace get_multi' do
61
+ TraceView::API.start_trace('dalli_test', '', {}) do
62
+ @dc.get_multi([:one, :two, :three, :four, :five, :six])
63
+ end
64
+
65
+ traces = get_all_traces
66
+ traces.count.must_equal 5
67
+
68
+ validate_outer_layers(traces, 'dalli_test')
69
+
70
+ traces[1]['KVOp'].must_equal "get_multi"
71
+ traces[2]['Label'].must_equal "info"
72
+ traces[2]['RemoteHost'].must_equal "127.0.0.1:11211"
73
+ traces[2].has_key?('KVKeyCount').must_equal true
74
+ traces[2].has_key?('KVHitCount').must_equal true
75
+ traces[3]['Label'].must_equal "exit"
76
+ end
77
+
78
+ it "should trace increment" do
79
+ @dc.incr("dalli_key_counter", 1, nil, 0)
80
+
81
+ TraceView::API.start_trace('dalli_test', '', {}) do
82
+ @dc.incr("dalli_key_counter")
83
+ end
84
+
85
+ traces = get_all_traces
86
+ traces.count.must_equal 4
87
+
88
+ validate_outer_layers(traces, 'dalli_test')
89
+
90
+ traces[1]['KVOp'].must_equal "incr"
91
+ traces[1]['KVKey'].must_equal "dalli_key_counter"
92
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
93
+ traces[2]['Label'].must_equal "exit"
94
+ end
95
+
96
+ it "should trace decrement" do
97
+ @dc.incr("dalli_key_counter", 1, nil, 0)
98
+
99
+ TraceView::API.start_trace('dalli_test', '', {}) do
100
+ @dc.decr("dalli_key_counter")
101
+ end
102
+
103
+ traces = get_all_traces
104
+ traces.count.must_equal 4
105
+
106
+ validate_outer_layers(traces, 'dalli_test')
107
+
108
+ traces[1]['KVOp'].must_equal "decr"
109
+ traces[1]['KVKey'].must_equal "dalli_key_counter"
110
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
111
+ traces[2]['Label'].must_equal "exit"
112
+ end
113
+
114
+ it "should trace replace" do
115
+ @dc.set('some_key', 1)
116
+
117
+ TraceView::API.start_trace('dalli_test', '', {}) do
118
+ @dc.replace("some_key", "woop")
119
+ end
120
+
121
+ traces = get_all_traces
122
+ traces.count.must_equal 4
123
+
124
+ validate_outer_layers(traces, 'dalli_test')
125
+
126
+ traces[1]['KVOp'].must_equal "replace"
127
+ traces[1]['KVKey'].must_equal "some_key"
128
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
129
+ traces[2]['Label'].must_equal "exit"
130
+ end
131
+
132
+ it "should trace delete" do
133
+ @dc.set('some_key', 1)
134
+
135
+ TraceView::API.start_trace('dalli_test', '', {}) do
136
+ @dc.delete("some_key")
137
+ end
138
+
139
+ traces = get_all_traces
140
+ traces.count.must_equal 4
141
+
142
+ validate_outer_layers(traces, 'dalli_test')
143
+
144
+ traces[1]['KVOp'].must_equal "delete"
145
+ traces[1]['KVKey'].must_equal "some_key"
146
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
147
+ end
148
+
149
+ it "should obey :collect_backtraces setting when true" do
150
+ @dc.set('some_key', 1)
151
+ TraceView::Config[:dalli][:collect_backtraces] = true
152
+
153
+ TraceView::API.start_trace('dalli_test', '', {}) do
154
+ @dc.get('some_key')
155
+ end
156
+
157
+ traces = get_all_traces
158
+ layer_has_key(traces, 'memcache', 'Backtrace')
159
+ end
160
+
161
+ it "should obey :collect_backtraces setting when false" do
162
+ TraceView::Config[:dalli][:collect_backtraces] = false
163
+
164
+ TraceView::API.start_trace('dalli_test', '', {}) do
165
+ @dc.get('some_key')
166
+ end
167
+
168
+ traces = get_all_traces
169
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
170
+ end
171
+ end
@@ -0,0 +1,86 @@
1
+ require 'minitest_helper'
2
+
3
+ # Disable this test on JRuby until we can investigate
4
+ # "SOCKET: SET COMM INACTIVITY UNIMPLEMENTED 10"
5
+ # https://travis-ci.org/appneta/traceview-ruby/jobs/33745752
6
+ if RUBY_VERSION >= '1.9' and TraceView::Config[:em_http_request][:enabled] and not defined?(JRUBY_VERSION)
7
+
8
+ describe "EventMachine" do
9
+ before do
10
+ clear_all_traces
11
+ @collect_backtraces = TraceView::Config[:em_http_request][:collect_backtraces]
12
+ end
13
+
14
+ after do
15
+ TraceView::Config[:em_http_request][:collect_backtraces] = @collect_backtraces
16
+ end
17
+
18
+ it 'EventMachine::HttpConnection should be loaded, defined and ready' do
19
+ defined?(::EventMachine::HttpConnection).wont_match nil
20
+ end
21
+
22
+ it 'should have traceview methods defined' do
23
+ ::EventMachine::HttpConnection.method_defined?("setup_request_with_traceview").must_equal true
24
+ end
25
+
26
+ it 'should trace request' do
27
+ TraceView::API.start_trace('em-http-request_test', '', {}) do
28
+ EventMachine.run do
29
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
30
+ http.callback do
31
+ EventMachine.stop
32
+ end
33
+ end
34
+ end
35
+
36
+ traces = get_all_traces
37
+
38
+ traces.count.must_equal 4
39
+ validate_outer_layers(traces, 'em-http-request_test')
40
+
41
+ traces[1]["Layer"].must_equal "em-http-request"
42
+ traces[1]["Label"].must_equal "entry"
43
+ traces[1]["IsService"].must_equal "1"
44
+ traces[1]["RemoteURL"].must_equal "http://appneta.com/"
45
+ traces[1].has_key?('Backtrace').must_equal TraceView::Config[:em_http_request][:collect_backtraces]
46
+
47
+ traces[2]["Layer"].must_equal "em-http-request"
48
+ traces[2]["Label"].must_equal "exit"
49
+ traces[2]["Async"].must_equal "1"
50
+ traces[2].has_key?('Backtrace').must_equal TraceView::Config[:em_http_request][:collect_backtraces]
51
+ end
52
+
53
+ it "should obey :collect_backtraces setting when true" do
54
+ TraceView::Config[:em_http_request][:collect_backtraces] = true
55
+
56
+ TraceView::API.start_trace('em-http-request_test', '', {}) do
57
+ EventMachine.run do
58
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
59
+ http.callback do
60
+ EventMachine.stop
61
+ end
62
+ end
63
+ end
64
+
65
+ traces = get_all_traces
66
+ layer_has_key(traces, 'em-http-request', 'Backtrace')
67
+ end
68
+
69
+ it "should obey :collect_backtraces setting when false" do
70
+ TraceView::Config[:em_http_request][:collect_backtraces] = false
71
+
72
+ TraceView::API.start_trace('em-http-request_test', '', {}) do
73
+ EventMachine.run do
74
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
75
+ http.callback do
76
+ EventMachine.stop
77
+ end
78
+ end
79
+ end
80
+
81
+ traces = get_all_traces
82
+ layer_doesnt_have_key(traces, 'em-http-request', 'Backtrace')
83
+ end
84
+ end
85
+
86
+ end # unless defined?(JRUBY_VERSION)