appoptics_apm 4.0.2

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 (226) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +43 -0
  3. data/.dockerignore +5 -0
  4. data/.gitignore +23 -0
  5. data/.rubocop.yml +5 -0
  6. data/.travis.yml +82 -0
  7. data/CHANGELOG.md +769 -0
  8. data/CONFIG.md +33 -0
  9. data/Dockerfile +41 -0
  10. data/Dockerfile_test +66 -0
  11. data/Gemfile +41 -0
  12. data/LICENSE +193 -0
  13. data/README.md +351 -0
  14. data/Rakefile +202 -0
  15. data/Vagrantfile +67 -0
  16. data/appoptics_apm.gemspec +55 -0
  17. data/build_gems.sh +15 -0
  18. data/docker-compose.yml +73 -0
  19. data/examples/DNT.md +35 -0
  20. data/examples/carrying_context.rb +220 -0
  21. data/examples/instrumenting_metal_controller.rb +8 -0
  22. data/examples/puma_on_heroku_config.rb +17 -0
  23. data/examples/tracing_async_threads.rb +124 -0
  24. data/examples/tracing_background_jobs.rb +53 -0
  25. data/examples/tracing_forked_processes.rb +99 -0
  26. data/examples/unicorn_on_heroku_config.rb +28 -0
  27. data/ext/oboe_metal/extconf.rb +54 -0
  28. data/ext/oboe_metal/lib/.keep +0 -0
  29. data/ext/oboe_metal/lib/liboboe-1.0.so.0.0.0 +0 -0
  30. data/ext/oboe_metal/noop/noop.c +7 -0
  31. data/ext/oboe_metal/src/VERSION +1 -0
  32. data/ext/oboe_metal/src/bson/bson.h +221 -0
  33. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  34. data/ext/oboe_metal/src/oboe.h +883 -0
  35. data/ext/oboe_metal/src/oboe.hpp +793 -0
  36. data/ext/oboe_metal/src/oboe_debug.h +50 -0
  37. data/ext/oboe_metal/src/oboe_wrap.cxx +6088 -0
  38. data/ext/oboe_metal/tests/test.rb +11 -0
  39. data/gemfiles/delayed_job.gemfile +36 -0
  40. data/gemfiles/frameworks.gemfile +44 -0
  41. data/gemfiles/instrumentation_mocked.gemfile +29 -0
  42. data/gemfiles/libraries.gemfile +85 -0
  43. data/gemfiles/rails23.gemfile +39 -0
  44. data/gemfiles/rails30.gemfile +42 -0
  45. data/gemfiles/rails31.gemfile +44 -0
  46. data/gemfiles/rails32.gemfile +54 -0
  47. data/gemfiles/rails40.gemfile +27 -0
  48. data/gemfiles/rails41.gemfile +27 -0
  49. data/gemfiles/rails42.gemfile +35 -0
  50. data/gemfiles/rails50.gemfile +44 -0
  51. data/gemfiles/rails51.gemfile +44 -0
  52. data/get_version.rb +5 -0
  53. data/init.rb +4 -0
  54. data/lib/appoptics_apm/api/layerinit.rb +39 -0
  55. data/lib/appoptics_apm/api/logging.rb +359 -0
  56. data/lib/appoptics_apm/api/memcache.rb +34 -0
  57. data/lib/appoptics_apm/api/profiling.rb +201 -0
  58. data/lib/appoptics_apm/api/tracing.rb +152 -0
  59. data/lib/appoptics_apm/api/util.rb +128 -0
  60. data/lib/appoptics_apm/api.rb +18 -0
  61. data/lib/appoptics_apm/base.rb +252 -0
  62. data/lib/appoptics_apm/config.rb +281 -0
  63. data/lib/appoptics_apm/frameworks/grape.rb +93 -0
  64. data/lib/appoptics_apm/frameworks/padrino/templates.rb +58 -0
  65. data/lib/appoptics_apm/frameworks/padrino.rb +52 -0
  66. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +106 -0
  67. data/lib/appoptics_apm/frameworks/rails/inst/action_controller2.rb +61 -0
  68. data/lib/appoptics_apm/frameworks/rails/inst/action_controller3.rb +58 -0
  69. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
  70. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
  71. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
  72. data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +58 -0
  73. data/lib/appoptics_apm/frameworks/rails/inst/action_view_2x.rb +56 -0
  74. data/lib/appoptics_apm/frameworks/rails/inst/action_view_30.rb +50 -0
  75. data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
  76. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
  77. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +28 -0
  78. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +30 -0
  79. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +120 -0
  80. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +101 -0
  81. data/lib/appoptics_apm/frameworks/rails.rb +116 -0
  82. data/lib/appoptics_apm/frameworks/sinatra/templates.rb +56 -0
  83. data/lib/appoptics_apm/frameworks/sinatra.rb +71 -0
  84. data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
  85. data/lib/appoptics_apm/inst/bunny-consumer.rb +92 -0
  86. data/lib/appoptics_apm/inst/curb.rb +329 -0
  87. data/lib/appoptics_apm/inst/dalli.rb +85 -0
  88. data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
  89. data/lib/appoptics_apm/inst/em-http-request.rb +105 -0
  90. data/lib/appoptics_apm/inst/excon.rb +130 -0
  91. data/lib/appoptics_apm/inst/faraday.rb +77 -0
  92. data/lib/appoptics_apm/inst/http.rb +83 -0
  93. data/lib/appoptics_apm/inst/httpclient.rb +176 -0
  94. data/lib/appoptics_apm/inst/memcache.rb +102 -0
  95. data/lib/appoptics_apm/inst/memcached.rb +94 -0
  96. data/lib/appoptics_apm/inst/mongo.rb +242 -0
  97. data/lib/appoptics_apm/inst/mongo2.rb +225 -0
  98. data/lib/appoptics_apm/inst/moped.rb +466 -0
  99. data/lib/appoptics_apm/inst/rack.rb +146 -0
  100. data/lib/appoptics_apm/inst/redis.rb +275 -0
  101. data/lib/appoptics_apm/inst/resque.rb +151 -0
  102. data/lib/appoptics_apm/inst/rest-client.rb +50 -0
  103. data/lib/appoptics_apm/inst/sequel.rb +178 -0
  104. data/lib/appoptics_apm/inst/sidekiq-client.rb +53 -0
  105. data/lib/appoptics_apm/inst/sidekiq-worker.rb +67 -0
  106. data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
  107. data/lib/appoptics_apm/inst/typhoeus.rb +113 -0
  108. data/lib/appoptics_apm/instrumentation.rb +22 -0
  109. data/lib/appoptics_apm/legacy_method_profiling.rb +97 -0
  110. data/lib/appoptics_apm/loading.rb +66 -0
  111. data/lib/appoptics_apm/logger.rb +41 -0
  112. data/lib/appoptics_apm/method_profiling.rb +33 -0
  113. data/lib/appoptics_apm/ruby.rb +35 -0
  114. data/lib/appoptics_apm/support.rb +135 -0
  115. data/lib/appoptics_apm/test.rb +94 -0
  116. data/lib/appoptics_apm/thread_local.rb +26 -0
  117. data/lib/appoptics_apm/util.rb +312 -0
  118. data/lib/appoptics_apm/version.rb +15 -0
  119. data/lib/appoptics_apm/xtrace.rb +103 -0
  120. data/lib/appoptics_apm.rb +72 -0
  121. data/lib/joboe_metal.rb +214 -0
  122. data/lib/oboe/README +2 -0
  123. data/lib/oboe/backward_compatibility.rb +80 -0
  124. data/lib/oboe/inst/rack.rb +11 -0
  125. data/lib/oboe.rb +7 -0
  126. data/lib/oboe_metal.rb +187 -0
  127. data/lib/rails/generators/appoptics_apm/install_generator.rb +45 -0
  128. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +222 -0
  129. data/ruby_setup.sh +47 -0
  130. data/run_docker_build_gem_upload_to_packagecloud.sh +20 -0
  131. data/run_tests_docker.rb +32 -0
  132. data/test/benchmark/README.md +65 -0
  133. data/test/benchmark/logging_bench.rb +54 -0
  134. data/test/benchmark/with_libraries_gemfile/bunny_bench.rb +69 -0
  135. data/test/benchmark/with_rails5x_gemfile/action_controller5x_bench.rb +43 -0
  136. data/test/frameworks/apps/grape_nested.rb +33 -0
  137. data/test/frameworks/apps/grape_simple.rb +80 -0
  138. data/test/frameworks/apps/padrino_simple.rb +80 -0
  139. data/test/frameworks/apps/sinatra_simple.rb +55 -0
  140. data/test/frameworks/grape_test.rb +286 -0
  141. data/test/frameworks/padrino_test.rb +222 -0
  142. data/test/frameworks/rails3x_test.rb +554 -0
  143. data/test/frameworks/rails4x_test.rb +570 -0
  144. data/test/frameworks/rails5x_api_test.rb +210 -0
  145. data/test/frameworks/rails5x_test.rb +376 -0
  146. data/test/frameworks/rails_shared_tests.rb +172 -0
  147. data/test/frameworks/sinatra_test.rb +140 -0
  148. data/test/instrumentation/bunny_client_test.rb +276 -0
  149. data/test/instrumentation/bunny_consumer_test.rb +204 -0
  150. data/test/instrumentation/curb_test.rb +398 -0
  151. data/test/instrumentation/dalli_test.rb +177 -0
  152. data/test/instrumentation/em_http_request_test.rb +89 -0
  153. data/test/instrumentation/excon_test.rb +231 -0
  154. data/test/instrumentation/faraday_test.rb +228 -0
  155. data/test/instrumentation/http_test.rb +143 -0
  156. data/test/instrumentation/httpclient_test.rb +320 -0
  157. data/test/instrumentation/memcache_test.rb +260 -0
  158. data/test/instrumentation/memcached_test.rb +229 -0
  159. data/test/instrumentation/mongo_v1_test.rb +479 -0
  160. data/test/instrumentation/mongo_v2_index_test.rb +124 -0
  161. data/test/instrumentation/mongo_v2_test.rb +584 -0
  162. data/test/instrumentation/mongo_v2_view_test.rb +435 -0
  163. data/test/instrumentation/moped_test.rb +517 -0
  164. data/test/instrumentation/rack_test.rb +165 -0
  165. data/test/instrumentation/redis_hashes_test.rb +268 -0
  166. data/test/instrumentation/redis_keys_test.rb +321 -0
  167. data/test/instrumentation/redis_lists_test.rb +310 -0
  168. data/test/instrumentation/redis_misc_test.rb +163 -0
  169. data/test/instrumentation/redis_sets_test.rb +296 -0
  170. data/test/instrumentation/redis_sortedsets_test.rb +328 -0
  171. data/test/instrumentation/redis_strings_test.rb +349 -0
  172. data/test/instrumentation/resque_test.rb +185 -0
  173. data/test/instrumentation/rest-client_test.rb +288 -0
  174. data/test/instrumentation/sequel_mysql2_test.rb +353 -0
  175. data/test/instrumentation/sequel_mysql_test.rb +334 -0
  176. data/test/instrumentation/sequel_pg_test.rb +336 -0
  177. data/test/instrumentation/sidekiq-client_test.rb +159 -0
  178. data/test/instrumentation/sidekiq-worker_test.rb +180 -0
  179. data/test/instrumentation/twitter-cassandra_test.rb +424 -0
  180. data/test/instrumentation/typhoeus_test.rb +284 -0
  181. data/test/jobs/delayed_job/db_worker_job.rb +29 -0
  182. data/test/jobs/delayed_job/error_worker_job.rb +10 -0
  183. data/test/jobs/delayed_job/remote_call_worker_job.rb +20 -0
  184. data/test/jobs/resque/db_worker_job.rb +29 -0
  185. data/test/jobs/resque/error_worker_job.rb +10 -0
  186. data/test/jobs/resque/remote_call_worker_job.rb +20 -0
  187. data/test/jobs/sidekiq/db_worker_job.rb +29 -0
  188. data/test/jobs/sidekiq/error_worker_job.rb +10 -0
  189. data/test/jobs/sidekiq/remote_call_worker_job.rb +20 -0
  190. data/test/minitest_helper.rb +276 -0
  191. data/test/mocked/curb_mocked_test.rb +311 -0
  192. data/test/mocked/excon_mocked_test.rb +166 -0
  193. data/test/mocked/faraday_mocked_test.rb +93 -0
  194. data/test/mocked/http_mocked_test.rb +129 -0
  195. data/test/mocked/httpclient_mocked_test.rb +245 -0
  196. data/test/mocked/rest_client_mocked_test.rb +103 -0
  197. data/test/mocked/typhoeus_mocked_test.rb +192 -0
  198. data/test/models/widget.rb +36 -0
  199. data/test/profiling/legacy_method_profiling_test.rb +201 -0
  200. data/test/profiling/method_profiling_test.rb +631 -0
  201. data/test/queues/delayed_job-client_test.rb +95 -0
  202. data/test/queues/delayed_job-worker_test.rb +91 -0
  203. data/test/reporter/reporter_test.rb +14 -0
  204. data/test/servers/delayed_job.rb +107 -0
  205. data/test/servers/rackapp_8101.rb +29 -0
  206. data/test/servers/rails3x_8140.rb +96 -0
  207. data/test/servers/rails4x_8140.rb +96 -0
  208. data/test/servers/rails5x_8140.rb +95 -0
  209. data/test/servers/rails5x_api_8150.rb +78 -0
  210. data/test/servers/sidekiq.rb +29 -0
  211. data/test/servers/sidekiq.yml +7 -0
  212. data/test/servers/sidekiq_initializer.rb +25 -0
  213. data/test/settings +0 -0
  214. data/test/support/auto_tracing_test.rb +50 -0
  215. data/test/support/backcompat_test.rb +276 -0
  216. data/test/support/config_test.rb +149 -0
  217. data/test/support/dnt_test.rb +98 -0
  218. data/test/support/init_report_test.rb +25 -0
  219. data/test/support/liboboe_settings_test.rb +110 -0
  220. data/test/support/logging_test.rb +130 -0
  221. data/test/support/noop_test.rb +88 -0
  222. data/test/support/sql_sanitize_test.rb +55 -0
  223. data/test/support/tracing_mode_test.rb +33 -0
  224. data/test/support/tvalias_test.rb +15 -0
  225. data/test/support/xtrace_test.rb +41 -0
  226. metadata +475 -0
@@ -0,0 +1,177 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if RUBY_VERSION > '1.8.7'
5
+
6
+ require 'minitest_helper'
7
+
8
+ describe "Dalli" do
9
+ before do
10
+ clear_all_traces
11
+ @dc = Dalli::Client.new
12
+ @collect_backtraces = AppOpticsAPM::Config[:dalli][:collect_backtraces]
13
+ end
14
+
15
+ after do
16
+ AppOpticsAPM::Config[:dalli][:collect_backtraces] = @collect_backtraces
17
+ end
18
+
19
+ it 'Stock Dalli should be loaded, defined and ready' do
20
+ defined?(::Dalli).wont_match nil
21
+ defined?(::Dalli::Client).wont_match nil
22
+ end
23
+
24
+ it 'should have appoptics_apm methods defined' do
25
+ [ :perform_with_appoptics, :get_multi_with_appoptics].each do |m|
26
+ ::Dalli::Client.method_defined?(m).must_equal true
27
+ end
28
+ end
29
+
30
+ it 'should trace set' do
31
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
32
+ @dc.set('some_key', 1234)
33
+ end
34
+
35
+ traces = get_all_traces
36
+ traces.count.must_equal 4
37
+
38
+ validate_outer_layers(traces, 'dalli_test')
39
+
40
+ traces[1].has_key?("KVOp").must_equal true
41
+ traces[1].has_key?("KVKey").must_equal true
42
+ traces[1]['Layer'].must_equal "memcache"
43
+ traces[1]['KVKey'].must_equal "some_key"
44
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
45
+ end
46
+
47
+ it 'should trace get' do
48
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
49
+ @dc.get('some_key')
50
+ end
51
+
52
+ traces = get_all_traces
53
+ traces.count.must_equal 5
54
+
55
+ validate_outer_layers(traces, 'dalli_test')
56
+
57
+ traces[1]['KVOp'].must_equal "get"
58
+ traces[1]['KVKey'].must_equal "some_key"
59
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
60
+ traces[2]['Label'].must_equal "info"
61
+ traces[2].has_key?('KVHit').must_equal true
62
+ traces[3]['Label'].must_equal "exit"
63
+ end
64
+
65
+ it 'should trace get_multi' do
66
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
67
+ @dc.get_multi([:one, :two, :three, :four, :five, :six])
68
+ end
69
+
70
+ traces = get_all_traces
71
+ traces.count.must_equal 5
72
+
73
+ validate_outer_layers(traces, 'dalli_test')
74
+
75
+ traces[1]['KVOp'].must_equal "get_multi"
76
+ traces[2]['Label'].must_equal "info"
77
+ traces[2]['RemoteHost'].must_equal "127.0.0.1:11211"
78
+ traces[2].has_key?('KVKeyCount').must_equal true
79
+ traces[2].has_key?('KVHitCount').must_equal true
80
+ traces[3]['Label'].must_equal "exit"
81
+ end
82
+
83
+ it "should trace increment" do
84
+ @dc.incr("dalli_key_counter", 1, nil, 0)
85
+
86
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
87
+ @dc.incr("dalli_key_counter")
88
+ end
89
+
90
+ traces = get_all_traces
91
+ traces.count.must_equal 4
92
+
93
+ validate_outer_layers(traces, 'dalli_test')
94
+
95
+ traces[1]['KVOp'].must_equal "incr"
96
+ traces[1]['KVKey'].must_equal "dalli_key_counter"
97
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
98
+ traces[2]['Label'].must_equal "exit"
99
+ end
100
+
101
+ it "should trace decrement" do
102
+ @dc.incr("dalli_key_counter", 1, nil, 0)
103
+
104
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
105
+ @dc.decr("dalli_key_counter")
106
+ end
107
+
108
+ traces = get_all_traces
109
+ traces.count.must_equal 4
110
+
111
+ validate_outer_layers(traces, 'dalli_test')
112
+
113
+ traces[1]['KVOp'].must_equal "decr"
114
+ traces[1]['KVKey'].must_equal "dalli_key_counter"
115
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
116
+ traces[2]['Label'].must_equal "exit"
117
+ end
118
+
119
+ it "should trace replace" do
120
+ @dc.set('some_key', 1)
121
+
122
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
123
+ @dc.replace("some_key", "woop")
124
+ end
125
+
126
+ traces = get_all_traces
127
+ traces.count.must_equal 4
128
+
129
+ validate_outer_layers(traces, 'dalli_test')
130
+
131
+ traces[1]['KVOp'].must_equal "replace"
132
+ traces[1]['KVKey'].must_equal "some_key"
133
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
134
+ traces[2]['Label'].must_equal "exit"
135
+ end
136
+
137
+ it "should trace delete" do
138
+ @dc.set('some_key', 1)
139
+
140
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
141
+ @dc.delete("some_key")
142
+ end
143
+
144
+ traces = get_all_traces
145
+ traces.count.must_equal 4
146
+
147
+ validate_outer_layers(traces, 'dalli_test')
148
+
149
+ traces[1]['KVOp'].must_equal "delete"
150
+ traces[1]['KVKey'].must_equal "some_key"
151
+ traces[1]['RemoteHost'].must_equal "127.0.0.1:11211"
152
+ end
153
+
154
+ it "should obey :collect_backtraces setting when true" do
155
+ @dc.set('some_key', 1)
156
+ AppOpticsAPM::Config[:dalli][:collect_backtraces] = true
157
+
158
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
159
+ @dc.get('some_key')
160
+ end
161
+
162
+ traces = get_all_traces
163
+ layer_has_key(traces, 'memcache', 'Backtrace')
164
+ end
165
+
166
+ it "should obey :collect_backtraces setting when false" do
167
+ AppOpticsAPM::Config[:dalli][:collect_backtraces] = false
168
+
169
+ AppOpticsAPM::API.start_trace('dalli_test', '', {}) do
170
+ @dc.get('some_key')
171
+ end
172
+
173
+ traces = get_all_traces
174
+ layer_doesnt_have_key(traces, 'memcache', 'Backtrace')
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,89 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+
6
+ # Disable this test on JRuby until we can investigate
7
+ # "SOCKET: SET COMM INACTIVITY UNIMPLEMENTED 10"
8
+ # https://travis-ci.org/tracelytics/ruby-appoptics_apm/jobs/33745752
9
+ if RUBY_VERSION >= '1.9' and AppOpticsAPM::Config[:em_http_request][:enabled] and not defined?(JRUBY_VERSION)
10
+
11
+ describe "EventMachine" do
12
+ before do
13
+ clear_all_traces
14
+ @collect_backtraces = AppOpticsAPM::Config[:em_http_request][:collect_backtraces]
15
+ end
16
+
17
+ after do
18
+ AppOpticsAPM::Config[:em_http_request][:collect_backtraces] = @collect_backtraces
19
+ end
20
+
21
+ it 'EventMachine::HttpConnection should be loaded, defined and ready' do
22
+ defined?(::EventMachine::HttpConnection).wont_match nil
23
+ end
24
+
25
+ it 'should have appoptics_apm methods defined' do
26
+ ::EventMachine::HttpConnection.method_defined?("setup_request_with_appoptics").must_equal true
27
+ end
28
+
29
+ it 'should trace request' do
30
+ AppOpticsAPM::API.start_trace('em-http-request_test', '', {}) do
31
+ EventMachine.run do
32
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
33
+ http.callback do
34
+ EventMachine.stop
35
+ end
36
+ end
37
+ end
38
+
39
+ traces = get_all_traces
40
+
41
+ traces.count.must_equal 4
42
+ validate_outer_layers(traces, 'em-http-request_test')
43
+
44
+ traces[1]["Layer"].must_equal "em-http-request"
45
+ traces[1]["Label"].must_equal "entry"
46
+ traces[1]["IsService"].must_equal "1"
47
+ traces[1]["RemoteURL"].must_equal "http://appneta.com/"
48
+ traces[1].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:em_http_request][:collect_backtraces]
49
+
50
+ traces[2]["Layer"].must_equal "em-http-request"
51
+ traces[2]["Label"].must_equal "exit"
52
+ traces[2]["Async"].must_equal "1"
53
+ traces[2].has_key?('Backtrace').must_equal AppOpticsAPM::Config[:em_http_request][:collect_backtraces]
54
+ end
55
+
56
+ it "should obey :collect_backtraces setting when true" do
57
+ AppOpticsAPM::Config[:em_http_request][:collect_backtraces] = true
58
+
59
+ AppOpticsAPM::API.start_trace('em-http-request_test', '', {}) do
60
+ EventMachine.run do
61
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
62
+ http.callback do
63
+ EventMachine.stop
64
+ end
65
+ end
66
+ end
67
+
68
+ traces = get_all_traces
69
+ layer_has_key(traces, 'em-http-request', 'Backtrace')
70
+ end
71
+
72
+ it "should obey :collect_backtraces setting when false" do
73
+ AppOpticsAPM::Config[:em_http_request][:collect_backtraces] = false
74
+
75
+ AppOpticsAPM::API.start_trace('em-http-request_test', '', {}) do
76
+ EventMachine.run do
77
+ http = EventMachine::HttpRequest.new('http://appneta.com/').get
78
+ http.callback do
79
+ EventMachine.stop
80
+ end
81
+ end
82
+ end
83
+
84
+ traces = get_all_traces
85
+ layer_doesnt_have_key(traces, 'em-http-request', 'Backtrace')
86
+ end
87
+ end
88
+
89
+ end # unless defined?(JRUBY_VERSION)
@@ -0,0 +1,231 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'minitest_helper'
5
+ require 'appoptics_apm/inst/rack'
6
+ require File.expand_path(File.dirname(__FILE__) + '../../frameworks/apps/sinatra_simple')
7
+
8
+ class ExconTest < Minitest::Test
9
+ include Rack::Test::Methods
10
+
11
+ def app
12
+ SinatraSimple
13
+ end
14
+
15
+ def test_must_return_xtrace_header
16
+ skip if defined?(JRUBY_VERSION)
17
+
18
+ clear_all_traces
19
+ get "/"
20
+ xtrace = last_response['X-Trace']
21
+
22
+ # Rack response header management under JRUBY.
23
+ assert xtrace
24
+ assert AppOpticsAPM::XTrace.valid?(xtrace)
25
+ end
26
+
27
+ def test_reports_version_init
28
+ init_kvs = ::AppOpticsAPM::Util.build_init_report
29
+ assert_equal ::Excon::VERSION, init_kvs['Ruby.excon.Version']
30
+ end
31
+
32
+ def test_class_get_request
33
+ clear_all_traces
34
+
35
+ AppOpticsAPM::API.start_trace('excon_tests') do
36
+ Excon.get('http://127.0.0.1:8101/')
37
+ end
38
+
39
+ traces = get_all_traces
40
+ assert_equal traces.count, 7
41
+ validate_outer_layers(traces, "excon_tests")
42
+ assert valid_edges?(traces), "Invalid edge in traces"
43
+
44
+ assert_equal 1, traces[1]['IsService']
45
+ assert_equal '127.0.0.1', traces[1]['RemoteHost']
46
+ assert_equal 'HTTP', traces[1]['RemoteProtocol']
47
+ assert_equal '/', traces[1]['ServiceArg']
48
+ assert_equal 'GET', traces[1]['HTTPMethod']
49
+ assert traces[1].key?('Backtrace')
50
+
51
+ assert_equal 'excon', traces[5]['Layer']
52
+ assert_equal 'exit', traces[5]['Label']
53
+ assert_equal 200, traces[5]['HTTPStatus']
54
+ end
55
+
56
+ def test_cross_app_tracing
57
+ clear_all_traces
58
+
59
+ AppOpticsAPM::API.start_trace('excon_tests') do
60
+ response = Excon.get('http://127.0.0.1:8101/?blah=1')
61
+ xtrace = response.headers['X-Trace']
62
+
63
+ assert xtrace
64
+ assert AppOpticsAPM::XTrace.valid?(xtrace)
65
+ end
66
+
67
+ traces = get_all_traces
68
+ assert_equal 7, traces.count
69
+ validate_outer_layers(traces, "excon_tests")
70
+ assert valid_edges?(traces), "Invalid edge in traces"
71
+
72
+ assert_equal 1, traces[1]['IsService']
73
+ assert_equal '127.0.0.1', traces[1]['RemoteHost']
74
+ assert_equal 'HTTP', traces[1]['RemoteProtocol']
75
+ assert_equal '/?blah=1', traces[1]['ServiceArg']
76
+ assert_equal 'GET', traces[1]['HTTPMethod']
77
+ assert_equal 200, traces[5]['HTTPStatus']
78
+ assert traces[1].key?('Backtrace')
79
+ end
80
+
81
+ def test_persistent_requests
82
+ # Persistence was adding in 0.31.0
83
+ skip if Excon::VERSION < '0.31.0'
84
+
85
+ clear_all_traces
86
+
87
+ AppOpticsAPM::API.start_trace('excon_tests') do
88
+ connection = Excon.new('http://127.0.0.1:8101/') # non-persistent by default
89
+ connection.get # socket established, then closed
90
+ connection.get(:persistent => true) # socket established, left open
91
+ connection.get # socket reused, then closed
92
+ end
93
+
94
+ traces = get_all_traces
95
+ assert_equal traces.count, 17
96
+ validate_outer_layers(traces, "excon_tests")
97
+ assert valid_edges?(traces), "Invalid edge in traces"
98
+
99
+ assert_equal 1, traces[1]['IsService']
100
+ assert_equal '127.0.0.1', traces[1]['RemoteHost']
101
+ assert_equal 'HTTP', traces[1]['RemoteProtocol']
102
+ assert_equal '/', traces[1]['ServiceArg']
103
+ assert_equal 'GET', traces[1]['HTTPMethod']
104
+ assert_equal 200, traces[5]['HTTPStatus']
105
+ assert traces[1].key?('Backtrace')
106
+
107
+ assert_equal 1, traces[6]['IsService']
108
+ assert_equal '127.0.0.1', traces[6]['RemoteHost']
109
+ assert_equal 'HTTP', traces[6]['RemoteProtocol']
110
+ assert_equal '/', traces[6]['ServiceArg']
111
+ assert_equal 'GET', traces[6]['HTTPMethod']
112
+ assert_equal 200, traces[10]['HTTPStatus']
113
+ assert traces[6].key?('Backtrace')
114
+
115
+ assert_equal 1, traces[11]['IsService']
116
+ assert_equal '127.0.0.1', traces[11]['RemoteHost']
117
+ assert_equal 'HTTP', traces[11]['RemoteProtocol']
118
+ assert_equal '/', traces[11]['ServiceArg']
119
+ assert_equal 'GET', traces[11]['HTTPMethod']
120
+ assert_equal 200, traces[15]['HTTPStatus']
121
+ assert traces[11].key?('Backtrace')
122
+ end
123
+
124
+ def test_pipelined_requests
125
+ skip if Excon::VERSION <= '0.17.0'
126
+
127
+ clear_all_traces
128
+
129
+ AppOpticsAPM::API.start_trace('excon_tests') do
130
+ connection = Excon.new('http://127.0.0.1:8101/')
131
+ connection.requests([{:method => :get}, {:method => :put}])
132
+ end
133
+
134
+ traces = get_all_traces
135
+ assert_equal 10, traces.count
136
+ validate_outer_layers(traces, "excon_tests")
137
+ assert valid_edges?(traces), "Invalid edge in traces"
138
+
139
+ assert_equal 1, traces[1]['IsService']
140
+ assert_equal '127.0.0.1', traces[1]['RemoteHost']
141
+ assert_equal 'HTTP', traces[1]['RemoteProtocol']
142
+ assert_equal '/', traces[1]['ServiceArg']
143
+ assert_equal 'true', traces[1]['Pipeline']
144
+ assert_equal 'GET, PUT', traces[1]['HTTPMethods']
145
+ assert traces[1].key?('Backtrace')
146
+ end
147
+
148
+ def test_requests_with_errors
149
+ clear_all_traces
150
+
151
+ begin
152
+ AppOpticsAPM::API.start_trace('excon_tests') do
153
+ Excon.get('http://asfjalkfjlajfljkaljf/')
154
+ end
155
+ rescue
156
+ end
157
+
158
+ traces = get_all_traces
159
+ assert_equal traces.count, 5
160
+ validate_outer_layers(traces, "excon_tests")
161
+ assert valid_edges?(traces), "Invalid edge in traces"
162
+
163
+ assert_equal 1, traces[1]['IsService']
164
+ assert_equal 'asfjalkfjlajfljkaljf', traces[1]['RemoteHost']
165
+ assert_equal 'HTTP', traces[1]['RemoteProtocol']
166
+ assert_equal '/', traces[1]['ServiceArg']
167
+ assert_equal 'GET', traces[1]['HTTPMethod']
168
+ assert traces[1].key?('Backtrace')
169
+
170
+ assert_equal 'excon', traces[2]['Layer']
171
+ assert_equal 'error', traces[2]['Label']
172
+ assert_equal "Excon::Error::Socket", traces[2]['ErrorClass']
173
+ assert traces[2].key?('ErrorMsg')
174
+ assert traces[2].key?('Backtrace')
175
+
176
+ assert_equal 'excon', traces[3]['Layer']
177
+ assert_equal 'exit', traces[3]['Label']
178
+ end
179
+
180
+ def test_obey_log_args_when_false
181
+ @log_args = AppOpticsAPM::Config[:excon][:log_args]
182
+ clear_all_traces
183
+
184
+ AppOpticsAPM::Config[:excon][:log_args] = false
185
+
186
+ AppOpticsAPM::API.start_trace('excon_tests') do
187
+ Excon.get('http://127.0.0.1:8101/?blah=1')
188
+ end
189
+
190
+ traces = get_all_traces
191
+ assert_equal 7, traces.count
192
+ assert_equal '/', traces[1]['ServiceArg']
193
+
194
+ AppOpticsAPM::Config[:excon][:log_args] = @log_args
195
+ end
196
+
197
+ def test_obey_log_args_when_true
198
+ @log_args = AppOpticsAPM::Config[:excon][:log_args]
199
+ clear_all_traces
200
+
201
+ AppOpticsAPM::Config[:excon][:log_args] = true
202
+
203
+ AppOpticsAPM::API.start_trace('excon_tests') do
204
+ Excon.get('http://127.0.0.1:8101/?blah=1')
205
+ end
206
+
207
+ traces = get_all_traces
208
+ assert_equal 7, traces.count
209
+ assert_equal '/?blah=1', traces[1]['ServiceArg']
210
+
211
+ AppOpticsAPM::Config[:excon][:log_args] = @log_args
212
+ end
213
+
214
+ def test_obey_log_args_when_true_and_using_hash
215
+ @log_args = AppOpticsAPM::Config[:excon][:log_args]
216
+ clear_all_traces
217
+
218
+ AppOpticsAPM::Config[:excon][:log_args] = true
219
+
220
+ AppOpticsAPM::API.start_trace('excon_tests') do
221
+ Excon.get('http://127.0.0.1:8101/?', :query => { :blah => 1 })
222
+ end
223
+
224
+ traces = get_all_traces
225
+ assert_equal 7, traces.count
226
+ assert_equal '/?blah=1', traces[1]['ServiceArg']
227
+
228
+ AppOpticsAPM::Config[:excon][:log_args] = @log_args
229
+ end
230
+ end
231
+