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,147 @@
1
+ require 'test_helper'
2
+
3
+ class ExconTest < Minitest::Test
4
+ def test_config_defaults
5
+ assert ::Instana.config[:excon].is_a?(Hash)
6
+ assert ::Instana.config[:excon].key?(:enabled)
7
+ assert_equal true, ::Instana.config[:excon][:enabled]
8
+ end
9
+
10
+ def test_basic_get
11
+ clear_all!
12
+
13
+ # A slight hack but webmock chokes with pipelined requests.
14
+ # Delete their excon middleware
15
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
16
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
17
+
18
+ url = "http://127.0.0.1:6511"
19
+
20
+ connection = Excon.new(url)
21
+ Instana.tracer.start_or_continue_trace('excon-test') do
22
+ connection.get(:path => '/?basic_get')
23
+ end
24
+
25
+ spans = ::Instana.processor.queued_spans
26
+ assert_equal 3, spans.length
27
+
28
+ sdk_span = find_first_span_by_name(spans, :'excon-test')
29
+ excon_span = find_first_span_by_name(spans, :excon)
30
+ rack_span = find_first_span_by_name(spans, :rack)
31
+
32
+ validate_sdk_span(sdk_span, {:name => :'excon-test', :type => :intermediate})
33
+
34
+ # data keys/values
35
+ refute_nil excon_span.key?(:data)
36
+ refute_nil excon_span[:data].key?(:http)
37
+ assert_equal "http://127.0.0.1:6511/", excon_span[:data][:http][:url]
38
+ assert_equal 200, excon_span[:data][:http][:status]
39
+
40
+ # excon backtrace not included by default check
41
+ assert !excon_span.key?(:stack)
42
+
43
+ assert_equal sdk_span[:t], excon_span[:t]
44
+ assert_equal rack_span[:t], excon_span[:t]
45
+
46
+ assert_equal rack_span[:p], excon_span[:s]
47
+ assert_equal excon_span[:p], sdk_span[:s]
48
+ end
49
+
50
+ def test_basic_get_with_error
51
+ clear_all!
52
+
53
+ # A slight hack but webmock chokes with pipelined requests.
54
+ # Delete their excon middleware
55
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
56
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
57
+
58
+ url = "http://127.0.0.1:6511"
59
+
60
+ begin
61
+ connection = Excon.new(url)
62
+ Instana.tracer.start_or_continue_trace('excon-test') do
63
+ connection.get(:path => '/error')
64
+ end
65
+ rescue
66
+ end
67
+
68
+ spans = ::Instana.processor.queued_spans
69
+ assert_equal 3, spans.length
70
+
71
+ rack_span = find_first_span_by_name(spans, :rack)
72
+ excon_span = find_first_span_by_name(spans, :excon)
73
+ sdk_span = find_first_span_by_name(spans, :'excon-test')
74
+
75
+ validate_sdk_span(sdk_span, {:name => :'excon-test', :type => :intermediate})
76
+
77
+ assert_equal sdk_span[:s], excon_span[:p]
78
+ assert_equal excon_span[:s], rack_span[:p]
79
+
80
+ assert_equal :excon, excon_span[:n]
81
+ refute_nil excon_span.key?(:data)
82
+ refute_nil excon_span[:data].key?(:http)
83
+ assert_equal "http://127.0.0.1:6511/error", excon_span[:data][:http][:url]
84
+ assert_equal 500, excon_span[:data][:http][:status]
85
+
86
+ # error validation
87
+ assert_equal true, excon_span[:error]
88
+ assert_equal 1, excon_span[:ec]
89
+ end
90
+
91
+ def test_pipelined_requests
92
+ clear_all!
93
+
94
+ # A slight hack but webmock chokes with pipelined requests.
95
+ # Delete their excon middleware
96
+ Excon.defaults[:middlewares].delete ::WebMock::HttpLibAdapters::ExconAdapter
97
+ Excon.defaults[:middlewares].delete ::Excon::Middleware::Mock
98
+
99
+ url = "http://127.0.0.1:6511"
100
+
101
+ connection = Excon.new(url)
102
+ request = { :method => :get, :path => '/?pipelined_request' }
103
+ Instana.tracer.start_or_continue_trace('excon-test') do
104
+ connection.requests([request, request, request])
105
+ end
106
+
107
+ spans = ::Instana.processor.queued_spans
108
+ assert_equal 7, spans.length
109
+
110
+ rack_spans = find_spans_by_name(spans, :rack)
111
+ excon_spans = find_spans_by_name(spans, :excon)
112
+ sdk_span = find_first_span_by_name(spans, :'excon-test')
113
+
114
+ validate_sdk_span(sdk_span, {:name => :'excon-test', :type => :intermediate})
115
+
116
+ assert_equal 3, rack_spans.length
117
+ assert_equal 3, excon_spans.length
118
+
119
+ # ::Instana::Util.pry!
120
+
121
+ for rack_span in rack_spans
122
+ # data keys/values
123
+ refute_nil rack_span.key?(:data)
124
+ refute_nil rack_span[:data].key?(:http)
125
+ assert_equal "/", rack_span[:data][:http][:url]
126
+ assert_equal 200, rack_span[:data][:http][:status]
127
+ assert !rack_span.key?(:stack)
128
+
129
+ # Make sure a parent is specified and that we have it
130
+ refute_nil rack_span[:p]
131
+ excon_span = find_span_by_id(spans, rack_span[:p])
132
+ assert_equal :excon, excon_span[:n]
133
+
134
+ refute_nil excon_span.key?(:data)
135
+ refute_nil excon_span[:data].key?(:http)
136
+ assert_equal "http://127.0.0.1:6511/", excon_span[:data][:http][:url]
137
+ assert_equal 200, excon_span[:data][:http][:status]
138
+ assert !excon_span.key?(:stack)
139
+
140
+ # walk up the line
141
+ refute_nil excon_span[:p]
142
+ grandparent_span = find_span_by_id(spans, excon_span[:p])
143
+ assert_nil grandparent_span[:p]
144
+ assert_equal :sdk, grandparent_span[:n]
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,377 @@
1
+ require 'test_helper'
2
+
3
+ class GrpcTest < Minitest::Test
4
+ def client_stub
5
+ PingPongService::Stub.new('127.0.0.1:50051', :this_channel_is_insecure)
6
+ end
7
+
8
+ def assert_client_span(client_span, call: '', call_type: '', error: nil)
9
+ data = client_span[:data]
10
+ assert_equal '127.0.0.1:50051', data[:rpc][:host]
11
+ assert_equal :grpc, data[:rpc][:flavor]
12
+ assert_equal call, data[:rpc][:call]
13
+ assert_equal call_type, data[:rpc][:call_type]
14
+
15
+ if error
16
+ assert_equal true, data[:rpc][:error]
17
+ assert_equal "2:RuntimeError: #{error}", data[:log][:message]
18
+ end
19
+ end
20
+
21
+ def assert_server_span(server_span, call: '', call_type: '', error: nil)
22
+ # Span name validation
23
+ assert_equal :'rpc-server', server_span[:n]
24
+
25
+ data = server_span[:data]
26
+ assert_equal :grpc, data[:rpc][:flavor]
27
+ assert_equal call, data[:rpc][:call]
28
+ assert_equal call_type, data[:rpc][:call_type]
29
+
30
+ if error
31
+ assert_equal true, data[:rpc][:error]
32
+ assert_equal error, data[:log][:message]
33
+ end
34
+ end
35
+
36
+ def test_request_response
37
+ clear_all!
38
+ response = nil
39
+
40
+ Instana.tracer.start_or_continue_trace(:rpctests) do
41
+ response = client_stub.ping(
42
+ PingPongService::PingRequest.new(message: 'Hello World')
43
+ )
44
+ end
45
+ sleep 1
46
+
47
+ assert 'Hello World', response.message
48
+
49
+ # Pause for a split second to allow traces to be queued
50
+ sleep 0.2
51
+
52
+ spans = ::Instana.processor.queued_spans
53
+ sdk_span = find_spans_by_name(spans, :rpctests).first
54
+ client_span = find_spans_by_name(spans, :'rpc-client').first
55
+ server_span = find_spans_by_name(spans, :'rpc-server').first
56
+
57
+ validate_sdk_span(sdk_span)
58
+
59
+ assert_client_span(
60
+ client_span,
61
+ call: '/PingPongService/Ping',
62
+ call_type: :request_response
63
+ )
64
+
65
+ assert_server_span(
66
+ server_span,
67
+ call: '/PingPongService/Ping',
68
+ call_type: :request_response
69
+ )
70
+
71
+ trace_id = sdk_span[:t]
72
+ assert_equal trace_id, client_span[:t]
73
+ assert_equal trace_id, server_span[:t]
74
+
75
+ assert_equal server_span[:p], client_span[:s]
76
+ assert_equal client_span[:p], sdk_span[:s]
77
+ end
78
+
79
+ def test_client_streamer
80
+ clear_all!
81
+ response = nil
82
+
83
+ Instana.tracer.start_or_continue_trace(:rpctests) do
84
+ response = client_stub.ping_with_client_stream(
85
+ (0..5).map do |index|
86
+ PingPongService::PingRequest.new(message: index.to_s)
87
+ end
88
+ )
89
+ end
90
+ sleep 1
91
+
92
+ assert '01234', response.message
93
+
94
+ # Pause for a split second to allow traces to be queued
95
+ sleep 0.2
96
+
97
+ spans = ::Instana.processor.queued_spans
98
+ sdk_span = find_spans_by_name(spans, :rpctests).first
99
+ client_span = find_spans_by_name(spans, :'rpc-client').first
100
+ server_span = find_spans_by_name(spans, :'rpc-server').first
101
+
102
+ validate_sdk_span(sdk_span)
103
+
104
+ assert_client_span(
105
+ client_span,
106
+ call: '/PingPongService/PingWithClientStream',
107
+ call_type: :client_streamer
108
+ )
109
+
110
+ assert_server_span(
111
+ server_span,
112
+ call: '/PingPongService/PingWithClientStream',
113
+ call_type: :client_streamer
114
+ )
115
+
116
+ trace_id = sdk_span[:t]
117
+ assert_equal trace_id, client_span[:t]
118
+ assert_equal trace_id, server_span[:t]
119
+
120
+ assert_equal server_span[:p], client_span[:s]
121
+ assert_equal client_span[:p], sdk_span[:s]
122
+ end
123
+
124
+ def test_server_streamer
125
+ clear_all!
126
+ responses = []
127
+
128
+ Instana.tracer.start_or_continue_trace(:rpctests) do
129
+ responses = client_stub.ping_with_server_stream(
130
+ PingPongService::PingRequest.new(message: 'Hello World')
131
+ )
132
+ end
133
+ assert %w(0 1 2 3 4), responses.map(&:message)
134
+
135
+ # Pause for a split second to allow traces to be queued
136
+ sleep 0.2
137
+
138
+ spans = ::Instana.processor.queued_spans
139
+ sdk_span = find_spans_by_name(spans, :rpctests).first
140
+ client_span = find_spans_by_name(spans, :'rpc-client').first
141
+ server_span = find_spans_by_name(spans, :'rpc-server').first
142
+
143
+ validate_sdk_span(sdk_span)
144
+
145
+ assert_client_span(
146
+ client_span,
147
+ call: '/PingPongService/PingWithServerStream',
148
+ call_type: :server_streamer
149
+ )
150
+
151
+ assert_server_span(
152
+ server_span,
153
+ call: '/PingPongService/PingWithServerStream',
154
+ call_type: :server_streamer
155
+ )
156
+
157
+ trace_id = sdk_span[:t]
158
+ assert_equal trace_id, client_span[:t]
159
+ assert_equal trace_id, server_span[:t]
160
+
161
+ assert_equal server_span[:p], client_span[:s]
162
+ assert_equal client_span[:p], sdk_span[:s]
163
+ end
164
+
165
+ def test_bidi_streamer
166
+ clear_all!
167
+ responses = []
168
+
169
+ Instana.tracer.start_or_continue_trace(:rpctests) do
170
+ responses = client_stub.ping_with_bidi_stream(
171
+ (0..5).map do |index|
172
+ PingPongService::PingRequest.new(message: (index * 2).to_s)
173
+ end
174
+ )
175
+ end
176
+ sleep 1
177
+
178
+ assert %w(0 2 4 6 8), responses.to_a.map(&:message)
179
+
180
+ # Pause for a split second to allow traces to be queued
181
+ sleep 0.2
182
+
183
+ spans = ::Instana.processor.queued_spans
184
+ sdk_span = find_spans_by_name(spans, :rpctests).first
185
+ client_span = find_spans_by_name(spans, :'rpc-client').first
186
+ server_span = find_spans_by_name(spans, :'rpc-server').first
187
+
188
+ validate_sdk_span(sdk_span)
189
+
190
+ assert_client_span(
191
+ client_span,
192
+ call: '/PingPongService/PingWithBidiStream',
193
+ call_type: :bidi_streamer
194
+ )
195
+
196
+ assert_server_span(
197
+ server_span,
198
+ call: '/PingPongService/PingWithBidiStream',
199
+ call_type: :bidi_streamer
200
+ )
201
+
202
+ trace_id = sdk_span[:t]
203
+ assert_equal trace_id, client_span[:t]
204
+ assert_equal trace_id, server_span[:t]
205
+
206
+ assert_equal server_span[:p], client_span[:s]
207
+ assert_equal client_span[:p], sdk_span[:s]
208
+ end
209
+
210
+ def test_request_response_failure
211
+ clear_all!
212
+ Instana.tracer.start_or_continue_trace(:rpctests) do
213
+ begin
214
+ client_stub.fail_to_ping( PingPongService::PingRequest.new(message: 'Hello World'))
215
+ rescue
216
+ end
217
+ end
218
+
219
+ # Pause for a split second to allow traces to be queued
220
+ sleep 0.2
221
+
222
+ spans = ::Instana.processor.queued_spans
223
+ sdk_span = find_spans_by_name(spans, :rpctests).first
224
+ client_span = find_spans_by_name(spans, :'rpc-client').first
225
+ server_span = find_spans_by_name(spans, :'rpc-server').first
226
+
227
+ validate_sdk_span(sdk_span)
228
+
229
+ assert_client_span(
230
+ client_span,
231
+ call: '/PingPongService/FailToPing',
232
+ call_type: :request_response,
233
+ error: 'Unexpected failed'
234
+ )
235
+ assert_server_span(
236
+ server_span,
237
+ call: '/PingPongService/FailToPing',
238
+ call_type: :request_response,
239
+ error: 'Unexpected failed'
240
+ )
241
+
242
+ trace_id = sdk_span[:t]
243
+ assert_equal trace_id, client_span[:t]
244
+ assert_equal trace_id, server_span[:t]
245
+
246
+ assert_equal server_span[:p], client_span[:s]
247
+ assert_equal client_span[:p], sdk_span[:s]
248
+ end
249
+
250
+ def test_client_streamer_failure
251
+ clear_all!
252
+ Instana.tracer.start_or_continue_trace(:rpctests) do
253
+ begin
254
+ client_stub.fail_to_ping_with_client_stream(
255
+ (0..5).map do |index|
256
+ PingPongService::PingRequest.new(message: index.to_s)
257
+ end
258
+ )
259
+ rescue
260
+ end
261
+ end
262
+
263
+ # Pause for a split second to allow traces to be queued
264
+ sleep 0.2
265
+
266
+ spans = ::Instana.processor.queued_spans
267
+ sdk_span = find_spans_by_name(spans, :rpctests).first
268
+ client_span = find_spans_by_name(spans, :'rpc-client').first
269
+ server_span = find_spans_by_name(spans, :'rpc-server').first
270
+
271
+ validate_sdk_span(sdk_span)
272
+
273
+ assert_client_span(
274
+ client_span,
275
+ call: '/PingPongService/FailToPingWithClientStream',
276
+ call_type: :client_streamer,
277
+ error: 'Unexpected failed'
278
+ )
279
+
280
+ assert_server_span(
281
+ server_span,
282
+ call: '/PingPongService/FailToPingWithClientStream',
283
+ call_type: :client_streamer,
284
+ error: 'Unexpected failed'
285
+ )
286
+
287
+ trace_id = sdk_span[:t]
288
+ assert_equal trace_id, client_span[:t]
289
+ assert_equal trace_id, server_span[:t]
290
+
291
+ assert_equal server_span[:p], client_span[:s]
292
+ assert_equal client_span[:p], sdk_span[:s]
293
+ end
294
+
295
+ def test_server_streamer_failure
296
+ clear_all!
297
+ Instana.tracer.start_or_continue_trace(:rpctests) do
298
+ begin
299
+ client_stub.fail_to_ping_with_server_stream(
300
+ PingPongService::PingRequest.new(message: 'Hello World')
301
+ )
302
+ rescue
303
+ end
304
+ end
305
+
306
+ # Pause for a split second to allow traces to be queued
307
+ sleep 0.2
308
+
309
+ spans = ::Instana.processor.queued_spans
310
+ sdk_span = find_spans_by_name(spans, :rpctests).first
311
+ client_span = find_spans_by_name(spans, :'rpc-client').first
312
+ server_span = find_spans_by_name(spans, :'rpc-server').first
313
+
314
+ validate_sdk_span(sdk_span)
315
+
316
+ assert_client_span(
317
+ client_span,
318
+ call: '/PingPongService/FailToPingWithServerStream',
319
+ call_type: :server_streamer
320
+ )
321
+
322
+ assert_server_span(
323
+ server_span,
324
+ call: '/PingPongService/FailToPingWithServerStream',
325
+ call_type: :server_streamer,
326
+ error: 'Unexpected failed'
327
+ )
328
+
329
+ trace_id = sdk_span[:t]
330
+ assert_equal trace_id, client_span[:t]
331
+ assert_equal trace_id, server_span[:t]
332
+
333
+ assert_equal server_span[:p], client_span[:s]
334
+ assert_equal client_span[:p], sdk_span[:s]
335
+ end
336
+
337
+ def test_bidi_streamer_failure
338
+ clear_all!
339
+ Instana.tracer.start_or_continue_trace(:rpctests) do
340
+ client_stub.fail_to_ping_with_bidi_stream(
341
+ (0..5).map do |index|
342
+ PingPongService::PingRequest.new(message: (index * 2).to_s)
343
+ end
344
+ )
345
+ end
346
+
347
+ # Pause for a split second to allow traces to be queued
348
+ sleep 0.2
349
+
350
+ spans = ::Instana.processor.queued_spans
351
+ sdk_span = find_spans_by_name(spans, :rpctests).first
352
+ client_span = find_spans_by_name(spans, :'rpc-client').first
353
+ server_span = find_spans_by_name(spans, :'rpc-server').first
354
+
355
+ validate_sdk_span(sdk_span)
356
+
357
+ assert_client_span(
358
+ client_span,
359
+ call: '/PingPongService/FailToPingWithBidiStream',
360
+ call_type: :bidi_streamer
361
+ )
362
+
363
+ assert_server_span(
364
+ server_span,
365
+ call: '/PingPongService/FailToPingWithBidiStream',
366
+ call_type: :bidi_streamer,
367
+ error: 'Unexpected failed'
368
+ )
369
+
370
+ trace_id = sdk_span[:t]
371
+ assert_equal trace_id, client_span[:t]
372
+ assert_equal trace_id, server_span[:t]
373
+
374
+ assert_equal server_span[:p], client_span[:s]
375
+ assert_equal client_span[:p], sdk_span[:s]
376
+ end
377
+ end