instana 1.10.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +23 -0
  3. data/.gitignore +16 -0
  4. data/.rubocop.yml +1156 -0
  5. data/.travis.yml +43 -0
  6. data/Configuration.md +149 -0
  7. data/Dockerfile +13 -0
  8. data/Gemfile +41 -0
  9. data/LICENSE +21 -0
  10. data/README.md +102 -0
  11. data/Rakefile +56 -0
  12. data/Tracing.md +145 -0
  13. data/Troubleshooting.md +32 -0
  14. data/benchmarks/Gemfile +7 -0
  15. data/benchmarks/id_generation.rb +12 -0
  16. data/benchmarks/opentracing.rb +26 -0
  17. data/benchmarks/rack_vanilla_vs_traced.rb +80 -0
  18. data/benchmarks/stackprof_rack_tracing.rb +77 -0
  19. data/benchmarks/time_processing.rb +12 -0
  20. data/bin/console +7 -0
  21. data/bin/setup +8 -0
  22. data/examples/opentracing.rb +31 -0
  23. data/examples/tracing.rb +80 -0
  24. data/gemfiles/libraries.gemfile +71 -0
  25. data/gemfiles/rails32.gemfile +51 -0
  26. data/gemfiles/rails42.gemfile +50 -0
  27. data/gemfiles/rails50.gemfile +52 -0
  28. data/instana.gemspec +46 -0
  29. data/lib/instana.rb +12 -0
  30. data/lib/instana/agent.rb +441 -0
  31. data/lib/instana/agent/helpers.rb +61 -0
  32. data/lib/instana/agent/hooks.rb +37 -0
  33. data/lib/instana/agent/tasks.rb +48 -0
  34. data/lib/instana/base.rb +54 -0
  35. data/lib/instana/collector.rb +116 -0
  36. data/lib/instana/collectors/gc.rb +57 -0
  37. data/lib/instana/collectors/memory.rb +34 -0
  38. data/lib/instana/collectors/thread.rb +30 -0
  39. data/lib/instana/config.rb +79 -0
  40. data/lib/instana/eum/eum-test.js.erb +16 -0
  41. data/lib/instana/eum/eum.js.erb +14 -0
  42. data/lib/instana/frameworks/cuba.rb +6 -0
  43. data/lib/instana/frameworks/instrumentation/abstract_mysql_adapter.rb +58 -0
  44. data/lib/instana/frameworks/instrumentation/action_controller.rb +183 -0
  45. data/lib/instana/frameworks/instrumentation/action_view.rb +43 -0
  46. data/lib/instana/frameworks/instrumentation/active_record.rb +27 -0
  47. data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +81 -0
  48. data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +56 -0
  49. data/lib/instana/frameworks/instrumentation/postgresql_adapter.rb +71 -0
  50. data/lib/instana/frameworks/rails.rb +42 -0
  51. data/lib/instana/frameworks/roda.rb +6 -0
  52. data/lib/instana/frameworks/sinatra.rb +9 -0
  53. data/lib/instana/helpers.rb +40 -0
  54. data/lib/instana/instrumentation.rb +21 -0
  55. data/lib/instana/instrumentation/dalli.rb +78 -0
  56. data/lib/instana/instrumentation/excon.rb +74 -0
  57. data/lib/instana/instrumentation/grpc.rb +84 -0
  58. data/lib/instana/instrumentation/net-http.rb +66 -0
  59. data/lib/instana/instrumentation/rack.rb +77 -0
  60. data/lib/instana/instrumentation/redis.rb +82 -0
  61. data/lib/instana/instrumentation/resque.rb +131 -0
  62. data/lib/instana/instrumentation/rest-client.rb +34 -0
  63. data/lib/instana/instrumentation/sidekiq-client.rb +45 -0
  64. data/lib/instana/instrumentation/sidekiq-worker.rb +54 -0
  65. data/lib/instana/opentracing/carrier.rb +4 -0
  66. data/lib/instana/opentracing/tracer.rb +18 -0
  67. data/lib/instana/rack.rb +10 -0
  68. data/lib/instana/setup.rb +36 -0
  69. data/lib/instana/test.rb +40 -0
  70. data/lib/instana/thread_local.rb +15 -0
  71. data/lib/instana/tracer.rb +392 -0
  72. data/lib/instana/tracing/processor.rb +92 -0
  73. data/lib/instana/tracing/span.rb +401 -0
  74. data/lib/instana/tracing/span_context.rb +33 -0
  75. data/lib/instana/util.rb +261 -0
  76. data/lib/instana/version.rb +4 -0
  77. data/lib/oj_check.rb +16 -0
  78. data/lib/opentracing.rb +6 -0
  79. data/test/agent/agent_test.rb +143 -0
  80. data/test/apps/cuba.rb +15 -0
  81. data/test/apps/grpc_server.rb +81 -0
  82. data/test/apps/roda.rb +10 -0
  83. data/test/apps/sinatra.rb +5 -0
  84. data/test/benchmarks/bench_id_generation.rb +12 -0
  85. data/test/benchmarks/bench_opentracing.rb +13 -0
  86. data/test/config_test.rb +37 -0
  87. data/test/frameworks/cuba_test.rb +44 -0
  88. data/test/frameworks/rack_test.rb +167 -0
  89. data/test/frameworks/rails/actioncontroller_test.rb +93 -0
  90. data/test/frameworks/rails/actionview3_test.rb +255 -0
  91. data/test/frameworks/rails/actionview4_test.rb +254 -0
  92. data/test/frameworks/rails/actionview5_test.rb +221 -0
  93. data/test/frameworks/rails/activerecord3_test.rb +134 -0
  94. data/test/frameworks/rails/activerecord4_test.rb +134 -0
  95. data/test/frameworks/rails/activerecord5_test.rb +87 -0
  96. data/test/frameworks/roda_test.rb +44 -0
  97. data/test/frameworks/sinatra_test.rb +44 -0
  98. data/test/instana_test.rb +27 -0
  99. data/test/instrumentation/dalli_test.rb +253 -0
  100. data/test/instrumentation/excon_test.rb +147 -0
  101. data/test/instrumentation/grpc_test.rb +377 -0
  102. data/test/instrumentation/net-http_test.rb +160 -0
  103. data/test/instrumentation/redis_test.rb +119 -0
  104. data/test/instrumentation/resque_test.rb +128 -0
  105. data/test/instrumentation/rest-client_test.rb +55 -0
  106. data/test/instrumentation/sidekiq-client_test.rb +125 -0
  107. data/test/instrumentation/sidekiq-worker_test.rb +173 -0
  108. data/test/jobs/resque_error_job.rb +22 -0
  109. data/test/jobs/resque_fast_job.rb +20 -0
  110. data/test/jobs/sidekiq_job_1.rb +6 -0
  111. data/test/jobs/sidekiq_job_2.rb +7 -0
  112. data/test/models/block.rb +18 -0
  113. data/test/servers/grpc_50051.rb +20 -0
  114. data/test/servers/helpers/sidekiq_worker_initializer.rb +27 -0
  115. data/test/servers/rackapp_6511.rb +25 -0
  116. data/test/servers/rails_3205.rb +167 -0
  117. data/test/servers/sidekiq/worker.rb +27 -0
  118. data/test/test_helper.rb +145 -0
  119. data/test/tracing/custom_test.rb +158 -0
  120. data/test/tracing/id_management_test.rb +130 -0
  121. data/test/tracing/opentracing_test.rb +335 -0
  122. data/test/tracing/trace_test.rb +67 -0
  123. data/test/tracing/tracer_async_test.rb +198 -0
  124. data/test/tracing/tracer_test.rb +223 -0
  125. metadata +327 -0
@@ -0,0 +1,130 @@
1
+
2
+ require 'test_helper'
3
+
4
+ class TracerIDMgmtTest < Minitest::Test
5
+ def test_id_to_header_conversion
6
+ # Test passing a standard Integer ID
7
+ original_id = ::Instana::Util.generate_id
8
+ converted_id = Instana::Util.id_to_header(original_id)
9
+
10
+ # Assert that it is a string and there are no non-hex characters
11
+ assert converted_id.is_a?(String)
12
+ assert !converted_id[/\H/]
13
+
14
+ # Test passing a standard Integer ID as a String
15
+ original_id = ::Instana::Util.generate_id
16
+ converted_id = Instana::Util.id_to_header(original_id)
17
+
18
+ # Assert that it is a string and there are no non-hex characters
19
+ assert converted_id.is_a?(String)
20
+ assert !converted_id[/\H/]
21
+ end
22
+
23
+ def test_id_to_header_conversion_with_bogus_id
24
+ # Test passing an empty String
25
+ converted_id = Instana::Util.id_to_header('')
26
+
27
+ # Assert that it is a string and there are no non-hex characters
28
+ assert converted_id.is_a?(String)
29
+ assert converted_id == ''
30
+
31
+ # Test passing a nil
32
+ converted_id = Instana::Util.id_to_header(nil)
33
+
34
+ # Assert that it is a string and there are no non-hex characters
35
+ assert converted_id.is_a?(String)
36
+ assert converted_id == ''
37
+
38
+ # Test passing an Array
39
+ converted_id = Instana::Util.id_to_header([])
40
+
41
+ # Assert that it is a string and there are no non-hex characters
42
+ assert converted_id.is_a?(String)
43
+ assert converted_id == ''
44
+ end
45
+
46
+ def test_header_to_id_conversion
47
+ # Get a hex string to test against & convert
48
+ header_id = Instana::Util.id_to_header(::Instana::Util.generate_id)
49
+ converted_id = Instana::Util.header_to_id(header_id)
50
+
51
+ # Assert that it is an Integer
52
+ assert converted_id.is_a?(Integer)
53
+ end
54
+
55
+ def test_header_to_id_conversion_with_bogus_header
56
+ # Bogus nil arg
57
+ bogus_result = Instana::Util.header_to_id(nil)
58
+ assert_equal 0, bogus_result
59
+
60
+ # Bogus Integer arg
61
+ bogus_result = Instana::Util.header_to_id(1234)
62
+ assert_equal 0, bogus_result
63
+
64
+ # Bogus Array arg
65
+ 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
99
+
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)
111
+ end
112
+
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
129
+ end
130
+ end
@@ -0,0 +1,335 @@
1
+ require 'test_helper'
2
+ require 'rack/test'
3
+ require 'rack/lobster'
4
+ require "opentracing"
5
+
6
+ module Instana
7
+ class OTRack1
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ otrack1_span = OpenTracing.start_span(:otrack1)
14
+ result = @app.call(env)
15
+ otrack1_span.finish
16
+ result
17
+ end
18
+ end
19
+
20
+ class OTRack2
21
+ def initialize(app)
22
+ @app = app
23
+ end
24
+
25
+ def call(env)
26
+ otrack2_span = OpenTracing.start_span(:otrack2)
27
+ result = @app.call(env)
28
+ otrack2_span.finish
29
+ result
30
+ end
31
+ end
32
+ end
33
+
34
+ OpenTracing.global_tracer = ::Instana.tracer
35
+
36
+ class OpenTracerTest < Minitest::Test
37
+ include Rack::Test::Methods
38
+
39
+ def app
40
+ @app = Rack::Builder.new {
41
+ use Instana::Rack
42
+ use Instana::OTRack1
43
+ use Rack::CommonLogger
44
+ use Rack::ShowExceptions
45
+ use Instana::OTRack2
46
+ map "/mrlobster" do
47
+ run Rack::Lobster.new
48
+ end
49
+ }
50
+ end
51
+
52
+ def test_supplies_all_ot_interfaces
53
+ clear_all!
54
+ assert defined?(OpenTracing)
55
+ assert OpenTracing.respond_to?(:global_tracer)
56
+ assert OpenTracing.global_tracer.respond_to?(:start_span)
57
+ assert OpenTracing.global_tracer.respond_to?(:inject)
58
+ assert OpenTracing.global_tracer.respond_to?(:extract)
59
+
60
+ assert defined?(OpenTracing::Carrier)
61
+ carrier = OpenTracing::Carrier.new
62
+ assert carrier.respond_to?(:[])
63
+ assert carrier.respond_to?(:[]=)
64
+ assert carrier.respond_to?(:each)
65
+
66
+ span = OpenTracing.start_span(:blah)
67
+ assert span.respond_to?(:finish)
68
+ assert span.respond_to?(:set_tag)
69
+ assert span.respond_to?(:tags)
70
+ assert span.respond_to?(:operation_name=)
71
+ assert span.respond_to?(:set_baggage_item)
72
+ assert span.respond_to?(:get_baggage_item)
73
+ assert span.respond_to?(:context)
74
+ assert span.respond_to?(:log)
75
+ end
76
+
77
+ def test_basic_get_with_opentracing
78
+ clear_all!
79
+ get '/mrlobster'
80
+ assert last_response.ok?
81
+
82
+ spans = ::Instana.processor.queued_spans
83
+ assert_equal 3, spans.length
84
+
85
+ first_span = find_first_span_by_name(spans, :rack)
86
+ second_span = find_first_span_by_name(spans, :otrack1)
87
+ third_span = find_first_span_by_name(spans, :otrack2)
88
+
89
+ assert_equal :rack, first_span[:n]
90
+ assert first_span[:ts].is_a?(Integer)
91
+ assert first_span[:ts] > 0
92
+ assert first_span[:d].is_a?(Integer)
93
+ assert first_span[:d].between?(0, 5)
94
+ assert first_span.key?(:data)
95
+ assert first_span[:data].key?(:http)
96
+ assert_equal "GET", first_span[:data][:http][:method]
97
+ assert_equal "/mrlobster", first_span[:data][:http][:url]
98
+ assert_equal 200, first_span[:data][:http][:status]
99
+ assert_equal 'example.org', first_span[:data][:http][:host]
100
+ assert_equal :otrack1, second_span[:data][:sdk][:name]
101
+ assert second_span.key?(:data)
102
+ assert second_span[:data].key?(:sdk)
103
+ assert second_span[:data][:sdk].key?(:name)
104
+ assert_equal :otrack2, third_span[:data][:sdk][:name]
105
+ assert third_span.key?(:data)
106
+ assert third_span[:data].key?(:sdk)
107
+ assert third_span[:data][:sdk].key?(:name)
108
+
109
+ # ID Validation
110
+ refute_equal first_span[:t], second_span[:t]
111
+ refute_equal second_span[:t], third_span[:t]
112
+ end
113
+
114
+ def test_get_with_inject_extract
115
+ clear_all!
116
+
117
+ trace_id = ::Instana::Util.generate_id
118
+ span_id = ::Instana::Util.generate_id
119
+
120
+ header 'X-Instana-T', ::Instana::Util.id_to_header(trace_id)
121
+ header 'X-Instana-S', ::Instana::Util.id_to_header(span_id)
122
+
123
+ get '/mrlobster'
124
+ assert last_response.ok?
125
+
126
+ spans = ::Instana.processor.queued_spans
127
+
128
+ assert_equal 3, spans.length
129
+ first_span = find_first_span_by_name(spans, :rack)
130
+
131
+ # Make sure context was picked up and continued in the resulting
132
+ # trace
133
+ assert_equal trace_id, first_span[:t]
134
+ assert_equal span_id, first_span[:p]
135
+ end
136
+
137
+ def test_start_span_with_tags
138
+ clear_all!
139
+ span = OpenTracing.start_span('my_app_entry')
140
+
141
+ assert span.is_a?(::Instana::Span)
142
+
143
+ span.set_tag(:tag_integer, 1234)
144
+ span.set_tag(:tag_boolean, true)
145
+ span.set_tag(:tag_array, [1,2,3,4])
146
+ span.set_tag(:tag_string, "1234")
147
+
148
+ assert_equal 1234, span.tags(:tag_integer)
149
+ assert_equal true, span.tags(:tag_boolean)
150
+ assert_equal [1,2,3,4], span.tags(:tag_array)
151
+ assert_equal "1234", span.tags(:tag_string)
152
+ span.finish
153
+ end
154
+
155
+ def test_start_span_with_custom_start_time
156
+ clear_all!
157
+ now = Time.now
158
+ now_in_ms = ::Instana::Util.time_to_ms(now)
159
+
160
+ span = OpenTracing.start_span('my_app_entry', :start_time => now)
161
+
162
+ assert span.is_a?(::Instana::Span)
163
+
164
+ span.set_tag(:tag_integer, 1234)
165
+ span.set_tag(:tag_boolean, true)
166
+ span.set_tag(:tag_array, [1,2,3,4])
167
+ span.set_tag(:tag_string, "1234")
168
+
169
+ assert_equal 1234, span.tags(:tag_integer)
170
+ assert_equal true, span.tags(:tag_boolean)
171
+ assert_equal [1,2,3,4], span.tags(:tag_array)
172
+ assert_equal "1234", span.tags(:tag_string)
173
+ span.finish
174
+
175
+ assert span[:ts].is_a?(Integer)
176
+ assert_equal now_in_ms, span[:ts]
177
+ assert span[:d].is_a?(Integer)
178
+ assert span[:d].between?(0, 5)
179
+ end
180
+
181
+ def test_span_kind_translation
182
+ clear_all!
183
+ span = OpenTracing.start_span('my_app_entry')
184
+
185
+ assert span.is_a?(::Instana::Span)
186
+
187
+ span.set_tag(:'span.kind', :server)
188
+ assert_equal :entry, span[:data][:sdk][:type]
189
+ assert_equal 1, span[:k]
190
+
191
+ span.set_tag(:'span.kind', :consumer)
192
+ assert_equal :entry, span[:data][:sdk][:type]
193
+ assert_equal 1, span[:k]
194
+
195
+ span.set_tag(:'span.kind', :client)
196
+ assert_equal :exit, span[:data][:sdk][:type]
197
+ assert_equal 2, span[:k]
198
+
199
+ span.set_tag(:'span.kind', :producer)
200
+ assert_equal :exit, span[:data][:sdk][:type]
201
+ assert_equal 2, span[:k]
202
+
203
+ span[:data][:sdk].delete(:type)
204
+ span.set_tag(:'span.kind', :blah)
205
+ assert_equal :intermediate, span[:data][:sdk][:type]
206
+ assert_equal 3, span[:k]
207
+ assert_equal :blah, span[:data][:sdk][:custom][:tags][:'span.kind']
208
+
209
+ span.finish
210
+ end
211
+
212
+ def test_start_span_with_baggage
213
+ clear_all!
214
+ span = OpenTracing.start_span('my_app_entry')
215
+ span.set_baggage_item(:baggage_integer, 1234)
216
+ span.set_baggage_item(:baggage_boolean, false)
217
+ span.set_baggage_item(:baggage_array, [1,2,3,4])
218
+ span.set_baggage_item(:baggage_string, '1234')
219
+
220
+ assert_equal 1234, span.get_baggage_item(:baggage_integer)
221
+ assert_equal false, span.get_baggage_item(:baggage_boolean)
222
+ assert_equal [1,2,3,4], span.get_baggage_item(:baggage_array)
223
+ assert_equal "1234", span.get_baggage_item(:baggage_string)
224
+ span.finish
225
+ end
226
+
227
+ def test_start_span_with_timestamps
228
+ clear_all!
229
+ span_tags = {:start_tag => 1234, :another_tag => 'tag_value'}
230
+
231
+ ts_start = Time.now - 1 # Put start time a bit in the past
232
+ ts_start_ms = ::Instana::Util.time_to_ms(ts_start)
233
+
234
+ span = OpenTracing.start_span('my_app_entry', tags: span_tags, start_time: ts_start)
235
+ sleep 0.1
236
+
237
+ ts_finish = Time.now + 5 # Put end time in the future
238
+ ts_finish_ms = ::Instana::Util.time_to_ms(ts_finish)
239
+
240
+ span.finish(ts_finish)
241
+
242
+ assert_equal ts_start_ms, span[:ts]
243
+ assert_equal (ts_finish_ms - ts_start_ms), span[:d]
244
+
245
+ assert_equal 1234, span[:data][:sdk][:custom][:tags][:start_tag]
246
+ assert_equal 'tag_value', span[:data][:sdk][:custom][:tags][:another_tag]
247
+ end
248
+
249
+ def test_nested_spans_using_child_of
250
+ clear_all!
251
+ entry_span = OpenTracing.start_span(:rack)
252
+ ac_span = OpenTracing.start_span(:action_controller, child_of: entry_span)
253
+ av_span = OpenTracing.start_span(:action_view, child_of: ac_span)
254
+ sleep 0.1
255
+ av_span.finish
256
+ ac_span.finish
257
+ entry_span.finish
258
+
259
+ spans = ::Instana.processor.queued_spans
260
+ assert_equal 3, spans.length
261
+
262
+ first_span = find_first_span_by_name(spans, :rack)
263
+ second_span = find_first_span_by_name(spans, :action_controller)
264
+ third_span = find_first_span_by_name(spans, :action_view)
265
+
266
+ # IDs
267
+ assert_equal first_span[:t], second_span[:t]
268
+ assert_equal second_span[:t], third_span[:t]
269
+
270
+ # Linkage
271
+ assert first_span[:p].nil?
272
+ assert_equal first_span[:s], second_span[:p]
273
+ assert_equal second_span[:s], third_span[:p]
274
+ end
275
+
276
+ def test_nested_spans_with_baggage
277
+ clear_all!
278
+ entry_span = OpenTracing.start_span(:rack)
279
+ ac_span = OpenTracing.start_span(:action_controller, child_of: entry_span)
280
+ ac_span.set_baggage_item(:my_bag, 1)
281
+ av_span = OpenTracing.start_span(:action_view, child_of: ac_span)
282
+ sleep 0.1
283
+ av_span.finish
284
+ ac_span.finish
285
+ entry_span.finish
286
+
287
+ spans = ::Instana.processor.queued_spans
288
+ assert_equal 3, spans.length
289
+
290
+ first_span = find_first_span_by_name(spans, :rack)
291
+ second_span = find_first_span_by_name(spans, :action_controller)
292
+ third_span = find_first_span_by_name(spans, :action_view)
293
+
294
+ # IDs
295
+ assert_equal first_span[:t], second_span[:t]
296
+ assert_equal second_span[:t], third_span[:t]
297
+
298
+ # Linkage
299
+ assert first_span[:p].nil?
300
+ assert_equal first_span[:s], second_span[:p]
301
+ assert_equal second_span[:s], third_span[:p]
302
+
303
+ # Every span should have baggage
304
+ assert_equal(nil, entry_span.context.baggage)
305
+ assert_equal({:my_bag=>1}, ac_span.context.baggage)
306
+ assert_equal({:my_bag=>1}, av_span.context.baggage)
307
+ end
308
+
309
+ def test_context_should_carry_baggage
310
+ clear_all!
311
+
312
+ entry_span = OpenTracing.start_span(:rack)
313
+ entry_span_context = entry_span.context
314
+
315
+ ac_span = OpenTracing.start_span(:action_controller, child_of: entry_span)
316
+ ac_span.set_baggage_item(:my_bag, 1)
317
+ ac_span_context = ac_span.context
318
+
319
+ av_span = OpenTracing.start_span(:action_view, child_of: entry_span)
320
+ av_span_context = av_span.context
321
+
322
+ sleep 0.1
323
+
324
+ av_span.finish
325
+ ac_span.finish
326
+ entry_span.finish
327
+
328
+ spans = ::Instana.processor.queued_spans
329
+ assert_equal 3, spans.length
330
+
331
+ assert_equal(nil, entry_span.context.baggage)
332
+ assert_equal({:my_bag=>1}, ac_span.context.baggage)
333
+ assert_equal(nil, av_span.context.baggage)
334
+ end
335
+ end