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.
- checksums.yaml +7 -0
- data/.dockerignore +5 -0
- data/.github/ISSUE_TEMPLATE/bug-or-feature-request.md +16 -0
- data/.github/workflows/build_and_release_gem.yml +103 -0
- data/.github/workflows/build_for_packagecloud.yml +70 -0
- data/.github/workflows/docker-images.yml +47 -0
- data/.github/workflows/run_cpluplus_tests.yml +73 -0
- data/.github/workflows/run_tests.yml +168 -0
- data/.github/workflows/scripts/test_install.rb +23 -0
- data/.github/workflows/swig/swig-v4.0.2.tar.gz +0 -0
- data/.github/workflows/test_on_4_linux.yml +159 -0
- data/.gitignore +36 -0
- data/.rubocop.yml +29 -0
- data/.travis.yml +130 -0
- data/.yardopts +6 -0
- data/CHANGELOG.md +769 -0
- data/CONFIG.md +33 -0
- data/Gemfile +14 -0
- data/LICENSE +202 -0
- data/README.md +393 -0
- data/appoptics_apm.gemspec +70 -0
- data/bin/appoptics_apm_config +15 -0
- data/examples/prepend.rb +13 -0
- data/examples/sdk_examples.rb +158 -0
- data/ext/oboe_metal/README.md +69 -0
- data/ext/oboe_metal/extconf.rb +151 -0
- data/ext/oboe_metal/lib/.keep +0 -0
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.0.0.0.sha256 +1 -0
- data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.0.0.0.sha256 +1 -0
- data/ext/oboe_metal/noop/noop.c +8 -0
- data/ext/oboe_metal/src/README.md +6 -0
- data/ext/oboe_metal/src/VERSION +2 -0
- data/ext/oboe_metal/src/bson/bson.h +220 -0
- data/ext/oboe_metal/src/bson/platform_hacks.h +91 -0
- data/ext/oboe_metal/src/frames.cc +246 -0
- data/ext/oboe_metal/src/frames.h +40 -0
- data/ext/oboe_metal/src/init_appoptics_apm.cc +21 -0
- data/ext/oboe_metal/src/logging.cc +95 -0
- data/ext/oboe_metal/src/logging.h +35 -0
- data/ext/oboe_metal/src/oboe.h +1156 -0
- data/ext/oboe_metal/src/oboe_api.cpp +652 -0
- data/ext/oboe_metal/src/oboe_api.hpp +431 -0
- data/ext/oboe_metal/src/oboe_debug.h +59 -0
- data/ext/oboe_metal/src/oboe_swig_wrap.cc +7329 -0
- data/ext/oboe_metal/src/profiling.cc +435 -0
- data/ext/oboe_metal/src/profiling.h +78 -0
- data/ext/oboe_metal/test/CMakeLists.txt +53 -0
- data/ext/oboe_metal/test/FindGMock.cmake +43 -0
- data/ext/oboe_metal/test/README.md +56 -0
- data/ext/oboe_metal/test/frames_test.cc +164 -0
- data/ext/oboe_metal/test/profiling_test.cc +93 -0
- data/ext/oboe_metal/test/ruby_inc_dir.rb +8 -0
- data/ext/oboe_metal/test/ruby_prefix.rb +8 -0
- data/ext/oboe_metal/test/ruby_test_helper.rb +67 -0
- data/ext/oboe_metal/test/test.h +11 -0
- data/ext/oboe_metal/test/test_main.cc +32 -0
- data/init.rb +4 -0
- data/lib/appoptics_apm/api/layerinit.rb +41 -0
- data/lib/appoptics_apm/api/logging.rb +381 -0
- data/lib/appoptics_apm/api/memcache.rb +37 -0
- data/lib/appoptics_apm/api/metrics.rb +63 -0
- data/lib/appoptics_apm/api/tracing.rb +57 -0
- data/lib/appoptics_apm/api/util.rb +120 -0
- data/lib/appoptics_apm/api.rb +21 -0
- data/lib/appoptics_apm/base.rb +231 -0
- data/lib/appoptics_apm/config.rb +299 -0
- data/lib/appoptics_apm/frameworks/grape.rb +98 -0
- data/lib/appoptics_apm/frameworks/padrino.rb +78 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller.rb +104 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller4.rb +48 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller5.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller6.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_controller_api.rb +50 -0
- data/lib/appoptics_apm/frameworks/rails/inst/action_view.rb +88 -0
- data/lib/appoptics_apm/frameworks/rails/inst/active_record.rb +27 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql.rb +43 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +29 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +31 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils.rb +119 -0
- data/lib/appoptics_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +114 -0
- data/lib/appoptics_apm/frameworks/rails/inst/logger_formatters.rb +27 -0
- data/lib/appoptics_apm/frameworks/rails.rb +100 -0
- data/lib/appoptics_apm/frameworks/sinatra.rb +96 -0
- data/lib/appoptics_apm/inst/bunny-client.rb +148 -0
- data/lib/appoptics_apm/inst/bunny-consumer.rb +89 -0
- data/lib/appoptics_apm/inst/curb.rb +332 -0
- data/lib/appoptics_apm/inst/dalli.rb +85 -0
- data/lib/appoptics_apm/inst/delayed_job.rb +92 -0
- data/lib/appoptics_apm/inst/em-http-request.rb +101 -0
- data/lib/appoptics_apm/inst/excon.rb +125 -0
- data/lib/appoptics_apm/inst/faraday.rb +106 -0
- data/lib/appoptics_apm/inst/graphql.rb +240 -0
- data/lib/appoptics_apm/inst/grpc_client.rb +159 -0
- data/lib/appoptics_apm/inst/grpc_server.rb +120 -0
- data/lib/appoptics_apm/inst/http.rb +81 -0
- data/lib/appoptics_apm/inst/httpclient.rb +174 -0
- data/lib/appoptics_apm/inst/logger_formatter.rb +50 -0
- data/lib/appoptics_apm/inst/logging_log_event.rb +28 -0
- data/lib/appoptics_apm/inst/lumberjack_formatter.rb +13 -0
- data/lib/appoptics_apm/inst/memcached.rb +86 -0
- data/lib/appoptics_apm/inst/mongo.rb +246 -0
- data/lib/appoptics_apm/inst/mongo2.rb +225 -0
- data/lib/appoptics_apm/inst/moped.rb +466 -0
- data/lib/appoptics_apm/inst/rack.rb +182 -0
- data/lib/appoptics_apm/inst/rack_cache.rb +35 -0
- data/lib/appoptics_apm/inst/redis.rb +274 -0
- data/lib/appoptics_apm/inst/resque.rb +151 -0
- data/lib/appoptics_apm/inst/rest-client.rb +48 -0
- data/lib/appoptics_apm/inst/sequel.rb +178 -0
- data/lib/appoptics_apm/inst/sidekiq-client.rb +55 -0
- data/lib/appoptics_apm/inst/sidekiq-worker.rb +66 -0
- data/lib/appoptics_apm/inst/twitter-cassandra.rb +294 -0
- data/lib/appoptics_apm/inst/typhoeus.rb +108 -0
- data/lib/appoptics_apm/instrumentation.rb +22 -0
- data/lib/appoptics_apm/loading.rb +65 -0
- data/lib/appoptics_apm/logger.rb +14 -0
- data/lib/appoptics_apm/noop/README.md +9 -0
- data/lib/appoptics_apm/noop/context.rb +27 -0
- data/lib/appoptics_apm/noop/metadata.rb +25 -0
- data/lib/appoptics_apm/noop/profiling.rb +21 -0
- data/lib/appoptics_apm/oboe_init_options.rb +211 -0
- data/lib/appoptics_apm/ruby.rb +35 -0
- data/lib/appoptics_apm/sdk/current_trace.rb +77 -0
- data/lib/appoptics_apm/sdk/custom_metrics.rb +94 -0
- data/lib/appoptics_apm/sdk/logging.rb +37 -0
- data/lib/appoptics_apm/sdk/tracing.rb +434 -0
- data/lib/appoptics_apm/support/profiling.rb +18 -0
- data/lib/appoptics_apm/support/transaction_metrics.rb +67 -0
- data/lib/appoptics_apm/support/transaction_settings.rb +219 -0
- data/lib/appoptics_apm/support/x_trace_options.rb +110 -0
- data/lib/appoptics_apm/support_report.rb +119 -0
- data/lib/appoptics_apm/test.rb +95 -0
- data/lib/appoptics_apm/thread_local.rb +26 -0
- data/lib/appoptics_apm/util.rb +326 -0
- data/lib/appoptics_apm/version.rb +16 -0
- data/lib/appoptics_apm/xtrace.rb +115 -0
- data/lib/appoptics_apm.rb +77 -0
- data/lib/joboe_metal.rb +212 -0
- data/lib/oboe.rb +7 -0
- data/lib/oboe_metal.rb +172 -0
- data/lib/rails/generators/appoptics_apm/install_generator.rb +47 -0
- data/lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb +425 -0
- data/log/.keep +0 -0
- data/yardoc_frontpage.md +26 -0
- 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
|