solarwinds_apm 5.1.9 → 6.0.0.preV2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +28 -55
  3. data/ext/oboe_metal/extconf.rb +37 -41
  4. data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.sha256 +1 -1
  5. data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.sha256 +1 -1
  6. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.sha256 +1 -1
  7. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.sha256 +1 -1
  8. data/ext/oboe_metal/src/VERSION +1 -1
  9. data/ext/oboe_metal/src/init_solarwinds_apm.cc +0 -6
  10. data/ext/oboe_metal/src/oboe_debug.h +1 -0
  11. data/lib/oboe_metal.rb +116 -80
  12. data/lib/rails/generators/solarwinds_apm/install_generator.rb +1 -5
  13. data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +42 -267
  14. data/lib/solarwinds_apm/api/current_trace_info.rb +148 -0
  15. data/lib/solarwinds_apm/api/tracing.rb +30 -0
  16. data/lib/solarwinds_apm/api/transaction_name.rb +58 -0
  17. data/lib/solarwinds_apm/api.rb +8 -15
  18. data/lib/solarwinds_apm/base.rb +4 -131
  19. data/lib/solarwinds_apm/config.rb +101 -174
  20. data/lib/solarwinds_apm/constants.rb +32 -0
  21. data/lib/solarwinds_apm/logger.rb +1 -1
  22. data/lib/solarwinds_apm/noop/context.rb +2 -5
  23. data/lib/solarwinds_apm/noop/metadata.rb +1 -2
  24. data/lib/solarwinds_apm/oboe_init_options.rb +74 -38
  25. data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +204 -0
  26. data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +166 -0
  27. data/lib/solarwinds_apm/opentelemetry/solarwinds_propagator.rb +92 -0
  28. data/lib/solarwinds_apm/opentelemetry/solarwinds_response_propagator.rb +72 -0
  29. data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +335 -0
  30. data/lib/solarwinds_apm/opentelemetry.rb +8 -0
  31. data/lib/solarwinds_apm/otel_config.rb +161 -0
  32. data/lib/solarwinds_apm/{inst → support}/logger_formatter.rb +5 -6
  33. data/lib/solarwinds_apm/{inst → support}/logging_log_event.rb +3 -6
  34. data/lib/solarwinds_apm/{inst → support}/lumberjack_formatter.rb +1 -4
  35. data/lib/solarwinds_apm/support/oboe_tracing_mode.rb +27 -0
  36. data/lib/solarwinds_apm/support/swomarginalia/LICENSE +20 -0
  37. data/lib/solarwinds_apm/support/swomarginalia/README.md +41 -0
  38. data/lib/solarwinds_apm/support/swomarginalia/comment.rb +205 -0
  39. data/lib/solarwinds_apm/support/swomarginalia/load_swomarginalia.rb +48 -0
  40. data/lib/solarwinds_apm/support/swomarginalia/railtie.rb +22 -0
  41. data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +86 -0
  42. data/lib/solarwinds_apm/support/transaction_cache.rb +24 -0
  43. data/lib/solarwinds_apm/support/transaction_settings.rb +26 -209
  44. data/lib/solarwinds_apm/support/transformer.rb +56 -0
  45. data/lib/solarwinds_apm/support/txn_name_manager.rb +25 -0
  46. data/lib/solarwinds_apm/support/x_trace_options.rb +42 -26
  47. data/lib/solarwinds_apm/support.rb +37 -10
  48. data/lib/solarwinds_apm/support_report.rb +10 -32
  49. data/lib/solarwinds_apm/thread_local.rb +1 -1
  50. data/lib/solarwinds_apm/version.rb +4 -4
  51. data/lib/solarwinds_apm.rb +29 -25
  52. metadata +63 -123
  53. data/.dockerignore +0 -5
  54. data/.gitignore +0 -58
  55. data/.rubocop.yml +0 -29
  56. data/.whitesource +0 -22
  57. data/.yardopts +0 -7
  58. data/CHANGELOG-appoptics.md +0 -766
  59. data/CHANGELOG.md +0 -82
  60. data/CONFIG.md +0 -31
  61. data/Gemfile +0 -15
  62. data/README.md +0 -385
  63. data/bin/solarwinds_apm_config +0 -15
  64. data/examples/prepend.rb +0 -13
  65. data/examples/sdk_examples.rb +0 -158
  66. data/ext/oboe_metal/README.md +0 -69
  67. data/ext/oboe_metal/extconf_local.rb +0 -75
  68. data/ext/oboe_metal/lib/.keep +0 -0
  69. data/ext/oboe_metal/noop/noop.c +0 -8
  70. data/ext/oboe_metal/src/README.md +0 -6
  71. data/ext/oboe_metal/src/frames.cc +0 -247
  72. data/ext/oboe_metal/src/frames.h +0 -40
  73. data/ext/oboe_metal/src/logging.cc +0 -97
  74. data/ext/oboe_metal/src/logging.h +0 -34
  75. data/ext/oboe_metal/src/profiling.cc +0 -435
  76. data/ext/oboe_metal/src/profiling.h +0 -78
  77. data/ext/oboe_metal/test/CMakeLists.txt +0 -53
  78. data/ext/oboe_metal/test/FindGMock.cmake +0 -43
  79. data/ext/oboe_metal/test/README.md +0 -56
  80. data/ext/oboe_metal/test/frames_test.cc +0 -164
  81. data/ext/oboe_metal/test/profiling_test.cc +0 -93
  82. data/ext/oboe_metal/test/ruby_inc_dir.rb +0 -8
  83. data/ext/oboe_metal/test/ruby_prefix.rb +0 -8
  84. data/ext/oboe_metal/test/ruby_test_helper.rb +0 -67
  85. data/ext/oboe_metal/test/test.h +0 -11
  86. data/ext/oboe_metal/test/test_main.cc +0 -32
  87. data/init.rb +0 -4
  88. data/lib/solarwinds_apm/api/layerinit.rb +0 -41
  89. data/lib/solarwinds_apm/api/logging.rb +0 -356
  90. data/lib/solarwinds_apm/api/memcache.rb +0 -37
  91. data/lib/solarwinds_apm/api/metrics.rb +0 -63
  92. data/lib/solarwinds_apm/api/util.rb +0 -98
  93. data/lib/solarwinds_apm/frameworks/grape.rb +0 -96
  94. data/lib/solarwinds_apm/frameworks/padrino.rb +0 -78
  95. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller.rb +0 -100
  96. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller5.rb +0 -50
  97. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller_api.rb +0 -50
  98. data/lib/solarwinds_apm/frameworks/rails/inst/action_view.rb +0 -88
  99. data/lib/solarwinds_apm/frameworks/rails/inst/active_record.rb +0 -26
  100. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +0 -29
  101. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +0 -22
  102. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +0 -103
  103. data/lib/solarwinds_apm/frameworks/rails/inst/logger_formatters.rb +0 -14
  104. data/lib/solarwinds_apm/frameworks/rails.rb +0 -100
  105. data/lib/solarwinds_apm/frameworks/sinatra.rb +0 -96
  106. data/lib/solarwinds_apm/inst/bunny-client.rb +0 -157
  107. data/lib/solarwinds_apm/inst/bunny-consumer.rb +0 -102
  108. data/lib/solarwinds_apm/inst/curb.rb +0 -289
  109. data/lib/solarwinds_apm/inst/dalli.rb +0 -89
  110. data/lib/solarwinds_apm/inst/delayed_job.rb +0 -100
  111. data/lib/solarwinds_apm/inst/excon.rb +0 -113
  112. data/lib/solarwinds_apm/inst/faraday.rb +0 -96
  113. data/lib/solarwinds_apm/inst/graphql.rb +0 -206
  114. data/lib/solarwinds_apm/inst/grpc_client.rb +0 -147
  115. data/lib/solarwinds_apm/inst/grpc_server.rb +0 -119
  116. data/lib/solarwinds_apm/inst/httpclient.rb +0 -182
  117. data/lib/solarwinds_apm/inst/memcached.rb +0 -86
  118. data/lib/solarwinds_apm/inst/mongo.rb +0 -246
  119. data/lib/solarwinds_apm/inst/mongo2.rb +0 -225
  120. data/lib/solarwinds_apm/inst/moped.rb +0 -466
  121. data/lib/solarwinds_apm/inst/net_http.rb +0 -60
  122. data/lib/solarwinds_apm/inst/rack.rb +0 -223
  123. data/lib/solarwinds_apm/inst/rack_cache.rb +0 -35
  124. data/lib/solarwinds_apm/inst/redis.rb +0 -280
  125. data/lib/solarwinds_apm/inst/redis_v4.rb +0 -273
  126. data/lib/solarwinds_apm/inst/resque.rb +0 -129
  127. data/lib/solarwinds_apm/inst/rest-client.rb +0 -43
  128. data/lib/solarwinds_apm/inst/sequel.rb +0 -241
  129. data/lib/solarwinds_apm/inst/sidekiq-client.rb +0 -63
  130. data/lib/solarwinds_apm/inst/sidekiq-worker.rb +0 -64
  131. data/lib/solarwinds_apm/inst/typhoeus.rb +0 -90
  132. data/lib/solarwinds_apm/instrumentation.rb +0 -22
  133. data/lib/solarwinds_apm/loading.rb +0 -65
  134. data/lib/solarwinds_apm/noop/profiling.rb +0 -21
  135. data/lib/solarwinds_apm/ruby.rb +0 -35
  136. data/lib/solarwinds_apm/sdk/current_trace_info.rb +0 -123
  137. data/lib/solarwinds_apm/sdk/custom_metrics.rb +0 -94
  138. data/lib/solarwinds_apm/sdk/logging.rb +0 -37
  139. data/lib/solarwinds_apm/sdk/trace_context_headers.rb +0 -69
  140. data/lib/solarwinds_apm/sdk/tracing.rb +0 -432
  141. data/lib/solarwinds_apm/support/profiling.rb +0 -25
  142. data/lib/solarwinds_apm/support/trace_context.rb +0 -53
  143. data/lib/solarwinds_apm/support/trace_state.rb +0 -69
  144. data/lib/solarwinds_apm/support/trace_string.rb +0 -89
  145. data/lib/solarwinds_apm/support/transaction_metrics.rb +0 -67
  146. data/lib/solarwinds_apm/test.rb +0 -165
  147. data/lib/solarwinds_apm/util.rb +0 -426
  148. data/log/.keep +0 -0
  149. data/log/postgresql/.keep +0 -0
  150. data/solarwinds_apm.gemspec +0 -55
  151. 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
@@ -1,21 +0,0 @@
1
- module SolarWindsAPM
2
-
3
- # override the Ruby method, so that no code related to profiling gets executed
4
- class Profiling
5
-
6
- def self.run
7
- yield
8
- end
9
- end
10
-
11
- # these put the c-functions into "noop"
12
- module CProfiler
13
- def self.set_interval(_)
14
- # do nothing
15
- end
16
-
17
- def self.get_tid
18
- return 0
19
- end
20
- end
21
- end
@@ -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