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
@@ -1,4 +1,8 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
1
4
  require 'test_helper'
5
+ require 'support/apps/http_endpoint/boot'
2
6
 
3
7
  class NetHTTPTest < Minitest::Test
4
8
  def test_config_defaults
@@ -7,6 +11,42 @@ class NetHTTPTest < Minitest::Test
7
11
  assert_equal true, ::Instana.config[:nethttp][:enabled]
8
12
  end
9
13
 
14
+ def test_get_with_query
15
+ clear_all!
16
+ WebMock.allow_net_connect!
17
+
18
+ Instana.tracer.start_or_continue_trace(:"net-http-test") do
19
+ Net::HTTP.get(URI('http://127.0.0.1:6511/?query_value=true'))
20
+ end
21
+
22
+ spans = ::Instana.processor.queued_spans
23
+ assert_equal 3, spans.length
24
+
25
+ http_span = find_first_span_by_name(spans, :'net-http')
26
+ assert_equal "http://127.0.0.1:6511/", http_span[:data][:http][:url]
27
+ assert_equal "query_value=true", http_span[:data][:http][:params]
28
+
29
+ WebMock.disable_net_connect!
30
+ end
31
+
32
+ def test_get_without_query
33
+ clear_all!
34
+ WebMock.allow_net_connect!
35
+
36
+ Instana.tracer.start_or_continue_trace(:"net-http-test") do
37
+ Net::HTTP.get(URI('http://127.0.0.1:6511/'))
38
+ end
39
+
40
+ spans = ::Instana.processor.queued_spans
41
+ assert_equal 3, spans.length
42
+
43
+ http_span = find_first_span_by_name(spans, :'net-http')
44
+ assert_equal "http://127.0.0.1:6511/", http_span[:data][:http][:url]
45
+ assert_equal "200", http_span[:data][:http][:status]
46
+
47
+ WebMock.disable_net_connect!
48
+ end
49
+
10
50
  def test_block_request
11
51
  clear_all!
12
52
  WebMock.allow_net_connect!
@@ -0,0 +1,151 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2021
3
+
4
+ require 'test_helper'
5
+
6
+ class RackInstrumentedRequestTest < Minitest::Test
7
+ def test_skip_trace_with_header
8
+ req = Instana::InstrumentedRequest.new(
9
+ 'HTTP_X_INSTANA_L' => '0;sample-data'
10
+ )
11
+
12
+ assert req.skip_trace?
13
+ end
14
+
15
+ def test_skip_trace_without_header
16
+ req = Instana::InstrumentedRequest.new({})
17
+
18
+ refute req.skip_trace?
19
+ end
20
+
21
+ def test_incoming_context
22
+ id = Instana::Util.generate_id
23
+ req = Instana::InstrumentedRequest.new(
24
+ 'HTTP_X_INSTANA_L' => '1',
25
+ 'HTTP_X_INSTANA_T' => id,
26
+ 'HTTP_X_INSTANA_S' => id
27
+ )
28
+
29
+ expected = {
30
+ trace_id: id,
31
+ span_id: id,
32
+ from_w3: false,
33
+ level: '1'
34
+ }
35
+
36
+ assert_equal expected, req.incoming_context
37
+ refute req.continuing_from_trace_parent?
38
+ end
39
+
40
+ def test_incoming_w3_content
41
+ req = Instana::InstrumentedRequest.new(
42
+ 'HTTP_X_INSTANA_L' => '1',
43
+ 'HTTP_TRACEPARENT' => '00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01'
44
+ )
45
+
46
+ expected = {
47
+ external_trace_id: '4bf92f3577b34da6a3ce929d0e0e4736',
48
+ external_state: nil,
49
+ trace_id: 'a3ce929d0e0e4736',
50
+ span_id: '00f067aa0ba902b7',
51
+ from_w3: true,
52
+ level: '1'
53
+ }
54
+
55
+ assert_equal expected, req.incoming_context
56
+ assert req.continuing_from_trace_parent?
57
+ end
58
+
59
+ def test_incoming_w3_content_invalid_id
60
+ req = Instana::InstrumentedRequest.new(
61
+ 'HTTP_X_INSTANA_L' => '1',
62
+ 'HTTP_TRACEPARENT' => '00-00000000000000000000000000000000-0000000000000000-01'
63
+ )
64
+
65
+ expected = {
66
+ level: '1'
67
+ }
68
+
69
+ assert_equal expected, req.incoming_context
70
+ refute req.continuing_from_trace_parent?
71
+ end
72
+
73
+ def test_incoming_invalid_w3_content
74
+ req = Instana::InstrumentedRequest.new(
75
+ 'HTTP_X_INSTANA_L' => '1',
76
+ 'HTTP_TRACEPARENT' => '00-XXa3ce929d0e0e4736-00f67aa0ba902b7-01'
77
+ )
78
+
79
+ expected = {
80
+ level: '1'
81
+ }
82
+
83
+ assert_equal expected, req.incoming_context
84
+ end
85
+
86
+ def test_incoming_w3_state
87
+ req = Instana::InstrumentedRequest.new(
88
+ 'HTTP_TRACESTATE' => 'a=12345,in=123;abe,c=[+]'
89
+ )
90
+
91
+ expected = {
92
+ t: '123',
93
+ p: 'abe'
94
+ }
95
+
96
+ assert_equal expected, req.instana_ancestor
97
+ end
98
+
99
+ def test_request_tags
100
+ ::Instana.agent.define_singleton_method(:extra_headers) { %w[X-Capture-This] }
101
+
102
+ req = Instana::InstrumentedRequest.new(
103
+ 'HTTP_HOST' => 'example.com',
104
+ 'REQUEST_METHOD' => 'GET',
105
+ 'HTTP_X_CAPTURE_THIS' => 'that',
106
+ 'PATH_INFO' => '/',
107
+ 'QUERY_STRING' => 'test=true'
108
+ )
109
+
110
+ expected = {
111
+ method: 'GET',
112
+ url: '/',
113
+ host: 'example.com',
114
+ header: {
115
+ "X-Capture-This": 'that'
116
+ },
117
+ params: 'test=true'
118
+ }
119
+
120
+ assert_equal expected, req.request_tags
121
+ ::Instana.agent.singleton_class.send(:remove_method, :extra_headers)
122
+ end
123
+
124
+ def test_correlation_data_valid
125
+ req = Instana::InstrumentedRequest.new(
126
+ 'HTTP_X_INSTANA_L' => '1,correlationType=web ;correlationId=1234567890abcdef'
127
+ )
128
+ expected = {
129
+ type: 'web',
130
+ id: '1234567890abcdef'
131
+ }
132
+
133
+ assert_equal expected, req.correlation_data
134
+ end
135
+
136
+ def test_correlation_data_invalid
137
+ req = Instana::InstrumentedRequest.new(
138
+ 'HTTP_X_INSTANA_L' => '0;sample-data'
139
+ )
140
+
141
+ assert_equal({}, req.correlation_data)
142
+ end
143
+
144
+ def test_correlation_data_legacy
145
+ req = Instana::InstrumentedRequest.new(
146
+ 'HTTP_X_INSTANA_L' => '1'
147
+ )
148
+
149
+ assert_equal({}, req.correlation_data)
150
+ end
151
+ end
@@ -0,0 +1,404 @@
1
+ # (c) Copyright IBM Corp. 2021
2
+ # (c) Copyright Instana Inc. 2016
3
+
4
+ require 'test_helper'
5
+ require 'rack/test'
6
+ require 'rack/lobster'
7
+
8
+ class RackTest < Minitest::Test
9
+ include Rack::Test::Methods
10
+
11
+ class PathTemplateApp
12
+ def call(env)
13
+ env['INSTANA_HTTP_PATH_TEMPLATE'] = 'sample_template'
14
+ [200, {}, ['Ok']]
15
+ end
16
+ end
17
+
18
+ class ErrorApp
19
+ def call(_env)
20
+ raise 'An Error'
21
+ end
22
+ end
23
+
24
+ class FiveZeroOneApp
25
+ def call(_env)
26
+ [501, {}, ['No']]
27
+ end
28
+ end
29
+
30
+ class NoHeadersApp
31
+ def call(_env)
32
+ [501, nil, ['No']]
33
+ end
34
+ end
35
+
36
+ def app
37
+ @app = Rack::Builder.new do
38
+ use Rack::CommonLogger
39
+ use Rack::ShowExceptions
40
+ use Instana::Rack
41
+ map("/mrlobster") { run Rack::Lobster.new }
42
+ map("/path_tpl") { run PathTemplateApp.new }
43
+ map("/error") { run ErrorApp.new }
44
+ map("/five_zero_one") { run FiveZeroOneApp.new }
45
+ end
46
+ end
47
+
48
+ def test_basic_get
49
+ clear_all!
50
+ ::Instana.config[:collect_backtraces] = true
51
+
52
+ get '/mrlobster'
53
+ assert last_response.ok?
54
+
55
+ spans = ::Instana.processor.queued_spans
56
+
57
+ # Span validation
58
+ assert_equal 1, spans.count
59
+
60
+ rack_span = spans.first
61
+ assert_equal :rack, rack_span[:n]
62
+
63
+ assert last_response.headers.key?("X-Instana-T")
64
+ assert last_response.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
65
+ assert last_response.headers.key?("X-Instana-S")
66
+ assert last_response.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
67
+ assert last_response.headers.key?("X-Instana-L")
68
+ assert last_response.headers["X-Instana-L"] == '1'
69
+ assert last_response.headers.key?("Server-Timing")
70
+ assert last_response.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
71
+
72
+ # W3 Trace Context
73
+ assert_equal "00-#{rack_span[:t].rjust(32, '0')}-#{rack_span[:s]}-01", last_response.headers["Traceparent"]
74
+ assert_equal "in=#{rack_span[:t]};#{rack_span[:s]}", last_response.headers["Tracestate"]
75
+
76
+ assert rack_span.key?(:data)
77
+ assert rack_span[:data].key?(:http)
78
+ assert_equal "GET", rack_span[:data][:http][:method]
79
+ assert_equal "/mrlobster", rack_span[:data][:http][:url]
80
+ assert_equal 200, rack_span[:data][:http][:status]
81
+ assert_equal 'example.org', rack_span[:data][:http][:host]
82
+ assert rack_span.key?(:f)
83
+ assert !rack_span.key?(:stack)
84
+
85
+ # Restore to default
86
+ ::Instana.config[:collect_backtraces] = false
87
+ end
88
+
89
+ def test_basic_get_with_custom_service_name
90
+ ENV['INSTANA_SERVICE_NAME'] = 'WalterBishop'
91
+
92
+ clear_all!
93
+ get '/mrlobster'
94
+ assert last_response.ok?
95
+
96
+ spans = ::Instana.processor.queued_spans
97
+
98
+ # Span validation
99
+ assert_equal 1, spans.count
100
+
101
+ rack_span = spans.first
102
+ assert_equal 'WalterBishop', rack_span[:data][:service]
103
+
104
+ ENV.delete('INSTANA_SERVICE_NAME')
105
+ end
106
+
107
+ def test_basic_post
108
+ clear_all!
109
+ post '/mrlobster'
110
+ assert last_response.ok?
111
+
112
+ spans = ::Instana.processor.queued_spans
113
+
114
+ # Span validation
115
+ assert_equal 1, spans.count
116
+ rack_span = spans.first
117
+ assert_equal :rack, rack_span[:n]
118
+
119
+ assert last_response.headers.key?("X-Instana-T")
120
+ assert last_response.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
121
+ assert last_response.headers.key?("X-Instana-S")
122
+ assert last_response.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
123
+ assert last_response.headers.key?("X-Instana-L")
124
+ assert last_response.headers["X-Instana-L"] == '1'
125
+ assert last_response.headers.key?("Server-Timing")
126
+ assert last_response.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
127
+
128
+ assert rack_span.key?(:data)
129
+ assert rack_span[:data].key?(:http)
130
+ assert_equal "POST", rack_span[:data][:http][:method]
131
+ assert_equal "/mrlobster", rack_span[:data][:http][:url]
132
+ assert_equal 200, rack_span[:data][:http][:status]
133
+ assert rack_span.key?(:f)
134
+ end
135
+
136
+ def test_basic_put
137
+ clear_all!
138
+ put '/mrlobster'
139
+ assert last_response.ok?
140
+
141
+ spans = ::Instana.processor.queued_spans
142
+
143
+ # Span validation
144
+ assert_equal 1, spans.count
145
+ rack_span = spans.first
146
+ assert_equal :rack, rack_span[:n]
147
+
148
+ assert last_response.headers.key?("X-Instana-T")
149
+ assert last_response.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
150
+ assert last_response.headers.key?("X-Instana-S")
151
+ assert last_response.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
152
+ assert last_response.headers.key?("X-Instana-L")
153
+ assert last_response.headers["X-Instana-L"] == '1'
154
+ assert last_response.headers.key?("Server-Timing")
155
+ assert last_response.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
156
+
157
+ assert rack_span.key?(:data)
158
+ assert rack_span[:data].key?(:http)
159
+ assert_equal "PUT", rack_span[:data][:http][:method]
160
+ assert_equal "/mrlobster", rack_span[:data][:http][:url]
161
+ assert_equal 200, rack_span[:data][:http][:status]
162
+ assert rack_span.key?(:f)
163
+ end
164
+
165
+ def test_context_continuation
166
+ clear_all!
167
+ continuation_id = Instana::Util.generate_id
168
+ header 'X-INSTANA-T', continuation_id
169
+ header 'X-INSTANA-S', continuation_id
170
+
171
+ get '/mrlobster'
172
+ assert last_response.ok?
173
+
174
+ spans = ::Instana.processor.queued_spans
175
+
176
+ # Span validation
177
+ assert_equal 1, spans.count
178
+ rack_span = spans.first
179
+ assert_equal :rack, rack_span[:n]
180
+
181
+ assert last_response.headers.key?("X-Instana-T")
182
+ assert last_response.headers["X-Instana-T"] == ::Instana::Util.id_to_header(rack_span[:t])
183
+ assert last_response.headers.key?("X-Instana-S")
184
+ assert last_response.headers["X-Instana-S"] == ::Instana::Util.id_to_header(rack_span[:s])
185
+ assert last_response.headers.key?("X-Instana-L")
186
+ assert last_response.headers["X-Instana-L"] == '1'
187
+ assert last_response.headers.key?("Server-Timing")
188
+ assert last_response.headers["Server-Timing"] == "intid;desc=#{::Instana::Util.id_to_header(rack_span[:t])}"
189
+
190
+ assert rack_span.key?(:data)
191
+ assert rack_span[:data].key?(:http)
192
+ assert_equal "GET", rack_span[:data][:http][:method]
193
+ assert_equal "/mrlobster", rack_span[:data][:http][:url]
194
+ assert_equal 200, rack_span[:data][:http][:status]
195
+ assert rack_span.key?(:f)
196
+
197
+ # Context validation
198
+ # The first span should have the passed in trace ID
199
+ # and specify the passed in span ID as it's parent.
200
+ assert_equal continuation_id, rack_span[:t]
201
+ assert_equal continuation_id, rack_span[:p]
202
+ end
203
+
204
+ def test_correlation_information
205
+ clear_all!
206
+
207
+ header 'X-INSTANA-L', '1,correlationType=test;correlationId=abcdefh123'
208
+
209
+ get '/mrlobster'
210
+ assert last_response.ok?
211
+
212
+ spans = ::Instana.processor.queued_spans
213
+
214
+ # Span validation
215
+ assert_equal 1, spans.count
216
+ rack_span = spans.first
217
+ assert_equal :rack, rack_span[:n]
218
+
219
+ assert_equal 'abcdefh123', rack_span[:crid]
220
+ assert_equal 'test', rack_span[:crtp]
221
+ end
222
+
223
+
224
+ def test_instana_response_headers
225
+ clear_all!
226
+ get '/mrlobster'
227
+ assert last_response.ok?
228
+
229
+ refute_nil last_response.headers.key?("X-Instana-T")
230
+ refute_nil last_response.headers.key?("X-Instana-S")
231
+ end
232
+
233
+ def test_that_url_params_not_logged
234
+ clear_all!
235
+ get '/mrlobster?blah=2&wilma=1&betty=2;fred=3'
236
+
237
+ spans = ::Instana.processor.queued_spans
238
+ assert_equal 1, spans.length
239
+
240
+ refute_nil spans.first.key?(:data)
241
+ refute_nil spans.first[:data].key?(:http)
242
+ refute_nil spans.first[:data][:http].key?(:url)
243
+ assert_equal '/mrlobster', spans.first[:data][:http][:url]
244
+
245
+ assert last_response.ok?
246
+ end
247
+
248
+ def test_custom_headers_capture
249
+ clear_all!
250
+ ::Instana.config[:collect_backtraces] = true
251
+ ::Instana.agent.define_singleton_method(:extra_headers) { %w(X-Capture-This X-Capture-That) }
252
+
253
+ get '/mrlobster', {}, { "HTTP_X_CAPTURE_THIS" => "ThereYouGo" }
254
+ assert last_response.ok?
255
+ assert_equal "ThereYouGo", last_request.env["HTTP_X_CAPTURE_THIS"]
256
+
257
+ spans = ::Instana.processor.queued_spans
258
+
259
+ # Span validation
260
+ assert_equal 1, spans.count
261
+ rack_span = spans.first
262
+
263
+ assert rack_span[:data][:http].key?(:header)
264
+ assert rack_span[:data][:http][:header].key?(:"X-Capture-This")
265
+ assert !rack_span[:data][:http][:header].key?(:"X-Capture-That")
266
+ assert_equal "ThereYouGo", rack_span[:data][:http][:header][:"X-Capture-This"]
267
+ assert !rack_span.key?(:stack)
268
+
269
+ # Restore to default
270
+ ::Instana.config[:collect_backtraces] = false
271
+ ::Instana.agent.singleton_class.send(:remove_method, :extra_headers)
272
+ end
273
+
274
+ def test_capture_http_path_template
275
+ clear_all!
276
+
277
+ get '/path_tpl'
278
+ assert last_response.ok?
279
+
280
+ spans = ::Instana.processor.queued_spans
281
+ assert_equal 1, spans.length
282
+
283
+ rack_span = spans.first
284
+ assert_equal :rack, rack_span[:n]
285
+ assert_equal 'sample_template', rack_span[:data][:http][:path_tpl]
286
+ end
287
+
288
+ def test_basic_get_with_x_instana_synthetic
289
+ header 'X-INSTANA-SYNTHETIC', '1'
290
+
291
+ clear_all!
292
+ get '/mrlobster'
293
+ assert last_response.ok?
294
+
295
+ spans = ::Instana.processor.queued_spans
296
+
297
+ # Span validation
298
+ assert_equal 1, spans.count
299
+
300
+ first_span = spans.first
301
+ assert_equal true, first_span[:sy]
302
+ end
303
+
304
+ def test_basic_get_with_w3_trace
305
+ clear_all!
306
+
307
+ header 'TRACEPARENT', '00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01'
308
+
309
+ get '/mrlobster'
310
+ assert last_response.ok?
311
+
312
+ spans = ::Instana.processor.queued_spans
313
+ assert_equal 1, spans.count
314
+
315
+ first_span = spans.first
316
+ assert_equal :rack, first_span[:n]
317
+ assert_equal 'a3ce929d0e0e4736', first_span[:t]
318
+ assert_equal '00f067aa0ba902b7', first_span[:p]
319
+ assert_equal '4bf92f3577b34da6a3ce929d0e0e4736', first_span[:lt]
320
+ assert_nil first_span[:ia]
321
+ assert first_span[:tp]
322
+ end
323
+
324
+ def test_basic_get_with_w3_disabled
325
+ clear_all!
326
+ ::Instana.config[:w3_trace_correlation] = false
327
+
328
+ header 'TRACEPARENT', '00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01'
329
+
330
+ get '/mrlobster'
331
+ assert last_response.ok?
332
+
333
+ spans = ::Instana.processor.queued_spans
334
+ assert_equal 1, spans.count
335
+
336
+ first_span = spans.first
337
+ assert_equal :rack, first_span[:n]
338
+ refute first_span[:tp]
339
+ ::Instana.config[:w3_trace_correlation] = true
340
+ end
341
+
342
+ def test_skip_trace
343
+ clear_all!
344
+ header 'X_INSTANA_L', '0;junk'
345
+
346
+ get '/mrlobster'
347
+ assert last_response.ok?
348
+
349
+ spans = ::Instana.processor.queued_spans
350
+ assert_equal 0, spans.count
351
+ end
352
+
353
+ def test_disable_trace
354
+ clear_all!
355
+ ::Instana.config[:tracing][:enabled] = false
356
+
357
+ get '/mrlobster'
358
+ assert last_response.ok?
359
+
360
+ spans = ::Instana.processor.queued_spans
361
+ assert_equal 0, spans.count
362
+ ::Instana.config[:tracing][:enabled] = true
363
+ end
364
+
365
+ def test_error_trace
366
+ clear_all!
367
+
368
+ get '/error'
369
+ refute last_response.ok?
370
+
371
+ spans = ::Instana.processor.queued_spans
372
+ assert_equal 1, spans.count
373
+
374
+ first_span = spans.first
375
+ assert_equal :rack, first_span[:n]
376
+ assert_equal 1, first_span[:ec]
377
+ end
378
+
379
+ def test_disable_trace_with_error
380
+ clear_all!
381
+ ::Instana.config[:tracing][:enabled] = false
382
+
383
+ get '/error'
384
+ refute last_response.ok?
385
+
386
+ spans = ::Instana.processor.queued_spans
387
+ assert_equal 0, spans.count
388
+ ::Instana.config[:tracing][:enabled] = true
389
+ end
390
+
391
+ def test_five_zero_x_trace
392
+ clear_all!
393
+
394
+ get '/five_zero_one'
395
+ refute last_response.ok?
396
+
397
+ spans = ::Instana.processor.queued_spans
398
+ assert_equal 1, spans.count
399
+
400
+ first_span = spans.first
401
+ assert_equal :rack, first_span[:n]
402
+ assert_equal 1, first_span[:ec]
403
+ end
404
+ end