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,166 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if !defined?(JRUBY_VERSION)
5
+
6
+ require 'minitest_helper'
7
+ require 'webmock/minitest'
8
+ require 'mocha/mini_test'
9
+ WebMock.allow_net_connect!
10
+
11
+ class ExconTest < Minitest::Test
12
+
13
+ def setup
14
+ WebMock.enable!
15
+ WebMock.disable_net_connect!
16
+ AppOpticsAPM.config_lock.synchronize {
17
+ @sample_rate = AppOpticsAPM::Config[:sample_rate]
18
+ @tracing_mode= AppOpticsAPM::Config[:tracing_mode]
19
+ }
20
+ end
21
+
22
+ def teardown
23
+ AppOpticsAPM.config_lock.synchronize {
24
+ AppOpticsAPM::Config[:sample_rate] = @sample_rate
25
+ AppOpticsAPM::Config[:tracing_mode] = @tracing_mode
26
+ AppOpticsAPM::Config[:blacklist] = []
27
+ }
28
+ WebMock.reset!
29
+ WebMock.allow_net_connect!
30
+ WebMock.disable!
31
+ end
32
+
33
+ # ========== excon get =================================
34
+
35
+ def test_xtrace_no_trace
36
+ stub_request(:get, "http://127.0.0.6:8101/")
37
+
38
+ AppOpticsAPM.config_lock.synchronize do
39
+ ::Excon.get("http://127.0.0.6:8101/")
40
+ end
41
+
42
+ assert_requested :get, "http://127.0.0.6:8101/", times: 1
43
+ assert_not_requested :get, "http://127.0.0.6:8101/", headers: {'X-Trace'=>/^.*$/}
44
+ end
45
+
46
+ def test_xtrace_tracing
47
+ stub_request(:get, "http://127.0.0.7:8101/").to_return(status: 200, body: "", headers: {})
48
+
49
+ AppOpticsAPM::API.start_trace('excon_tests') do
50
+ ::Excon.get("http://127.0.0.7:8101/")
51
+ end
52
+
53
+ assert_requested :get, "http://127.0.0.7:8101/", times: 1
54
+ assert_requested :get, "http://127.0.0.7:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]{56}01/}, times: 1
55
+ end
56
+
57
+ def test_xtrace_tracing_not_sampling
58
+ stub_request(:get, "http://127.0.0.4:8101/").to_return(status: 200, body: "", headers: {})
59
+
60
+ AppOpticsAPM.config_lock.synchronize do
61
+ AppOpticsAPM::Config[:sample_rate] = 0
62
+ AppOpticsAPM::API.start_trace('excon_test') do
63
+ ::Excon.get("http://127.0.0.4:8101/")
64
+ end
65
+ end
66
+
67
+ assert_requested :get, "http://127.0.0.4:8101/", times: 1
68
+ assert_requested :get, "http://127.0.0.4:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*00$/}, times: 1
69
+ assert_not_requested :get, "http://127.0.0.4:8101/", headers: {'X-Trace'=>/^2B0*$/}
70
+ end
71
+
72
+ def test_xtrace_tracing_blacklisted
73
+ stub_request(:get, "http://127.0.0.3:8101/").to_return(status: 200, body: "", headers: {})
74
+
75
+ AppOpticsAPM.config_lock.synchronize do
76
+ AppOpticsAPM::Config.blacklist << '127.0.0.3'
77
+ AppOpticsAPM::API.start_trace('excon_tests') do
78
+ ::Excon.get("http://127.0.0.3:8101/")
79
+ end
80
+ end
81
+
82
+ assert_requested :get, "http://127.0.0.3:8101/", times: 1
83
+ assert_not_requested :get, "http://127.0.0.3:8101/", headers: {'X-Trace'=>/.*/}
84
+ end
85
+
86
+ # ========== excon pipelined =================================
87
+
88
+ def test_xtrace_pipelined_tracing
89
+ stub_request(:get, "http://127.0.0.5:8101/").to_return(status: 200, body: "", headers: {})
90
+ stub_request(:put, "http://127.0.0.5:8101/").to_return(status: 200, body: "", headers: {})
91
+
92
+ AppOpticsAPM::API.start_trace('excon_tests') do
93
+ connection = ::Excon.new('http://127.0.0.5:8101/')
94
+ connection.requests([{:method => :get}, {:method => :put}])
95
+ end
96
+
97
+ assert_requested :get, "http://127.0.0.5:8101/", times: 1
98
+ assert_requested :put, "http://127.0.0.5:8101/", times: 1
99
+ assert_requested :get, "http://127.0.0.5:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*01$/}, times: 1
100
+ assert_requested :put, "http://127.0.0.5:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*01$/}, times: 1
101
+ end
102
+
103
+ def test_xtrace_pipelined_tracing_not_sampling
104
+ stub_request(:get, "http://127.0.0.2:8101/").to_return(status: 200, body: "", headers: {})
105
+ stub_request(:put, "http://127.0.0.2:8101/").to_return(status: 200, body: "", headers: {})
106
+
107
+ AppOpticsAPM.config_lock.synchronize do
108
+ AppOpticsAPM::Config[:sample_rate] = 0
109
+ AppOpticsAPM::API.start_trace('excon_tests') do
110
+ connection = ::Excon.new('http://127.0.0.2:8101/')
111
+ connection.requests([{:method => :get}, {:method => :put}])
112
+ end
113
+ end
114
+
115
+ assert_requested :get, "http://127.0.0.2:8101/", times: 1
116
+ assert_requested :put, "http://127.0.0.2:8101/", times: 1
117
+ assert_requested :get, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*00$/}, times: 1
118
+ assert_requested :put, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*00$/}, times: 1
119
+ assert_not_requested :get, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B0*$/}
120
+ assert_not_requested :put, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B0*$/}
121
+ end
122
+
123
+ def test_xtrace_pipelined_no_trace
124
+ stub_request(:get, "http://127.0.0.8:8101/").to_return(status: 200, body: "", headers: {})
125
+ stub_request(:put, "http://127.0.0.8:8101/").to_return(status: 200, body: "", headers: {})
126
+
127
+ connection = ::Excon.new('http://127.0.0.8:8101/')
128
+ connection.requests([{:method => :get}, {:method => :put}])
129
+
130
+ assert_requested :get, "http://127.0.0.8:8101/", times: 1
131
+ assert_requested :put, "http://127.0.0.8:8101/", times: 1
132
+ assert_not_requested :get, "http://127.0.0.8:8101/", headers: {'X-Trace'=>/^.*$/}
133
+ assert_not_requested :put, "http://127.0.0.8:8101/", headers: {'X-Trace'=>/^.*$/}
134
+ end
135
+
136
+ def test_xtrace_pipelined_tracing_blacklisted
137
+ stub_request(:get, "http://127.0.0.9:8101/").to_return(status: 200, body: "", headers: {})
138
+ stub_request(:put, "http://127.0.0.9:8101/").to_return(status: 200, body: "", headers: {})
139
+
140
+ AppOpticsAPM.config_lock.synchronize do
141
+ AppOpticsAPM::Config.blacklist << '127.0.0.9'
142
+ AppOpticsAPM::API.start_trace('excon_tests') do
143
+ connection = ::Excon.new('http://127.0.0.9:8101/')
144
+ connection.requests([{:method => :get}, {:method => :put}])
145
+ end
146
+ end
147
+
148
+ assert_requested :get, "http://127.0.0.9:8101/", times: 1
149
+ assert_requested :put, "http://127.0.0.9:8101/", times: 1
150
+ assert_not_requested :get, "http://127.9.0.8:8101/", headers: {'X-Trace'=>/^.*$/}
151
+ assert_not_requested :put, "http://127.9.0.8:8101/", headers: {'X-Trace'=>/^.*$/}
152
+ end
153
+
154
+ # ========== excon make sure headers are preserved =============================
155
+ def test_preserves_custom_headers
156
+ stub_request(:get, "http://127.0.0.6:8101/").to_return(status: 200, body: "", headers: {})
157
+
158
+ AppOpticsAPM::API.start_trace('excon_tests') do
159
+ Excon.get('http://127.0.0.6:8101', headers: { 'Custom' => 'specialvalue' })
160
+ end
161
+
162
+ assert_requested :get, "http://127.0.0.6:8101/", headers: {'Custom'=>'specialvalue'}, times: 1
163
+ end
164
+ end
165
+ end
166
+
@@ -0,0 +1,93 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ if !defined?(JRUBY_VERSION)
5
+
6
+ require 'minitest_helper'
7
+ require 'webmock/minitest'
8
+ require 'mocha/mini_test'
9
+ WebMock.allow_net_connect!
10
+
11
+ class FaradayMockedTest < Minitest::Test
12
+
13
+ def setup
14
+ WebMock.enable!
15
+ WebMock.disable_net_connect!
16
+ AppOpticsAPM.config_lock.synchronize {
17
+ @sample_rate = AppOpticsAPM::Config[:sample_rate]
18
+ }
19
+ end
20
+
21
+ def teardown
22
+ AppOpticsAPM.config_lock.synchronize {
23
+ AppOpticsAPM::Config[:blacklist] = []
24
+ AppOpticsAPM::Config[:sample_rate] = @sample_rate
25
+ }
26
+ WebMock.reset!
27
+ WebMock.allow_net_connect!
28
+ WebMock.disable!
29
+ end
30
+
31
+ def test_tracing_sampling
32
+ stub_request(:get, "http://127.0.0.1:8101/")
33
+
34
+ AppOpticsAPM::API.start_trace('faraday_test') do
35
+ conn = Faraday.new(:url => 'http://127.0.0.1:8101') do |faraday|
36
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
37
+ end
38
+ conn.get
39
+ end
40
+
41
+ assert_requested :get, "http://127.0.0.1:8101/", times: 1
42
+ assert_requested :get, "http://127.0.0.1:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*01$/}, times: 1
43
+ end
44
+
45
+ def test_tracing_not_sampling
46
+ stub_request(:get, "http://127.0.0.12:8101/")
47
+
48
+ AppOpticsAPM.config_lock.synchronize do
49
+ AppOpticsAPM::Config[:sample_rate] = 0
50
+ AppOpticsAPM::API.start_trace('faraday_test') do
51
+ conn = Faraday.new(:url => 'http://127.0.0.12:8101') do |faraday|
52
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
53
+ end
54
+ conn.get
55
+ end
56
+ end
57
+
58
+ assert_requested :get, "http://127.0.0.12:8101/", times: 1
59
+ assert_requested :get, "http://127.0.0.12:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*00$/}, times: 1
60
+ assert_not_requested :get, "http://127.0.0.12:8101/", headers: {'X-Trace'=>/^2B0*$/}
61
+ end
62
+
63
+ def test_no_xtrace
64
+ stub_request(:get, "http://127.0.0.3:8101/")
65
+
66
+ conn = Faraday.new(:url => 'http://127.0.0.3:8101') do |faraday|
67
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
68
+ end
69
+ conn.get
70
+
71
+ assert_requested :get, "http://127.0.0.3:8101/", times: 1
72
+ assert_not_requested :get, "http://127.0.0.3:8101/", headers: {'X-Trace'=>/^.*$/}
73
+ end
74
+
75
+ def test_blacklisted
76
+ stub_request(:get, "http://127.0.0.4:8101/")
77
+
78
+ AppOpticsAPM.config_lock.synchronize do
79
+ AppOpticsAPM::Config.blacklist << '127.0.0.4'
80
+ AppOpticsAPM::API.start_trace('faraday_test') do
81
+ conn = Faraday.new(:url => 'http://127.0.0.4:8101') do |faraday|
82
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
83
+ end
84
+ conn.get
85
+ end
86
+ end
87
+
88
+ assert_requested :get, "http://127.0.0.4:8101/", times: 1
89
+ assert_not_requested :get, "http://127.0.0.4:8101/", headers: {'X-Trace'=>/^.*$/}
90
+ end
91
+
92
+ end
93
+ end
@@ -0,0 +1,129 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ unless defined?(JRUBY_VERSION)
5
+ require 'minitest_helper'
6
+ require 'mocha/mini_test'
7
+ require 'net/http'
8
+
9
+ class HTTPMockedTest < Minitest::Test
10
+
11
+ class MockResponse
12
+ def get_fields(x); nil; end
13
+ def code; 200; end
14
+ end
15
+
16
+ def setup
17
+ AppOpticsAPM.config_lock.synchronize do
18
+ @sample_rate = AppOpticsAPM::Config[:sample_rate]
19
+ end
20
+ end
21
+
22
+ def teardown
23
+ AppOpticsAPM.config_lock.synchronize do
24
+ AppOpticsAPM::Config[:sample_rate] = @sample_rate
25
+ AppOpticsAPM::Config[:blacklist] = []
26
+ end
27
+ end
28
+
29
+ # webmock not working, interferes with instrumentation
30
+
31
+ def test_tracing_sampling
32
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _|
33
+ !req.to_hash['x-trace'].nil? &&
34
+ req.to_hash['x-trace'].first =~ /^2B[0-9,A-F]*01$/
35
+ end.returns(MockResponse.new)
36
+
37
+ AppOpticsAPM::API.start_trace('net_http_test') do
38
+ uri = URI('http://127.0.0.1:8101/?q=1')
39
+ Net::HTTP.start(uri.host, uri.port) do |http|
40
+ request = Net::HTTP::Get.new(uri)
41
+ http.request(request)
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_tracing_not_sampling
47
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _, _|
48
+ !req.to_hash['x-trace'].nil? &&
49
+ req.to_hash['x-trace'].first =~ /^2B[0-9,A-F]*00$/ &&
50
+ req.to_hash['x-trace'].first !~ /^2B0*$/
51
+ end.returns(MockResponse.new)
52
+
53
+ AppOpticsAPM.config_lock.synchronize do
54
+ AppOpticsAPM::Config[:sample_rate] = 0
55
+ AppOpticsAPM::API.start_trace('Net::HTTP_test') do
56
+ uri = URI('http://127.0.0.1:8101/?q=1')
57
+ Net::HTTP.start(uri.host, uri.port) do |http|
58
+ request = Net::HTTP::Get.new(uri)
59
+ http.request(request) # Net::HTTPResponse object
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def test_no_xtrace
66
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _, _|
67
+ req.to_hash['x-trace'].nil?
68
+ end.returns(MockResponse.new)
69
+
70
+ uri = URI('http://127.0.0.1:8101/?q=1')
71
+ Net::HTTP.start(uri.host, uri.port) do |http|
72
+ request = Net::HTTP::Get.new(uri)
73
+ http.request(request) # Net::HTTPResponse object
74
+ end
75
+ end
76
+
77
+ def test_blacklisted
78
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _, _|
79
+ req.to_hash['x-trace'].nil?
80
+ end.returns(MockResponse.new)
81
+
82
+ AppOpticsAPM.config_lock.synchronize do
83
+ AppOpticsAPM::Config.blacklist << '127.0.0.1'
84
+ AppOpticsAPM::API.start_trace('Net::HTTP_tests') do
85
+ uri = URI('http://127.0.0.1:8101/?q=1')
86
+ Net::HTTP.start(uri.host, uri.port) do |http|
87
+ request = Net::HTTP::Get.new(uri)
88
+ http.request(request) # Net::HTTPResponse object
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def test_not_sampling_blacklisted
95
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _, _|
96
+ req.to_hash['x-trace'].nil?
97
+ end.returns(MockResponse.new)
98
+
99
+ AppOpticsAPM.config_lock.synchronize do
100
+ AppOpticsAPM::Config[:sample_rate] = 0
101
+ AppOpticsAPM::Config.blacklist << '127.0.0.1'
102
+ AppOpticsAPM::API.start_trace('Net::HTTP_tests') do
103
+ uri = URI('http://127.0.0.1:8101/?q=1')
104
+ Net::HTTP.start(uri.host, uri.port) do |http|
105
+ request = Net::HTTP::Get.new(uri)
106
+ http.request(request) # Net::HTTPResponse object
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ # ========== make sure headers are preserved =============================
113
+ def test_preserves_custom_headers
114
+ Net::HTTP.any_instance.expects(:request_without_appoptics).with do |req, _|
115
+ assert req.to_hash['custom'], "Custom header missing"
116
+ assert_match /specialvalue/, req.to_hash['custom'].first
117
+ end.returns(MockResponse.new)
118
+
119
+ AppOpticsAPM::API.start_trace('Net::HTTP_tests') do
120
+ uri = URI('http://127.0.0.1:8101/?q=1')
121
+ Net::HTTP.start(uri.host, uri.port) do |http|
122
+ request = Net::HTTP::Get.new(uri)
123
+ request['Custom'] = 'specialvalue'
124
+ http.request(request) # Net::HTTPResponse object
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,245 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ unless defined?(JRUBY_VERSION)
5
+ require 'minitest_helper'
6
+ require 'webmock/minitest'
7
+ require 'mocha/mini_test'
8
+ WebMock.allow_net_connect!
9
+
10
+ class HTTPClientMockedTest < Minitest::Test
11
+
12
+ def setup
13
+ WebMock.enable!
14
+ WebMock.disable_net_connect!
15
+ AppOpticsAPM.config_lock.synchronize do
16
+ @sample_rate = AppOpticsAPM::Config[:sample_rate]
17
+ end
18
+ end
19
+
20
+ def teardown
21
+ WebMock.reset!
22
+ WebMock.allow_net_connect!
23
+ WebMock.disable!
24
+ AppOpticsAPM.config_lock.synchronize do
25
+ AppOpticsAPM::Config[:sample_rate] = @sample_rate
26
+ AppOpticsAPM::Config[:blacklist] = []
27
+ end
28
+ end
29
+
30
+ #====== DO REQUEST ===================================================
31
+
32
+ def test_do_request_tracing_sampling_array_headers
33
+ stub_request(:get, "http://127.0.0.1:8101/")
34
+ AppOpticsAPM::API.start_trace('httpclient_test') do
35
+ clnt = HTTPClient.new
36
+ clnt.get('http://127.0.0.1:8101/', nil, [['some_header', 'some_value'], ['some_header2', 'some_value2']])
37
+ end
38
+
39
+ assert_requested :get, "http://127.0.0.1:8101/", times: 1
40
+ assert_requested :get, "http://127.0.0.1:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*01$/}, times: 1
41
+ end
42
+
43
+ def test_do_request_tracing_sampling_hash_headers
44
+ stub_request(:get, "http://127.0.0.6:8101/")
45
+ AppOpticsAPM::API.start_trace('httpclient_test') do
46
+ clnt = HTTPClient.new
47
+ clnt.get('http://127.0.0.6:8101/', nil, { 'some_header' => 'some_value', 'some_header2' => 'some_value2' })
48
+ end
49
+
50
+ assert_requested :get, "http://127.0.0.6:8101/", times: 1
51
+ assert_requested :get, "http://127.0.0.6:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*01$/}, times: 1
52
+ end
53
+
54
+ def test_do_request_tracing_not_sampling
55
+ stub_request(:get, "http://127.0.0.2:8101/")
56
+ AppOpticsAPM.config_lock.synchronize do
57
+ AppOpticsAPM::Config[:sample_rate] = 0
58
+ AppOpticsAPM::API.start_trace('httpclient_test') do
59
+ clnt = HTTPClient.new
60
+ clnt.get('http://127.0.0.2:8101/')
61
+ end
62
+ end
63
+
64
+ assert_requested :get, "http://127.0.0.2:8101/", times: 1
65
+ assert_requested :get, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B[0-9,A-F]*00$/}, times: 1
66
+ assert_not_requested :get, "http://127.0.0.2:8101/", headers: {'X-Trace'=>/^2B0*$/}
67
+ end
68
+
69
+ def test_do_request_no_xtrace
70
+ stub_request(:get, "http://127.0.0.3:8101/")
71
+ clnt = HTTPClient.new
72
+ clnt.get('http://127.0.0.3:8101/')
73
+
74
+ assert_requested :get, "http://127.0.0.3:8101/", times: 1
75
+ assert_not_requested :get, "http://127.0.0.3:8101/", headers: {'X-Trace'=>/^.*$/}
76
+ end
77
+
78
+ def test_do_request_blacklisted
79
+ stub_request(:get, "http://127.0.0.4:8101/")
80
+
81
+ AppOpticsAPM.config_lock.synchronize do
82
+ AppOpticsAPM::Config.blacklist << '127.0.0.4'
83
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
84
+ clnt = HTTPClient.new
85
+ clnt.get('http://127.0.0.4:8101/')
86
+ end
87
+ end
88
+
89
+ assert_requested :get, "http://127.0.0.4:8101/"
90
+ assert_not_requested :get, "http://127.0.0.4:8101/", headers: {'X-Trace'=>/^.*$/}
91
+ end
92
+
93
+ def test_do_request_not_sampling_blacklisted
94
+ stub_request(:get, "http://127.0.0.5:8101/")
95
+
96
+ AppOpticsAPM.config_lock.synchronize do
97
+ AppOpticsAPM::Config[:sample_rate] = 0
98
+ AppOpticsAPM::Config.blacklist << '127.0.0.5'
99
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
100
+ clnt = HTTPClient.new
101
+ clnt.get('http://127.0.0.5:8101/')
102
+ end
103
+ end
104
+
105
+ assert_requested :get, "http://127.0.0.5:8101/"
106
+ assert_not_requested :get, "http://127.0.0.5:8101/", headers: {'X-Trace'=>/^.*$/}
107
+ end
108
+
109
+ #====== ASYNC REQUEST ================================================
110
+ # using expectations in these tests because stubbing doesn't work with threads
111
+
112
+ def test_async_tracing_sampling_array_headers
113
+ WebMock.disable!
114
+
115
+ Thread.expects(:new).yields # continue without forking off a thread
116
+
117
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
118
+ 'http://127.0.0.11:8101/' == req.header.request_uri.to_s &&
119
+ req.header['X-Trace'].first =~ /^2B[0-9,A-F]*01$/
120
+ end
121
+
122
+ AppOpticsAPM::API.start_trace('httpclient_test') do
123
+ clnt = HTTPClient.new
124
+ clnt.get_async('http://127.0.0.11:8101/', nil, [['some_header', 'some_value'], ['some_header2', 'some_value2']])
125
+ end
126
+ end
127
+
128
+ def test_async_tracing_sampling_hash_headers
129
+ WebMock.disable!
130
+
131
+ Thread.expects(:new).yields # continue without forking off a thread
132
+
133
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
134
+ 'http://127.0.0.16:8101/' == req.header.request_uri.to_s &&
135
+ req.header['X-Trace'].first =~ /^2B[0-9,A-F]*01$/
136
+ end
137
+
138
+ AppOpticsAPM::API.start_trace('httpclient_test') do
139
+ clnt = HTTPClient.new
140
+ clnt.get_async('http://127.0.0.16:8101/', nil, { 'some_header' => 'some_value', 'some_header2' => 'some_value2' })
141
+ end
142
+ end
143
+
144
+ def test_async_tracing_not_sampling
145
+ WebMock.disable!
146
+
147
+ Thread.expects(:new).yields # continue without forking off a thread
148
+
149
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
150
+ 'http://127.0.0.12:8101/' == req.header.request_uri.to_s &&
151
+ req.header['X-Trace'].first =~ /^2B[0-9,A-F]*00$/ &&
152
+ req.header['X-Trace'].first !~ /^2B0*$/
153
+ end
154
+
155
+ AppOpticsAPM.config_lock.synchronize do
156
+ AppOpticsAPM::Config[:sample_rate] = 0
157
+ AppOpticsAPM::API.start_trace('httpclient_test') do
158
+ clnt = HTTPClient.new
159
+ clnt.get_async('http://127.0.0.12:8101/')
160
+ end
161
+ end
162
+ end
163
+
164
+ def test_async_no_xtrace
165
+ WebMock.disable!
166
+
167
+ Thread.expects(:new).yields # continue without forking off a thread
168
+
169
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
170
+ 'http://127.0.0.13:8101/' == req.header.request_uri.to_s &&
171
+ req.header['X-Trace'].empty?
172
+ end
173
+
174
+ clnt = HTTPClient.new
175
+ clnt.get_async('http://127.0.0.13:8101/')
176
+ end
177
+
178
+ def test_async_blacklisted
179
+ WebMock.disable!
180
+
181
+ Thread.expects(:new).yields # continue without forking off a thread
182
+
183
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
184
+ 'http://127.0.0.14:8101/' == req.header.request_uri.to_s &&
185
+ req.header['X-Trace'].empty?
186
+ end
187
+
188
+ AppOpticsAPM.config_lock.synchronize do
189
+ AppOpticsAPM::Config.blacklist << '127.0.0.14'
190
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
191
+ clnt = HTTPClient.new
192
+ clnt.get_async('http://127.0.0.14:8101/')
193
+ end
194
+ end
195
+ end
196
+
197
+ def test_async_not_sampling_blacklisted
198
+ WebMock.disable!
199
+
200
+ Thread.expects(:new).yields # continue without forking off a thread
201
+
202
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
203
+ 'http://127.0.0.15:8101/' == req.header.request_uri.to_s &&
204
+ req.header['X-Trace'].empty?
205
+ end
206
+
207
+ AppOpticsAPM.config_lock.synchronize do
208
+ AppOpticsAPM::Config[:sample_rate] = 0
209
+ AppOpticsAPM::Config.blacklist << '127.0.0.15'
210
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
211
+ clnt = HTTPClient.new
212
+ clnt.get_async('http://127.0.0.15:8101/')
213
+ end
214
+ end
215
+ end
216
+
217
+ # ========== make sure headers are preserved =============================
218
+ def test_preserves_custom_headers
219
+ stub_request(:get, "http://127.0.0.6:8101/").to_return(status: 200, body: "", headers: {})
220
+
221
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
222
+ clnt = HTTPClient.new
223
+ clnt.get('http://127.0.0.6:8101/', nil, [['Custom', 'specialvalue'], ['some_header2', 'some_value2']])
224
+ end
225
+
226
+ assert_requested :get, "http://127.0.0.6:8101/", headers: {'Custom'=>'specialvalue'}, times: 1
227
+ end
228
+
229
+ def test_async_preserves_custom_headers
230
+ WebMock.disable!
231
+
232
+ Thread.expects(:new).yields # continue without forking off a thread
233
+
234
+ HTTPClient.any_instance.expects(:do_get_stream_without_appoptics).with do |req, _, _|
235
+ assert req.headers['Custom'], "Custom header missing"
236
+ assert_match(/^specialvalue$/, req.headers['Custom'] )
237
+ end
238
+
239
+ AppOpticsAPM::API.start_trace('httpclient_tests') do
240
+ clnt = HTTPClient.new
241
+ clnt.get_async('http://127.0.0.6:8101/', nil, [['Custom', 'specialvalue'], ['some_header2', 'some_value2']])
242
+ end
243
+ end
244
+ end
245
+ end