solarwinds_apm 5.1.9 → 6.0.0.preV1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +0 -1
- data/ext/oboe_metal/extconf.rb +19 -23
- data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.sha256 +1 -1
- data/ext/oboe_metal/src/VERSION +1 -1
- data/ext/oboe_metal/src/oboe_debug.h +1 -0
- data/lib/oboe_metal.rb +116 -80
- data/lib/rails/generators/solarwinds_apm/install_generator.rb +1 -2
- data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +44 -260
- data/lib/solarwinds_apm/api/current_trace_info.rb +148 -0
- data/lib/solarwinds_apm/api/tracing.rb +30 -0
- data/lib/solarwinds_apm/api/transaction_name.rb +57 -0
- data/lib/solarwinds_apm/api.rb +8 -15
- data/lib/solarwinds_apm/base.rb +4 -131
- data/lib/solarwinds_apm/config.rb +128 -175
- data/lib/solarwinds_apm/constants.rb +32 -0
- data/lib/solarwinds_apm/logger.rb +1 -1
- data/lib/solarwinds_apm/noop/context.rb +2 -5
- data/lib/solarwinds_apm/noop/metadata.rb +1 -2
- data/lib/solarwinds_apm/noop/profiling.rb +3 -7
- data/lib/solarwinds_apm/oboe_init_options.rb +71 -33
- data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +204 -0
- data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +163 -0
- data/lib/solarwinds_apm/opentelemetry/solarwinds_propagator.rb +92 -0
- data/lib/solarwinds_apm/opentelemetry/solarwinds_response_propagator.rb +72 -0
- data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +330 -0
- data/lib/solarwinds_apm/opentelemetry.rb +8 -0
- data/lib/solarwinds_apm/otel_config.rb +161 -0
- data/lib/solarwinds_apm/{inst → support}/logger_formatter.rb +5 -6
- data/lib/solarwinds_apm/{inst → support}/logging_log_event.rb +3 -6
- data/lib/solarwinds_apm/{inst → support}/lumberjack_formatter.rb +1 -4
- data/lib/solarwinds_apm/support/oboe_tracing_mode.rb +27 -0
- data/lib/solarwinds_apm/support/swomarginalia/LICENSE +20 -0
- data/lib/solarwinds_apm/support/swomarginalia/README.md +41 -0
- data/lib/solarwinds_apm/support/swomarginalia/comment.rb +205 -0
- data/lib/solarwinds_apm/support/swomarginalia/load_swomarginalia.rb +48 -0
- data/lib/solarwinds_apm/support/swomarginalia/railtie.rb +22 -0
- data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +86 -0
- data/lib/solarwinds_apm/support/transaction_cache.rb +24 -0
- data/lib/solarwinds_apm/support/transaction_settings.rb +26 -209
- data/lib/solarwinds_apm/support/transformer.rb +56 -0
- data/lib/solarwinds_apm/support/txn_name_manager.rb +25 -0
- data/lib/solarwinds_apm/support/x_trace_options.rb +42 -26
- data/lib/solarwinds_apm/support.rb +33 -10
- data/lib/solarwinds_apm/support_report.rb +10 -32
- data/lib/solarwinds_apm/thread_local.rb +1 -1
- data/lib/solarwinds_apm/version.rb +4 -4
- data/lib/solarwinds_apm.rb +31 -26
- metadata +76 -121
- data/.dockerignore +0 -5
- data/.gitignore +0 -58
- data/.rubocop.yml +0 -29
- data/.whitesource +0 -22
- data/.yardopts +0 -7
- data/CHANGELOG-appoptics.md +0 -766
- data/CHANGELOG.md +0 -82
- data/CONFIG.md +0 -31
- data/Gemfile +0 -15
- data/README.md +0 -385
- data/bin/solarwinds_apm_config +0 -15
- data/examples/prepend.rb +0 -13
- data/examples/sdk_examples.rb +0 -158
- data/ext/oboe_metal/README.md +0 -69
- data/ext/oboe_metal/extconf_local.rb +0 -75
- data/ext/oboe_metal/lib/.keep +0 -0
- data/ext/oboe_metal/noop/noop.c +0 -8
- data/ext/oboe_metal/src/README.md +0 -6
- data/ext/oboe_metal/src/frames.cc +0 -247
- data/ext/oboe_metal/src/frames.h +0 -40
- data/ext/oboe_metal/src/logging.cc +0 -97
- data/ext/oboe_metal/src/logging.h +0 -34
- data/ext/oboe_metal/src/profiling.cc +0 -435
- data/ext/oboe_metal/src/profiling.h +0 -78
- data/ext/oboe_metal/test/CMakeLists.txt +0 -53
- data/ext/oboe_metal/test/FindGMock.cmake +0 -43
- data/ext/oboe_metal/test/README.md +0 -56
- data/ext/oboe_metal/test/frames_test.cc +0 -164
- data/ext/oboe_metal/test/profiling_test.cc +0 -93
- data/ext/oboe_metal/test/ruby_inc_dir.rb +0 -8
- data/ext/oboe_metal/test/ruby_prefix.rb +0 -8
- data/ext/oboe_metal/test/ruby_test_helper.rb +0 -67
- data/ext/oboe_metal/test/test.h +0 -11
- data/ext/oboe_metal/test/test_main.cc +0 -32
- data/init.rb +0 -4
- data/lib/solarwinds_apm/api/layerinit.rb +0 -41
- data/lib/solarwinds_apm/api/logging.rb +0 -356
- data/lib/solarwinds_apm/api/memcache.rb +0 -37
- data/lib/solarwinds_apm/api/metrics.rb +0 -63
- data/lib/solarwinds_apm/api/util.rb +0 -98
- data/lib/solarwinds_apm/frameworks/grape.rb +0 -96
- data/lib/solarwinds_apm/frameworks/padrino.rb +0 -78
- data/lib/solarwinds_apm/frameworks/rails/inst/action_controller.rb +0 -100
- data/lib/solarwinds_apm/frameworks/rails/inst/action_controller5.rb +0 -50
- data/lib/solarwinds_apm/frameworks/rails/inst/action_controller_api.rb +0 -50
- data/lib/solarwinds_apm/frameworks/rails/inst/action_view.rb +0 -88
- data/lib/solarwinds_apm/frameworks/rails/inst/active_record.rb +0 -26
- data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +0 -29
- data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +0 -22
- data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +0 -103
- data/lib/solarwinds_apm/frameworks/rails/inst/logger_formatters.rb +0 -14
- data/lib/solarwinds_apm/frameworks/rails.rb +0 -100
- data/lib/solarwinds_apm/frameworks/sinatra.rb +0 -96
- data/lib/solarwinds_apm/inst/bunny-client.rb +0 -157
- data/lib/solarwinds_apm/inst/bunny-consumer.rb +0 -102
- data/lib/solarwinds_apm/inst/curb.rb +0 -289
- data/lib/solarwinds_apm/inst/dalli.rb +0 -89
- data/lib/solarwinds_apm/inst/delayed_job.rb +0 -100
- data/lib/solarwinds_apm/inst/excon.rb +0 -113
- data/lib/solarwinds_apm/inst/faraday.rb +0 -96
- data/lib/solarwinds_apm/inst/graphql.rb +0 -206
- data/lib/solarwinds_apm/inst/grpc_client.rb +0 -147
- data/lib/solarwinds_apm/inst/grpc_server.rb +0 -119
- data/lib/solarwinds_apm/inst/httpclient.rb +0 -182
- data/lib/solarwinds_apm/inst/memcached.rb +0 -86
- data/lib/solarwinds_apm/inst/mongo.rb +0 -246
- data/lib/solarwinds_apm/inst/mongo2.rb +0 -225
- data/lib/solarwinds_apm/inst/moped.rb +0 -466
- data/lib/solarwinds_apm/inst/net_http.rb +0 -60
- data/lib/solarwinds_apm/inst/rack.rb +0 -223
- data/lib/solarwinds_apm/inst/rack_cache.rb +0 -35
- data/lib/solarwinds_apm/inst/redis.rb +0 -280
- data/lib/solarwinds_apm/inst/redis_v4.rb +0 -273
- data/lib/solarwinds_apm/inst/resque.rb +0 -129
- data/lib/solarwinds_apm/inst/rest-client.rb +0 -43
- data/lib/solarwinds_apm/inst/sequel.rb +0 -241
- data/lib/solarwinds_apm/inst/sidekiq-client.rb +0 -63
- data/lib/solarwinds_apm/inst/sidekiq-worker.rb +0 -64
- data/lib/solarwinds_apm/inst/typhoeus.rb +0 -90
- data/lib/solarwinds_apm/instrumentation.rb +0 -22
- data/lib/solarwinds_apm/loading.rb +0 -65
- data/lib/solarwinds_apm/ruby.rb +0 -35
- data/lib/solarwinds_apm/sdk/current_trace_info.rb +0 -123
- data/lib/solarwinds_apm/sdk/custom_metrics.rb +0 -94
- data/lib/solarwinds_apm/sdk/logging.rb +0 -37
- data/lib/solarwinds_apm/sdk/trace_context_headers.rb +0 -69
- data/lib/solarwinds_apm/sdk/tracing.rb +0 -432
- data/lib/solarwinds_apm/support/profiling.rb +0 -25
- data/lib/solarwinds_apm/support/trace_context.rb +0 -53
- data/lib/solarwinds_apm/support/trace_state.rb +0 -69
- data/lib/solarwinds_apm/support/trace_string.rb +0 -89
- data/lib/solarwinds_apm/support/transaction_metrics.rb +0 -67
- data/lib/solarwinds_apm/test.rb +0 -165
- data/lib/solarwinds_apm/util.rb +0 -426
- data/log/.keep +0 -0
- data/log/postgresql/.keep +0 -0
- data/solarwinds_apm.gemspec +0 -55
- data/yardoc_frontpage.md +0 -24
@@ -1,63 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
module SolarWindsAPM
|
5
|
-
class SidekiqClient
|
6
|
-
include SolarWindsAPM::SDK::TraceContextHeaders
|
7
|
-
|
8
|
-
def collect_kvs(args)
|
9
|
-
begin
|
10
|
-
# Attempt to collect up pertinent info. If we hit something unexpected,
|
11
|
-
# keep calm and instrument on.
|
12
|
-
|
13
|
-
report_kvs = {}
|
14
|
-
worker_class, msg, queue, _ = args
|
15
|
-
|
16
|
-
report_kvs[:Spec] = :pushq
|
17
|
-
report_kvs[:Flavor] = :sidekiq
|
18
|
-
report_kvs[:Queue] = queue
|
19
|
-
report_kvs[:Retry] = msg['retry']
|
20
|
-
report_kvs[:JobName] = msg['wrapped'] || worker_class
|
21
|
-
report_kvs[:MsgID] = msg['jid']
|
22
|
-
report_kvs[:Args] = msg['args'].to_s[0..1024] if SolarWindsAPM::Config[:sidekiqclient][:log_args]
|
23
|
-
report_kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:sidekiqclient][:collect_backtraces]
|
24
|
-
rescue => e
|
25
|
-
SolarWindsAPM.logger.warn "[solarwinds_apm/sidekiq] Non-fatal error capturing KVs: #{e.message}"
|
26
|
-
end
|
27
|
-
report_kvs
|
28
|
-
end
|
29
|
-
|
30
|
-
def call(*args)
|
31
|
-
# args: 0: worker_class, 1: msg, 2: queue, 3: redis_pool
|
32
|
-
if SolarWindsAPM.tracing?
|
33
|
-
report_kvs = collect_kvs(args)
|
34
|
-
SolarWindsAPM::API.log_entry(:'sidekiq-client', report_kvs)
|
35
|
-
if args[1].is_a?(Hash)
|
36
|
-
# We've been doing this since 2015, but ...
|
37
|
-
# ... is it actually safe to inject our entries into the msg of the job?
|
38
|
-
# Opentelemetry does it too :), so I guess we're good
|
39
|
-
args[1]['SourceTrace'] = SolarWindsAPM::Context.toString
|
40
|
-
add_tracecontext_headers(args[1])
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
result = yield
|
45
|
-
rescue => e
|
46
|
-
SolarWindsAPM::API.log_exception(:'sidekiq-client', e, { :JobID => result['jid'] })
|
47
|
-
raise
|
48
|
-
ensure
|
49
|
-
SolarWindsAPM::API.log_exit(:'sidekiq-client', { :JobID => result['jid'] })
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
if defined?(Sidekiq) && SolarWindsAPM::Config[:sidekiqclient][:enabled]
|
55
|
-
SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting sidekiq client' if SolarWindsAPM::Config[:verbose]
|
56
|
-
|
57
|
-
Sidekiq.configure_client do |config|
|
58
|
-
config.client_middleware do |chain|
|
59
|
-
SolarWindsAPM.logger.info '[solarwinds_apm/loading] Adding Sidekiq client middleware' if SolarWindsAPM::Config[:verbose]
|
60
|
-
chain.add SolarWindsAPM::SidekiqClient
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
module SolarWindsAPM
|
5
|
-
class SidekiqWorker
|
6
|
-
def collect_kvs(args)
|
7
|
-
begin
|
8
|
-
# Attempt to collect up pertinent info. If we hit something unexpected,
|
9
|
-
# keep calm and instrument on.
|
10
|
-
report_kvs = {}
|
11
|
-
_worker, msg, queue = args
|
12
|
-
|
13
|
-
# Background Job Spec KVs
|
14
|
-
report_kvs[:Spec] = :job
|
15
|
-
report_kvs[:Flavor] = :sidekiq
|
16
|
-
report_kvs[:Queue] = queue
|
17
|
-
report_kvs[:Retry] = msg['retry']
|
18
|
-
report_kvs[:JobName] = msg['wrapped'] || msg['class']
|
19
|
-
report_kvs[:MsgID] = msg['jid']
|
20
|
-
report_kvs[:Args] = msg['args'].to_s[0..1024] if SolarWindsAPM::Config[:sidekiqworker][:log_args]
|
21
|
-
report_kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:sidekiqworker][:collect_backtraces]
|
22
|
-
|
23
|
-
# Webserver Spec KVs
|
24
|
-
report_kvs[:'HTTP-Host'] = Socket.gethostname
|
25
|
-
report_kvs[:Controller] = "Sidekiq_#{queue}"
|
26
|
-
report_kvs[:Action] = msg['wrapped'] || msg['class']
|
27
|
-
report_kvs[:URL] = "/sidekiq/#{queue}/#{msg['wrapped'] || msg['class']}"
|
28
|
-
rescue => e
|
29
|
-
SolarWindsAPM.logger.warn "[solarwinds_apm/sidekiq] Non-fatal error capturing KVs: #{e.message}"
|
30
|
-
end
|
31
|
-
report_kvs
|
32
|
-
end
|
33
|
-
|
34
|
-
def call(*args)
|
35
|
-
# args: 0: worker, 1: msg, 2: queue
|
36
|
-
report_kvs = collect_kvs(args)
|
37
|
-
|
38
|
-
# Continue the trace from the enqueue side
|
39
|
-
if args[1].is_a?(Hash) && SolarWindsAPM::TraceString.valid?(args[1]['SourceTrace'])
|
40
|
-
report_kvs[:SourceTrace] = args[1]['SourceTrace']
|
41
|
-
SolarWindsAPM::Context.fromString(args[1]['SourceTrace'])
|
42
|
-
args[1].delete('SourceTrace')
|
43
|
-
unless args[1]['traceparent'] && args[1]['tracestate']
|
44
|
-
add_tracecontext_headers(args[1])
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
SolarWindsAPM::SDK.start_trace(:'sidekiq-worker', kvs: report_kvs, headers: args[1]) do
|
49
|
-
yield
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
if defined?(Sidekiq) && SolarWindsAPM::Config[:sidekiqworker][:enabled]
|
56
|
-
SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting sidekiq worker' if SolarWindsAPM::Config[:verbose]
|
57
|
-
|
58
|
-
Sidekiq.configure_server do |config|
|
59
|
-
config.server_middleware do |chain|
|
60
|
-
SolarWindsAPM.logger.info '[solarwinds_apm/loading] Adding Sidekiq worker middleware' if SolarWindsAPM::Config[:verbose]
|
61
|
-
chain.add SolarWindsAPM::SidekiqWorker
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
class TyphoeusError < StandardError; end
|
4
|
-
|
5
|
-
module SolarWindsAPM
|
6
|
-
module Inst
|
7
|
-
module TyphoeusRequestOps
|
8
|
-
include SolarWindsAPM::SDK::TraceContextHeaders
|
9
|
-
|
10
|
-
def run
|
11
|
-
unless SolarWindsAPM.tracing?
|
12
|
-
add_tracecontext_headers(options[:headers])
|
13
|
-
return super
|
14
|
-
end
|
15
|
-
|
16
|
-
begin
|
17
|
-
SolarWindsAPM::API.log_entry(:typhoeus)
|
18
|
-
|
19
|
-
context = SolarWindsAPM::Context.toString
|
20
|
-
|
21
|
-
kvs = {}
|
22
|
-
kvs[:Spec] = 'rsc'
|
23
|
-
kvs[:IsService] = 1
|
24
|
-
kvs[:HTTPMethod] = SolarWindsAPM::Util.upcase(options[:method])
|
25
|
-
|
26
|
-
add_tracecontext_headers(options[:headers])
|
27
|
-
response = super
|
28
|
-
|
29
|
-
if response.code == 0
|
30
|
-
exception = TyphoeusError.new(response.return_message)
|
31
|
-
exception.set_backtrace(SolarWindsAPM::API.backtrace)
|
32
|
-
SolarWindsAPM::API.log_exception(:typhoeus, exception)
|
33
|
-
end
|
34
|
-
|
35
|
-
kvs[:HTTPStatus] = response.code
|
36
|
-
kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:typhoeus][:collect_backtraces]
|
37
|
-
# Conditionally log query params
|
38
|
-
uri = URI(response.effective_url)
|
39
|
-
kvs[:RemoteURL] = SolarWindsAPM::Config[:typhoeus][:log_args] ? uri.to_s : uri.to_s.split('?').first
|
40
|
-
kvs[:RemoteURL] = SolarWindsAPM::Util.sanitize_uri(kvs[:RemoteURL])
|
41
|
-
response
|
42
|
-
rescue => e
|
43
|
-
SolarWindsAPM::API.log_exception(:typhoeus, e)
|
44
|
-
raise e
|
45
|
-
ensure
|
46
|
-
SolarWindsAPM::API.log_exit(:typhoeus, kvs)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
module TyphoeusHydraRunnable
|
52
|
-
include SolarWindsAPM::SDK::TraceContextHeaders
|
53
|
-
|
54
|
-
def run
|
55
|
-
unless SolarWindsAPM.tracing?
|
56
|
-
queued_requests.map do |request|
|
57
|
-
add_tracecontext_headers(request.options[:headers])
|
58
|
-
end
|
59
|
-
return super
|
60
|
-
end
|
61
|
-
|
62
|
-
kvs = {}
|
63
|
-
|
64
|
-
kvs[:queued_requests] = queued_requests.count
|
65
|
-
kvs[:max_concurrency] = max_concurrency
|
66
|
-
kvs[:Async] = 1
|
67
|
-
kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:typhoeus][:collect_backtraces]
|
68
|
-
|
69
|
-
# FIXME: Until we figure out a strategy to deal with libcurl internal
|
70
|
-
# threading and Ethon's use of easy handles, here we just do a simple
|
71
|
-
# trace of the hydra run.
|
72
|
-
SolarWindsAPM::SDK.trace(:typhoeus_hydra, kvs: kvs) do
|
73
|
-
queued_requests.map do |request|
|
74
|
-
add_tracecontext_headers(request.options[:headers])
|
75
|
-
end
|
76
|
-
|
77
|
-
super
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
if defined?(Typhoeus) && SolarWindsAPM::Config[:typhoeus][:enabled]
|
86
|
-
SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting typhoeus' if SolarWindsAPM::Config[:verbose]
|
87
|
-
|
88
|
-
Typhoeus::Request.prepend(SolarWindsAPM::Inst::TyphoeusRequestOps)
|
89
|
-
Typhoeus::Hydra.prepend(SolarWindsAPM::Inst::TyphoeusHydraRunnable)
|
90
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
module SolarWindsAPM
|
5
|
-
##
|
6
|
-
# The Inst module holds all of the instrumentation extensions for various
|
7
|
-
# libraries such as Redis, Dalli and Resque.
|
8
|
-
module Inst
|
9
|
-
def self.load_instrumentation
|
10
|
-
# Load the general instrumentation
|
11
|
-
pattern = File.join(File.dirname(__FILE__), 'inst', '*.rb')
|
12
|
-
Dir.glob(pattern) do |f|
|
13
|
-
begin
|
14
|
-
require f
|
15
|
-
rescue => e
|
16
|
-
SolarWindsAPM.logger.error "[solarwinds_apm/loading] Error loading instrumentation file '#{f}' : #{e}"
|
17
|
-
SolarWindsAPM.logger.debug "[solarwinds_apm/loading] #{e.backtrace.first}"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
require 'digest/sha1'
|
5
|
-
|
6
|
-
module SolarWindsAPM
|
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 solarwinds_apm em.
|
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 solarwinds_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
|
-
|
50
|
-
begin
|
51
|
-
require 'solarwinds_apm/api'
|
52
|
-
rescue LoadError => e
|
53
|
-
SolarWindsAPM.logger.fatal "[solarwinds_apm/error] Couldn't load api: #{e.message}"
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
SolarWindsAPM::Loading.require_api
|
60
|
-
|
61
|
-
# Auto-start the Reporter unless we are running Unicorn on Heroku
|
62
|
-
# In that case, we start the reporters after fork
|
63
|
-
unless SolarWindsAPM.heroku? && SolarWindsAPM.forking_webserver?
|
64
|
-
SolarWindsAPM::Reporter.start if SolarWindsAPM.loaded
|
65
|
-
end
|
data/lib/solarwinds_apm/ruby.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
module SolarWindsAPM
|
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 SolarWindsAPM.loaded
|
26
|
-
SolarWindsAPM::Inst.load_instrumentation
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
if SolarWindsAPM.loaded && !SolarWindsAPM.framework?
|
34
|
-
SolarWindsAPM::Ruby.load
|
35
|
-
end
|
@@ -1,123 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) SolarWinds, LLC.
|
3
|
-
# All rights reserved.
|
4
|
-
#++
|
5
|
-
|
6
|
-
module SolarWindsAPM
|
7
|
-
module SDK
|
8
|
-
|
9
|
-
module CurrentTraceInfo
|
10
|
-
# Creates an instance of {TraceInfo} with instance methods {TraceInfo#trace_id},
|
11
|
-
# {TraceInfo#span_id}, {TraceInfo#trace_flags}, {TraceInfo#for_log},
|
12
|
-
# and {TraceInfo#hash_for_log}.
|
13
|
-
#
|
14
|
-
# === Example:
|
15
|
-
#
|
16
|
-
# trace = SolarWindsAPM::SDK.current_trace_info
|
17
|
-
# trace.for_log # 'trace_id=7435a9fe510ae4533414d425dadf4e18 span_id=49e60702469db05f trace_flags=01' or '' depends on Config
|
18
|
-
# trace.hash_for_log # { trace_id: '7435a9fe510ae4533414d425dadf4e18',
|
19
|
-
# span_id: '49e60702469db05f',
|
20
|
-
# trace_flags: ''} or {} depends on Config
|
21
|
-
#
|
22
|
-
# Configure trace info injection with lograge:
|
23
|
-
#
|
24
|
-
# Lograge.custom_options = lambda do |event|
|
25
|
-
# SolarWindsAPM::SDK.current_trace_info.hash_for_log
|
26
|
-
# end
|
27
|
-
#
|
28
|
-
|
29
|
-
def current_trace_info
|
30
|
-
TraceInfo.new
|
31
|
-
end
|
32
|
-
|
33
|
-
# @attr trace_id
|
34
|
-
# @attr span_id
|
35
|
-
# @attr trace_flags
|
36
|
-
class TraceInfo
|
37
|
-
attr_reader :tracestring, :trace_id, :span_id, :trace_flags, :do_log
|
38
|
-
|
39
|
-
SQL_REGEX=/\/\*\s*traceparent=.*\*\/\s*/.freeze
|
40
|
-
|
41
|
-
def initialize
|
42
|
-
tracestring = SolarWindsAPM::Context.toString
|
43
|
-
parts = SolarWindsAPM::TraceString.split(tracestring)
|
44
|
-
|
45
|
-
@tracestring = parts[:tracestring]
|
46
|
-
@trace_id = parts[:trace_id]
|
47
|
-
@span_id = parts[:span_id]
|
48
|
-
@trace_flags = parts[:flags]
|
49
|
-
|
50
|
-
@do_log = log? # true if the tracecontext should be added to logs
|
51
|
-
@do_sql = sql? # true if the tracecontext should be added to sql
|
52
|
-
end
|
53
|
-
|
54
|
-
# for_log returns a string in the format
|
55
|
-
# 'trace_id=<trace_id> span_id=<span_id> trace_flags=<trace_flags>' or ''.
|
56
|
-
#
|
57
|
-
# An empty string is returned depending on the setting for
|
58
|
-
# <tt>SolarWindsAPM::Config[:log_traceId]</tt>, which can be :never,
|
59
|
-
# :sampled, :traced, or :always.
|
60
|
-
#
|
61
|
-
def for_log
|
62
|
-
@for_log ||= @do_log ? "trace_id=#{@trace_id} span_id=#{@span_id} trace_flags=#{@trace_flags}" : ''
|
63
|
-
end
|
64
|
-
|
65
|
-
def hash_for_log
|
66
|
-
@hash_for_log ||= @do_log ? { trace_id: @trace_id,
|
67
|
-
span_id: @span_id,
|
68
|
-
trace_flags: @trace_flags } : {}
|
69
|
-
end
|
70
|
-
|
71
|
-
def for_sql
|
72
|
-
@for_sql ||= @do_sql ? "/*traceparent='#{@tracestring}'*/" : ''
|
73
|
-
end
|
74
|
-
|
75
|
-
##
|
76
|
-
# add_traceparent_to_sql
|
77
|
-
#
|
78
|
-
# returns the sql with "/*traceparent='#{@tracestring}'*/" prepended
|
79
|
-
# and adds the QueryTag kv to kvs
|
80
|
-
#
|
81
|
-
def add_traceparent_to_sql(sql, kvs)
|
82
|
-
sql = sql.gsub(SQL_REGEX, '') # remove if it was added before
|
83
|
-
|
84
|
-
unless for_sql.empty?
|
85
|
-
kvs[:QueryTag] = for_sql
|
86
|
-
return "#{for_sql}#{sql}"
|
87
|
-
end
|
88
|
-
|
89
|
-
sql
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
# if true the trace info should be added to the log message
|
95
|
-
def log?
|
96
|
-
case SolarWindsAPM::Config[:log_traceId]
|
97
|
-
when :never, nil
|
98
|
-
false
|
99
|
-
when :always
|
100
|
-
# there is no way @tracestring is not ok
|
101
|
-
# it may be all 0s, but that is ok
|
102
|
-
# SolarWindsAPM::TraceString.ok?(@tracestring)
|
103
|
-
true
|
104
|
-
when :traced
|
105
|
-
SolarWindsAPM::TraceString.valid?(@tracestring)
|
106
|
-
when :sampled
|
107
|
-
SolarWindsAPM::TraceString.sampled?(@tracestring)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# if true the trace info should be added to the sql query
|
112
|
-
def sql?
|
113
|
-
SolarWindsAPM::Config[:tag_sql] &&
|
114
|
-
SolarWindsAPM::TraceString.sampled?(@tracestring)
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
extend CurrentTraceInfo
|
122
|
-
end
|
123
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2016 SolarWinds, LLC.
|
3
|
-
# All rights reserved.
|
4
|
-
#++
|
5
|
-
|
6
|
-
module SolarWindsAPM
|
7
|
-
module SDK
|
8
|
-
|
9
|
-
module CustomMetrics
|
10
|
-
|
11
|
-
# Send counts
|
12
|
-
#
|
13
|
-
# Use this method to report the number of times an action occurs. The metric counts reported are summed and flushed every 60 seconds.
|
14
|
-
#
|
15
|
-
# === Arguments:
|
16
|
-
#
|
17
|
-
# * +name+ (String) Name to be used for the metric. Must be 255 or fewer characters and consist only of A-Za-z0-9.:-*
|
18
|
-
# * +count+ (Integer, optional, default = 1): Count of actions being reported
|
19
|
-
# * +with_hostname+ (Boolean, optional, default = false): Indicates if the host name should be included as a tag for the metric
|
20
|
-
# * +tags_kvs+ (Hash, optional): List of key/value pairs to describe the metric. The key must be <= 64 characters, the value must be <= 255 characters, allowed characters: A-Za-z0-9.:-_
|
21
|
-
#
|
22
|
-
# === Example:
|
23
|
-
#
|
24
|
-
# class WorkTracker
|
25
|
-
# def counting(name, tags = {})
|
26
|
-
# yield # yield to where work is done
|
27
|
-
# SolarWindsAPM::SDK.increment_metric(name, 1, false, tags)
|
28
|
-
# end
|
29
|
-
# end
|
30
|
-
#
|
31
|
-
# === Returns:
|
32
|
-
# * 0 on success, error code on failure
|
33
|
-
#
|
34
|
-
def increment_metric(name, count = 1, with_hostname = false, tags_kvs = {})
|
35
|
-
return true unless SolarWindsAPM.loaded
|
36
|
-
with_hostname = with_hostname ? 1 : 0
|
37
|
-
tags, tags_count = make_tags(tags_kvs)
|
38
|
-
SolarWindsAPM::CustomMetrics.increment(name.to_s, count, with_hostname, nil, tags, tags_count) == 1
|
39
|
-
end
|
40
|
-
|
41
|
-
# Send values with counts
|
42
|
-
#
|
43
|
-
# Use this method to report a value for each or multiple counts. The metric values reported are aggregated and flushed every 60 seconds. The dashboard displays the average value per count.
|
44
|
-
#
|
45
|
-
# === Arguments:
|
46
|
-
#
|
47
|
-
# * +name+ (String) Name to be used for the metric. Must be 255 or fewer characters and consist only of A-Za-z0-9.:-*
|
48
|
-
# * +value+ (Numeric) Value to be added to the current sum
|
49
|
-
# * +count+ (Integer, optional, default = 1): Count of actions being reported
|
50
|
-
# * +with_hostname+ (Boolean, optional, default = false): Indicates if the host name should be included as a tag for the metric
|
51
|
-
# * +tags_kvs+ (Hash, optional): List of key/value pairs to describe the metric. The key must be <= 64 characters, the value must be <= 255 characters, allowed characters: A-Za-z0-9.:-_
|
52
|
-
#
|
53
|
-
# === Example:
|
54
|
-
#
|
55
|
-
# class WorkTracker
|
56
|
-
# def timing(name, tags = {})
|
57
|
-
# start = Time.now
|
58
|
-
# yield # yield to where work is done
|
59
|
-
# duration = Time.now - start
|
60
|
-
# SolarWindsAPM::SDK.summary_metric(name, duration, 1, false, tags)
|
61
|
-
# end
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
# === Returns:
|
65
|
-
# * 0 on success, error code on failure
|
66
|
-
#
|
67
|
-
def summary_metric(name, value, count = 1, with_hostname = false, tags_kvs = {})
|
68
|
-
return true unless SolarWindsAPM.loaded
|
69
|
-
with_hostname = with_hostname ? 1 : 0
|
70
|
-
tags, tags_count = make_tags(tags_kvs)
|
71
|
-
SolarWindsAPM::CustomMetrics.summary(name.to_s, value, count, with_hostname, nil, tags, tags_count) == 1
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def make_tags(tags_kvs)
|
77
|
-
unless tags_kvs.is_a?(Hash)
|
78
|
-
SolarWindsAPM.logger.warn("[solarwinds_apm/metrics] CustomMetrics received tags_kvs that are not a Hash (found #{tags_kvs.class}), setting tags_kvs = {}")
|
79
|
-
tags_kvs = {}
|
80
|
-
end
|
81
|
-
count = tags_kvs.size
|
82
|
-
tags = SolarWindsAPM::MetricTags.new(count)
|
83
|
-
|
84
|
-
tags_kvs.each_with_index do |(k, v), i|
|
85
|
-
tags.add(i, k.to_s, v.to_s)
|
86
|
-
end
|
87
|
-
|
88
|
-
[tags, count]
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
extend CustomMetrics
|
93
|
-
end
|
94
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# Copyright (c) 2019 SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
#
|
4
|
-
|
5
|
-
module SolarWindsAPM
|
6
|
-
module SDK
|
7
|
-
module Logging
|
8
|
-
|
9
|
-
# Log an information event in the current span
|
10
|
-
#
|
11
|
-
# a possible use-case is to collect extra information during the execution of a request
|
12
|
-
#
|
13
|
-
# === Arguments:
|
14
|
-
# * +kvs+ - (optional) hash containing key/value pairs that will be reported with this span.
|
15
|
-
#
|
16
|
-
def log_info(kvs)
|
17
|
-
SolarWindsAPM::API.log_info(SolarWindsAPM.layer, kvs)
|
18
|
-
end
|
19
|
-
|
20
|
-
# Log an exception/error event in the current span
|
21
|
-
#
|
22
|
-
# this may be helpful to track problems when an exception is rescued
|
23
|
-
#
|
24
|
-
# === Arguments:
|
25
|
-
# * +exception+ - an exception, must respond to :message and :backtrace
|
26
|
-
# * +kvs+ - (optional) hash containing key/value pairs that will be reported with this span.
|
27
|
-
#
|
28
|
-
def log_exception(exception, kvs = {})
|
29
|
-
SolarWindsAPM::API.log_exception(SolarWindsAPM.layer, exception, kvs)
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
extend Logging
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
#sh Copyright (c) SolarWinds, LLC.
|
2
|
-
# All rights reserved.
|
3
|
-
|
4
|
-
module SolarWindsAPM
|
5
|
-
module SDK
|
6
|
-
##
|
7
|
-
#
|
8
|
-
# Module to be included in classes with outbound calls
|
9
|
-
#
|
10
|
-
module TraceContextHeaders
|
11
|
-
|
12
|
-
##
|
13
|
-
# Add w3c tracecontext to headers arg
|
14
|
-
#
|
15
|
-
# === Argument:
|
16
|
-
# * +:headers+ outbound headers, a Hash or other object that can have key/value assigned
|
17
|
-
#
|
18
|
-
# Internally it uses SolarWindsAPM.trace_context, which is a thread local
|
19
|
-
# variable containing verified and processed incoming w3c headers.
|
20
|
-
# It gets populated by requests processed by Rack or through the
|
21
|
-
# :headers arg in SolarWindsAPM::SDK.start_trace
|
22
|
-
#
|
23
|
-
# === Example:
|
24
|
-
# class OutboundCaller
|
25
|
-
# include SolarWindsAPM::SDK::TraceContextHeaders
|
26
|
-
#
|
27
|
-
# # create new headers
|
28
|
-
# def faraday_send
|
29
|
-
# conn = Faraday.new(:url => 'http://example.com')
|
30
|
-
# headers = add_tracecontext_headers
|
31
|
-
# conn.get('/', nil, headers)
|
32
|
-
# end
|
33
|
-
#
|
34
|
-
# # add to given headers
|
35
|
-
# def excon_send(headers)
|
36
|
-
# conn = Excon.new('http://example.com')
|
37
|
-
# add_tracecontext_headers(headers)
|
38
|
-
# conn.get(headers: headers)
|
39
|
-
# end
|
40
|
-
# end
|
41
|
-
#
|
42
|
-
# === Returns:
|
43
|
-
# * The headers with w3c tracecontext added, also modifies the headers arg if given
|
44
|
-
#
|
45
|
-
def add_tracecontext_headers(headers = {})
|
46
|
-
begin
|
47
|
-
if SolarWindsAPM::Context.isValid
|
48
|
-
headers['traceparent'] = SolarWindsAPM::Context.toString
|
49
|
-
parent_id_flags = SolarWindsAPM::TraceString.span_id_flags(headers['traceparent'])
|
50
|
-
tracestate = SolarWindsAPM.trace_context&.tracestate
|
51
|
-
headers['tracestate'] = SolarWindsAPM::TraceState.add_sw_member(tracestate, parent_id_flags)
|
52
|
-
else
|
53
|
-
# make sure we propagate an incoming trace_context even if we don't trace
|
54
|
-
if SolarWindsAPM.trace_context
|
55
|
-
headers['traceparent'] = SolarWindsAPM.trace_context.traceparent
|
56
|
-
headers['tracestate'] = SolarWindsAPM.trace_context.tracestate
|
57
|
-
end
|
58
|
-
end
|
59
|
-
rescue => e
|
60
|
-
# we don't know what the class of headers is and the obj may not
|
61
|
-
# be able to accept a key/value assignment
|
62
|
-
# unfortunately I could not find a method to check for that
|
63
|
-
# therefore we're catching the error and don't change the headers
|
64
|
-
end
|
65
|
-
headers
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|