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,235 @@
1
+ require 'minitest_helper'
2
+
3
+ describe "Faraday" do
4
+ before do
5
+ clear_all_traces
6
+ @collect_backtraces = TraceView::Config[:faraday][:collect_backtraces]
7
+ end
8
+
9
+ after do
10
+ TraceView::Config[:faraday][:collect_backtraces] = @collect_backtraces
11
+ end
12
+
13
+ it 'Faraday should be defined and ready' do
14
+ defined?(::Faraday).wont_match nil
15
+ end
16
+
17
+ it 'Faraday should have traceview methods defined' do
18
+ [ :run_request_with_traceview ].each do |m|
19
+ ::Faraday::Connection.method_defined?(m).must_equal true
20
+ end
21
+ end
22
+
23
+ it "should trace cross-app request" do
24
+ TraceView::API.start_trace('faraday_test') do
25
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
26
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
27
+ end
28
+ response = conn.get '/games?q=1'
29
+ response.headers["x-trace"].wont_match nil
30
+ end
31
+
32
+ traces = get_all_traces
33
+ traces.count.must_equal 11
34
+
35
+ validate_outer_layers(traces, 'faraday_test')
36
+
37
+ traces[1]['Layer'].must_equal 'faraday'
38
+ traces[1].key?('Backtrace').must_equal TraceView::Config[:faraday][:collect_backtraces]
39
+
40
+ traces[6]['Layer'].must_equal 'net-http'
41
+ traces[6]['IsService'].must_equal 1
42
+ traces[6]['RemoteProtocol'].must_equal 'HTTP'
43
+ traces[6]['RemoteHost'].must_equal '127.0.0.1:8101'
44
+ traces[6]['ServiceArg'].must_equal '/games?q=1'
45
+ traces[6]['HTTPMethod'].must_equal 'GET'
46
+ traces[6]['HTTPStatus'].must_equal '200'
47
+
48
+ traces[7]['Layer'].must_equal 'net-http'
49
+ traces[7]['Label'].must_equal 'exit'
50
+
51
+ traces[8]['Layer'].must_equal 'faraday'
52
+ traces[9]['Label'].must_equal 'exit'
53
+ end
54
+
55
+ it 'should trace a Faraday request' do
56
+ TraceView::API.start_trace('faraday_test') do
57
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
58
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
59
+ end
60
+ conn.get '/?q=ruby_test_suite'
61
+ end
62
+
63
+ traces = get_all_traces
64
+ traces.count.must_equal 11
65
+
66
+ valid_edges?(traces)
67
+ validate_outer_layers(traces, 'faraday_test')
68
+
69
+ traces[1]['Layer'].must_equal 'faraday'
70
+ traces[1].key?('Backtrace').must_equal TraceView::Config[:faraday][:collect_backtraces]
71
+
72
+ traces[6]['Layer'].must_equal 'net-http'
73
+ traces[6]['Label'].must_equal 'info'
74
+ traces[6]['IsService'].must_equal 1
75
+ traces[6]['RemoteProtocol'].must_equal 'HTTP'
76
+ traces[6]['RemoteHost'].must_equal '127.0.0.1:8101'
77
+ traces[6]['ServiceArg'].must_equal '/?q=ruby_test_suite'
78
+ traces[6]['HTTPMethod'].must_equal 'GET'
79
+ traces[6]['HTTPStatus'].must_equal '200'
80
+
81
+ traces[7]['Layer'].must_equal 'net-http'
82
+ traces[7]['Label'].must_equal 'exit'
83
+
84
+ traces[8]['Layer'].must_equal 'faraday'
85
+ traces[8]['Label'].must_equal 'info'
86
+
87
+ traces[9]['Layer'].must_equal 'faraday'
88
+ traces[9]['Label'].must_equal 'exit'
89
+ end
90
+
91
+ it 'should trace a Faraday class style request' do
92
+ TraceView::API.start_trace('faraday_test') do
93
+ Faraday.get('http://127.0.0.1:8101/', {:a => 1})
94
+ end
95
+
96
+ traces = get_all_traces
97
+ traces.count.must_equal 11
98
+
99
+ valid_edges?(traces)
100
+ validate_outer_layers(traces, 'faraday_test')
101
+
102
+ traces[1]['Layer'].must_equal 'faraday'
103
+ traces[1].key?('Backtrace').must_equal TraceView::Config[:faraday][:collect_backtraces]
104
+
105
+ traces[6]['Layer'].must_equal 'net-http'
106
+ traces[6]['Label'].must_equal 'info'
107
+ traces[6]['IsService'].must_equal 1
108
+ traces[6]['RemoteProtocol'].must_equal 'HTTP'
109
+ traces[6]['RemoteHost'].must_equal '127.0.0.1:8101'
110
+ traces[6]['ServiceArg'].must_equal '/?a=1'
111
+ traces[6]['HTTPMethod'].must_equal 'GET'
112
+ traces[6]['HTTPStatus'].must_equal '200'
113
+
114
+ traces[7]['Layer'].must_equal 'net-http'
115
+ traces[7]['Label'].must_equal 'exit'
116
+
117
+ traces[8]['Layer'].must_equal 'faraday'
118
+ traces[8]['Label'].must_equal 'info'
119
+
120
+ traces[9]['Layer'].must_equal 'faraday'
121
+ traces[9]['Label'].must_equal 'exit'
122
+ end
123
+
124
+ it 'should trace a Faraday with the excon adapter' do
125
+ TraceView::API.start_trace('faraday_test') do
126
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
127
+ faraday.adapter :excon
128
+ end
129
+ conn.get '/?q=1'
130
+ end
131
+
132
+ traces = get_all_traces
133
+ traces.count.must_equal 10
134
+
135
+ valid_edges?(traces)
136
+ validate_outer_layers(traces, 'faraday_test')
137
+
138
+ traces[1]['Layer'].must_equal 'faraday'
139
+ traces[1].key?('Backtrace').must_equal TraceView::Config[:faraday][:collect_backtraces]
140
+
141
+ traces[2]['Layer'].must_equal 'excon'
142
+ traces[2]['Label'].must_equal 'entry'
143
+ traces[2]['IsService'].must_equal 1
144
+ traces[2]['RemoteProtocol'].must_equal 'HTTP'
145
+ traces[2]['RemoteHost'].must_equal '127.0.0.1'
146
+ traces[2]['ServiceArg'].must_equal '/?q=1'
147
+ traces[2]['HTTPMethod'].must_equal 'GET'
148
+
149
+ traces[6]['Layer'].must_equal 'excon'
150
+ traces[6]['Label'].must_equal 'exit'
151
+ traces[6]['HTTPStatus'].must_equal 200
152
+
153
+ traces[7]['Layer'].must_equal 'faraday'
154
+ traces[7]['Label'].must_equal 'info'
155
+ unless RUBY_VERSION < '1.9.3'
156
+ # FIXME: Ruby 1.8 is reporting an object instance instead of
157
+ # an array
158
+ traces[7]['Middleware'].must_equal '[Faraday::Adapter::Excon]'
159
+ end
160
+
161
+ traces[8]['Layer'].must_equal 'faraday'
162
+ traces[8]['Label'].must_equal 'exit'
163
+ end
164
+
165
+ it 'should trace a Faraday with the httpclient adapter' do
166
+ skip "FIXME: once HTTPClient instrumentation is done"
167
+
168
+ TraceView::API.start_trace('faraday_test') do
169
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
170
+ faraday.adapter :httpclient
171
+ end
172
+ conn.get '/?q=1'
173
+ end
174
+
175
+ traces = get_all_traces
176
+ traces.count.must_equal 10
177
+
178
+ valid_edges?(traces)
179
+ validate_outer_layers(traces, 'faraday_test')
180
+
181
+ traces[1]['Layer'].must_equal 'faraday'
182
+ traces[1].key?('Backtrace').must_equal TraceView::Config[:faraday][:collect_backtraces]
183
+
184
+ traces[2]['Layer'].must_equal 'excon'
185
+ traces[2]['Label'].must_equal 'entry'
186
+ traces[2]['IsService'].must_equal 1
187
+ traces[2]['RemoteProtocol'].must_equal 'HTTP'
188
+ traces[2]['RemoteHost'].must_equal '127.0.0.1'
189
+ traces[2]['ServiceArg'].must_equal '/?q=1'
190
+ traces[2]['HTTPMethod'].must_equal 'GET'
191
+
192
+ traces[6]['Layer'].must_equal 'excon'
193
+ traces[6]['Label'].must_equal 'exit'
194
+ traces[6]['HTTPStatus'].must_equal 200
195
+
196
+ traces[7]['Layer'].must_equal 'faraday'
197
+ traces[7]['Label'].must_equal 'info'
198
+ unless RUBY_VERSION < '1.9.3'
199
+ # FIXME: Ruby 1.8 is reporting an object instance instead of
200
+ # an array
201
+ traces[7]['Middleware'].must_equal '[Faraday::Adapter::Excon]'
202
+ end
203
+
204
+ traces[8]['Layer'].must_equal 'faraday'
205
+ traces[8]['Label'].must_equal 'exit'
206
+ end
207
+
208
+ it 'should obey :collect_backtraces setting when true' do
209
+ TraceView::Config[:faraday][:collect_backtraces] = true
210
+
211
+ TraceView::API.start_trace('faraday_test') do
212
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
213
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
214
+ end
215
+ conn.get '/?q=ruby_test_suite'
216
+ end
217
+
218
+ traces = get_all_traces
219
+ layer_has_key(traces, 'faraday', 'Backtrace')
220
+ end
221
+
222
+ it 'should obey :collect_backtraces setting when false' do
223
+ TraceView::Config[:faraday][:collect_backtraces] = false
224
+
225
+ TraceView::API.start_trace('faraday_test') do
226
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
227
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
228
+ end
229
+ conn.get '/?q=ruby_test_suite'
230
+ end
231
+
232
+ traces = get_all_traces
233
+ layer_doesnt_have_key(traces, 'faraday', 'Backtrace')
234
+ end
235
+ end
@@ -0,0 +1,140 @@
1
+ require 'minitest_helper'
2
+ require 'net/http'
3
+
4
+ describe "Net::HTTP" do
5
+ before do
6
+ clear_all_traces
7
+ @collect_backtraces = TraceView::Config[:nethttp][:collect_backtraces]
8
+ @log_args = TraceView::Config[:nethttp][:log_args]
9
+ end
10
+
11
+ after do
12
+ TraceView::Config[:nethttp][:collect_backtraces] = @collect_backtraces
13
+ TraceView::Config[:nethttp][:log_args] = @log_args
14
+ end
15
+
16
+ it 'Net::HTTP should be defined and ready' do
17
+ defined?(::Net::HTTP).wont_match nil
18
+ end
19
+
20
+ it 'Net::HTTP should have traceview methods defined' do
21
+ [ :request_with_traceview ].each do |m|
22
+ ::Net::HTTP.method_defined?(m).must_equal true
23
+ end
24
+ end
25
+
26
+ it "should trace a Net::HTTP request to an instr'd app" do
27
+ TraceView::API.start_trace('net-http_test', '', {}) do
28
+ uri = URI('http://127.0.0.1:8101/?q=1')
29
+ http = Net::HTTP.new(uri.host, uri.port)
30
+ request = Net::HTTP::Get.new(uri.request_uri)
31
+ response = http.request(request)
32
+ # The HTTP response should have an X-Trace header inside of it
33
+ response["x-trace"].wont_match nil
34
+ end
35
+
36
+ traces = get_all_traces
37
+ traces.count.must_equal 8
38
+ valid_edges?(traces).must_equal true
39
+ validate_outer_layers(traces, 'net-http_test')
40
+
41
+ traces[1]['Layer'].must_equal 'net-http'
42
+ traces[1]['Label'].must_equal 'entry'
43
+
44
+ traces[2]['Layer'].must_equal 'rack'
45
+ traces[2]['Label'].must_equal 'entry'
46
+
47
+ traces[3]['Layer'].must_equal 'rack'
48
+ traces[3]['Label'].must_equal 'info'
49
+
50
+ traces[4]['Layer'].must_equal 'rack'
51
+ traces[4]['Label'].must_equal 'exit'
52
+
53
+ traces[5]['IsService'].must_equal 1
54
+ traces[5]['RemoteProtocol'].must_equal "HTTP"
55
+ traces[5]['RemoteHost'].must_equal "127.0.0.1:8101"
56
+ traces[5]['ServiceArg'].must_equal "/?q=1"
57
+ traces[5]['HTTPMethod'].must_equal "GET"
58
+ traces[5]['HTTPStatus'].must_equal "200"
59
+ traces[5].has_key?('Backtrace').must_equal TraceView::Config[:nethttp][:collect_backtraces]
60
+ end
61
+
62
+ it "should trace a GET request" do
63
+ TraceView::API.start_trace('net-http_test', '', {}) do
64
+ uri = URI('http://127.0.0.1:8101/')
65
+ http = Net::HTTP.new(uri.host, uri.port)
66
+ http.get('/?q=1').read_body
67
+ end
68
+
69
+ traces = get_all_traces
70
+ traces.count.must_equal 8
71
+ valid_edges?(traces).must_equal true
72
+
73
+ validate_outer_layers(traces, 'net-http_test')
74
+
75
+ traces[1]['Layer'].must_equal 'net-http'
76
+ traces[5]['IsService'].must_equal 1
77
+ traces[5]['RemoteProtocol'].must_equal "HTTP"
78
+ traces[5]['RemoteHost'].must_equal "127.0.0.1:8101"
79
+ traces[5]['ServiceArg'].must_equal "/?q=1"
80
+ traces[5]['HTTPMethod'].must_equal "GET"
81
+ traces[5]['HTTPStatus'].must_equal "200"
82
+ traces[5].has_key?('Backtrace').must_equal TraceView::Config[:nethttp][:collect_backtraces]
83
+ end
84
+
85
+ it "should obey :log_args setting when true" do
86
+ TraceView::Config[:nethttp][:log_args] = true
87
+
88
+ TraceView::API.start_trace('nethttp_test', '', {}) do
89
+ uri = URI('http://127.0.0.1:8101/')
90
+ http = Net::HTTP.new(uri.host, uri.port)
91
+ http.use_ssl = false
92
+ http.get('/?q=ruby_test_suite').read_body
93
+ end
94
+
95
+ traces = get_all_traces
96
+ traces[5]['ServiceArg'].must_equal '/?q=ruby_test_suite'
97
+ end
98
+
99
+ it "should obey :log_args setting when false" do
100
+ TraceView::Config[:nethttp][:log_args] = false
101
+
102
+ TraceView::API.start_trace('nethttp_test', '', {}) do
103
+ uri = URI('http://127.0.0.1:8101/')
104
+ http = Net::HTTP.new(uri.host, uri.port)
105
+ http.use_ssl = false
106
+ http.get('/?q=ruby_test_suite').read_body
107
+ end
108
+
109
+ traces = get_all_traces
110
+ traces[5]['ServiceArg'].must_equal '/'
111
+ end
112
+
113
+ it "should obey :collect_backtraces setting when true" do
114
+ TraceView::Config[:nethttp][:collect_backtraces] = true
115
+
116
+ TraceView::API.start_trace('nethttp_test', '', {}) do
117
+ uri = URI('http://127.0.0.1:8101/')
118
+ http = Net::HTTP.new(uri.host, uri.port)
119
+ http.use_ssl = false
120
+ http.get('/?q=ruby_test_suite').read_body
121
+ end
122
+
123
+ traces = get_all_traces
124
+ layer_has_key(traces, 'net-http', 'Backtrace')
125
+ end
126
+
127
+ it "should obey :collect_backtraces setting when false" do
128
+ TraceView::Config[:nethttp][:collect_backtraces] = false
129
+
130
+ TraceView::API.start_trace('nethttp_test', '', {}) do
131
+ uri = URI('http://127.0.0.1:8101/')
132
+ http = Net::HTTP.new(uri.host, uri.port)
133
+ http.use_ssl = false
134
+ http.get('/?q=ruby_test_suite').read_body
135
+ end
136
+
137
+ traces = get_all_traces
138
+ layer_doesnt_have_key(traces, 'net-http', 'Backtrace')
139
+ end
140
+ end
@@ -0,0 +1,296 @@
1
+ require 'minitest_helper'
2
+ require 'traceview/inst/rack'
3
+ require File.expand_path(File.dirname(__FILE__) + '../../frameworks/apps/sinatra_simple')
4
+
5
+ class HTTPClientTest < Minitest::Test
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ SinatraSimple
10
+ end
11
+
12
+ def test_reports_version_init
13
+ init_kvs = ::TraceView::Util.build_init_report
14
+ assert init_kvs.key?('Ruby.HTTPClient.Version')
15
+ assert_equal init_kvs['Ruby.HTTPClient.Version'], "HTTPClient-#{::HTTPClient::VERSION}"
16
+ end
17
+
18
+ def test_get_request
19
+ clear_all_traces
20
+
21
+ response = nil
22
+
23
+ TraceView::API.start_trace('httpclient_tests') do
24
+ clnt = HTTPClient.new
25
+ response = clnt.get('http://127.0.0.1:8101/', :query => { :keyword => 'ruby', :lang => 'en' })
26
+ end
27
+
28
+ traces = get_all_traces
29
+
30
+ # Validate returned xtrace
31
+ assert response.headers.key?("X-Trace")
32
+ assert TraceView::XTrace.valid?(response.headers["X-Trace"])
33
+
34
+ assert_equal traces.count, 7
35
+ valid_edges?(traces)
36
+ validate_outer_layers(traces, "httpclient_tests")
37
+
38
+ assert_equal traces[1]['IsService'], 1
39
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/?keyword=ruby&lang=en'
40
+ assert_equal traces[1]['HTTPMethod'], 'GET'
41
+ assert traces[1].key?('Backtrace')
42
+
43
+ assert_equal traces[5]['Layer'], 'httpclient'
44
+ assert_equal traces[5]['Label'], 'exit'
45
+ assert_equal traces[5]['HTTPStatus'], 200
46
+ end
47
+
48
+ def test_get_with_header_hash
49
+ clear_all_traces
50
+
51
+ response = nil
52
+
53
+ TraceView::API.start_trace('httpclient_tests') do
54
+ clnt = HTTPClient.new
55
+ response = clnt.get('http://127.0.0.1:8101/', nil, { "SOAPAction" => "HelloWorld" })
56
+ end
57
+
58
+ traces = get_all_traces
59
+
60
+ xtrace = response.headers['X-Trace']
61
+ assert xtrace
62
+ assert TraceView::XTrace.valid?(xtrace)
63
+
64
+ assert_equal traces.count, 7
65
+ valid_edges?(traces)
66
+ validate_outer_layers(traces, "httpclient_tests")
67
+
68
+ assert_equal traces[1]['IsService'], 1
69
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/'
70
+ assert_equal traces[1]['HTTPMethod'], 'GET'
71
+ assert traces[1].key?('Backtrace')
72
+
73
+ assert_equal traces[5]['Layer'], 'httpclient'
74
+ assert_equal traces[5]['Label'], 'exit'
75
+ assert_equal traces[5]['HTTPStatus'], 200
76
+ end
77
+
78
+ def test_get_with_header_array
79
+ clear_all_traces
80
+
81
+ response = nil
82
+
83
+ TraceView::API.start_trace('httpclient_tests') do
84
+ clnt = HTTPClient.new
85
+ response = clnt.get('http://127.0.0.1:8101/', nil, [["Accept", "text/plain"], ["Accept", "text/html"]])
86
+ end
87
+
88
+ traces = get_all_traces
89
+
90
+ xtrace = response.headers['X-Trace']
91
+ assert xtrace
92
+ assert TraceView::XTrace.valid?(xtrace)
93
+
94
+ assert_equal traces.count, 7
95
+ valid_edges?(traces)
96
+ validate_outer_layers(traces, "httpclient_tests")
97
+
98
+ assert_equal traces[1]['IsService'], 1
99
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/'
100
+ assert_equal traces[1]['HTTPMethod'], 'GET'
101
+ assert traces[1].key?('Backtrace')
102
+
103
+ assert_equal traces[5]['Layer'], 'httpclient'
104
+ assert_equal traces[5]['Label'], 'exit'
105
+ assert_equal traces[5]['HTTPStatus'], 200
106
+ end
107
+
108
+ def test_post_request
109
+ clear_all_traces
110
+
111
+ response = nil
112
+
113
+ TraceView::API.start_trace('httpclient_tests') do
114
+ clnt = HTTPClient.new
115
+ response = clnt.post('http://127.0.0.1:8101/')
116
+ end
117
+
118
+ traces = get_all_traces
119
+
120
+ xtrace = response.headers['X-Trace']
121
+ assert xtrace
122
+ assert TraceView::XTrace.valid?(xtrace)
123
+
124
+ assert_equal traces.count, 7
125
+ valid_edges?(traces)
126
+ validate_outer_layers(traces, "httpclient_tests")
127
+
128
+ assert_equal traces[1]['IsService'], 1
129
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/'
130
+ assert_equal traces[1]['HTTPMethod'], 'POST'
131
+ assert traces[1].key?('Backtrace')
132
+
133
+ assert_equal traces[5]['Layer'], 'httpclient'
134
+ assert_equal traces[5]['Label'], 'exit'
135
+ assert_equal traces[5]['HTTPStatus'], 200
136
+ end
137
+
138
+ def test_async_get
139
+ skip if RUBY_VERSION < '1.9.2'
140
+
141
+ clear_all_traces
142
+
143
+ conn = nil
144
+
145
+ TraceView::API.start_trace('httpclient_tests') do
146
+ clnt = HTTPClient.new
147
+ conn = clnt.get_async('http://127.0.0.1:8101/?blah=1')
148
+ end
149
+
150
+ # Allow async request to finish
151
+ Thread.pass until conn.finished?
152
+
153
+ traces = get_all_traces
154
+ #require 'byebug'; debugger
155
+ assert_equal traces.count, 7
156
+ valid_edges?(traces)
157
+
158
+ # FIXME: validate_outer_layers assumes that the traces
159
+ # are ordered which in the case of async, they aren't
160
+ # validate_outer_layers(traces, "httpclient_tests")
161
+
162
+ assert_equal traces[2]['Async'], 1
163
+ assert_equal traces[2]['IsService'], 1
164
+ assert_equal traces[2]['RemoteURL'], 'http://127.0.0.1:8101/?blah=1'
165
+ assert_equal traces[2]['HTTPMethod'], 'GET'
166
+ assert traces[2].key?('Backtrace')
167
+
168
+ assert_equal traces[6]['Layer'], 'httpclient'
169
+ assert_equal traces[6]['Label'], 'exit'
170
+ assert_equal traces[6]['HTTPStatus'], 200
171
+ end
172
+
173
+ def test_cross_app_tracing
174
+ clear_all_traces
175
+
176
+ response = nil
177
+
178
+ TraceView::API.start_trace('httpclient_tests') do
179
+ clnt = HTTPClient.new
180
+ response = clnt.get('http://127.0.0.1:8101/', :query => { :keyword => 'ruby', :lang => 'en' })
181
+ end
182
+
183
+ xtrace = response.headers['X-Trace']
184
+ assert xtrace
185
+ assert TraceView::XTrace.valid?(xtrace)
186
+
187
+ traces = get_all_traces
188
+
189
+ assert_equal traces.count, 7
190
+ valid_edges?(traces)
191
+ validate_outer_layers(traces, "httpclient_tests")
192
+
193
+ assert_equal traces[1]['IsService'], 1
194
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/?keyword=ruby&lang=en'
195
+ assert_equal traces[1]['HTTPMethod'], 'GET'
196
+ assert traces[1].key?('Backtrace')
197
+
198
+ assert_equal traces[2]['Layer'], 'rack'
199
+ assert_equal traces[2]['Label'], 'entry'
200
+ assert_equal traces[3]['Layer'], 'rack'
201
+ assert_equal traces[3]['Label'], 'info'
202
+ assert_equal traces[4]['Layer'], 'rack'
203
+ assert_equal traces[4]['Label'], 'exit'
204
+
205
+ assert_equal traces[5]['Layer'], 'httpclient'
206
+ assert_equal traces[5]['Label'], 'exit'
207
+ assert_equal traces[5]['HTTPStatus'], 200
208
+ end
209
+
210
+ def test_requests_with_errors
211
+ clear_all_traces
212
+
213
+ result = nil
214
+ begin
215
+ TraceView::API.start_trace('httpclient_tests') do
216
+ clnt = HTTPClient.new
217
+ result = clnt.get('http://asfjalkfjlajfljkaljf/')
218
+ end
219
+ rescue
220
+ end
221
+
222
+ traces = get_all_traces
223
+ assert_equal traces.count, 5
224
+ valid_edges?(traces)
225
+ validate_outer_layers(traces, "httpclient_tests")
226
+
227
+ assert_equal traces[1]['IsService'], 1
228
+ assert_equal traces[1]['RemoteURL'], 'http://asfjalkfjlajfljkaljf/'
229
+ assert_equal traces[1]['HTTPMethod'], 'GET'
230
+ assert traces[1].key?('Backtrace')
231
+
232
+ assert_equal traces[2]['Layer'], 'httpclient'
233
+ assert_equal traces[2]['Label'], 'error'
234
+ assert_equal traces[2]['ErrorClass'], "SocketError"
235
+ assert traces[2].key?('ErrorMsg')
236
+ assert traces[2].key?('Backtrace')
237
+
238
+ assert_equal traces[3]['Layer'], 'httpclient'
239
+ assert_equal traces[3]['Label'], 'exit'
240
+ end
241
+
242
+ def test_log_args_when_true
243
+ clear_all_traces
244
+
245
+ @log_args = TraceView::Config[:httpclient][:log_args]
246
+ TraceView::Config[:httpclient][:log_args] = true
247
+
248
+ response = nil
249
+
250
+ TraceView::API.start_trace('httpclient_tests') do
251
+ clnt = HTTPClient.new
252
+ response = clnt.get('http://127.0.0.1:8101/', :query => { :keyword => 'ruby', :lang => 'en' })
253
+ end
254
+
255
+ traces = get_all_traces
256
+
257
+ xtrace = response.headers['X-Trace']
258
+ assert xtrace
259
+ assert TraceView::XTrace.valid?(xtrace)
260
+
261
+ assert_equal traces.count, 7
262
+ valid_edges?(traces)
263
+
264
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/?keyword=ruby&lang=en'
265
+
266
+ TraceView::Config[:httpclient][:log_args] = @log_args
267
+ end
268
+
269
+ def test_log_args_when_false
270
+ clear_all_traces
271
+
272
+ @log_args = TraceView::Config[:httpclient][:log_args]
273
+ TraceView::Config[:httpclient][:log_args] = false
274
+
275
+ response = nil
276
+
277
+ TraceView::API.start_trace('httpclient_tests') do
278
+ clnt = HTTPClient.new
279
+ response = clnt.get('http://127.0.0.1:8101/', :query => { :keyword => 'ruby', :lang => 'en' })
280
+ end
281
+
282
+ traces = get_all_traces
283
+
284
+ xtrace = response.headers['X-Trace']
285
+ assert xtrace
286
+ assert TraceView::XTrace.valid?(xtrace)
287
+
288
+ assert_equal traces.count, 7
289
+ valid_edges?(traces)
290
+
291
+ assert_equal traces[1]['RemoteURL'], 'http://127.0.0.1:8101/'
292
+
293
+ TraceView::Config[:httpclient][:log_args] = @log_args
294
+ end
295
+ end
296
+