solarwinds_apm 5.1.8 → 6.0.0.preV1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -1
  3. data/ext/oboe_metal/extconf.rb +19 -23
  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/oboe_api.cpp +9 -7
  10. data/ext/oboe_metal/src/oboe_api.h +7 -7
  11. data/ext/oboe_metal/src/oboe_debug.h +2 -0
  12. data/ext/oboe_metal/src/oboe_swig_wrap.cc +19 -18
  13. data/lib/oboe_metal.rb +116 -80
  14. data/lib/rails/generators/solarwinds_apm/install_generator.rb +1 -2
  15. data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +44 -260
  16. data/lib/solarwinds_apm/api/current_trace_info.rb +148 -0
  17. data/lib/solarwinds_apm/api/tracing.rb +30 -0
  18. data/lib/solarwinds_apm/api/transaction_name.rb +57 -0
  19. data/lib/solarwinds_apm/api.rb +8 -15
  20. data/lib/solarwinds_apm/base.rb +4 -131
  21. data/lib/solarwinds_apm/config.rb +128 -175
  22. data/lib/solarwinds_apm/constants.rb +32 -0
  23. data/lib/solarwinds_apm/logger.rb +1 -1
  24. data/lib/solarwinds_apm/noop/context.rb +2 -5
  25. data/lib/solarwinds_apm/noop/metadata.rb +1 -2
  26. data/lib/solarwinds_apm/noop/profiling.rb +3 -7
  27. data/lib/solarwinds_apm/oboe_init_options.rb +71 -33
  28. data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +204 -0
  29. data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +163 -0
  30. data/lib/solarwinds_apm/opentelemetry/solarwinds_propagator.rb +92 -0
  31. data/lib/solarwinds_apm/opentelemetry/solarwinds_response_propagator.rb +72 -0
  32. data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +330 -0
  33. data/lib/solarwinds_apm/opentelemetry.rb +8 -0
  34. data/lib/solarwinds_apm/otel_config.rb +161 -0
  35. data/lib/solarwinds_apm/{inst → support}/logger_formatter.rb +5 -6
  36. data/lib/solarwinds_apm/{inst → support}/logging_log_event.rb +3 -6
  37. data/lib/solarwinds_apm/{inst → support}/lumberjack_formatter.rb +1 -4
  38. data/lib/solarwinds_apm/support/oboe_tracing_mode.rb +27 -0
  39. data/lib/solarwinds_apm/support/swomarginalia/LICENSE +20 -0
  40. data/lib/solarwinds_apm/support/swomarginalia/README.md +41 -0
  41. data/lib/solarwinds_apm/support/swomarginalia/comment.rb +205 -0
  42. data/lib/solarwinds_apm/support/swomarginalia/load_swomarginalia.rb +48 -0
  43. data/lib/solarwinds_apm/support/swomarginalia/railtie.rb +22 -0
  44. data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +86 -0
  45. data/lib/solarwinds_apm/support/transaction_cache.rb +24 -0
  46. data/lib/solarwinds_apm/support/transaction_settings.rb +26 -209
  47. data/lib/solarwinds_apm/support/transformer.rb +56 -0
  48. data/lib/solarwinds_apm/support/txn_name_manager.rb +25 -0
  49. data/lib/solarwinds_apm/support/x_trace_options.rb +42 -26
  50. data/lib/solarwinds_apm/support.rb +33 -10
  51. data/lib/solarwinds_apm/support_report.rb +10 -32
  52. data/lib/solarwinds_apm/thread_local.rb +1 -1
  53. data/lib/solarwinds_apm/version.rb +4 -4
  54. data/lib/solarwinds_apm.rb +31 -26
  55. metadata +76 -121
  56. data/.dockerignore +0 -5
  57. data/.gitignore +0 -58
  58. data/.rubocop.yml +0 -29
  59. data/.whitesource +0 -22
  60. data/.yardopts +0 -7
  61. data/CHANGELOG-appoptics.md +0 -766
  62. data/CHANGELOG.md +0 -72
  63. data/CONFIG.md +0 -31
  64. data/Gemfile +0 -15
  65. data/README.md +0 -385
  66. data/bin/solarwinds_apm_config +0 -15
  67. data/examples/prepend.rb +0 -13
  68. data/examples/sdk_examples.rb +0 -158
  69. data/ext/oboe_metal/README.md +0 -69
  70. data/ext/oboe_metal/extconf_local.rb +0 -75
  71. data/ext/oboe_metal/lib/.keep +0 -0
  72. data/ext/oboe_metal/noop/noop.c +0 -8
  73. data/ext/oboe_metal/src/README.md +0 -6
  74. data/ext/oboe_metal/src/frames.cc +0 -247
  75. data/ext/oboe_metal/src/frames.h +0 -40
  76. data/ext/oboe_metal/src/logging.cc +0 -97
  77. data/ext/oboe_metal/src/logging.h +0 -34
  78. data/ext/oboe_metal/src/profiling.cc +0 -435
  79. data/ext/oboe_metal/src/profiling.h +0 -78
  80. data/ext/oboe_metal/test/CMakeLists.txt +0 -53
  81. data/ext/oboe_metal/test/FindGMock.cmake +0 -43
  82. data/ext/oboe_metal/test/README.md +0 -56
  83. data/ext/oboe_metal/test/frames_test.cc +0 -164
  84. data/ext/oboe_metal/test/profiling_test.cc +0 -93
  85. data/ext/oboe_metal/test/ruby_inc_dir.rb +0 -8
  86. data/ext/oboe_metal/test/ruby_prefix.rb +0 -8
  87. data/ext/oboe_metal/test/ruby_test_helper.rb +0 -67
  88. data/ext/oboe_metal/test/test.h +0 -11
  89. data/ext/oboe_metal/test/test_main.cc +0 -32
  90. data/init.rb +0 -4
  91. data/lib/solarwinds_apm/api/layerinit.rb +0 -41
  92. data/lib/solarwinds_apm/api/logging.rb +0 -356
  93. data/lib/solarwinds_apm/api/memcache.rb +0 -37
  94. data/lib/solarwinds_apm/api/metrics.rb +0 -63
  95. data/lib/solarwinds_apm/api/util.rb +0 -98
  96. data/lib/solarwinds_apm/frameworks/grape.rb +0 -96
  97. data/lib/solarwinds_apm/frameworks/padrino.rb +0 -78
  98. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller.rb +0 -100
  99. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller5.rb +0 -50
  100. data/lib/solarwinds_apm/frameworks/rails/inst/action_controller_api.rb +0 -50
  101. data/lib/solarwinds_apm/frameworks/rails/inst/action_view.rb +0 -88
  102. data/lib/solarwinds_apm/frameworks/rails/inst/active_record.rb +0 -26
  103. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/mysql2.rb +0 -29
  104. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/postgresql.rb +0 -22
  105. data/lib/solarwinds_apm/frameworks/rails/inst/connection_adapters/utils5x.rb +0 -103
  106. data/lib/solarwinds_apm/frameworks/rails/inst/logger_formatters.rb +0 -14
  107. data/lib/solarwinds_apm/frameworks/rails.rb +0 -100
  108. data/lib/solarwinds_apm/frameworks/sinatra.rb +0 -96
  109. data/lib/solarwinds_apm/inst/bunny-client.rb +0 -157
  110. data/lib/solarwinds_apm/inst/bunny-consumer.rb +0 -102
  111. data/lib/solarwinds_apm/inst/curb.rb +0 -289
  112. data/lib/solarwinds_apm/inst/dalli.rb +0 -89
  113. data/lib/solarwinds_apm/inst/delayed_job.rb +0 -100
  114. data/lib/solarwinds_apm/inst/excon.rb +0 -113
  115. data/lib/solarwinds_apm/inst/faraday.rb +0 -96
  116. data/lib/solarwinds_apm/inst/graphql.rb +0 -206
  117. data/lib/solarwinds_apm/inst/grpc_client.rb +0 -147
  118. data/lib/solarwinds_apm/inst/grpc_server.rb +0 -119
  119. data/lib/solarwinds_apm/inst/httpclient.rb +0 -182
  120. data/lib/solarwinds_apm/inst/memcached.rb +0 -86
  121. data/lib/solarwinds_apm/inst/mongo.rb +0 -246
  122. data/lib/solarwinds_apm/inst/mongo2.rb +0 -225
  123. data/lib/solarwinds_apm/inst/moped.rb +0 -466
  124. data/lib/solarwinds_apm/inst/net_http.rb +0 -60
  125. data/lib/solarwinds_apm/inst/rack.rb +0 -223
  126. data/lib/solarwinds_apm/inst/rack_cache.rb +0 -35
  127. data/lib/solarwinds_apm/inst/redis.rb +0 -280
  128. data/lib/solarwinds_apm/inst/redis_v4.rb +0 -273
  129. data/lib/solarwinds_apm/inst/resque.rb +0 -129
  130. data/lib/solarwinds_apm/inst/rest-client.rb +0 -43
  131. data/lib/solarwinds_apm/inst/sequel.rb +0 -241
  132. data/lib/solarwinds_apm/inst/sidekiq-client.rb +0 -63
  133. data/lib/solarwinds_apm/inst/sidekiq-worker.rb +0 -64
  134. data/lib/solarwinds_apm/inst/typhoeus.rb +0 -90
  135. data/lib/solarwinds_apm/instrumentation.rb +0 -22
  136. data/lib/solarwinds_apm/loading.rb +0 -65
  137. data/lib/solarwinds_apm/ruby.rb +0 -35
  138. data/lib/solarwinds_apm/sdk/current_trace_info.rb +0 -123
  139. data/lib/solarwinds_apm/sdk/custom_metrics.rb +0 -94
  140. data/lib/solarwinds_apm/sdk/logging.rb +0 -37
  141. data/lib/solarwinds_apm/sdk/trace_context_headers.rb +0 -69
  142. data/lib/solarwinds_apm/sdk/tracing.rb +0 -432
  143. data/lib/solarwinds_apm/support/profiling.rb +0 -25
  144. data/lib/solarwinds_apm/support/trace_context.rb +0 -53
  145. data/lib/solarwinds_apm/support/trace_state.rb +0 -69
  146. data/lib/solarwinds_apm/support/trace_string.rb +0 -89
  147. data/lib/solarwinds_apm/support/transaction_metrics.rb +0 -67
  148. data/lib/solarwinds_apm/test.rb +0 -165
  149. data/lib/solarwinds_apm/util.rb +0 -426
  150. data/log/.keep +0 -0
  151. data/log/postgresql/.keep +0 -0
  152. data/solarwinds_apm.gemspec +0 -55
  153. data/yardoc_frontpage.md +0 -24
@@ -1,96 +0,0 @@
1
- # Copyright (c) 2016 SolarWinds, LLC.
2
- # All rights reserved.
3
-
4
- module SolarWindsAPM
5
- module Sinatra
6
- module Base
7
- def self.included(klass)
8
- SolarWindsAPM::Util.method_alias(klass, :dispatch!, ::Sinatra::Base)
9
- SolarWindsAPM::Util.method_alias(klass, :handle_exception!, ::Sinatra::Base)
10
- end
11
-
12
- def dispatch_with_sw_apm
13
-
14
- SolarWindsAPM::API.log_entry('sinatra', {})
15
-
16
- response = dispatch_without_sw_apm
17
-
18
- # Report Controller/Action and transaction as best possible
19
- report_kvs = {}
20
- report_kvs[:Controller] = self.class
21
- report_kvs[:Action] = env['sinatra.route']
22
- env['solarwinds_apm.controller'] = report_kvs[:Controller]
23
- env['solarwinds_apm.action'] = report_kvs[:Action]
24
-
25
- response
26
- rescue => e
27
- SolarWindsAPM::API.log_exception('sinatra', e)
28
- raise e
29
- ensure
30
- report_kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:sinatra][:collect_backtraces]
31
- SolarWindsAPM::API.log_exit('sinatra', report_kvs)
32
- end
33
-
34
- def handle_exception_with_sw_apm(boom)
35
- SolarWindsAPM::API.log_exception(:sinatra, boom)
36
- handle_exception_without_sw_apm(boom)
37
- end
38
-
39
- def sw_apm_rum_header
40
- SolarWindsAPM.logger.warn '[solarwinds_apm/warn] Note that sw_apm_rum_header is deprecated. It is now a no-op and should be removed from your application code.'
41
- return ''
42
- end
43
- alias_method :oboe_rum_header, :sw_apm_rum_header
44
-
45
- def sw_apm_rum_footer
46
- SolarWindsAPM.logger.warn '[solarwinds_apm/warn] Note that sw_apm_rum_footer is deprecated. It is now a no-op and should be removed from your application code.'
47
- return ''
48
- end
49
- alias_method :oboe_rum_footer, :sw_apm_rum_footer
50
- end
51
-
52
- module Templates
53
- def self.included(klass)
54
- SolarWindsAPM::Util.method_alias(klass, :render, ::Sinatra::Templates)
55
- end
56
-
57
- def render_with_sw_apm(engine, data, options = {}, locals = {}, &block)
58
- if SolarWindsAPM.tracing?
59
- report_kvs = {}
60
-
61
- report_kvs[:engine] = engine
62
- report_kvs[:template] = data
63
-
64
- SolarWindsAPM::SDK.trace(:sinatra_render, kvs: report_kvs, protect_op: :sinatra_render) do
65
- report_kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:sinatra][:collect_backtraces]
66
- render_without_sw_apm(engine, data, options, locals, &block)
67
- end
68
- else
69
- render_without_sw_apm(engine, data, options, locals, &block)
70
- end
71
- end
72
- end
73
- end
74
- end
75
-
76
- if defined?(Sinatra) && SolarWindsAPM::Config[:sinatra][:enabled]
77
- require 'solarwinds_apm/inst/rack'
78
-
79
- SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting Sinatra' if SolarWindsAPM::Config[:verbose]
80
-
81
- SolarWindsAPM::Inst.load_instrumentation
82
-
83
- Sinatra::Base.use SolarWindsAPM::Rack
84
-
85
- # When in the gem TEST environment, we load this instrumentation regardless.
86
- # Otherwise, only when Padrino isn't around.
87
- unless defined?(Padrino) && !ENV.key?('SW_APM_GEM_TEST')
88
- # Padrino has 'enhanced' routes and rendering so the Sinatra
89
- # instrumentation won't work anyways. Only load for pure Sinatra apps.
90
- SolarWindsAPM::Util.send_include(Sinatra::Base, SolarWindsAPM::Sinatra::Base)
91
- SolarWindsAPM::Util.send_include(Sinatra::Templates, SolarWindsAPM::Sinatra::Templates)
92
-
93
- # Report __Init after fork when in Heroku
94
- SolarWindsAPM::API.report_init unless SolarWindsAPM.heroku?
95
- end
96
- end
@@ -1,157 +0,0 @@
1
- # Copyright (c) 2016 SolarWinds, LLC.
2
- # All rights reserved.
3
-
4
- module SolarWindsAPM
5
- module Inst
6
- module BunnyExchange
7
- include SolarWindsAPM::SDK::TraceContextHeaders
8
-
9
- def self.included(klass)
10
- SolarWindsAPM::Util.method_alias(klass, :delete, ::Bunny::Exchange)
11
- end
12
-
13
- def delete_with_sw_apm(opts = {})
14
- # If we're not tracing, just do a fast return.
15
- return delete_without_sw_apm(opts) if !SolarWindsAPM.tracing?
16
-
17
- begin
18
- kvs = {}
19
- kvs[:Spec] = :pushq
20
- kvs[:Flavor] = :rabbitmq
21
- kvs[:Op] = :delete
22
- kvs[:ExchangeType] = @type
23
- kvs[:RemoteHost] = channel.connection.host
24
- kvs[:RemotePort] = channel.connection.port.to_i
25
- kvs[:VirtualHost] = channel.connection.vhost
26
-
27
- if @name.is_a?(String) && !@name.empty?
28
- kvs[:ExchangeName] = @name
29
- else
30
- kvs[:ExchangeName] = :default
31
- end
32
-
33
- SolarWindsAPM::API.log_entry(:'rabbitmq-client')
34
- delete_without_sw_apm(opts)
35
- rescue => e
36
- SolarWindsAPM::API.log_exception(:'rabbitmq-client', e)
37
- raise e
38
- ensure
39
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:bunnyclient][:collect_backtraces]
40
- SolarWindsAPM::API.log_exit(:'rabbitmq-client', kvs)
41
- end
42
- end
43
- end
44
-
45
- module BunnyChannel
46
- include SolarWindsAPM::SDK::TraceContextHeaders
47
-
48
- def self.included(klass)
49
- SolarWindsAPM::Util.method_alias(klass, :basic_publish, ::Bunny::Channel)
50
- SolarWindsAPM::Util.method_alias(klass, :queue, ::Bunny::Channel)
51
- SolarWindsAPM::Util.method_alias(klass, :wait_for_confirms, ::Bunny::Channel)
52
- end
53
-
54
- def collect_channel_kvs
55
- kvs = {}
56
- kvs[:Spec] = :pushq
57
- kvs[:Flavor] = :rabbitmq
58
- kvs[:RemoteHost] = @connection.host
59
- kvs[:RemotePort] = @connection.port.to_i
60
- kvs[:VirtualHost] = @connection.vhost
61
- kvs
62
- rescue => e
63
- SolarWindsAPM.logger.debug "[solarwinds_apm/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if SolarWindsAPM::Config[:verbose]
64
- ensure
65
- return kvs
66
- end
67
-
68
- def basic_publish_with_sw_apm(payload, exchange, routing_key, opts = {})
69
- # If we're not tracing, just do a fast return.
70
- return basic_publish_without_sw_apm(payload, exchange, routing_key, opts) if !SolarWindsAPM.tracing?
71
-
72
- begin
73
- kvs = collect_channel_kvs
74
-
75
- if exchange.respond_to?(:name)
76
- kvs[:ExchangeName] = exchange.name
77
- elsif exchange.respond_to?(:empty?) && !exchange.empty?
78
- kvs[:ExchangeName] = exchange
79
- else
80
- kvs[:ExchangeName] = :default
81
- end
82
-
83
- kvs[:Queue] = opts[:queue] if opts.key?(:queue)
84
- kvs[:RoutingKey] = routing_key if routing_key
85
- kvs[:Op] = :publish
86
-
87
- SolarWindsAPM::API.log_entry(:'rabbitmq-client')
88
- # Pass the tracing context as a header
89
- opts[:headers] ||= {}
90
- opts[:headers][:SourceTrace] = SolarWindsAPM::Context.toString
91
- add_tracecontext_headers(opts[:headers])
92
-
93
- basic_publish_without_sw_apm(payload, exchange, routing_key, opts)
94
- rescue => e
95
- SolarWindsAPM::API.log_exception(:'rabbitmq-client', e)
96
- raise e
97
- ensure
98
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:bunnyclient][:collect_backtraces]
99
- SolarWindsAPM::API.log_exit(:'rabbitmq-client', kvs)
100
- end
101
- end
102
-
103
- def queue_with_sw_apm(name = AMQ::Protocol::EMPTY_STRING, opts = {})
104
- # If we're not tracing, just do a fast return.
105
- return queue_without_sw_apm(name, opts) if !SolarWindsAPM.tracing?
106
-
107
- begin
108
- kvs = collect_channel_kvs
109
- kvs[:Op] = :queue
110
-
111
- SolarWindsAPM::API.log_entry(:'rabbitmq-client')
112
- opts[:headers] ||= {}
113
- add_tracecontext_headers(opts[:headers])
114
-
115
- result = queue_without_sw_apm(name, opts)
116
- kvs[:Queue] = result.name
117
- result
118
- rescue => e
119
- SolarWindsAPM::API.log_exception(:'rabbitmq-client', e)
120
- raise e
121
- ensure
122
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:bunnyclient][:collect_backtraces]
123
- SolarWindsAPM::API.log_exit(:'rabbitmq-client', kvs)
124
- end
125
- end
126
-
127
- def wait_for_confirms_with_sw_apm
128
- # If we're not tracing, just do a fast return.
129
- return wait_for_confirms_without_sw_apm if !SolarWindsAPM.tracing?
130
-
131
- begin
132
- kvs = collect_channel_kvs
133
- kvs[:Op] = :wait_for_confirms
134
-
135
- SolarWindsAPM::API.log_entry(:'rabbitmq-client')
136
- # can't continue trace for wait on consumer, because we can't send opts for wait
137
- # Seems ok, since this is waiting client side
138
- # and not actually spending time on the consumer
139
-
140
- wait_for_confirms_without_sw_apm
141
- rescue => e
142
- SolarWindsAPM::API.log_exception(:'rabbitmq-client', e)
143
- raise e
144
- ensure
145
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:bunnyclient][:collect_backtraces]
146
- SolarWindsAPM::API.log_exit(:'rabbitmq-client', kvs)
147
- end
148
- end
149
- end
150
- end
151
- end
152
-
153
- if defined?(Bunny) && SolarWindsAPM::Config[:bunnyclient][:enabled]
154
- SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting bunny client' if SolarWindsAPM::Config[:verbose]
155
- SolarWindsAPM::Util.send_include(Bunny::Exchange, SolarWindsAPM::Inst::BunnyExchange)
156
- SolarWindsAPM::Util.send_include(Bunny::Channel, SolarWindsAPM::Inst::BunnyChannel)
157
- end
@@ -1,102 +0,0 @@
1
- # Copyright (c) 2016 SolarWinds, LLC.
2
- # All rights reserved.
3
-
4
- module SolarWindsAPM
5
- module Inst
6
- module BunnyConsumer
7
- include SolarWindsAPM::SDK::TraceContextHeaders
8
-
9
- def self.included(klass)
10
- SolarWindsAPM::Util.method_alias(klass, :call, ::Bunny::Consumer)
11
- end
12
-
13
- def collect_consumer_kvs(args)
14
- kvs = {}
15
- kvs[:Spec] = :job
16
- kvs[:Flavor] = :rabbitmq
17
- kvs[:RemoteHost] = @channel.connection.host
18
- kvs[:RemotePort] = @channel.connection.port.to_i
19
- kvs[:VirtualHost] = @channel.connection.vhost
20
-
21
- mp = args[1]
22
- kvs[:RoutingKey] = args[0].routing_key if args[0].routing_key
23
- kvs[:MsgID] = args[1].message_id if mp.message_id
24
- kvs[:AppID] = args[1].app_id if mp.app_id
25
- kvs[:Priority] = args[1].priority if mp.priority
26
-
27
- if @queue.respond_to?(:name)
28
- kvs[:Queue] = @queue.name
29
- else
30
- kvs[:Queue] = @queue
31
- end
32
-
33
- # Report configurable Controller/Action KVs
34
- # See SolarWindsAPM::Config[:bunnyconsumer] in lib/solarwinds_apm/config.rb
35
- # Used for dashboard trace filtering
36
- controller_key = SolarWindsAPM::Config[:bunnyconsumer][:controller]
37
- if mp.respond_to?(controller_key)
38
- value = mp.method(controller_key).call
39
- kvs[:Controller] = value if value
40
- end
41
-
42
- action_key = SolarWindsAPM::Config[:bunnyconsumer][:action]
43
- if mp.respond_to?(action_key)
44
- value = mp.method(action_key).call
45
- kvs[:Action] = value if value
46
- end
47
-
48
- if kvs[:Queue]
49
- kvs[:URL] = "/bunny/#{kvs[:Queue]}"
50
- else
51
- kvs[:URL] = "/bunny/consumer"
52
- end
53
-
54
- if SolarWindsAPM::Config[:bunnyconsumer][:log_args] && @arguments
55
- kvs[:Args] = @arguments.to_s
56
- end
57
-
58
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:bunnyconsumer][:collect_backtraces]
59
-
60
- kvs
61
- rescue => e
62
- SolarWindsAPM.logger.debug "[solarwinds_apm/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" if SolarWindsAPM::Config[:verbose]
63
- ensure
64
- return kvs
65
- end
66
-
67
- def call_with_sw_apm(*args)
68
- report_kvs = collect_consumer_kvs(args)
69
-
70
- # TODO all of this (to the next empty line) can be removed
71
- # once all of our agents (actually only Node) use w3c-header for RabbitMQ
72
- # w3c headers are read and added by the logging code
73
- # If SourceTrace was passed:
74
- # - capture it, report it
75
- # - and add it as traceparent and tracestate header for use by start_trace
76
- headers = args[1][:headers]
77
- if headers && headers['SourceTrace']
78
- report_kvs[:SourceTrace] = headers['SourceTrace']
79
- # Remove SourceTrace
80
- headers.delete('SourceTrace')
81
- unless headers['traceparent'] && headers['tracestate']
82
- add_tracecontext_headers(headers)
83
- end
84
- end
85
-
86
- # the context either gets propagated via w3c headers
87
- # or a new one should be started
88
- # lets clear any context that may exist
89
- # TODO revert with NH-11132
90
- SolarWindsAPM::Context.clear
91
- SolarWindsAPM::SDK.start_trace(:'rabbitmq-consumer', kvs: report_kvs, headers: headers) do
92
- call_without_sw_apm(*args)
93
- end
94
- end
95
- end
96
- end
97
- end
98
-
99
- if SolarWindsAPM::Config[:bunnyconsumer][:enabled] && defined?(Bunny)
100
- SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting bunny consumer' if SolarWindsAPM::Config[:verbose]
101
- SolarWindsAPM::Util.send_include(Bunny::Consumer, SolarWindsAPM::Inst::BunnyConsumer)
102
- end
@@ -1,289 +0,0 @@
1
- # Copyright (c) 2016 SolarWinds, LLC.
2
- # All rights reserved.
3
-
4
- module SolarWindsAPM
5
- module Inst
6
-
7
- # Curb instrumentation wraps instance and class methods in two classes:
8
- # Curl::Easy and Curl::Multi. This CurlUtility module is used as a common module
9
- # to be shared among both modules.
10
- module CurlUtility
11
- include SolarWindsAPM::SDK::TraceContextHeaders
12
-
13
- private
14
- ##
15
- # sw_apm_collect
16
- #
17
- # Used as a central area to retrieve and return values
18
- # that we're interesting in reporting to SolarWindsAPM
19
- #
20
- def sw_apm_collect(verb = nil)
21
- kvs = {}
22
-
23
- kvs[:Spec] = 'rsc'
24
- kvs[:IsService] = 1
25
-
26
- # Conditionally log query args
27
- if SolarWindsAPM::Config[:curb][:log_args]
28
- kvs[:RemoteURL] = url
29
- else
30
- kvs[:RemoteURL] = url.split('?').first
31
- end
32
-
33
- kvs[:RemoteURL] = SolarWindsAPM::Util.sanitize_uri(kvs[:RemoteURL])
34
- kvs[:HTTPMethod] = verb if verb
35
-
36
- kvs
37
- rescue => e
38
- SolarWindsAPM.logger.debug "[solarwinds_apm/debug] Error capturing curb KVs: #{e.message}"
39
- if SolarWindsAPM::Config[:verbose]
40
- SolarWindsAPM.logger.debug "[solarwinds_apm/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
41
- SolarWindsAPM.logger.debug e.backtrace.join('\n')
42
- end
43
- ensure
44
- return kvs
45
- end
46
-
47
- ##
48
- # trace_curb_method
49
- #
50
- # An agnostic method that will profile any Curl::Easy method (and optional args and block)
51
- # that you throw at it.
52
- #
53
- def trace_curb_method(kvs, method, args, &block)
54
- # If we're not tracing, just do a fast return.
55
- unless SolarWindsAPM.tracing?
56
- add_tracecontext_headers(self.headers)
57
- return self.send(method, args, &block)
58
- end
59
-
60
- begin
61
- kvs.merge! sw_apm_collect
62
-
63
- SolarWindsAPM::API.log_entry(:curb, kvs)
64
- kvs.clear
65
-
66
- # The core curb call
67
- add_tracecontext_headers(self.headers)
68
- response = self.send(method, *args, &block)
69
-
70
- kvs[:HTTPStatus] = response_code
71
-
72
- # If we get a redirect, report the location header
73
- if ((300..308).to_a.include? response_code) && headers.key?("Location")
74
- kvs[:Location] = headers["Location"]
75
- end
76
-
77
- response
78
- rescue => e
79
- SolarWindsAPM::API.log_exception(:curb, e)
80
- raise e
81
- ensure
82
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:curb][:collect_backtraces]
83
- SolarWindsAPM::API.log_exit(:curb, kvs)
84
- end
85
- end
86
-
87
- end # CurlUtility
88
-
89
- # Instrumentation specific to ::Curl::Easy
90
- module CurlEasy
91
- # Common methods
92
- include SolarWindsAPM::Inst::CurlUtility
93
-
94
- def self.included(klass)
95
- SolarWindsAPM::Util.method_alias(klass, :http, ::Curl::Easy)
96
- SolarWindsAPM::Util.method_alias(klass, :perform, ::Curl::Easy)
97
- SolarWindsAPM::Util.method_alias(klass, :http_put, ::Curl::Easy)
98
- SolarWindsAPM::Util.method_alias(klass, :http_post, ::Curl::Easy)
99
- end
100
-
101
- ##
102
- # http_post_with_sw_apm
103
- #
104
- # ::Curl::Easy.new.http_post wrapper
105
- #
106
- def http_post_with_sw_apm(*args, &block)
107
- # If we're not tracing, just do a fast return.
108
- if !SolarWindsAPM.tracing? || SolarWindsAPM.tracing_layer?(:curb)
109
- add_tracecontext_headers(self.headers)
110
- return http_post_without_sw_apm(*args)
111
- end
112
-
113
- kvs = {}
114
- kvs[:HTTPMethod] = :POST
115
-
116
- trace_curb_method(kvs, :http_post_without_sw_apm, args, &block)
117
- end
118
-
119
- ##
120
- # http_put_with_sw_apm
121
- #
122
- # ::Curl::Easy.new.http_put wrapper
123
- #
124
- def http_put_with_sw_apm(*args, &block)
125
- # If we're not tracing, just do a fast return.
126
- if !SolarWindsAPM.tracing? || SolarWindsAPM.tracing_layer?(:curb)
127
- add_tracecontext_headers(self.headers)
128
- return http_put_without_sw_apm(data)
129
- end
130
-
131
- kvs = {}
132
- kvs[:HTTPMethod] = :PUT
133
-
134
- trace_curb_method(kvs, :http_put_without_sw_apm, args, &block)
135
- end
136
-
137
- ##
138
- # perform_with_sw_apm
139
- #
140
- # ::Curl::Easy.new.perform wrapper
141
- #
142
- def perform_with_sw_apm(&block)
143
- # If we're not tracing, just do a fast return.
144
- # excluding curb layer: because the curb C code for easy.http calls perform,
145
- # we have to make sure we don't log again
146
- if !SolarWindsAPM.tracing? || SolarWindsAPM.tracing_layer?(:curb)
147
- add_tracecontext_headers(self.headers)
148
- return perform_without_sw_apm(&block)
149
- end
150
-
151
- kvs = {}
152
- # This perform gets called from two places, ::Curl::Easy.new.perform
153
- # and Curl::Easy.new.http_head. In the case of http_head we detect the
154
- # HTTP verb via get info.
155
- if self.getinfo(self.sym2curl(:nobody))
156
- kvs[:HTTPMethod] = :HEAD
157
- else
158
- kvs[:HTTPMethod] = :GET
159
- end
160
-
161
- trace_curb_method(kvs, :perform_without_sw_apm, nil, &block)
162
- end
163
-
164
- ##
165
- # http_with_sw_apm
166
- #
167
- # ::Curl::Easy.new.http wrapper
168
- #
169
- def http_with_sw_apm(verb, &block)
170
- unless SolarWindsAPM.tracing?
171
- add_tracecontext_headers(self.headers)
172
- # If we're not tracing, just do a fast return.
173
- return http_without_sw_apm(verb)
174
- end
175
-
176
- kvs = {}
177
- kvs[:HTTPMethod] = verb
178
-
179
- trace_curb_method(kvs, :http_without_sw_apm, [verb], &block)
180
- end
181
- end
182
-
183
- ##
184
- # CurlMultiCM
185
- #
186
- # This module contains the class method wrappers for the CurlMulti class.
187
- # This module should be _extended_ by CurlMulti.
188
- #
189
- module CurlMultiCM
190
- include SolarWindsAPM::Inst::CurlUtility
191
-
192
- def self.extended(klass)
193
- SolarWindsAPM::Util.class_method_alias(klass, :http, ::Curl::Multi)
194
- end
195
-
196
- ##
197
- # http_with_sw_apm
198
- #
199
- # ::Curl::Multi.new.http wrapper
200
- #
201
- def http_with_sw_apm(urls_with_config, multi_options={}, &block)
202
- # If we're not tracing, just do a fast return.
203
- unless SolarWindsAPM.tracing?
204
- urls_with_config.each do |conf|
205
- conf[:headers] ||= {}
206
- add_tracecontext_headers(conf[:headers])
207
- end
208
- return http_without_sw_apm(urls_with_config, multi_options, &block)
209
- end
210
-
211
- begin
212
- kvs = {}
213
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:curb][:collect_backtraces]
214
-
215
- SolarWindsAPM::API.log_entry(:curb_multi, kvs)
216
- context = SolarWindsAPM::Context.toString
217
-
218
- traces = []
219
- urls_with_config.each do |conf|
220
- conf[:headers] ||= {}
221
- add_tracecontext_headers(conf[:headers])
222
- end
223
- # The core curb call
224
- http_without_sw_apm(urls_with_config, multi_options)
225
- rescue => e
226
- SolarWindsAPM::API.log_exception(:curb_multi, e)
227
- raise e
228
- ensure
229
- SolarWindsAPM::API.log_exit(:curb_multi)
230
- end
231
- end
232
- end
233
-
234
- ##
235
- # CurlMultiIM
236
- #
237
- # This module contains the instance method wrappers for the CurlMulti class.
238
- # This module should be _included_ into CurlMulti.
239
- #
240
- module CurlMultiIM
241
- include SolarWindsAPM::Inst::CurlUtility
242
-
243
- def self.included(klass)
244
- SolarWindsAPM::Util.method_alias(klass, :perform, ::Curl::Multi)
245
- end
246
-
247
- ##
248
- # perform_with_sw_apm
249
- #
250
- # ::Curl::Multi.new.perform wrapper
251
- #
252
- # the reason we instrument this method is because it can be called directly,
253
- # therefore we exclude calls that already have a curb layer assigned
254
- # Be aware: this method is also called from the c-implementation
255
- #
256
- def perform_with_sw_apm(&block)
257
- self.requests.each do |request|
258
- request = request[1] if request.is_a?(Array)
259
- add_tracecontext_headers(request.headers)
260
- end
261
- # If we're not tracing or we're already tracing curb, just do a fast return.
262
- if !SolarWindsAPM.tracing? || [:curb, :curb_multi].include?(SolarWindsAPM.layer)
263
- return perform_without_sw_apm(&block)
264
- end
265
-
266
- begin
267
- kvs = {}
268
- kvs[:Backtrace] = SolarWindsAPM::API.backtrace if SolarWindsAPM::Config[:curb][:collect_backtraces]
269
-
270
- SolarWindsAPM::API.log_entry(:curb_multi, kvs)
271
-
272
- perform_without_sw_apm(&block)
273
- rescue => e
274
- SolarWindsAPM::API.log_exception(:curb_multi, e)
275
- raise e
276
- ensure
277
- SolarWindsAPM::API.log_exit(:curb_multi)
278
- end
279
- end
280
- end
281
- end
282
- end
283
-
284
- if SolarWindsAPM::Config[:curb][:enabled] && defined?(::Curl)
285
- SolarWindsAPM.logger.info '[solarwinds_apm/loading] Instrumenting curb' if SolarWindsAPM::Config[:verbose]
286
- SolarWindsAPM::Util.send_include(::Curl::Easy, SolarWindsAPM::Inst::CurlEasy)
287
- SolarWindsAPM::Util.send_extend(::Curl::Multi, SolarWindsAPM::Inst::CurlMultiCM)
288
- SolarWindsAPM::Util.send_include(::Curl::Multi, SolarWindsAPM::Inst::CurlMultiIM)
289
- end