instana 1.11.6 → 1.209.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +263 -0
  3. data/.editorconfig +10 -0
  4. data/.github/ISSUE_TEMPLATE/bug.yml +39 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +14 -1136
  8. data/.rubocop_todo.yml +1140 -0
  9. data/Appraisals +124 -0
  10. data/Gemfile +14 -32
  11. data/LICENSE +2 -1
  12. data/README.md +2 -6
  13. data/Rakefile +18 -49
  14. data/bin/console +8 -4
  15. data/docker-compose.yml +20 -0
  16. data/examples/opentracing.rb +4 -0
  17. data/examples/tracing.rb +4 -0
  18. data/extras/license_header.rb +44 -0
  19. data/gemfiles/.bundle/config +1 -2
  20. data/gemfiles/aws_30.gemfile +22 -0
  21. data/gemfiles/cuba_30.gemfile +18 -0
  22. data/gemfiles/dalli_20.gemfile +18 -0
  23. data/gemfiles/excon_02.gemfile +18 -0
  24. data/gemfiles/excon_021.gemfile +18 -0
  25. data/gemfiles/excon_079.gemfile +18 -0
  26. data/gemfiles/graphql_10.gemfile +18 -0
  27. data/gemfiles/grpc_10.gemfile +18 -0
  28. data/gemfiles/mongo_216.gemfile +18 -0
  29. data/gemfiles/net_http_01.gemfile +17 -0
  30. data/gemfiles/rack_16.gemfile +18 -0
  31. data/gemfiles/rack_20.gemfile +18 -0
  32. data/gemfiles/rails_42.gemfile +21 -0
  33. data/gemfiles/rails_50.gemfile +21 -0
  34. data/gemfiles/rails_52.gemfile +21 -0
  35. data/gemfiles/rails_60.gemfile +21 -0
  36. data/gemfiles/redis_40.gemfile +18 -0
  37. data/gemfiles/resque_122.gemfile +19 -0
  38. data/gemfiles/resque_20.gemfile +18 -0
  39. data/gemfiles/rest_client_16.gemfile +18 -0
  40. data/gemfiles/rest_client_20.gemfile +18 -0
  41. data/gemfiles/roda_20.gemfile +18 -0
  42. data/gemfiles/roda_30.gemfile +18 -0
  43. data/gemfiles/shoryuken_50.gemfile +19 -0
  44. data/gemfiles/sidekiq_42.gemfile +18 -0
  45. data/gemfiles/sidekiq_50.gemfile +18 -0
  46. data/gemfiles/sinatra_14.gemfile +18 -0
  47. data/instana.gemspec +8 -14
  48. data/lib/instana/activator.rb +58 -0
  49. data/lib/instana/activators/action_cable.rb +24 -0
  50. data/lib/instana/activators/action_controller_api.rb +21 -0
  51. data/lib/instana/activators/action_controller_base.rb +21 -0
  52. data/lib/instana/activators/action_mailer.rb +22 -0
  53. data/lib/instana/activators/action_view.rb +21 -0
  54. data/lib/instana/activators/active_job.rb +21 -0
  55. data/lib/instana/activators/active_record.rb +21 -0
  56. data/lib/instana/activators/aws_sdk_dynamodb.rb +20 -0
  57. data/lib/instana/activators/aws_sdk_lambda.rb +20 -0
  58. data/lib/instana/activators/aws_sdk_s3.rb +20 -0
  59. data/lib/instana/activators/aws_sdk_sns.rb +20 -0
  60. data/lib/instana/activators/aws_sdk_sqs.rb +20 -0
  61. data/lib/instana/activators/cuba.rb +21 -0
  62. data/lib/instana/activators/dalli.rb +23 -0
  63. data/lib/instana/activators/excon.rb +20 -0
  64. data/lib/instana/activators/graphql.rb +22 -0
  65. data/lib/instana/activators/grpc_client.rb +20 -0
  66. data/lib/instana/activators/grpc_server.rb +20 -0
  67. data/lib/instana/activators/mongo.rb +23 -0
  68. data/lib/instana/activators/net_http.rb +20 -0
  69. data/lib/instana/activators/rack.rb +16 -0
  70. data/lib/instana/activators/rails.rb +18 -0
  71. data/lib/instana/activators/redis.rb +20 -0
  72. data/lib/instana/activators/resque_client.rb +21 -0
  73. data/lib/instana/activators/resque_worker.rb +32 -0
  74. data/lib/instana/activators/rest_client.rb +20 -0
  75. data/lib/instana/activators/roda.rb +21 -0
  76. data/lib/instana/activators/shoryuken.rb +24 -0
  77. data/lib/instana/activators/sidekiq_client.rb +24 -0
  78. data/lib/instana/activators/sidekiq_worker.rb +24 -0
  79. data/lib/instana/activators/sinatra.rb +21 -0
  80. data/lib/instana/backend/agent.rb +68 -0
  81. data/lib/instana/backend/gc_snapshot.rb +41 -0
  82. data/lib/instana/backend/host_agent.rb +83 -0
  83. data/lib/instana/backend/host_agent_activation_observer.rb +99 -0
  84. data/lib/instana/backend/host_agent_lookup.rb +57 -0
  85. data/lib/instana/backend/host_agent_reporting_observer.rb +129 -0
  86. data/lib/instana/backend/process_info.rb +72 -0
  87. data/lib/instana/backend/request_client.rb +74 -0
  88. data/lib/instana/backend/serverless_agent.rb +116 -0
  89. data/lib/instana/base.rb +15 -29
  90. data/lib/instana/config.rb +31 -23
  91. data/lib/instana/frameworks/cuba.rb +32 -3
  92. data/lib/instana/frameworks/rails.rb +22 -32
  93. data/lib/instana/frameworks/roda.rb +41 -3
  94. data/lib/instana/frameworks/sinatra.rb +16 -3
  95. data/lib/instana/instrumentation/action_cable.rb +53 -0
  96. data/lib/instana/instrumentation/action_controller.rb +84 -0
  97. data/lib/instana/instrumentation/action_mailer.rb +22 -0
  98. data/lib/instana/instrumentation/action_view.rb +30 -0
  99. data/lib/instana/instrumentation/active_job.rb +52 -0
  100. data/lib/instana/instrumentation/active_record.rb +50 -0
  101. data/lib/instana/instrumentation/aws_sdk_dynamodb.rb +48 -0
  102. data/lib/instana/instrumentation/aws_sdk_lambda.rb +37 -0
  103. data/lib/instana/instrumentation/aws_sdk_s3.rb +55 -0
  104. data/lib/instana/instrumentation/aws_sdk_sns.rb +29 -0
  105. data/lib/instana/instrumentation/aws_sdk_sqs.rb +98 -0
  106. data/lib/instana/instrumentation/dalli.rb +10 -18
  107. data/lib/instana/instrumentation/excon.rb +73 -61
  108. data/lib/instana/instrumentation/graphql.rb +78 -0
  109. data/lib/instana/instrumentation/grpc.rb +73 -66
  110. data/lib/instana/instrumentation/instrumented_request.rb +190 -0
  111. data/lib/instana/instrumentation/mongo.rb +46 -0
  112. data/lib/instana/instrumentation/net-http.rb +54 -44
  113. data/lib/instana/instrumentation/rack.rb +57 -48
  114. data/lib/instana/instrumentation/redis.rb +13 -18
  115. data/lib/instana/instrumentation/resque.rb +28 -51
  116. data/lib/instana/instrumentation/rest-client.rb +5 -17
  117. data/lib/instana/instrumentation/shoryuken.rb +44 -0
  118. data/lib/instana/instrumentation/sidekiq-client.rb +4 -10
  119. data/lib/instana/instrumentation/sidekiq-worker.rb +4 -10
  120. data/lib/instana/instrumented_logger.rb +26 -0
  121. data/lib/instana/logger_delegator.rb +31 -0
  122. data/lib/instana/open_tracing/carrier.rb +7 -0
  123. data/lib/instana/open_tracing/instana_tracer.rb +99 -0
  124. data/lib/instana/rack.rb +4 -0
  125. data/lib/instana/secrets.rb +59 -0
  126. data/lib/instana/serverless.rb +160 -0
  127. data/lib/instana/setup.rb +36 -12
  128. data/lib/instana/snapshot/deltable.rb +25 -0
  129. data/lib/instana/snapshot/docker_container.rb +151 -0
  130. data/lib/instana/snapshot/fargate_container.rb +88 -0
  131. data/lib/instana/snapshot/fargate_process.rb +67 -0
  132. data/lib/instana/snapshot/fargate_task.rb +72 -0
  133. data/lib/instana/snapshot/google_cloud_run_instance.rb +69 -0
  134. data/lib/instana/snapshot/google_cloud_run_process.rb +58 -0
  135. data/lib/instana/snapshot/lambda_function.rb +39 -0
  136. data/lib/instana/snapshot/ruby_process.rb +48 -0
  137. data/lib/instana/tracer.rb +42 -148
  138. data/lib/instana/tracing/processor.rb +48 -21
  139. data/lib/instana/tracing/span.rb +70 -61
  140. data/lib/instana/tracing/span_context.rb +34 -2
  141. data/lib/instana/util.rb +25 -137
  142. data/lib/instana/version.rb +4 -1
  143. data/lib/instana.rb +12 -2
  144. data/lib/opentracing.rb +29 -3
  145. data/sonar-project.properties +9 -0
  146. data/test/activator_test.rb +30 -0
  147. data/test/backend/agent_test.rb +80 -0
  148. data/test/backend/gc_snapshot_test.rb +11 -0
  149. data/test/backend/host_agent_activation_observer_test.rb +73 -0
  150. data/test/backend/host_agent_lookup_test.rb +78 -0
  151. data/test/backend/host_agent_reporting_observer_test.rb +274 -0
  152. data/test/backend/host_agent_test.rb +57 -0
  153. data/test/backend/process_info_test.rb +83 -0
  154. data/test/backend/request_client_test.rb +39 -0
  155. data/test/backend/serverless_agent_test.rb +83 -0
  156. data/test/benchmarks/bench_id_generation.rb +3 -0
  157. data/test/benchmarks/bench_opentracing.rb +3 -0
  158. data/test/config_test.rb +11 -14
  159. data/test/frameworks/cuba_test.rb +44 -30
  160. data/test/frameworks/roda_test.rb +46 -30
  161. data/test/frameworks/sinatra_test.rb +52 -30
  162. data/test/instana_test.rb +14 -4
  163. data/test/instrumentation/aws_test.rb +196 -0
  164. data/test/instrumentation/dalli_test.rb +3 -0
  165. data/test/instrumentation/excon_test.rb +20 -3
  166. data/test/instrumentation/graphql_test.rb +119 -0
  167. data/test/instrumentation/grpc_test.rb +6 -2
  168. data/test/instrumentation/mongo_test.rb +37 -0
  169. data/test/instrumentation/{net-http_test.rb → net_http_test.rb} +40 -0
  170. data/test/instrumentation/rack_instrumented_request_test.rb +151 -0
  171. data/test/instrumentation/rack_test.rb +404 -0
  172. data/test/instrumentation/rails_action_cable_test.rb +131 -0
  173. data/test/{frameworks/rails/actioncontroller_test.rb → instrumentation/rails_action_controller_test.rb} +48 -17
  174. data/test/instrumentation/rails_action_mailer_test.rb +37 -0
  175. data/test/instrumentation/rails_action_view_test.rb +151 -0
  176. data/test/instrumentation/rails_active_job_test.rb +65 -0
  177. data/test/instrumentation/rails_active_record_database_missing_test.rb +43 -0
  178. data/test/instrumentation/rails_active_record_test.rb +115 -0
  179. data/test/instrumentation/redis_test.rb +13 -0
  180. data/test/instrumentation/resque_test.rb +63 -17
  181. data/test/instrumentation/{rest-client_test.rb → rest_client_test.rb} +9 -0
  182. data/test/instrumentation/shoryuken_test.rb +47 -0
  183. data/test/instrumentation/sidekiq-client_test.rb +4 -0
  184. data/test/instrumentation/sidekiq-worker_test.rb +4 -0
  185. data/test/secrets_test.rb +112 -0
  186. data/test/serverless_test.rb +369 -0
  187. data/test/snapshot/deltable_test.rb +17 -0
  188. data/test/snapshot/docker_container_test.rb +82 -0
  189. data/test/snapshot/fargate_container_test.rb +82 -0
  190. data/test/snapshot/fargate_process_test.rb +35 -0
  191. data/test/snapshot/fargate_task_test.rb +49 -0
  192. data/test/snapshot/google_cloud_run_instance_test.rb +74 -0
  193. data/test/snapshot/google_cloud_run_process_test.rb +33 -0
  194. data/test/snapshot/lambda_function_test.rb +37 -0
  195. data/test/snapshot/ruby_process_test.rb +14 -0
  196. data/test/support/apps/active_record/active_record.rb +24 -0
  197. data/test/{servers/grpc_50051.rb → support/apps/grpc/boot.rb} +4 -1
  198. data/test/{apps → support/apps/grpc}/grpc_server.rb +3 -0
  199. data/test/{servers/rackapp_6511.rb → support/apps/http_endpoint/boot.rb} +3 -0
  200. data/test/{servers/rails_3205.rb → support/apps/rails/boot.rb} +10 -13
  201. data/test/{models → support/apps/rails/models}/block.rb +4 -1
  202. data/test/{models → support/apps/rails/models}/block6.rb +3 -0
  203. data/test/support/apps/resque/boot.rb +5 -0
  204. data/test/{jobs → support/apps/resque/jobs}/resque_error_job.rb +3 -3
  205. data/test/{jobs → support/apps/resque/jobs}/resque_fast_job.rb +6 -3
  206. data/test/support/apps/sidekiq/boot.rb +25 -0
  207. data/test/{jobs → support/apps/sidekiq/jobs}/sidekiq_job_1.rb +3 -0
  208. data/test/{jobs → support/apps/sidekiq/jobs}/sidekiq_job_2.rb +3 -0
  209. data/test/{servers → support/apps}/sidekiq/worker.rb +5 -2
  210. data/test/support/helpers.rb +97 -0
  211. data/test/support/mock_timer.rb +20 -0
  212. data/test/test_helper.rb +49 -145
  213. data/test/tracing/custom_test.rb +4 -4
  214. data/test/tracing/id_management_test.rb +13 -63
  215. data/test/tracing/instrumented_logger_test.rb +39 -0
  216. data/test/tracing/opentracing_test.rb +21 -5
  217. data/test/tracing/processor_test.rb +58 -0
  218. data/test/tracing/span_context_test.rb +22 -0
  219. data/test/tracing/span_test.rb +165 -0
  220. data/test/tracing/tracer_async_test.rb +32 -0
  221. data/test/tracing/tracer_test.rb +113 -14
  222. data/test/util_test.rb +10 -0
  223. metadata +249 -160
  224. data/.travis.yml +0 -43
  225. data/Dockerfile +0 -16
  226. data/benchmarks/10k-rack-traces.rb +0 -92
  227. data/benchmarks/Gemfile +0 -7
  228. data/benchmarks/Gemfile.lock +0 -38
  229. data/benchmarks/id_generation.rb +0 -12
  230. data/benchmarks/opentracing.rb +0 -26
  231. data/benchmarks/rack_vanilla_vs_traced.rb +0 -85
  232. data/benchmarks/stackprof_rack_tracing.rb +0 -77
  233. data/benchmarks/time_processing.rb +0 -12
  234. data/gemfiles/libraries.gemfile +0 -71
  235. data/gemfiles/rails32.gemfile +0 -51
  236. data/gemfiles/rails42.gemfile +0 -50
  237. data/gemfiles/rails50.gemfile +0 -52
  238. data/gemfiles/rails52.gemfile +0 -52
  239. data/gemfiles/rails60.gemfile +0 -72
  240. data/lib/instana/agent/helpers.rb +0 -84
  241. data/lib/instana/agent/hooks.rb +0 -41
  242. data/lib/instana/agent/tasks.rb +0 -48
  243. data/lib/instana/agent.rb +0 -499
  244. data/lib/instana/collector.rb +0 -116
  245. data/lib/instana/collectors/gc.rb +0 -57
  246. data/lib/instana/collectors/memory.rb +0 -34
  247. data/lib/instana/collectors/thread.rb +0 -30
  248. data/lib/instana/eum/eum-test.js.erb +0 -17
  249. data/lib/instana/eum/eum.js.erb +0 -17
  250. data/lib/instana/frameworks/instrumentation/abstract_mysql_adapter.rb +0 -58
  251. data/lib/instana/frameworks/instrumentation/action_controller.rb +0 -183
  252. data/lib/instana/frameworks/instrumentation/action_view.rb +0 -43
  253. data/lib/instana/frameworks/instrumentation/active_record.rb +0 -27
  254. data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +0 -81
  255. data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +0 -56
  256. data/lib/instana/frameworks/instrumentation/postgresql_adapter.rb +0 -85
  257. data/lib/instana/helpers.rb +0 -44
  258. data/lib/instana/instrumentation.rb +0 -25
  259. data/lib/instana/opentracing/carrier.rb +0 -4
  260. data/lib/instana/opentracing/tracer.rb +0 -18
  261. data/lib/instana/test.rb +0 -42
  262. data/lib/instana/thread_local.rb +0 -15
  263. data/lib/oj_check.rb +0 -16
  264. data/test/agent/agent_test.rb +0 -148
  265. data/test/apps/cuba.rb +0 -15
  266. data/test/apps/roda.rb +0 -10
  267. data/test/apps/sinatra.rb +0 -5
  268. data/test/frameworks/rack_test.rb +0 -200
  269. data/test/frameworks/rails/actionview3_test.rb +0 -210
  270. data/test/frameworks/rails/actionview4_test.rb +0 -208
  271. data/test/frameworks/rails/actionview5_test.rb +0 -221
  272. data/test/frameworks/rails/activerecord_test.rb +0 -227
  273. data/test/servers/helpers/sidekiq_worker_initializer.rb +0 -27
  274. data/test/tracing/trace_test.rb +0 -67
data/lib/instana/util.rb CHANGED
@@ -1,71 +1,10 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
1
4
  module Instana
2
5
  module Util
3
6
  class << self
4
7
  ID_RANGE = -2**63..2**63-1
5
-
6
- # An agnostic approach to method aliasing.
7
- #
8
- # @param klass [Object] The class or module that holds the method to be alias'd.
9
- # @param method [Symbol] The name of the method to be aliased.
10
- #
11
- def method_alias(klass, method)
12
- if klass.method_defined?(method.to_sym) ||
13
- klass.private_method_defined?(method.to_sym)
14
-
15
- with = "#{method}_with_instana"
16
- without = "#{method}_without_instana"
17
-
18
- klass.class_eval do
19
- alias_method without, method.to_s
20
- alias_method method.to_s, with
21
- end
22
- else
23
- ::Instana.logger.debug "No such method (#{method}) to alias on #{klass}"
24
- end
25
- end
26
-
27
- # Calls on target_class to 'extend' cls
28
- #
29
- # @param target_cls [Object] the class/module to do the 'extending'
30
- # @param cls [Object] the class/module to be 'extended'
31
- #
32
- def send_extend(target_cls, cls)
33
- target_cls.send(:extend, cls) if defined?(target_cls)
34
- end
35
-
36
- # Calls on <target_cls> to include <cls> into itself.
37
- #
38
- # @param target_cls [Object] the class/module to do the 'including'
39
- # @param cls [Object] the class/module to be 'included'
40
- #
41
- def send_include(target_cls, cls)
42
- target_cls.send(:include, cls) if defined?(target_cls)
43
- end
44
-
45
- # Debugging helper method
46
- #
47
- def pry!
48
- # Only valid for development or test environments
49
- #env = ENV['RACK_ENV'] || ENV['RAILS_ENV']
50
- #return unless %w(development, test).include? env
51
- require 'pry-byebug'
52
-
53
- if defined?(PryByebug)
54
- Pry.commands.alias_command 'c', 'continue'
55
- Pry.commands.alias_command 's', 'step'
56
- Pry.commands.alias_command 'n', 'next'
57
- Pry.commands.alias_command 'f', 'finish'
58
-
59
- Pry::Commands.command(/^$/, 'repeat last command') do
60
- _pry_.run_command Pry.history.to_a.last
61
- end
62
- end
63
-
64
- binding.pry
65
- rescue LoadError
66
- ::Instana.logger.warn("No debugger in bundle. Couldn't load pry-byebug.")
67
- end
68
-
69
8
  # Retrieves and returns the source code for any ruby
70
9
  # files requested by the UI via the host agent
71
10
  #
@@ -84,6 +23,7 @@ module Instana
84
23
  # Method to collect up process info for snapshots. This
85
24
  # is generally used once per process.
86
25
  #
26
+ # :nocov:
87
27
  def take_snapshot
88
28
  data = {}
89
29
 
@@ -123,53 +63,12 @@ module Instana
123
63
  ::Instana.logger.debug { e.backtrace.join("\r\n") }
124
64
  return data
125
65
  end
126
-
127
- # Used in class initialization and after a fork, this method
128
- # collects up process information
129
- #
130
- def collect_process_info
131
- process = {}
132
- cmdline_file = "/proc/#{Process.pid}/cmdline"
133
-
134
- # If there is a /proc filesystem, we read this manually so
135
- # we can split on embedded null bytes. Otherwise (e.g. OSX, Windows)
136
- # use ProcTable.
137
- if File.exist?(cmdline_file)
138
- cmdline = IO.read(cmdline_file).split(?\x00)
139
- else
140
- # Attempt to support older versions of sys-proctable and ffi.
141
- #
142
- # Alternatively we could use Sys::ProcTable::VERSION here but the
143
- # consistency across historical versions is unknown. Alternative
144
- # to the alternative, would be Ruby metaprogramming using the `arity`
145
- # and `parameters` methods.
146
- # e.g ProcTable.method(:ps).arity/parameters
147
- if Gem.loaded_specs.key?("sys-proctable") &&
148
- (Gem.loaded_specs["sys-proctable"].version >= Gem::Version.new("1.2.0"))
149
- cmdline = ProcTable.ps(:pid => Process.pid).cmdline.split(' ')
150
- else
151
- cmdline = ProcTable.ps(Process.pid).cmdline.split(' ')
152
- end
153
- end
154
-
155
- if RUBY_PLATFORM =~ /darwin/i
156
- cmdline.delete_if{ |e| e.include?('=') }
157
- process[:name] = cmdline.join(' ')
158
- else
159
- process[:name] = cmdline.shift
160
- process[:arguments] = cmdline
161
- end
162
-
163
- process[:pid] = Process.pid
164
- # This is usually Process.pid but in the case of containers, the host agent
165
- # will return to us the true host pid in which we use to report data.
166
- process[:report_pid] = nil
167
- process
168
- end
66
+ # :nocov:
169
67
 
170
68
  # Best effort to determine a name for the instrumented application
171
69
  # on the dashboard.
172
70
  #
71
+ # :nocov:
173
72
  def get_app_name
174
73
  if ENV.key?('INSTANA_SERVICE_NAME')
175
74
  return ENV['INSTANA_SERVICE_NAME']
@@ -206,6 +105,7 @@ module Instana
206
105
  Instana.logger.debug { e.backtrace.join("\r\n") }
207
106
  return "Ruby"
208
107
  end
108
+ # :nocov:
209
109
 
210
110
  # Get the current time in milliseconds from the epoch
211
111
  #
@@ -225,53 +125,41 @@ module Instana
225
125
  (time.to_f * 1000).floor
226
126
  end
227
127
 
228
- # Generate a random 64bit ID
128
+ # Generate a random 64bit/128bit ID
129
+ #
130
+ # @param size [Integer] Number of 64 bit integers used to generate the id
229
131
  #
230
- # @return [Integer] a random 64bit integer
132
+ # @return [String] a random 64bit/128bit hex encoded string
231
133
  #
232
- def generate_id
233
- # Max value is 9223372036854775807 (signed long in Java)
234
- rand(ID_RANGE)
134
+ def generate_id(size = 1)
135
+ Array.new(size) { rand(ID_RANGE) }
136
+ .pack('q>*')
137
+ .unpack('H*')
138
+ .first
235
139
  end
236
140
 
237
141
  # Convert an ID to a value appropriate to pass in a header.
238
142
  #
239
- # @param id [Integer] the id to be converted
143
+ # @param id [String] the id to be converted
240
144
  #
241
145
  # @return [String]
242
146
  #
243
147
  def id_to_header(id)
244
- unless id.is_a?(Integer) || id.is_a?(String)
245
- Instana.logger.debug "id_to_header received a #{id.class}: returning empty string"
246
- return String.new
247
- end
248
- [id.to_i].pack('q>').unpack('H*')[0].gsub(/^0+/, '')
249
- rescue => e
250
- Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
251
- Instana.logger.debug { e.backtrace.join("\r\n") }
148
+ return '' unless id.is_a?(String)
149
+ # Only send 64bit IDs downstream for now
150
+ id.length == 32 ? id[16..-1] : id
252
151
  end
253
152
 
254
153
  # Convert a received header value into a valid ID
255
154
  #
256
155
  # @param header_id [String] the header value to be converted
257
156
  #
258
- # @return [Integer]
157
+ # @return [String]
259
158
  #
260
- def header_to_id(header_id)
261
- if !header_id.is_a?(String)
262
- Instana.logger.debug "header_to_id received a #{header_id.class}: returning 0"
263
- return 0
264
- end
265
- if header_id.length < 16
266
- # The header is less than 16 chars. Prepend
267
- # zeros so we can convert correctly
268
- missing = 16 - header_id.length
269
- header_id = ("0" * missing) + header_id
270
- end
271
- [header_id].pack("H*").unpack("q>")[0]
272
- rescue => e
273
- Instana.logger.info "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
274
- Instana.logger.debug { e.backtrace.join("\r\n") }
159
+ def header_to_id(given)
160
+ return '' unless given.is_a?(String)
161
+ return '' unless given.match(/\A[a-z\d]{16,32}\z/i)
162
+ given
275
163
  end
276
164
  end
277
165
  end
@@ -1,4 +1,7 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
1
4
  module Instana
2
- VERSION = "1.11.6"
5
+ VERSION = "1.209.2"
3
6
  VERSION_FULL = "instana-#{VERSION}"
4
7
  end
data/lib/instana.rb CHANGED
@@ -1,4 +1,7 @@
1
- require "instana/setup"
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
4
+ require 'instana/setup'
2
5
 
3
6
  # Boot the instana agent background thread. If you wish to have greater
4
7
  # control on the where and which thread this is run in, instead use
@@ -9,4 +12,11 @@ require "instana/setup"
9
12
  # the thread of your choice.
10
13
  #
11
14
 
12
- ::Instana.agent.spawn_background_thread
15
+ # :nocov:
16
+ unless ENV.fetch('INSTANA_DISABLE', false)
17
+ ::Instana::Activator.start
18
+ ::Instana.agent.spawn_background_thread
19
+
20
+ ::Instana.logger.info "Stan is on the scene. Starting Instana instrumentation version #{::Instana::VERSION}"
21
+ end
22
+ # :nocov:
data/lib/opentracing.rb CHANGED
@@ -1,6 +1,32 @@
1
- require "instana/opentracing/tracer"
2
- require "instana/opentracing/carrier"
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2017
3
+
4
+ require "instana/open_tracing/carrier"
5
+ require "instana/open_tracing/instana_tracer"
6
+
7
+ module OpenTracing
8
+ class << self
9
+ # Text format for #inject and #extract
10
+ FORMAT_TEXT_MAP = 1
11
+
12
+ # Binary format for #inject and #extract
13
+ FORMAT_BINARY = 2
14
+
15
+ # Ruby Specific format to handle how Rack changes environment variables.
16
+ FORMAT_RACK = 3
17
+
18
+ attr_accessor :global_tracer
19
+
20
+ def method_missing(method_name, *args, &block)
21
+ @global_tracer.send(method_name, *args, &block)
22
+ end
23
+
24
+ def respond_to_missing?(name, all)
25
+ @global_tracer.respond_to?(name, all)
26
+ end
27
+ end
28
+ end
3
29
 
4
30
  # Set the global tracer to our OT tracer
5
31
  # which supports the OT specification
6
- OpenTracing.global_tracer = ::Instana.tracer
32
+ OpenTracing.global_tracer = OpenTracing::InstanaTracer.new(::Instana.tracer)
@@ -0,0 +1,9 @@
1
+ sonar.projectKey=ruby-sensor
2
+ sonar.sources=lib
3
+ sonar.tests=test
4
+ sonar.exclusions=_junit/*
5
+ sonar.ruby.coverage.reportPaths=coverage/coverage.json
6
+ sonar.links.homepage=https://github.com/instana/ruby-sensor/
7
+ sonar.links.ci=https://circleci.com/gh/instana/ruby-sensor
8
+ sonar.links.issue=https://github.com/instana/ruby-sensor/issues
9
+ sonar.links.scm=https://github.com/instana/ruby-sensor/
@@ -0,0 +1,30 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class ActivatorTest < Minitest::Test
7
+ def test_start
8
+ refute_nil Instana::Activator.trace_point
9
+ assert Instana::Activator.trace_point.enabled?
10
+ end
11
+
12
+ def test_klass_call
13
+ assert_equal [], Instana::Activator.call
14
+ end
15
+
16
+ def test_instance_call
17
+ subject = Class.new(Instana::Activator) do
18
+ def can_instrument?
19
+ true
20
+ end
21
+
22
+ def instrument
23
+ true
24
+ end
25
+ end
26
+
27
+ assert_equal 1, Instana::Activator.call.length
28
+ assert subject.call
29
+ end
30
+ end
@@ -0,0 +1,80 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class AgentTest < Minitest::Test
7
+ def test_host
8
+ subject = Instana::Backend::Agent.new
9
+ assert_nil subject.delegate
10
+ subject.setup
11
+ assert subject.delegate.is_a?(Instana::Backend::HostAgent)
12
+ end
13
+
14
+ def test_fargate
15
+ ENV['ECS_CONTAINER_METADATA_URI'] = 'https://10.10.10.10:9292/v3'
16
+ ENV['INSTANA_ENDPOINT_URL'] = 'http://example.com'
17
+
18
+ stub_request(:get, 'https://10.10.10.10:9292/v3/task')
19
+ .to_return(status: 200, body: File.read('test/support/ecs/task.json'))
20
+
21
+ subject = Instana::Backend::Agent.new(fargate_metadata_uri: 'https://10.10.10.10:9292/v3')
22
+ assert_nil subject.delegate
23
+ subject.setup
24
+ assert subject.delegate.is_a?(Instana::Backend::ServerlessAgent)
25
+ ensure
26
+ ENV['INSTANA_ENDPOINT_URL'] = nil
27
+ ENV['ECS_CONTAINER_METADATA_URI'] = nil
28
+ end
29
+
30
+ def test_fargate_error
31
+ ENV['ECS_CONTAINER_METADATA_URI'] = 'https://10.10.10.10:9292/v3'
32
+ ENV['INSTANA_ENDPOINT_URL'] = 'http://example.com'
33
+
34
+ stub_request(:get, 'https://10.10.10.10:9292/v3/task')
35
+ .to_return(status: 500)
36
+
37
+ subject = Instana::Backend::Agent.new(logger: Logger.new('/dev/null'))
38
+ assert_nil subject.delegate
39
+ subject.setup
40
+ assert subject.delegate.is_a?(Instana::Backend::ServerlessAgent)
41
+ ensure
42
+ ENV['INSTANA_ENDPOINT_URL'] = nil
43
+ ENV['ECS_CONTAINER_METADATA_URI'] = nil
44
+ end
45
+
46
+ def test_lambda
47
+ ENV['_HANDLER'] = 'TEST_FUNCTION'
48
+ ENV['INSTANA_ENDPOINT_URL'] = 'http://example.com'
49
+
50
+ subject = Instana::Backend::Agent.new
51
+ assert_nil subject.delegate
52
+ subject.setup
53
+ assert subject.delegate.is_a?(Instana::Backend::ServerlessAgent)
54
+ ensure
55
+ ENV['_HANDLER'] = nil
56
+ ENV['INSTANA_ENDPOINT_URL'] = nil
57
+ end
58
+
59
+ def test_google_cloud
60
+ ENV['K_REVISION'] = 'TEST'
61
+ ENV['INSTANA_ENDPOINT_URL'] = 'http://example.com'
62
+
63
+ subject = Instana::Backend::Agent.new
64
+ assert_nil subject.delegate
65
+ subject.setup
66
+ assert subject.delegate.is_a?(Instana::Backend::ServerlessAgent)
67
+ ensure
68
+ ENV['K_REVISION'] = nil
69
+ ENV['INSTANA_ENDPOINT_URL'] = nil
70
+ end
71
+
72
+ def test_delegate_super
73
+ subject = Instana::Backend::Agent.new
74
+ assert_raises NoMethodError do
75
+ subject.invalid
76
+ end
77
+
78
+ refute subject.respond_to?(:invalid)
79
+ end
80
+ end
@@ -0,0 +1,11 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class GcSnapshotTest < Minitest::Test
7
+ def test_report
8
+ subject = Instana::Backend::GCSnapshot.instance
9
+ assert subject.report.is_a?(Hash)
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class HostAgentActivationObserverTest < Minitest::Test
7
+ def setup
8
+ @socket_proc = ->(_c) { OpenStruct.new(fileno: 0) }
9
+ end
10
+
11
+ def test_standard_discovery
12
+ stub_request(:put, "http://10.10.10.10:9292/com.instana.plugin.ruby.discovery")
13
+ .and_timeout
14
+ .and_return(status: 500, body: '{"ok": false}')
15
+ .and_return(status: 200, body: '[{"pid": 1234}]')
16
+ .and_return(status: 200, body: '{"pid": 1234}')
17
+
18
+ stub_request(:head, "http://10.10.10.10:9292/com.instana.plugin.ruby.1234")
19
+ .and_return(status: 500, body: '{"ok": false}')
20
+ .and_return(status: 200, body: '{"ok": true}')
21
+
22
+ client = Instana::Backend::RequestClient.new('10.10.10.10', 9292)
23
+ discovery = Concurrent::Atom.new(nil)
24
+
25
+ subject = Instana::Backend::HostAgentActivationObserver.new(client, discovery, wait_time: 0, logger: Logger.new('/dev/null'), max_wait_tries: 1, socket_proc: @socket_proc)
26
+
27
+ subject.update(nil, nil, nil)
28
+ assert_equal({'pid' => 1234}, discovery.value)
29
+ end
30
+
31
+ def test_linux_discovery
32
+ stub_request(:put, "http://10.10.10.10:9292/com.instana.plugin.ruby.discovery")
33
+ .and_return(status: 200, body: '{"pid": 1234}')
34
+
35
+ stub_request(:head, "http://10.10.10.10:9292/com.instana.plugin.ruby.1234")
36
+ .and_return(status: 200, body: '{"ok": true}')
37
+
38
+ client = Instana::Backend::RequestClient.new('10.10.10.10', 9292)
39
+ discovery = Concurrent::Atom.new(nil)
40
+
41
+ subject = Instana::Backend::HostAgentActivationObserver.new(client, discovery, wait_time: 0, logger: Logger.new('/dev/null'), max_wait_tries: 1, socket_proc: @socket_proc)
42
+
43
+ FakeFS.with_fresh do
44
+ FakeFS::FileSystem.clone('test/support/proc', '/proc')
45
+ FakeFS::FileSystem.clone('test/support/proc/0', "/proc/#{Process.pid}")
46
+ Dir.mkdir('/proc/self/fd')
47
+ File.symlink('/proc/self/sched', "/proc/self/fd/0")
48
+
49
+ subject.update(nil, nil, nil)
50
+ end
51
+
52
+ assert_equal({'pid' => 1234}, discovery.value)
53
+ end
54
+
55
+ def test_discovery_standard_error
56
+ client = Instana::Backend::RequestClient.new('10.10.10.10', 9292)
57
+ discovery = Concurrent::Atom.new(nil)
58
+
59
+ subject = Instana::Backend::HostAgentActivationObserver.new(client, discovery, wait_time: 0, logger: Logger.new('/dev/null'), proc_table: nil, socket_proc: @socket_proc)
60
+
61
+ subject.update(nil, nil, nil)
62
+ assert_nil discovery.value
63
+ end
64
+
65
+ def test_value_present
66
+ client = Instana::Backend::RequestClient.new('10.10.10.10', 9292)
67
+ discovery = Concurrent::Atom.new(nil)
68
+
69
+ subject = Instana::Backend::HostAgentActivationObserver.new(client, discovery, socket_proc: @socket_proc)
70
+ assert_nil subject.update(nil, nil, true)
71
+ assert_nil discovery.value
72
+ end
73
+ end
@@ -0,0 +1,78 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class HostAgentLookupTest < Minitest::Test
7
+ def test_lookup
8
+ stub_request(:get, "http://10.10.10.10:42699/")
9
+ .to_return(status: 200)
10
+
11
+ subject = Instana::Backend::HostAgentLookup.new('10.10.10.10', 42699)
12
+ client = subject.call
13
+
14
+ assert client
15
+ assert client.send_request('GET', '/').ok?
16
+ end
17
+
18
+ def test_lookup_no_agent
19
+ stub_request(:get, "http://10.10.10.10:42699/")
20
+ .to_timeout
21
+
22
+ subject = Instana::Backend::HostAgentLookup.new('10.10.10.10', 42699)
23
+
24
+ client = FakeFS.with_fresh do
25
+ FakeFS::FileSystem.clone('test/support/ecs', '/proc')
26
+
27
+ subject.call
28
+ end
29
+
30
+ assert_nil client
31
+ end
32
+
33
+ def test_lookup_agent_error
34
+ stub_request(:get, "http://10.10.10.10:42699/")
35
+ .to_return(status: 500)
36
+
37
+ subject = Instana::Backend::HostAgentLookup.new('10.10.10.10', 42699)
38
+
39
+ client = FakeFS.with_fresh do
40
+ FakeFS::FileSystem.clone('test/support/ecs', '/proc')
41
+
42
+ subject.call
43
+ end
44
+
45
+ assert_nil client
46
+ end
47
+
48
+ def test_lookup_with_gateway
49
+ stub_request(:get, "http://10.10.10.10:42699/")
50
+ .to_timeout
51
+ stub_request(:get, "http://172.18.0.1:42699/")
52
+ .to_return(status: 200)
53
+
54
+ subject = Instana::Backend::HostAgentLookup.new('10.10.10.10', 42699)
55
+
56
+ client = FakeFS do
57
+ FakeFS::FileSystem.clone('test/support/proc', '/proc')
58
+ subject.call
59
+ end
60
+
61
+ assert client
62
+ assert client.send_request('GET', '/').ok?
63
+ end
64
+
65
+ def test_lookup_with_gateway_no_destination
66
+ stub_request(:get, "http://10.10.10.10:42699/")
67
+ .to_timeout
68
+
69
+ subject = Instana::Backend::HostAgentLookup.new('10.10.10.10', 42699, destination: '11111111')
70
+
71
+ client = FakeFS do
72
+ FakeFS::FileSystem.clone('test/support/proc', '/proc')
73
+ subject.call
74
+ end
75
+
76
+ assert_nil client
77
+ end
78
+ end