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,160 @@
1
+ require 'test_helper'
2
+
3
+ class NetHTTPTest < Minitest::Test
4
+ def test_config_defaults
5
+ assert ::Instana.config[:nethttp].is_a?(Hash)
6
+ assert ::Instana.config[:nethttp].key?(:enabled)
7
+ assert_equal true, ::Instana.config[:nethttp][:enabled]
8
+ end
9
+
10
+ def test_block_request
11
+ clear_all!
12
+ WebMock.allow_net_connect!
13
+ url = "http://127.0.0.1:6511/"
14
+
15
+ uri = URI.parse(url)
16
+ req = Net::HTTP::Get.new(uri)
17
+
18
+ response = nil
19
+ Instana.tracer.start_or_continue_trace('net-http-test') do
20
+ Net::HTTP.start(req.uri.hostname, req.uri.port, :open_timeout => 1, :read_timeout => 1) do |http|
21
+ response = http.request(req)
22
+ end
23
+ end
24
+
25
+ spans = ::Instana.processor.queued_spans
26
+ assert_equal 3, spans.length
27
+
28
+ rs_span = find_first_span_by_name(spans, :rack)
29
+ first_span = find_first_span_by_name(spans, :'net-http-test')
30
+ second_span = find_first_span_by_name(spans, :'net-http')
31
+
32
+ # Span name validation
33
+ assert_equal :sdk, first_span[:n]
34
+ assert_equal :'net-http', second_span[:n]
35
+
36
+ # first_span is the parent of second_span
37
+ assert_equal first_span[:s], second_span[:p]
38
+
39
+ # data keys/values
40
+ refute_nil second_span.key?(:data)
41
+ refute_nil second_span[:data].key?(:http)
42
+ assert_equal "http://127.0.0.1:6511/", second_span[:data][:http][:url]
43
+ assert_equal "200", second_span[:data][:http][:status]
44
+ assert !second_span.key?(:stack)
45
+
46
+ # Rack server trace should have the same trace ID
47
+ assert_equal rs_span[:t], first_span[:t]
48
+ assert_equal first_span[:t], second_span[:t]
49
+
50
+ # Rack server trace should have net-http has parent span
51
+ assert_equal second_span[:s], rs_span[:p]
52
+
53
+ WebMock.disable_net_connect!
54
+ end
55
+
56
+ def test_basic_post_without_uri
57
+ clear_all!
58
+ WebMock.allow_net_connect!
59
+
60
+ response = nil
61
+ Instana.tracer.start_or_continue_trace('net-http-test') do
62
+ http = Net::HTTP.new("127.0.0.1", 6511)
63
+ response = http.request(Net::HTTP::Post.new("/"))
64
+ end
65
+
66
+ spans = ::Instana.processor.queued_spans
67
+ assert_equal 3, spans.length
68
+
69
+ rack_span = find_first_span_by_name(spans, :rack)
70
+ sdk_span = find_first_span_by_name(spans, :'net-http-test')
71
+ http_span = find_first_span_by_name(spans, :'net-http')
72
+
73
+ # Span name validation
74
+ assert_equal :sdk, sdk_span[:n]
75
+ assert_equal :'net-http', http_span[:n]
76
+
77
+ # first_span is the parent of second_span
78
+ assert_equal sdk_span[:s], http_span[:p]
79
+
80
+ # data keys/values
81
+ refute_nil http_span.key?(:data)
82
+ refute_nil http_span[:data].key?(:http)
83
+ assert_equal "http://127.0.0.1:6511/", http_span[:data][:http][:url]
84
+ assert_equal "200", http_span[:data][:http][:status]
85
+ assert !http_span.key?(:stack)
86
+
87
+ # Rack server trace should have the same trace ID
88
+ assert_equal rack_span[:t], sdk_span[:t]
89
+ assert_equal sdk_span[:t], http_span[:t]
90
+
91
+ # Rack server trace should have net-http has parent span
92
+ assert_equal http_span[:s], rack_span[:p]
93
+
94
+ WebMock.disable_net_connect!
95
+ end
96
+
97
+ def test_request_with_dns_error
98
+ clear_all!
99
+ WebMock.allow_net_connect!
100
+
101
+ begin
102
+ Instana.tracer.start_or_continue_trace('net-http-error-test') do
103
+ http = Net::HTTP.new("asdfasdf.asdfsadf", 80)
104
+ http.request(Net::HTTP::Get.new("/blah"))
105
+ end
106
+ rescue Exception
107
+ nil
108
+ end
109
+
110
+ spans = ::Instana.processor.queued_spans
111
+ assert_equal 1, spans.length
112
+
113
+ first_span = spans.first
114
+
115
+ assert_equal :sdk, first_span[:n]
116
+ assert_equal :'net-http-error-test', first_span[:data][:sdk][:name]
117
+ assert_equal true, first_span[:error]
118
+ assert_equal 1, first_span[:ec]
119
+ ts_key = first_span[:data][:sdk][:custom][:logs].keys.first
120
+ assert first_span[:data][:sdk][:custom][:logs].key?(ts_key)
121
+ assert first_span[:data][:sdk][:custom][:logs][ts_key].key?(:event)
122
+ assert first_span[:data][:sdk][:custom][:logs][ts_key].key?(:parameters)
123
+
124
+ WebMock.disable_net_connect!
125
+ end
126
+
127
+ def test_request_with_5xx_response
128
+ clear_all!
129
+ WebMock.allow_net_connect!
130
+
131
+ response = nil
132
+ Instana.tracer.start_or_continue_trace('net-http-error-test') do
133
+ http = Net::HTTP.new("127.0.0.1", 6511)
134
+ response = http.request(Net::HTTP::Get.new("/error"))
135
+ end
136
+
137
+ spans = ::Instana.processor.queued_spans
138
+ assert_equal 3, spans.length
139
+
140
+ rack_span = find_first_span_by_name(spans, :rack)
141
+ sdk_span = find_first_span_by_name(spans, :'net-http-error-test')
142
+ http_span = find_first_span_by_name(spans, :'net-http')
143
+
144
+ assert_equal :sdk, sdk_span[:n]
145
+ assert_equal :'net-http-error-test', sdk_span[:data][:sdk][:name]
146
+ assert_equal nil, sdk_span[:error]
147
+ assert_equal nil, sdk_span[:ec]
148
+
149
+ refute_nil http_span.key?(:data)
150
+ refute_nil http_span[:data].key?(:http)
151
+ assert_equal "http://127.0.0.1:6511/error", http_span[:data][:http][:url]
152
+ assert_equal "500", http_span[:data][:http][:status]
153
+ assert_equal :'net-http', http_span[:n]
154
+ assert !http_span.key?(:stack)
155
+ assert_equal true, http_span[:error]
156
+ assert_equal 1, http_span[:ec]
157
+
158
+ WebMock.disable_net_connect!
159
+ end
160
+ end
@@ -0,0 +1,119 @@
1
+ require 'test_helper'
2
+
3
+ class RedisTest < Minitest::Test
4
+ def test_normal_call
5
+ clear_all!
6
+ redis_client = create_redis_client
7
+
8
+ Instana.tracer.start_or_continue_trace(:redis_test) do
9
+ redis_client.set('hello', 'world')
10
+ end
11
+ redis_client.disconnect!
12
+
13
+ assert_redis_trace('SET')
14
+ end
15
+
16
+ def test_normal_call_with_error
17
+ clear_all!
18
+ redis_client = create_redis_client
19
+
20
+ Instana.tracer.start_or_continue_trace(:redis_test) do
21
+ begin
22
+ redis_client.zadd('hello', 'invalid', 'value')
23
+ rescue; end
24
+ end
25
+ redis_client.disconnect!
26
+
27
+ assert_redis_trace('ZADD', with_error: 'ERR value is not a valid float')
28
+ end
29
+
30
+ def test_pipeline_call
31
+ clear_all!
32
+ redis_client = create_redis_client
33
+
34
+ Instana.tracer.start_or_continue_trace(:redis_test) do
35
+ redis_client.pipelined do
36
+ redis_client.set('hello', 'world')
37
+ redis_client.set('other', 'world')
38
+ end
39
+ end
40
+
41
+ assert_redis_trace('PIPELINE')
42
+ end
43
+
44
+ def test_pipeline_call_with_error
45
+ clear_all!
46
+ redis_client = create_redis_client
47
+
48
+ Instana.tracer.start_or_continue_trace(:redis_test) do
49
+ begin
50
+ redis_client.pipelined do
51
+ redis_client.set('other', 'world')
52
+ redis_client.call('invalid')
53
+ end
54
+ rescue; end
55
+ end
56
+
57
+ assert_redis_trace('PIPELINE', with_error: "ERR unknown command 'invalid'")
58
+ end
59
+
60
+ def test_multi_call
61
+ clear_all!
62
+ redis_client = create_redis_client
63
+
64
+ Instana.tracer.start_or_continue_trace(:redis_test) do
65
+ redis_client.multi do
66
+ redis_client.set('hello', 'world')
67
+ redis_client.set('other', 'world')
68
+ end
69
+ end
70
+
71
+ assert_redis_trace('MULTI')
72
+ end
73
+
74
+ def test_multi_call_with_error
75
+ clear_all!
76
+ redis_client = create_redis_client
77
+
78
+ Instana.tracer.start_or_continue_trace(:redis_test) do
79
+ begin
80
+ redis_client.multi do
81
+ redis_client.set('other', 'world')
82
+ redis_client.call('invalid')
83
+ end
84
+ rescue; end
85
+ end
86
+
87
+ assert_redis_trace('MULTI', with_error: "ERR unknown command 'invalid'")
88
+ end
89
+
90
+ private
91
+
92
+ def create_redis_client
93
+ Redis.new(url: ENV['I_REDIS_URL'])
94
+ end
95
+
96
+ def assert_redis_trace(command, with_error: nil)
97
+ spans = ::Instana.processor.queued_spans
98
+ assert_equal 2, spans.length
99
+ first_span, second_span = spans.to_a.reverse
100
+
101
+ # first_span is the parent of second_span
102
+ assert_equal first_span[:s], second_span[:p]
103
+ assert_equal :sdk, first_span[:n]
104
+ assert_equal :redis, second_span[:n]
105
+
106
+ data = second_span[:data]
107
+
108
+ uri = URI.parse(ENV['I_REDIS_URL'])
109
+ assert_equal "#{uri.host}:#{uri.port}", data[:redis][:connection]
110
+
111
+ assert_equal 0, data[:redis][:db]
112
+ assert_equal command, data[:redis][:command]
113
+
114
+ if with_error
115
+ assert_equal true, data[:redis][:error]
116
+ assert data[:log].key?(:message)
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,128 @@
1
+ require 'test_helper'
2
+ require_relative "../jobs/resque_fast_job"
3
+ require_relative "../jobs/resque_error_job"
4
+ require 'resque'
5
+
6
+ if ENV.key?('REDIS_URL')
7
+ ::Resque.redis = ENV['REDIS_URL']
8
+ elsif ENV.key?('I_REDIS_URL')
9
+ ::Resque.redis = ENV['I_REDIS_URL']
10
+ else
11
+ ::Resque.redis = 'localhost:6379'
12
+ end
13
+
14
+ class ResqueClientTest < Minitest::Test
15
+ def setup
16
+ clear_all!
17
+ ENV['FORK_PER_JOB'] = 'false'
18
+ Resque.redis.redis.flushall
19
+ @worker = Resque::Worker.new(:critical)
20
+ end
21
+
22
+ def teardown
23
+ end
24
+
25
+ def test_enqueue
26
+ ::Instana.tracer.start_or_continue_trace('resque-client_test') do
27
+ ::Resque.enqueue(FastJob)
28
+ end
29
+
30
+ spans = ::Instana.processor.queued_spans
31
+ assert_equal 3, spans.length
32
+
33
+ sdk_span = find_first_span_by_name(spans, :'resque-client_test')
34
+ resque_span = find_first_span_by_name(spans, :'resque-client')
35
+ redis_span = find_first_span_by_name(spans, :redis)
36
+
37
+ assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
38
+
39
+ assert_equal :"resque-client", resque_span[:n]
40
+ assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
41
+ assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
42
+ assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
43
+
44
+ assert_equal :redis, redis_span[:n]
45
+ end
46
+
47
+ def test_enqueue_to
48
+ ::Instana.tracer.start_or_continue_trace('resque-client_test') do
49
+ ::Resque.enqueue_to(:critical, FastJob)
50
+ end
51
+
52
+ spans = ::Instana.processor.queued_spans
53
+ assert_equal 3, spans.length
54
+
55
+ sdk_span = find_first_span_by_name(spans, :'resque-client_test')
56
+ resque_span = find_first_span_by_name(spans, :'resque-client')
57
+ redis_span = find_first_span_by_name(spans, :redis)
58
+
59
+ assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
60
+ assert_equal :"resque-client", resque_span[:n]
61
+ assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
62
+ assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
63
+ assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
64
+ assert_equal :redis, redis_span[:n]
65
+ end
66
+
67
+ def test_dequeue
68
+ ::Instana.tracer.start_or_continue_trace('resque-client_test', '', {}) do
69
+ ::Resque.dequeue(FastJob, { :generate => :farfalla })
70
+ end
71
+
72
+ spans = ::Instana.processor.queued_spans
73
+ assert_equal 3, spans.length
74
+
75
+ sdk_span = find_first_span_by_name(spans, :'resque-client_test')
76
+ resque_span = find_first_span_by_name(spans, :'resque-client')
77
+ redis_span = find_first_span_by_name(spans, :redis)
78
+
79
+ assert_equal :'resque-client_test', sdk_span[:data][:sdk][:name]
80
+ assert_equal :"resque-client", spans[1][:n]
81
+ assert_equal "FastJob", resque_span[:data][:'resque-client'][:job]
82
+ assert_equal :critical, resque_span[:data][:'resque-client'][:queue]
83
+ assert_equal false, resque_span[:data][:'resque-client'].key?(:error)
84
+ assert_equal :redis, redis_span[:n]
85
+ end
86
+
87
+ def test_worker_job
88
+ Resque::Job.create(:critical, FastJob)
89
+ @worker.work(0)
90
+
91
+ spans = ::Instana.processor.queued_spans
92
+ assert_equal 3, spans.length
93
+
94
+ resque_span = spans[2]
95
+ redis1_span = spans[1]
96
+ redis2_span = spans[0]
97
+
98
+ assert_equal :'resque-worker', resque_span[:n]
99
+ assert_equal false, resque_span.key?(:error)
100
+ assert_equal false, resque_span.key?(:ec)
101
+ assert_equal "FastJob", resque_span[:data][:'resque-worker'][:job]
102
+ assert_equal "critical", resque_span[:data][:'resque-worker'][:queue]
103
+ assert_equal false, resque_span[:data][:'resque-worker'].key?(:error)
104
+
105
+ assert_equal :redis, redis1_span[:n]
106
+ assert_equal "SET", redis1_span[:data][:redis][:command]
107
+ assert_equal :redis, redis2_span[:n]
108
+ assert_equal "SET", redis2_span[:data][:redis][:command]
109
+ end
110
+
111
+ def test_worker_error_job
112
+ Resque::Job.create(:critical, ErrorJob)
113
+ @worker.work(0)
114
+
115
+ spans = ::Instana.processor.queued_spans
116
+ assert_equal 5, spans.length
117
+
118
+ resque_span = find_first_span_by_name(spans, :'resque-worker')
119
+
120
+ assert_equal :'resque-worker', resque_span[:n]
121
+ assert_equal true, resque_span.key?(:error)
122
+ assert_equal 1, resque_span[:ec]
123
+ assert_equal "ErrorJob", resque_span[:data][:'resque-worker'][:job]
124
+ assert_equal "critical", resque_span[:data][:'resque-worker'][:queue]
125
+ assert_equal "Exception: Silly Rabbit, Trix are for kids.", resque_span[:data][:'resque-worker'][:error]
126
+ assert_equal Array, resque_span[:stack].class
127
+ end
128
+ end
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class RestClientTest < Minitest::Test
4
+ def test_config_defaults
5
+ assert ::Instana.config[:'rest-client'].is_a?(Hash)
6
+ assert ::Instana.config[:'rest-client'].key?(:enabled)
7
+ assert_equal true, ::Instana.config[:'rest-client'][:enabled]
8
+ end
9
+
10
+ def test_basic_get
11
+ clear_all!
12
+ WebMock.allow_net_connect!
13
+
14
+ url = "http://127.0.0.1:6511/"
15
+
16
+ Instana.tracer.start_or_continue_trace('restclient-test') do
17
+ RestClient.get url
18
+ end
19
+
20
+ spans = ::Instana.processor.queued_spans
21
+ assert_equal 4, spans.length
22
+
23
+ rack_span = find_first_span_by_name(spans, :rack)
24
+ sdk_span = find_first_span_by_name(spans, :'restclient-test')
25
+ rest_span = find_first_span_by_name(spans, :'rest-client')
26
+ net_span = find_first_span_by_name(spans, :'net-http')
27
+
28
+ validate_sdk_span(sdk_span, {:name => :'restclient-test', :type => :intermediate})
29
+ validate_sdk_span(rest_span, {:name => :'rest-client', :type => :intermediate})
30
+
31
+ # Span name validation
32
+ assert_equal :rack, rack_span[:n]
33
+ assert_equal :sdk, sdk_span[:n]
34
+ assert_equal :sdk, rest_span[:n]
35
+ assert_equal :"net-http", net_span[:n]
36
+
37
+ # Trace IDs and relationships
38
+ trace_id = sdk_span[:t]
39
+ assert_equal trace_id, rest_span[:t]
40
+ assert_equal trace_id, net_span[:t]
41
+ assert_equal trace_id, rack_span[:t]
42
+
43
+ assert_equal sdk_span[:s], rest_span[:p]
44
+ assert_equal rest_span[:s], net_span[:p]
45
+ assert_equal net_span[:s], rack_span[:p]
46
+
47
+ # data keys/values
48
+ refute_nil net_span.key?(:data)
49
+ refute_nil net_span[:data].key?(:http)
50
+ assert_equal "http://127.0.0.1:6511/", net_span[:data][:http][:url]
51
+ assert_equal "200", net_span[:data][:http][:status]
52
+
53
+ WebMock.disable_net_connect!
54
+ end
55
+ end