appoptics_apm-zearn 4.13.1

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +5 -0
  3. data/.github/ISSUE_TEMPLATE/bug-or-feature-request.md +16 -0
  4. data/.github/workflows/build_and_release_gem.yml +103 -0
  5. data/.github/workflows/build_for_packagecloud.yml +70 -0
  6. data/.github/workflows/docker-images.yml +47 -0
  7. data/.github/workflows/run_cpluplus_tests.yml +73 -0
  8. data/.github/workflows/run_tests.yml +168 -0
  9. data/.github/workflows/scripts/test_install.rb +23 -0
  10. data/.github/workflows/swig/swig-v4.0.2.tar.gz +0 -0
  11. data/.github/workflows/test_on_4_linux.yml +159 -0
  12. data/.gitignore +36 -0
  13. data/.rubocop.yml +29 -0
  14. data/.travis.yml +130 -0
  15. data/.yardopts +6 -0
  16. data/CHANGELOG.md +769 -0
  17. data/CONFIG.md +33 -0
  18. data/Gemfile +14 -0
  19. data/LICENSE +202 -0
  20. data/README.md +393 -0
  21. data/appoptics_apm.gemspec +70 -0
  22. data/bin/appoptics_apm_config +15 -0
  23. data/examples/prepend.rb +13 -0
  24. data/examples/sdk_examples.rb +158 -0
  25. data/ext/oboe_metal/README.md +69 -0
  26. data/ext/oboe_metal/extconf.rb +151 -0
  27. data/ext/oboe_metal/lib/.keep +0 -0
  28. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256 +1 -0
  29. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256 +1 -0
  30. data/ext/oboe_metal/noop/noop.c +8 -0
  31. data/ext/oboe_metal/src/README.md +6 -0
  32. data/ext/oboe_metal/src/VERSION +2 -0
  33. data/ext/oboe_metal/src/bson/bson.h +220 -0
  34. data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
  35. data/ext/oboe_metal/src/frames.cc +246 -0
  36. data/ext/oboe_metal/src/frames.h +40 -0
  37. data/ext/oboe_metal/src/init_appoptics_apm.cc +21 -0
  38. data/ext/oboe_metal/src/logging.cc +95 -0
  39. data/ext/oboe_metal/src/logging.h +35 -0
  40. data/ext/oboe_metal/src/oboe.h +1156 -0
  41. data/ext/oboe_metal/src/oboe_api.cpp +652 -0
  42. data/ext/oboe_metal/src/oboe_api.hpp +431 -0
  43. data/ext/oboe_metal/src/oboe_debug.h +59 -0
  44. data/ext/oboe_metal/src/oboe_swig_wrap.cc +7329 -0
  45. data/ext/oboe_metal/src/profiling.cc +435 -0
  46. data/ext/oboe_metal/src/profiling.h +78 -0
  47. data/ext/oboe_metal/test/CMakeLists.txt +53 -0
  48. data/ext/oboe_metal/test/FindGMock.cmake +43 -0
  49. data/ext/oboe_metal/test/README.md +56 -0
  50. data/ext/oboe_metal/test/frames_test.cc +164 -0
  51. data/ext/oboe_metal/test/profiling_test.cc +93 -0
  52. data/ext/oboe_metal/test/ruby_inc_dir.rb +8 -0
  53. data/ext/oboe_metal/test/ruby_prefix.rb +8 -0
  54. data/ext/oboe_metal/test/ruby_test_helper.rb +67 -0
  55. data/ext/oboe_metal/test/test.h +11 -0
  56. data/ext/oboe_metal/test/test_main.cc +32 -0
  57. data/init.rb +4 -0
  58. data/lib/appoptics_apm/api/layerinit.rb +41 -0
  59. data/lib/appoptics_apm/api/logging.rb +381 -0
  60. data/lib/appoptics_apm/api/memcache.rb +37 -0
  61. data/lib/appoptics_apm/api/metrics.rb +63 -0
  62. data/lib/appoptics_apm/api/tracing.rb +57 -0
  63. data/lib/appoptics_apm/api/util.rb +120 -0
  64. data/lib/appoptics_apm/api.rb +21 -0
  65. data/lib/appoptics_apm/base.rb +231 -0
  66. data/lib/appoptics_apm/config.rb +299 -0
  67. data/lib/appoptics_apm/frameworks/grape.rb +98 -0
  68. data/lib/appoptics_apm/frameworks/padrino.rb +78 -0
  69. data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +104 -0
  70. data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
  71. data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
  72. data/lib/appoptics_apm/frameworks/rails/inst/action_controller6.rb +50 -0
  73. data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
  74. data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +88 -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 +29 -0
  78. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +31 -0
  79. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +119 -0
  80. data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +114 -0
  81. data/lib/appoptics_apm/frameworks/rails/inst/logger_formatters.rb +27 -0
  82. data/lib/appoptics_apm/frameworks/rails.rb +100 -0
  83. data/lib/appoptics_apm/frameworks/sinatra.rb +96 -0
  84. data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
  85. data/lib/appoptics_apm/inst/bunny-consumer.rb +89 -0
  86. data/lib/appoptics_apm/inst/curb.rb +332 -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 +101 -0
  90. data/lib/appoptics_apm/inst/excon.rb +125 -0
  91. data/lib/appoptics_apm/inst/faraday.rb +106 -0
  92. data/lib/appoptics_apm/inst/graphql.rb +240 -0
  93. data/lib/appoptics_apm/inst/grpc_client.rb +159 -0
  94. data/lib/appoptics_apm/inst/grpc_server.rb +120 -0
  95. data/lib/appoptics_apm/inst/http.rb +81 -0
  96. data/lib/appoptics_apm/inst/httpclient.rb +174 -0
  97. data/lib/appoptics_apm/inst/logger_formatter.rb +50 -0
  98. data/lib/appoptics_apm/inst/logging_log_event.rb +28 -0
  99. data/lib/appoptics_apm/inst/lumberjack_formatter.rb +13 -0
  100. data/lib/appoptics_apm/inst/memcached.rb +86 -0
  101. data/lib/appoptics_apm/inst/mongo.rb +246 -0
  102. data/lib/appoptics_apm/inst/mongo2.rb +225 -0
  103. data/lib/appoptics_apm/inst/moped.rb +466 -0
  104. data/lib/appoptics_apm/inst/rack.rb +182 -0
  105. data/lib/appoptics_apm/inst/rack_cache.rb +35 -0
  106. data/lib/appoptics_apm/inst/redis.rb +274 -0
  107. data/lib/appoptics_apm/inst/resque.rb +151 -0
  108. data/lib/appoptics_apm/inst/rest-client.rb +48 -0
  109. data/lib/appoptics_apm/inst/sequel.rb +178 -0
  110. data/lib/appoptics_apm/inst/sidekiq-client.rb +55 -0
  111. data/lib/appoptics_apm/inst/sidekiq-worker.rb +66 -0
  112. data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
  113. data/lib/appoptics_apm/inst/typhoeus.rb +108 -0
  114. data/lib/appoptics_apm/instrumentation.rb +22 -0
  115. data/lib/appoptics_apm/loading.rb +65 -0
  116. data/lib/appoptics_apm/logger.rb +14 -0
  117. data/lib/appoptics_apm/noop/README.md +9 -0
  118. data/lib/appoptics_apm/noop/context.rb +27 -0
  119. data/lib/appoptics_apm/noop/metadata.rb +25 -0
  120. data/lib/appoptics_apm/noop/profiling.rb +21 -0
  121. data/lib/appoptics_apm/oboe_init_options.rb +211 -0
  122. data/lib/appoptics_apm/ruby.rb +35 -0
  123. data/lib/appoptics_apm/sdk/current_trace.rb +77 -0
  124. data/lib/appoptics_apm/sdk/custom_metrics.rb +94 -0
  125. data/lib/appoptics_apm/sdk/logging.rb +37 -0
  126. data/lib/appoptics_apm/sdk/tracing.rb +434 -0
  127. data/lib/appoptics_apm/support/profiling.rb +18 -0
  128. data/lib/appoptics_apm/support/transaction_metrics.rb +67 -0
  129. data/lib/appoptics_apm/support/transaction_settings.rb +219 -0
  130. data/lib/appoptics_apm/support/x_trace_options.rb +110 -0
  131. data/lib/appoptics_apm/support_report.rb +119 -0
  132. data/lib/appoptics_apm/test.rb +95 -0
  133. data/lib/appoptics_apm/thread_local.rb +26 -0
  134. data/lib/appoptics_apm/util.rb +326 -0
  135. data/lib/appoptics_apm/version.rb +16 -0
  136. data/lib/appoptics_apm/xtrace.rb +115 -0
  137. data/lib/appoptics_apm.rb +77 -0
  138. data/lib/joboe_metal.rb +212 -0
  139. data/lib/oboe.rb +7 -0
  140. data/lib/oboe_metal.rb +172 -0
  141. data/lib/rails/generators/appoptics_apm/install_generator.rb +47 -0
  142. data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +425 -0
  143. data/log/.keep +0 -0
  144. data/yardoc_frontpage.md +26 -0
  145. metadata +231 -0
@@ -0,0 +1,219 @@
1
+ # Copyright (c) 2018 SolarWinds, LLC.
2
+ # All rights reserved.
3
+ #
4
+
5
+ AO_TRACING_ENABLED = 1
6
+ AO_TRACING_DISABLED = 0
7
+ AO_TRACING_UNSET = -1
8
+
9
+ AO_TRACING_DECISIONS_OK = 0
10
+
11
+ OBOE_SETTINGS_UNSET = -1
12
+
13
+ module AppOpticsAPM
14
+ ##
15
+ # This module helps with setting up the transaction filters and applying them
16
+ #
17
+ class TransactionSettings
18
+
19
+ attr_accessor :do_sample, :do_metrics
20
+ attr_reader :auth_msg, :do_propagate, :status_msg, :type, :source, :rate, :xtrace
21
+ #, :status
22
+
23
+ def initialize(url = '', xtrace = nil, options = nil)
24
+ @do_metrics = false
25
+ @do_sample = false
26
+ @do_propagate = true
27
+ @xtrace = xtrace
28
+ tracing_mode = AO_TRACING_ENABLED
29
+
30
+ if AppOpticsAPM::Context.isValid
31
+ @do_sample = AppOpticsAPM.tracing?
32
+ return
33
+ end
34
+
35
+ if url && asset?(url)
36
+ @do_propagate = false
37
+ return
38
+ end
39
+
40
+ if tracing_mode_disabled? && !tracing_enabled?(url) ||
41
+ tracing_disabled?(url)
42
+
43
+ tracing_mode = AO_TRACING_DISABLED
44
+ end
45
+
46
+ args = [@xtrace]
47
+ args << tracing_mode
48
+ args << (AppOpticsAPM::Config[:sample_rate] || OBOE_SETTINGS_UNSET)
49
+
50
+ if options && (options.options || options.signature)
51
+ args << (options.trigger_trace ? 1 : 0)
52
+ args << (trigger_tracing_mode_disabled? ? 0 : 1)
53
+ args << options.options
54
+ args << options.signature
55
+ args << options.timestamp
56
+ end
57
+
58
+ metrics, sample, @rate, @source, @bucket_rate, @bucket_cap, @type, @auth, @status_msg, @auth_msg, @status =
59
+ AppOpticsAPM::Context.getDecisions(*args)
60
+
61
+ if @status > AO_TRACING_DECISIONS_OK
62
+ AppOpticsAPM.logger.warn "[appoptics-apm/sample] Problem getting the sampling decisions: #{@status_msg} code: #{@status}"
63
+ end
64
+
65
+ @do_metrics = metrics > 0
66
+ @do_sample = sample > 0
67
+ end
68
+
69
+ def to_s
70
+ "do_propagate: #{do_propagate}, do_sample: #{do_sample}, do_metrics: #{do_metrics} rate: #{rate}, source: #{source}"
71
+ end
72
+
73
+ def add_kvs(kvs)
74
+ kvs[:SampleRate] = @rate
75
+ kvs[:SampleSource] = @source
76
+ end
77
+
78
+ def triggered_trace?
79
+ @type == 1
80
+ end
81
+
82
+ def auth_ok?
83
+ # @auth is undefined if initialize is called with an existing context
84
+ !@auth || @auth < 1
85
+ end
86
+
87
+ private
88
+
89
+ ##
90
+ # check the config setting for :tracing_mode
91
+ def tracing_mode_disabled?
92
+ AppOpticsAPM::Config[:tracing_mode] &&
93
+ [:disabled, :never].include?(AppOpticsAPM::Config[:tracing_mode])
94
+ end
95
+
96
+ ##
97
+ # tracing_enabled?
98
+ #
99
+ # Given a path, this method determines whether it matches any of the
100
+ # regexps to exclude it from metrics and traces
101
+ #
102
+ def tracing_enabled?(url)
103
+ return false unless AppOpticsAPM::Config[:url_enabled_regexps].is_a? Array
104
+ # once we only support Ruby >= 2.4.0 use `match?` instead of `=~`
105
+ return AppOpticsAPM::Config[:url_enabled_regexps].any? { |regex| regex =~ url }
106
+ rescue => e
107
+ AppOpticsAPM.logger.warn "[AppOpticsAPM/filter] Could not apply :enabled filter to path. #{e.inspect}"
108
+ true
109
+ end
110
+
111
+ ##
112
+ # tracing_disabled?
113
+ #
114
+ # Given a path, this method determines whether it matches any of the
115
+ # regexps to exclude it from metrics and traces
116
+ #
117
+ def tracing_disabled?(url)
118
+ return false unless AppOpticsAPM::Config[:url_disabled_regexps].is_a? Array
119
+ # once we only support Ruby >= 2.4.0 use `match?` instead of `=~`
120
+ return AppOpticsAPM::Config[:url_disabled_regexps].any? { |regex| regex =~ url }
121
+ rescue => e
122
+ AppOpticsAPM.logger.warn "[AppOpticsAPM/filter] Could not apply :disabled filter to path. #{e.inspect}"
123
+ false
124
+ end
125
+
126
+ def trigger_tracing_mode_disabled?
127
+ AppOpticsAPM::Config[:trigger_tracing_mode] &&
128
+ AppOpticsAPM::Config[:trigger_tracing_mode] == :disabled
129
+ end
130
+
131
+ ##
132
+ # asset?
133
+ #
134
+ # Given a path, this method determines whether it is a static asset
135
+ #
136
+ def asset?(path)
137
+ return false unless AppOpticsAPM::Config[:dnt_compiled]
138
+ # once we only support Ruby >= 2.4.0 use `match?` instead of `=~`
139
+ return AppOpticsAPM::Config[:dnt_compiled] =~ path
140
+ rescue => e
141
+ AppOpticsAPM.logger.warn "[AppOpticsAPM/filter] Could not apply do-not-trace filter to path. #{e.inspect}"
142
+ false
143
+ end
144
+
145
+ public
146
+
147
+ class << self
148
+
149
+ def asset?(path)
150
+ return false unless AppOpticsAPM::Config[:dnt_compiled]
151
+ # once we only support Ruby >= 2.4.0 use `match?` instead of `=~`
152
+ return AppOpticsAPM::Config[:dnt_compiled] =~ path
153
+ rescue => e
154
+ AppOpticsAPM.logger.warn "[AppOpticsAPM/filter] Could not apply do-not-trace filter to path. #{e.inspect}"
155
+ false
156
+ end
157
+
158
+
159
+ def compile_url_settings(settings)
160
+ if !settings.is_a?(Array) || settings.empty?
161
+ reset_url_regexps
162
+ return
163
+ end
164
+
165
+ # `tracing: disabled` is the default
166
+ disabled = settings.select { |v| !v.has_key?(:tracing) || v[:tracing] == :disabled }
167
+ enabled = settings.select { |v| v[:tracing] == :enabled }
168
+
169
+ AppOpticsAPM::Config[:url_enabled_regexps] = compile_regexp(enabled)
170
+ AppOpticsAPM::Config[:url_disabled_regexps] = compile_regexp(disabled)
171
+ end
172
+
173
+ def compile_regexp(settings)
174
+ regexp_regexp = compile_url_settings_regexp(settings)
175
+ extensions_regexp = compile_url_settings_extensions(settings)
176
+
177
+ regexps = [regexp_regexp, extensions_regexp].flatten.compact
178
+
179
+ regexps.empty? ? nil : regexps
180
+ end
181
+
182
+ def compile_url_settings_regexp(value)
183
+ regexps = value.select do |v|
184
+ v.key?(:regexp) &&
185
+ !(v[:regexp].is_a?(String) && v[:regexp].empty?) &&
186
+ !(v[:regexp].is_a?(Regexp) && v[:regexp].inspect == '//')
187
+ end
188
+
189
+ regexps.map! do |v|
190
+ begin
191
+ v[:regexp].is_a?(String) ? Regexp.new(v[:regexp], v[:opts]) : Regexp.new(v[:regexp])
192
+ rescue
193
+ AppOpticsAPM.logger.warn "[appoptics_apm/config] Problem compiling transaction_settings item #{v}, will ignore."
194
+ nil
195
+ end
196
+ end
197
+ regexps.keep_if { |v| !v.nil?}
198
+ regexps.empty? ? nil : regexps
199
+ end
200
+
201
+ def compile_url_settings_extensions(value)
202
+ extensions = value.select do |v|
203
+ v.key?(:extensions) &&
204
+ v[:extensions].is_a?(Array) &&
205
+ !v[:extensions].empty?
206
+ end
207
+ extensions = extensions.map { |v| v[:extensions] }.flatten
208
+ extensions.keep_if { |v| v.is_a?(String)}
209
+
210
+ extensions.empty? ? nil : Regexp.new("(#{Regexp.union(extensions).source})(\\?.+){0,1}$")
211
+ end
212
+
213
+ def reset_url_regexps
214
+ AppOpticsAPM::Config[:url_enabled_regexps] = nil
215
+ AppOpticsAPM::Config[:url_disabled_regexps] = nil
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,110 @@
1
+ # Copyright (c) 2019 SolarWinds, LLC.
2
+ # All rights reserved.
3
+
4
+
5
+ module AppOpticsAPM
6
+ class XTraceOptions
7
+
8
+ attr_reader :options, :signature, :trigger_trace, :timestamp
9
+ attr_reader :pd_keys, :custom_kvs, :ignored # used in tests
10
+ ##
11
+ # Params:
12
+ # +options+ : An X-Trace-Options @options string
13
+ # +signature+ : hmac signature to pass on for verification
14
+ #
15
+ # populates:
16
+ # - @force_trace (true|false)
17
+ # - @app_id (as given by Pingdom)
18
+ # - @probe_id (as given by Pingdom)
19
+ # - @loc (2 characters given by Pingdom)
20
+ # - @custom_kvs (hash)
21
+ # - @ignored (array)
22
+ #
23
+ # split it up by ';' separator
24
+ # kv assignment by '='
25
+ # currently valid keys:
26
+ # - force_trace (valid: 0,1) unless we use just a kv
27
+ # - application_id (format defined by pingdom (no validation))
28
+ # - probe_id
29
+ # - custom_* (';=' not allowed in key), value (validate max. length)
30
+ # - ts (unix timestamp)
31
+ # - other keys will be reported in the response options as ignored
32
+
33
+ def initialize(options, signature = nil)
34
+ @options = options.dup
35
+ @signature = signature.dup
36
+ @trigger_trace = false
37
+ @custom_kvs = {}
38
+ @pd_keys = nil
39
+ @ignored = []
40
+ @timestamp = 0
41
+
42
+ options&.split(/;+/)&.each do |val|
43
+ k = val.split('=', 2)
44
+
45
+ next unless k[0] # it can be nil, eg when the header starts with ';'
46
+
47
+ k[0]&.strip!
48
+ case k[0]
49
+ when 'trigger-trace'
50
+ if k[1]
51
+ @ignored << 'trigger-trace'
52
+ else
53
+ @trigger_trace = true
54
+ end
55
+ when 'pd-keys'
56
+ if @pd_keys
57
+ AppOpticsAPM.logger.info "[appoptics_apm/x-trace-options] Duplicate key: #{k[0]}"
58
+ else
59
+ @pd_keys = k[1].strip
60
+ end
61
+ when /^custom-[^\s]*$/
62
+ if @custom_kvs[k[0]]
63
+ AppOpticsAPM.logger.info "[appoptics_apm/x-trace-options] Duplicate key: #{k[0]}"
64
+ else
65
+ @custom_kvs[k[0]] = k[1].strip
66
+ end
67
+ when 'ts'
68
+ if @timestamp > 0
69
+ AppOpticsAPM.logger.info "[appoptics_apm/x-trace-options] Duplicate key: #{k[0]}"
70
+ else
71
+ @timestamp = k[1].to_i
72
+ end
73
+ else
74
+ @ignored << k[0]
75
+ end
76
+ end
77
+ unless @ignored.empty?
78
+ msg = "[appoptics_apm/x-trace-options] Some keys were ignored: #{@ignored.join(',' )}"
79
+ AppOpticsAPM.logger.info(msg)
80
+ end
81
+ end
82
+
83
+ def add_kvs(kvs, settings)
84
+ return unless settings.auth_ok?
85
+
86
+ @custom_kvs.each { |k,v| kvs[k] = v } unless @custom_kvs.empty?
87
+ kvs['PDKeys'] = @pd_keys if @pd_keys
88
+ kvs['TriggeredTrace'] = true if settings.triggered_trace?
89
+ end
90
+
91
+ def add_response_header(headers, settings)
92
+ return unless options
93
+
94
+ response = []
95
+ response << "auth=#{settings.auth_msg}" if @signature
96
+ if settings.auth_ok?
97
+ if @trigger_trace
98
+ trigger_msg = settings.xtrace && settings.type == 0 ? 'ignored' : settings.status_msg
99
+ else
100
+ trigger_msg = 'not-requested'
101
+ end
102
+ response << "trigger-trace=#{trigger_msg}"
103
+ response << "ignored=#{@ignored.join(',')}" unless @ignored.empty?
104
+ end
105
+
106
+ headers['X-Trace-Options-Response'] = response.join(';')
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,119 @@
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 technicalsupport@solarwinds.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
+ if defined?(AppOpticsAPM::Rack)
62
+ AppOpticsAPM.logger.warn "AppOpticsAPM::Rack middleware loaded?: #{yesno(::Rails.configuration.middleware.include? AppOpticsAPM::Rack)}"
63
+ end
64
+ end
65
+
66
+ using_sinatra = defined?(::Sinatra)
67
+ AppOpticsAPM.logger.warn "Using Sinatra?: #{yesno(using_sinatra)}"
68
+
69
+ using_padrino = defined?(::Padrino)
70
+ AppOpticsAPM.logger.warn "Using Padrino?: #{yesno(using_padrino)}"
71
+
72
+ using_grape = defined?(::Grape)
73
+ AppOpticsAPM.logger.warn "Using Grape?: #{yesno(using_grape)}"
74
+
75
+ AppOpticsAPM.logger.warn '********************************************************'
76
+ AppOpticsAPM.logger.warn '* ActiveRecord Adapter'
77
+ AppOpticsAPM.logger.warn '********************************************************'
78
+ if defined?(::ActiveRecord)
79
+ if defined?(::ActiveRecord::Base.connection.adapter_name)
80
+ AppOpticsAPM.logger.warn "ActiveRecord adapter: #{::ActiveRecord::Base.connection.adapter_name}"
81
+ end
82
+ else
83
+ AppOpticsAPM.logger.warn 'No ActiveRecord'
84
+ end
85
+
86
+ AppOpticsAPM.logger.warn '********************************************************'
87
+ AppOpticsAPM.logger.warn '* AppOpticsAPM::Config Values'
88
+ AppOpticsAPM.logger.warn '********************************************************'
89
+ AppOpticsAPM::Config.print_config
90
+
91
+ AppOpticsAPM.logger.warn '********************************************************'
92
+ AppOpticsAPM.logger.warn '* OS, Platform + Env'
93
+ AppOpticsAPM.logger.warn '********************************************************'
94
+ AppOpticsAPM.logger.warn "host_os: " + RbConfig::CONFIG['host_os']
95
+ AppOpticsAPM.logger.warn "sitearch: " + RbConfig::CONFIG['sitearch']
96
+ AppOpticsAPM.logger.warn "arch: " + RbConfig::CONFIG['arch']
97
+ AppOpticsAPM.logger.warn RUBY_PLATFORM
98
+ AppOpticsAPM.logger.warn "RACK_ENV: #{ENV['RACK_ENV']}"
99
+ AppOpticsAPM.logger.warn "RAILS_ENV: #{ENV['RAILS_ENV']}" if using_rails
100
+
101
+ AppOpticsAPM.logger.warn '********************************************************'
102
+ AppOpticsAPM.logger.warn '* Raw __Init KVs'
103
+ AppOpticsAPM.logger.warn '********************************************************'
104
+ platform_info = AppOpticsAPM::Util.build_init_report
105
+ platform_info.each { |k,v|
106
+ AppOpticsAPM.logger.warn "#{k}: #{v}"
107
+ }
108
+
109
+ AppOpticsAPM.logger.warn '********************************************************'
110
+ AppOpticsAPM.logger.warn '* END AppOpticsAPM Support Report'
111
+ AppOpticsAPM.logger.warn '* Support Email: technicalsupport@solarwinds.com'
112
+ AppOpticsAPM.logger.warn '* Github: https://github.com/librato/ruby-appoptics'
113
+ AppOpticsAPM.logger.warn '********************************************************'
114
+
115
+ AppOpticsAPM.logger.level = @logger_level
116
+ nil
117
+ end
118
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize
119
+ end
@@ -0,0 +1,95 @@
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 "[appoptics_apm/test] 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?('POSTGRES_USER')
57
+ port = ENV.key?('POSTGRES_PORT') ? ENV['POSTGRES_PORT'] : 5432
58
+ ENV['DATABASE_URL'] = "postgresql://#{ENV['POSTGRES_PASSWORD']}:#{ENV['POSTGRES_USER']}@#{ENV['POSTGRES_HOST']}:#{port}/travis_ci_test"
59
+ else
60
+ ENV['DATABASE_URL'] = 'postgresql://postgres@127.0.0.1:5432/travis_ci_test'
61
+ end
62
+ end
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
+ port = ENV.key?('MYSQL_PORT') ? ENV['MYSQL_PORT'] : 3306
73
+ ENV['DATABASE_URL'] = "mysql://root:#{ENV['DOCKER_MYSQL_PASS']}@#{ENV['MYSQL_HOST']}:#{port}/travis_ci_test"
74
+ else
75
+ ENV['DATABASE_URL'] = 'mysql://root@127.0.0.1:3306/travis_ci_test'
76
+ end
77
+ end
78
+
79
+ ##
80
+ # set_mysql2_env
81
+ #
82
+ # Used to set the mysql specific DATABASE_URL env based
83
+ # on various conditions
84
+ def set_mysql2_env
85
+ if ENV.key?('TRAVIS_MYSQL_PASS')
86
+ ENV['DATABASE_URL'] = "mysql2://root:#{ENV['TRAVIS_MYSQL_PASS']}@127.0.0.1:3306/travis_ci_test"
87
+ elsif ENV.key?('DOCKER_MYSQL_PASS')
88
+ ENV['DATABASE_URL'] = "mysql2://root:#{ENV['DOCKER_MYSQL_PASS']}@#{ENV['MYSQL_HOST']}:3306/travis_ci_test"
89
+ else
90
+ ENV['DATABASE_URL'] = 'mysql2://root@127.0.0.1:3306/travis_ci_test'
91
+ end
92
+ end
93
+ end
94
+ end
95
+ 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