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/test/test_helper.rb CHANGED
@@ -1,159 +1,63 @@
1
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
- ENV['INSTANA_TEST'] = 'true'
3
- require "rubygems"
4
- require "bundler/setup"
5
- Bundler.require(:default, :test)
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
6
3
 
7
- require "minitest/spec"
8
- require "minitest/autorun"
9
- require "minitest/reporters"
10
- require "minitest/debugger" if ENV['DEBUG']
11
- require "minitest/benchmark"
12
- require 'webmock/minitest'
4
+ ENV['INSTANA_TEST'] = 'true'
13
5
 
14
- require "instana/test"
15
- ::Instana::Test.setup_environment
6
+ begin
7
+ require 'simplecov'
8
+ require 'simplecov_json_formatter'
16
9
 
17
- # Webmock: Whitelist local IPs
18
- whitelist = ['127.0.0.1', 'localhost', '172.17.0.1', '172.0.12.100']
19
- allowed_sites = lambda{|uri|
20
- whitelist.include?(uri.host)
21
- }
22
- ::WebMock.disable_net_connect!(allow: allowed_sites)
10
+ SimpleCov.start do
11
+ enable_coverage :branch
23
12
 
24
- # Boot background webservers to test against.
25
- require "./test/servers/rackapp_6511"
13
+ add_filter %r{^/test/}
26
14
 
27
- case File.basename(ENV['BUNDLE_GEMFILE'])
28
- when /rails/
29
- require './test/servers/rails_3205'
30
- when /libraries/
31
- # Configure gRPC
32
- require './test/servers/grpc_50051.rb'
15
+ add_group(
16
+ 'In Process Collector',
17
+ [%r{lib/instana/(agent|backend|tracing|collectors|open_tracing|snapshot)}, %r{lib/instana/[^/]+\.rb}]
18
+ )
33
19
 
34
- # Hook into sidekiq to control the current mode
35
- $sidekiq_mode = :client
36
- class << Sidekiq
37
- def server?
38
- $sidekiq_mode == :server
20
+ if ENV['APPRAISAL_INITIALIZED']
21
+ add_group(
22
+ 'Instrumentation',
23
+ %r{lib/instana/(activators|frameworks|instrumentation)}
24
+ )
25
+ else
26
+ add_filter %r{lib/instana/(activators|frameworks|instrumentation)}
39
27
  end
40
- end
41
-
42
- ENV['REDIS_URL'] ||= 'redis://127.0.0.1:6379'
43
-
44
- # Configure redis for sidekiq client
45
- Sidekiq.configure_client do |config|
46
- config.redis = { url: ENV['REDIS_URL'] }
47
- end
48
-
49
- # Configure redis for sidekiq worker
50
- $sidekiq_mode = :server
51
- ::Sidekiq.configure_server do |config|
52
- config.redis = { url: ENV['REDIS_URL'] }
53
- end
54
- $sidekiq_mode = :client
55
-
56
- require './test/servers/sidekiq/worker'
57
- end
58
-
59
- Minitest::Reporters.use! MiniTest::Reporters::SpecReporter.new
60
-
61
- # Used to reset the gem to boot state. It clears out any queued and/or staged
62
- # traces and resets the tracer to no active trace.
63
- #
64
- def clear_all!
65
- ::Instana.processor.clear!
66
- ::Instana.tracer.clear!
67
- nil
68
- end
69
-
70
- def disable_redis_instrumentation
71
- ::Redis::Client.class_eval do
72
- alias call call_without_instana
73
- alias call_pipeline call_pipeline_without_instana
74
- end
75
- end
76
-
77
- def enable_redis_instrumentation
78
- ::Redis::Client.class_eval do
79
- alias call call_with_instana
80
- alias call_pipeline call_pipeline_with_instana
81
- end
82
- end
83
-
84
- def validate_sdk_span(json_span, sdk_hash = {}, errored = false, ec = 1)
85
- assert_equal :sdk, json_span[:n]
86
- assert json_span.key?(:k)
87
- assert json_span.key?(:d)
88
- assert json_span.key?(:ts)
89
-
90
- for k,v in sdk_hash
91
- assert_equal v, json_span[:data][:sdk][k]
92
- end
93
-
94
- if errored
95
- assert_equal true, json_span[:error]
96
- assert_equal 1, json_span[:ec]
97
- end
98
- end
99
28
 
100
- def find_spans_by_name(spans, name)
101
- result = []
102
- for span in spans
103
- if span[:n] == :sdk
104
- if span[:data][:sdk][:name] == name
105
- result << span
106
- end
107
- elsif span[:n] == name
108
- result << span
29
+ if ENV['CI']
30
+ formatter SimpleCov::Formatter::JSONFormatter
109
31
  end
110
32
  end
111
- if result.empty?
112
- raise Exception.new("No SDK spans (#{name}) could be found")
113
- else
114
- return result
115
- end
33
+ rescue LoadError => _e
34
+ nil
116
35
  end
117
36
 
118
- def find_first_span_by_name(spans, name)
119
- for span in spans
120
- if span[:n] == :sdk
121
- if span[:data][:sdk][:name] == name
122
- return span
123
- end
124
- else
125
- if span[:n] == name
126
- return span
127
- end
128
- end
129
- end
130
- raise Exception.new("Span (#{name}) not found")
131
- end
37
+ require 'bundler/setup'
38
+ Bundler.require
132
39
 
133
- def find_span_by_id(spans, id)
134
- for span in spans
135
- if span[:s] == id
136
- return span
137
- end
138
- end
139
- raise Exception.new("Span with id (#{id}) not found")
140
- end
40
+ require "minitest/spec"
41
+ require "minitest/autorun"
42
+ require "minitest/reporters"
43
+ require 'fakefs/safe'
141
44
 
142
- # Finds the first span in +spans+ for which +block+ returns true
143
- #
144
- # ar_span = find_first_span_by_qualifier(ar_spans) do |span|
145
- # span[:data][:activerecord][:sql] == sql
146
- # end
147
- #
148
- # This helper will raise an exception if no span evaluates to true against he provided block.
149
- #
150
- # +spans+: +Array+ of spans to search
151
- # +block+: The Ruby block to evaluate against each span
152
- def find_first_span_by_qualifier(spans, &block)
153
- spans.each do |span|
154
- if block.call(span)
155
- return span
156
- end
157
- end
158
- raise Exception.new("Span with qualifier not found")
159
- end
45
+ require 'webmock/minitest'
46
+ # Webmock: Whitelist local IPs
47
+ WebMock.disable_net_connect!(
48
+ allow: ->(uri) { %w[localhost 127.0.0.1 172.17.0.1 172.0.12.100].include?(uri.host) && ENV.key?('APPRAISAL_INITIALIZED') }
49
+ )
50
+
51
+ Dir['test/support/*.rb'].each { |f| load(f) }
52
+
53
+ if ENV['CI']
54
+ Minitest::Reporters.use!([
55
+ Minitest::Reporters::JUnitReporter.new('_junit', false),
56
+ Minitest::Reporters::SpecReporter.new
57
+ ])
58
+ else
59
+ Minitest::Reporters.use!([
60
+ MiniTest::Reporters::SpecReporter.new
61
+ ])
62
+ end
63
+ Minitest::Test.include(Instana::TestHelpers)
@@ -1,3 +1,6 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
1
4
  require 'test_helper'
2
5
 
3
6
  class CustomTracingTest < Minitest::Test
@@ -36,9 +39,7 @@ class CustomTracingTest < Minitest::Test
36
39
  assert_equal :entry, first_span[:data][:sdk][:type]
37
40
 
38
41
  assert first_span.key?(:f)
39
- assert first_span[:f].key?(:e)
40
- assert first_span[:f].key?(:h)
41
- assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
42
+ assert_equal ::Instana.agent.source, first_span[:f]
42
43
  end
43
44
 
44
45
  def test_custom_tracing_with_args
@@ -110,7 +111,6 @@ class CustomTracingTest < Minitest::Test
110
111
 
111
112
  ::Instana.tracer.log_entry(:custom_span, kvs)
112
113
  raise "custom tracing error. This is only a test"
113
- ::Instana.tracer.log_info({:on_info_kv => 1})
114
114
  rescue => e
115
115
  ::Instana.tracer.log_error(e)
116
116
  ensure
@@ -1,4 +1,8 @@
1
1
 
2
+
3
+ # (c) Copyright IBM Corp. 2021
4
+ # (c) Copyright Instana Inc. 2016
5
+
2
6
  require 'test_helper'
3
7
 
4
8
  class TracerIDMgmtTest < Minitest::Test
@@ -49,82 +53,28 @@ class TracerIDMgmtTest < Minitest::Test
49
53
  converted_id = Instana::Util.header_to_id(header_id)
50
54
 
51
55
  # Assert that it is an Integer
52
- assert converted_id.is_a?(Integer)
56
+ assert converted_id.is_a?(String)
53
57
  end
54
58
 
55
59
  def test_header_to_id_conversion_with_bogus_header
56
60
  # Bogus nil arg
57
61
  bogus_result = Instana::Util.header_to_id(nil)
58
- assert_equal 0, bogus_result
62
+ assert_equal '', bogus_result
59
63
 
60
64
  # Bogus Integer arg
61
65
  bogus_result = Instana::Util.header_to_id(1234)
62
- assert_equal 0, bogus_result
66
+ assert_equal '', bogus_result
63
67
 
64
68
  # Bogus Array arg
65
69
  bogus_result = Instana::Util.header_to_id([1234])
66
- assert_equal 0, bogus_result
67
- end
68
-
69
- def test_id_conversion_back_and_forth
70
- # id --> header --> id
71
- original_id = ::Instana::Util.generate_id
72
- header_id = Instana::Util.id_to_header(original_id)
73
- converted_back_id = Instana::Util.header_to_id(header_id)
74
- assert original_id == converted_back_id
75
-
76
- # header --> id --> header
77
- original_header_id = "c025ee93b1aeda7b"
78
- id = Instana::Util.header_to_id(original_header_id)
79
- converted_back_header_id = Instana::Util.id_to_header(id)
80
- assert_equal original_header_id, converted_back_header_id
81
-
82
- # Test a random value
83
- id = -7815363404733516491
84
- header = "938a406416457535"
85
-
86
- result = Instana::Util.header_to_id(header)
87
- assert_equal id, result
88
-
89
- result = Instana::Util.id_to_header(id)
90
- assert_equal header, result
91
-
92
- 10000.times do
93
- original_id = ::Instana::Util.generate_id
94
- header_id = Instana::Util.id_to_header(original_id)
95
- converted_back_id = Instana::Util.header_to_id(header_id)
96
- assert original_id == converted_back_id
97
- end
98
- end
70
+ assert_equal '', bogus_result
99
71
 
100
- def test_id_max_value_and_conversion
101
- max_id = 9223372036854775807
102
- min_id = -9223372036854775808
103
- max_hex = "7fffffffffffffff"
104
- min_hex = "8000000000000000"
105
-
106
- assert_equal max_hex, Instana::Util.id_to_header(max_id)
107
- assert_equal min_hex, Instana::Util.id_to_header(min_id)
108
-
109
- assert_equal max_id, Instana::Util.header_to_id(max_hex)
110
- assert_equal min_id, Instana::Util.header_to_id(min_hex)
72
+ # Invalid characters/length
73
+ bogus_result = Instana::Util.header_to_id('qwerty')
74
+ assert_equal '', bogus_result
111
75
  end
112
76
 
113
- def test_that_leading_zeros_handled_correctly
114
-
115
- header = ::Instana::Util.id_to_header(16)
116
- assert_equal "10", header
117
-
118
- id = ::Instana::Util.header_to_id("10")
119
- assert_equal 16, id
120
-
121
- id = ::Instana::Util.header_to_id("0000000000000010")
122
- assert_equal 16, id
123
-
124
- id = ::Instana::Util.header_to_id("88b6c735206ca42")
125
- assert_equal 615705016619420226, id
126
-
127
- id = ::Instana::Util.header_to_id("088b6c735206ca42")
128
- assert_equal 615705016619420226, id
77
+ def test_long_id_trim
78
+ assert_equal 16, Instana::Util.id_to_header(::Instana::Util.generate_id(2)).length
129
79
  end
130
80
  end
@@ -0,0 +1,39 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class InstrumentedLoggerTest < Minitest::Test
7
+ def setup
8
+ clear_all!
9
+ end
10
+
11
+ def test_log_warn_error
12
+ subject = Instana::InstrumentedLogger.new('/dev/null')
13
+
14
+ Instana::Tracer.start_or_continue_trace(:test_logging) do
15
+ subject.warn('warn')
16
+ subject.debug('test')
17
+ subject.error('error')
18
+ end
19
+
20
+ spans = ::Instana.processor.queued_spans
21
+
22
+ warn_span, error_span, = *spans
23
+
24
+ assert_equal :log, warn_span[:n]
25
+ assert_equal 'warn', warn_span[:data][:log][:message]
26
+ assert_equal 'Warn', warn_span[:data][:log][:level]
27
+
28
+ assert_equal :log, error_span[:n]
29
+ assert_equal 'error', error_span[:data][:log][:message]
30
+ assert_equal 'Error', error_span[:data][:log][:level]
31
+ end
32
+
33
+ def test_no_trace
34
+ subject = Instana::InstrumentedLogger.new('/dev/null')
35
+ subject.warn('warn')
36
+
37
+ assert_equal [], ::Instana.processor.queued_spans
38
+ end
39
+ end
@@ -1,3 +1,6 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2017
3
+
1
4
  require 'test_helper'
2
5
  require 'rack/test'
3
6
  require 'rack/lobster'
@@ -31,8 +34,6 @@ module Instana
31
34
  end
32
35
  end
33
36
 
34
- OpenTracing.global_tracer = ::Instana.tracer
35
-
36
37
  class OpenTracerTest < Minitest::Test
37
38
  include Rack::Test::Methods
38
39
 
@@ -57,6 +58,8 @@ class OpenTracerTest < Minitest::Test
57
58
  assert OpenTracing.global_tracer.respond_to?(:inject)
58
59
  assert OpenTracing.global_tracer.respond_to?(:extract)
59
60
 
61
+ assert OpenTracing.respond_to?(:start_span)
62
+
60
63
  assert defined?(OpenTracing::Carrier)
61
64
  carrier = OpenTracing::Carrier.new
62
65
  assert carrier.respond_to?(:[])
@@ -301,7 +304,7 @@ class OpenTracerTest < Minitest::Test
301
304
  assert_equal second_span[:s], third_span[:p]
302
305
 
303
306
  # Every span should have baggage
304
- assert_equal(nil, entry_span.context.baggage)
307
+ assert_equal({}, entry_span.context.baggage)
305
308
  assert_equal({:my_bag=>1}, ac_span.context.baggage)
306
309
  assert_equal({:my_bag=>1}, av_span.context.baggage)
307
310
  end
@@ -328,9 +331,9 @@ class OpenTracerTest < Minitest::Test
328
331
  spans = ::Instana.processor.queued_spans
329
332
  assert_equal 3, spans.length
330
333
 
331
- assert_equal(nil, entry_span.context.baggage)
334
+ assert_equal({}, entry_span.context.baggage)
332
335
  assert_equal({:my_bag=>1}, ac_span.context.baggage)
333
- assert_equal(nil, av_span.context.baggage)
336
+ assert_equal({}, av_span.context.baggage)
334
337
  end
335
338
 
336
339
  def test_start_active_span
@@ -353,4 +356,17 @@ class OpenTracerTest < Minitest::Test
353
356
  span = OpenTracing.start_active_span(:rack)
354
357
  assert_equal OpenTracing.active_span, span
355
358
  end
359
+
360
+ def test_active_span_block
361
+ clear_all!
362
+
363
+ obj = OpenTracing.start_active_span(:rack) { 1 }
364
+ assert_equal 1, obj
365
+ end
366
+
367
+ def test_span_rename
368
+ span = OpenTracing.start_active_span(:rack)
369
+ span.operation_name = 'test'
370
+ assert_equal 'test', span.name
371
+ end
356
372
  end
@@ -0,0 +1,58 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class ProcessorTest < Minitest::Test
7
+ def test_queued_spans_empty
8
+ subject = Instana::Processor.new
9
+ assert_equal [], subject.queued_spans
10
+ end
11
+
12
+ def test_queued_spans_valid_level
13
+ clear_all!
14
+ subject = Instana::Processor.new
15
+
16
+ span_context = Instana::SpanContext.new('9', '8', 0)
17
+ span = Instana::Span.new(:rack, parent_ctx: span_context)
18
+ span2 = Instana::Span.new(:"net-http")
19
+
20
+ subject.add_span(span)
21
+ subject.add_span(span2)
22
+
23
+ spans = subject.queued_spans
24
+ valid_span, = spans
25
+
26
+ assert_equal 1, spans.length
27
+ assert_equal :"net-http", valid_span[:n]
28
+ end
29
+
30
+ def test_queued_spans_invalid_type
31
+ subject = Instana::Processor.new
32
+ subject.add_span(false)
33
+
34
+ assert_equal [], subject.queued_spans
35
+ end
36
+
37
+ def test_send
38
+ ENV['INSTANA_TEST'] = nil
39
+
40
+ subject = Instana::Processor.new
41
+ span = Instana::Span.new(:rack)
42
+ subject.add_span(span)
43
+
44
+ was_invoked = false
45
+
46
+ subject.send do |spans|
47
+ was_invoked = true
48
+ rack_span, = spans
49
+
50
+ assert_equal 1, spans.length
51
+ assert_equal :rack, rack_span[:n]
52
+ end
53
+
54
+ assert was_invoked
55
+ ensure
56
+ ENV['INSTANA_TEST'] = 'true'
57
+ end
58
+ end
@@ -0,0 +1,22 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class SpanContextTest < Minitest::Test
7
+ def test_to_hash
8
+ subject = Instana::SpanContext.new('trace', 'span')
9
+ assert_equal({trace_id: 'trace', span_id: 'span'}, subject.to_hash)
10
+ end
11
+
12
+ def test_invalid
13
+ subject = Instana::SpanContext.new(nil, nil)
14
+ refute subject.valid?
15
+ end
16
+
17
+ def test_flags_level_zero
18
+ subject = Instana::SpanContext.new('trace', 'span', 0, {external_state: 'cn=test'})
19
+ assert_equal '00-000000000000000000000000000trace-000000000000span-00', subject.trace_parent_header
20
+ assert_equal 'cn=test', subject.trace_state_header
21
+ end
22
+ end
@@ -0,0 +1,165 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class SpanTest < Minitest::Test
7
+ def test_getters_setters
8
+ span = Instana::Span.new(:test)
9
+
10
+ assert_equal span[:s], span.id
11
+ assert_equal span[:t], span.trace_id
12
+ assert_equal span[:p], span.parent_id
13
+ assert_equal span[:d], span.duration
14
+
15
+ span.parent_id = 'test'
16
+ assert_equal 'test', span.parent_id
17
+
18
+ span.name = 'test'
19
+ assert_equal 'test', span[:data][:sdk][:name]
20
+
21
+ span[:t] = 'test'
22
+ assert span.key?(:t)
23
+ assert_equal 'test', span[:t]
24
+
25
+ assert span.inspect
26
+ end
27
+
28
+ def test_builtin_span_rename
29
+ span = Instana::Span.new(:"net-http")
30
+ assert_equal :"net-http", span.name
31
+
32
+ span.name = 'test'
33
+ assert_equal 'test', span.name
34
+ end
35
+
36
+ def test_exit_span
37
+ span = Instana::Span.new(:"net-http")
38
+ assert span.exit_span?
39
+ end
40
+
41
+ def test_span_from_contetx
42
+ context = Instana::SpanContext.new('test', 'test', 0)
43
+ span = Instana::Span.new(:test, parent_ctx: context)
44
+
45
+ assert_equal 'test', span.parent_id
46
+ assert_equal 'test', span.trace_id
47
+ end
48
+
49
+ def test_span_from_contetx_invalid
50
+ context = Instana::SpanContext.new(nil, nil, 1)
51
+ span = Instana::Span.new(:test, parent_ctx: context)
52
+
53
+ assert_nil span.parent_id
54
+ refute_equal context.span_id, span.trace_id
55
+ assert_equal 1, span.context.level
56
+ end
57
+
58
+ def test_span_collect_backtraces
59
+ Instana.config[:collect_backtraces] = true
60
+ span = Instana::Span.new(:excon)
61
+ assert span[:stack]
62
+ ensure
63
+ Instana.config[:collect_backtraces] = false
64
+ end
65
+
66
+ def test_span_backtrace_cleaner
67
+ Instana.config[:collect_backtraces] = true
68
+ Instana.config[:backtrace_cleaner] =
69
+ ->(trace) { trace.filter { |line| line.include?("lib/instana") } }
70
+ span = Instana::Span.new(:excon)
71
+
72
+ assert_equal 1, span[:stack].size
73
+ ensure
74
+ Instana.config[:backtrace_cleaner] = nil
75
+ Instana.config[:collect_backtraces] = false
76
+ end
77
+
78
+ def test_span_stack_over_limit
79
+ def inner(depth = 50, &blk) # rubocop:disable Lint/NestedMethodDefinition
80
+ return blk.call if depth.zero?
81
+
82
+ inner(depth - 1, &blk)
83
+ end
84
+
85
+ inner do
86
+ span = Instana::Span.new(:excon)
87
+ span.add_stack(limit: 500)
88
+ assert_equal 40, span[:stack].length
89
+ end
90
+ end
91
+
92
+ def test_multiple_errors
93
+ span = Instana::Span.new(:activerecord)
94
+ span.set_tag(:activerecord, {})
95
+
96
+ span.add_error(StandardError.new('Test1'))
97
+ span.add_error(StandardError.new('Test2'))
98
+
99
+ assert_equal 2, span[:ec]
100
+ assert_equal 'Test2', span[:data][:activerecord][:error]
101
+ end
102
+
103
+ def test_add_error_nil
104
+ span = Instana::Span.new(:activerecord)
105
+ span.add_error(nil)
106
+
107
+ assert_equal 1, span[:ec]
108
+ end
109
+
110
+ def test_set_tag_merge
111
+ span = Instana::Span.new(:excon)
112
+ span.set_tag(1024, {a: 1})
113
+ span.set_tag(1024, {b: 2})
114
+
115
+ assert_equal({'1024' => {a: 1, b: 2}}, span[:data])
116
+ end
117
+
118
+ def test_set_tags_non_hash
119
+ span = Instana::Span.new(:excon)
120
+ assert_nil span.set_tags(0)
121
+ end
122
+
123
+ def test_tags_standard
124
+ span = Instana::Span.new(:excon)
125
+ span.set_tag(:test, {a: 1})
126
+
127
+ assert_equal({test: {a: 1}}, span.tags)
128
+ assert_equal({a: 1}, span.tags(:test))
129
+ end
130
+
131
+ def test_log_standard
132
+ span = Instana::Span.new(:excon)
133
+ span.log(:test, Time.now, a: 1)
134
+
135
+ assert_equal({log: {a: 1}}, span.tags)
136
+ end
137
+
138
+ def test_log_error
139
+ time = Minitest::Mock.new
140
+ time.expect(:to_f, nil)
141
+
142
+ span = Instana::Span.new(:sdk)
143
+ span.log(:test, time, a: 1)
144
+
145
+ assert_equal({}, span.tags)
146
+ time.verify
147
+ end
148
+
149
+ def test_inc_processed_counts
150
+ clear_all!
151
+
152
+ span = Instana::Span.new(:excon)
153
+ span.close
154
+
155
+ metrics = Instana.processor.span_metrics
156
+
157
+ assert_equal 1, metrics[:opened]
158
+ assert_equal 1, metrics[:closed]
159
+
160
+ metrics = Instana.processor.span_metrics
161
+
162
+ assert_equal 0, metrics[:opened]
163
+ assert_equal 0, metrics[:closed]
164
+ end
165
+ end