appoptics_apm 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
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,66 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'digest/sha1'
5
+
6
+ module AppOpticsAPM
7
+ module Util
8
+ ##
9
+ # This module was used solely for the deprecated RUM ID calculation
10
+ # but may be useful in the future.
11
+ #
12
+ module Base64URL
13
+ module_function
14
+
15
+ def encode(bin)
16
+ c = [bin].pack('m0').gsub(/\=+\Z/, '').tr('+/', '-_').rstrip
17
+ m = c.size % 4
18
+ c += '=' * (4 - m) if m != 0
19
+ c
20
+ end
21
+
22
+ def decode(bin)
23
+ m = bin.size % 4
24
+ bin += '=' * (4 - m) if m != 0
25
+ bin.tr('-_', '+/').unpack('m0').first
26
+ end
27
+ end
28
+ end
29
+
30
+ ##
31
+ # This module houses all of the loading functionality for the appoptics_apm gem.
32
+ #
33
+ # Note that this does not necessarily _have_ to include initialization routines
34
+ # (although it can).
35
+ #
36
+ # Actual initialization is often separated out as it can be dependent on on the state
37
+ # of the stack boot process. e.g. code requiring that initializers, frameworks or
38
+ # instrumented libraries are already loaded...
39
+ #
40
+ module Loading
41
+ ##
42
+ # Load the appoptics_apm tracing API
43
+ #
44
+ def self.require_api
45
+ pattern = File.join(File.dirname(__FILE__), 'api', '*.rb')
46
+ Dir.glob(pattern) do |f|
47
+ require f
48
+ end
49
+ require 'appoptics_apm/api'
50
+
51
+ begin
52
+ AppOpticsAPM::API.extend_with_tracing
53
+ rescue LoadError => e
54
+ AppOpticsAPM.logger.fatal "[appoptics_apm/error] Couldn't load api: #{e.message}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ AppOpticsAPM::Loading.require_api
61
+
62
+ # Auto-start the Reporter unless we running Unicorn on Heroku
63
+ # In that case, we start the reporters after fork
64
+ unless AppOpticsAPM.heroku? && AppOpticsAPM.forking_webserver?
65
+ AppOpticsAPM::Reporter.start if AppOpticsAPM.loaded
66
+ end
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'logger'
5
+
6
+ module AppOpticsAPM
7
+ class << self
8
+ attr_accessor :logger
9
+ end
10
+
11
+ class Logger
12
+ # Fatal message
13
+ def fatal(string, exception = nil)
14
+ AppOpticsAPM.logger.fatal(string) if AppOpticsAPM.logger
15
+ end
16
+
17
+ # Error message
18
+ def error(msg, exception = nil)
19
+ AppOpticsAPM.logger.error(string) if AppOpticsAPM.logger
20
+ end
21
+
22
+ # Warn message
23
+ def warn(msg, exception = nil)
24
+ AppOpticsAPM.logger.warn(string) if AppOpticsAPM.logger
25
+ end
26
+
27
+ # Info message
28
+ def info(msg, exception = nil)
29
+ AppOpticsAPM.logger.info(string) if AppOpticsAPM.logger
30
+ end
31
+
32
+ # Debug message
33
+ def debug(msg, exception = nil)
34
+ AppOpticsAPM.logger.debug(string) if AppOpticsAPM.logger
35
+ end
36
+
37
+ end
38
+ end
39
+
40
+ AppOpticsAPM.logger = Logger.new(STDERR)
41
+
@@ -0,0 +1,33 @@
1
+
2
+ module AppOpticsAPM
3
+ module MethodProfiling
4
+ def profile_wrapper(method, report_kvs, opts, *args, &block)
5
+ report_kvs[:Backtrace] = AppOpticsAPM::API.backtrace(2) if opts[:backtrace]
6
+ report_kvs[:Arguments] = args if opts[:arguments]
7
+
8
+ # if this is a rails controller we want to set the transaction for the outbound metrics
9
+ if defined?(request) && defined?(request.env)
10
+ report_kvs['Controller'] = self.class.name
11
+ report_kvs['Action'] = self.action_name
12
+ request.env['appoptics_apm.controller'] = report_kvs['Controller']
13
+ request.env['appoptics_apm.action'] = report_kvs['Action']
14
+ end
15
+
16
+ AppOpticsAPM::API.log(nil, :profile_entry, report_kvs)
17
+
18
+ begin
19
+ rv = self.send(method, *args, &block)
20
+ report_kvs[:ReturnValue] = rv if opts[:result]
21
+ rv
22
+ rescue => e
23
+ AppOpticsAPM::API.log_exception(nil, e)
24
+ raise
25
+ ensure
26
+ report_kvs.delete(:Backtrace)
27
+ report_kvs.delete(:Controller)
28
+ report_kvs.delete(:Action)
29
+ AppOpticsAPM::API.log(nil, :profile_exit, report_kvs)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ module AppOpticsAPM
5
+ ##
6
+ # This module provides a method to manually initialize the
7
+ # Ruby instrumentation. Normally this is done by detecting
8
+ # frameworks at load time and inserting initialization hooks.
9
+ module Ruby
10
+ class << self
11
+ def initialize
12
+ load
13
+ end
14
+
15
+ ##
16
+ # The core method to load Ruby instrumentation. Call this
17
+ # from raw Ruby scripts or in Ruby applications where a
18
+ # supported framework isn't being used. Supported frameworks
19
+ # will instead be detected at load time and initialization is
20
+ # automatic.
21
+ def load
22
+ # In case some apps call this manually, make sure
23
+ # that the gem is fully loaded and not in no-op
24
+ # mode (e.g. on unsupported platforms etc.)
25
+ if AppOpticsAPM.loaded
26
+ AppOpticsAPM::Inst.load_instrumentation
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ if AppOpticsAPM.loaded && !AppOpticsAPM.framework?
34
+ ::AppOpticsAPM::Ruby.load
35
+ end
@@ -0,0 +1,135 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ require 'rbconfig'
5
+ require 'logger'
6
+
7
+ module AppOpticsAPM
8
+ ##
9
+ # This module is used to debug problematic setups and/or environments.
10
+ # Depending on the environment, output may be to stdout or the framework
11
+ # log file (e.g. log/production.log)
12
+
13
+ ##
14
+ # yesno
15
+ #
16
+ # Utility method to translate value/nil to "yes"/"no" strings
17
+ def self.yesno(x)
18
+ x ? 'yes' : 'no'
19
+ end
20
+
21
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
22
+ def self.support_report
23
+ @logger_level = AppOpticsAPM.logger.level
24
+ AppOpticsAPM.logger.level = ::Logger::DEBUG
25
+
26
+ AppOpticsAPM.logger.warn '********************************************************'
27
+ AppOpticsAPM.logger.warn '* BEGIN AppOpticsAPM Support Report'
28
+ AppOpticsAPM.logger.warn '* Please email the output of this report to support@appoptics.com'
29
+ AppOpticsAPM.logger.warn '********************************************************'
30
+ AppOpticsAPM.logger.warn "Ruby: #{RUBY_DESCRIPTION}"
31
+ AppOpticsAPM.logger.warn "$0: #{$0}"
32
+ AppOpticsAPM.logger.warn "$1: #{$1}" unless $1.nil?
33
+ AppOpticsAPM.logger.warn "$2: #{$2}" unless $2.nil?
34
+ AppOpticsAPM.logger.warn "$3: #{$3}" unless $3.nil?
35
+ AppOpticsAPM.logger.warn "$4: #{$4}" unless $4.nil?
36
+ AppOpticsAPM.logger.warn "AppOpticsAPM.loaded == #{AppOpticsAPM.loaded}"
37
+
38
+ using_jruby = defined?(JRUBY_VERSION)
39
+ AppOpticsAPM.logger.warn "Using JRuby?: #{yesno(using_jruby)}"
40
+ if using_jruby
41
+ AppOpticsAPM.logger.warn "Joboe Agent Status: #{Java::ComTracelyticsAgent::Agent.getStatus}"
42
+ end
43
+
44
+ on_heroku = AppOpticsAPM.heroku?
45
+ AppOpticsAPM.logger.warn "On Heroku?: #{yesno(on_heroku)}"
46
+ if on_heroku
47
+ AppOpticsAPM.logger.warn "APPOPTICS_URL: #{ENV['APPOPTICS_URL']}"
48
+ end
49
+
50
+ AppOpticsAPM.logger.warn "AppOpticsAPM::Ruby defined?: #{yesno(defined?(AppOpticsAPM::Ruby))}"
51
+ AppOpticsAPM.logger.warn "AppOpticsAPM.reporter: #{AppOpticsAPM.reporter}"
52
+
53
+ AppOpticsAPM.logger.warn '********************************************************'
54
+ AppOpticsAPM.logger.warn '* Frameworks'
55
+ AppOpticsAPM.logger.warn '********************************************************'
56
+
57
+ using_rails = defined?(::Rails)
58
+ AppOpticsAPM.logger.warn "Using Rails?: #{yesno(using_rails)}"
59
+ if using_rails
60
+ AppOpticsAPM.logger.warn "AppOpticsAPM::Rails loaded?: #{yesno(defined?(::AppOpticsAPM::Rails))}"
61
+ AppOpticsAPM.logger.warn "AppOpticsAPM::Rack middleware loaded?: #{yesno(::Rails.configuration.middleware.include? AppOpticsAPM::Rack)}"
62
+ end
63
+
64
+ using_sinatra = defined?(::Sinatra)
65
+ AppOpticsAPM.logger.warn "Using Sinatra?: #{yesno(using_sinatra)}"
66
+
67
+ using_padrino = defined?(::Padrino)
68
+ AppOpticsAPM.logger.warn "Using Padrino?: #{yesno(using_padrino)}"
69
+
70
+ using_grape = defined?(::Grape)
71
+ AppOpticsAPM.logger.warn "Using Grape?: #{yesno(using_grape)}"
72
+
73
+ AppOpticsAPM.logger.warn '********************************************************'
74
+ AppOpticsAPM.logger.warn '* ActiveRecord Adapter'
75
+ AppOpticsAPM.logger.warn '********************************************************'
76
+ if defined?(::ActiveRecord)
77
+ if defined?(::ActiveRecord::Base.connection.adapter_name)
78
+ AppOpticsAPM.logger.warn "ActiveRecord adapter: #{::ActiveRecord::Base.connection.adapter_name}"
79
+ end
80
+ else
81
+ AppOpticsAPM.logger.warn 'No ActiveRecord'
82
+ end
83
+
84
+ AppOpticsAPM.logger.warn '********************************************************'
85
+ AppOpticsAPM.logger.warn '* AppOpticsAPM Libraries'
86
+ AppOpticsAPM.logger.warn '********************************************************'
87
+ files = []
88
+ ['/usr/lib/liboboe*', '/usr/lib64/liboboe*'].each do |d|
89
+ files = Dir.glob(d)
90
+ break if !files.empty?
91
+ end
92
+ if files.empty?
93
+ AppOpticsAPM.logger.warn 'Error: No liboboe libs!'
94
+ else
95
+ files.each { |f|
96
+ AppOpticsAPM.logger.warn f
97
+ }
98
+ end
99
+
100
+ AppOpticsAPM.logger.warn '********************************************************'
101
+ AppOpticsAPM.logger.warn '* AppOpticsAPM::Config Values'
102
+ AppOpticsAPM.logger.warn '********************************************************'
103
+ AppOpticsAPM::Config.show.each { |k,v|
104
+ AppOpticsAPM.logger.warn "#{k}: #{v}"
105
+ }
106
+
107
+ AppOpticsAPM.logger.warn '********************************************************'
108
+ AppOpticsAPM.logger.warn '* OS, Platform + Env'
109
+ AppOpticsAPM.logger.warn '********************************************************'
110
+ AppOpticsAPM.logger.warn "host_os: " + RbConfig::CONFIG['host_os']
111
+ AppOpticsAPM.logger.warn "sitearch: " + RbConfig::CONFIG['sitearch']
112
+ AppOpticsAPM.logger.warn "arch: " + RbConfig::CONFIG['arch']
113
+ AppOpticsAPM.logger.warn RUBY_PLATFORM
114
+ AppOpticsAPM.logger.warn "RACK_ENV: #{ENV['RACK_ENV']}"
115
+ AppOpticsAPM.logger.warn "RAILS_ENV: #{ENV['RAILS_ENV']}" if using_rails
116
+
117
+ AppOpticsAPM.logger.warn '********************************************************'
118
+ AppOpticsAPM.logger.warn '* Raw __Init KVs'
119
+ AppOpticsAPM.logger.warn '********************************************************'
120
+ platform_info = AppOpticsAPM::Util.build_init_report
121
+ platform_info.each { |k,v|
122
+ AppOpticsAPM.logger.warn "#{k}: #{v}"
123
+ }
124
+
125
+ AppOpticsAPM.logger.warn '********************************************************'
126
+ AppOpticsAPM.logger.warn '* END AppOpticsAPM Support Report'
127
+ AppOpticsAPM.logger.warn '* Support Email: support@appoptics.com'
128
+ AppOpticsAPM.logger.warn '* Github: https://github.com/librato/ruby-appoptics'
129
+ AppOpticsAPM.logger.warn '********************************************************'
130
+
131
+ AppOpticsAPM.logger.level = @logger_level
132
+ nil
133
+ end
134
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
135
+ end
@@ -0,0 +1,94 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ module AppOpticsAPM
5
+ module Test
6
+ class << self
7
+ ##
8
+ # load_extras
9
+ #
10
+ # This method simply loads all the extras needed to run
11
+ # tests such as models, jobs etc...
12
+ #
13
+ def load_extras
14
+ # If we're using the libraries gemfile (with sidekiq and resque)
15
+ if AppOpticsAPM::Test.gemfile?(:libraries)
16
+ # Load all of the test workers
17
+ pattern = File.join(File.dirname(__FILE__), '../../test/jobs/**/', '*.rb')
18
+ Dir.glob(pattern) do |f|
19
+ AppOpticsAPM.logger.debug "Loading test job file: #{File.basename(f)}"
20
+ require f
21
+ end
22
+ end
23
+ end
24
+
25
+ ##
26
+ # gemfile?
27
+ #
28
+ # Method used to determine under which gemfile we're running.
29
+ # Pass <tt>name</tt> as the gemfile name only (without the
30
+ # .gemfile extension)
31
+ #
32
+ # returns true or fase depending on result
33
+ #
34
+ def gemfile?(name)
35
+ File.basename(ENV['BUNDLE_GEMFILE']) == (name.to_s + '.gemfile')
36
+ end
37
+
38
+ ##
39
+ # gemfile
40
+ #
41
+ # Used to determine under which gemfile we are running. This
42
+ # method will return the name of the active gemfile
43
+ #
44
+ def gemfile
45
+ File.basename(ENV['BUNDLE_GEMFILE']).split('.').first
46
+ end
47
+
48
+ ##
49
+ # set_postgresql_env
50
+ #
51
+ # Used to set the postgresql specific DATABASE_URL env based
52
+ # on various conditions
53
+ def set_postgresql_env
54
+ if ENV.key?('TRAVIS_PSQL_PASS')
55
+ ENV['DATABASE_URL'] = "postgresql://postgres:#{ENV['TRAVIS_PSQL_PASS']}@127.0.0.1:5432/travis_ci_test"
56
+ elsif ENV.key?('DOCKER_PSQL_PASS')
57
+ ENV['DATABASE_URL'] = "postgresql://docker:#{ENV['DOCKER_PSQL_PASS']}@127.0.0.1:5432/travis_ci_test"
58
+ else
59
+ ENV['DATABASE_URL'] = 'postgresql://postgres@127.0.0.1:5432/travis_ci_test'
60
+ end
61
+ end
62
+
63
+ ##
64
+ # set_mysql_env
65
+ #
66
+ # Used to set the mysql specific DATABASE_URL env based
67
+ # on various conditions
68
+ def set_mysql_env
69
+ if ENV.key?('TRAVIS_MYSQL_PASS')
70
+ ENV['DATABASE_URL'] = "mysql://root:#{ENV['TRAVIS_MYSQL_PASS']}@127.0.0.1:3306/travis_ci_test"
71
+ elsif ENV.key?('DOCKER_MYSQL_PASS')
72
+ ENV['DATABASE_URL'] = "mysql://root:#{ENV['DOCKER_MYSQL_PASS']}@mysql:3306/travis_ci_test"
73
+ else
74
+ ENV['DATABASE_URL'] = 'mysql://root@127.0.0.1:3306/travis_ci_test'
75
+ end
76
+ end
77
+
78
+ ##
79
+ # set_mysql2_env
80
+ #
81
+ # Used to set the mysql specific DATABASE_URL env based
82
+ # on various conditions
83
+ def set_mysql2_env
84
+ if ENV.key?('TRAVIS_MYSQL_PASS')
85
+ ENV['DATABASE_URL'] = "mysql2://root:#{ENV['TRAVIS_MYSQL_PASS']}@127.0.0.1:3306/travis_ci_test"
86
+ elsif ENV.key?('DOCKER_MYSQL_PASS')
87
+ ENV['DATABASE_URL'] = "mysql2://root:#{ENV['DOCKER_MYSQL_PASS']}@mysql:3306/travis_ci_test"
88
+ else
89
+ ENV['DATABASE_URL'] = 'mysql2://root@127.0.0.1:3306/travis_ci_test'
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright (c) 2016 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+ module AppOpticsAPM
5
+ ##
6
+ # Provides thread local storage for AppOpticsAPM.
7
+ #
8
+ # Example usage:
9
+ # module AppOpticsAPMBase
10
+ # extend ::AppOpticsAPM::ThreadLocal
11
+ # thread_local :layer_op
12
+ # end
13
+ module ThreadLocal
14
+ def thread_local(name)
15
+ key = "__#{self}_#{name}__".intern
16
+
17
+ define_method(name) do
18
+ Thread.current[key]
19
+ end
20
+
21
+ define_method(name.to_s + '=') do |value|
22
+ Thread.current[key] = value
23
+ end
24
+ end
25
+ end
26
+ end