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,67 @@
1
+ # require 'test_helper'
2
+ #
3
+ # class TraceTest < Minitest::Test
4
+ # def test_trace_spans_count
5
+ # t = ::Instana::Trace.new(:test_trace, { :one => 1, :two => 2 })
6
+ # t.new_span(:sub_span, { :sub_four => 4 })
7
+ # t.end_span(:sub_five => 5)
8
+ # t.end_span(:three => 3)
9
+ # assert t.spans.size == 2
10
+ # end
11
+ #
12
+ # def test_trace_with_incoming_context
13
+ # incoming_context = { :trace_id => "1234", :span_id => "4321" }
14
+ # t = ::Instana::Trace.new(:test_trace, { :one => 1, :two => 2 }, incoming_context)
15
+ # first_span = t.spans.first
16
+ # assert_equal "1234", first_span[:t]
17
+ # assert_equal "4321", first_span[:p]
18
+ # assert t.spans.size == 1
19
+ # end
20
+ #
21
+ # def test_max_value_of_generated_id
22
+ # # Max is the maximum value for a Java signed long
23
+ # max_value = 9223372036854775807
24
+ # 1000.times do
25
+ # assert ::Instana::Util.generate_id <= max_value
26
+ # end
27
+ # end
28
+ #
29
+ # def test_min_value_of_generated_id
30
+ # # Max is the maximum value for a Java signed long
31
+ # max_value = -9223372036854775808
32
+ # 1000.times do
33
+ # assert ::Instana::Util.generate_id >= max_value
34
+ # end
35
+ # end
36
+ #
37
+ # def test_entry_span_doesnt_have_stack_by_default
38
+ # t = ::Instana::Trace.new(:rack)
39
+ # first_span = t.spans.first
40
+ # assert !first_span.key?(:stack)
41
+ # end
42
+ #
43
+ # def test_entry_span_has_stack_by_config
44
+ # ::Instana.config[:collect_backtraces] = true
45
+ # t = ::Instana::Trace.new(:rack)
46
+ # first_span = t.spans.first
47
+ # assert first_span.key?(:stack)
48
+ # assert_equal 2, first_span[:stack].count
49
+ # ::Instana.config[:collect_backtraces] = false
50
+ # end
51
+ #
52
+ # def test_exit_span_doesnt_have_stack_by_default
53
+ # t = ::Instana::Trace.new(:trace_test)
54
+ # t.new_span(:excon)
55
+ # second_span = t.spans.to_a[1]
56
+ # assert !second_span.key?(:stack)
57
+ # end
58
+ #
59
+ # def test_exit_span_has_stack_by_config
60
+ # ::Instana.config[:collect_backtraces] = true
61
+ # t = ::Instana::Trace.new(:trace_test)
62
+ # t.new_span(:excon)
63
+ # second_span = t.spans.to_a[1]
64
+ # assert second_span.key?(:stack)
65
+ # ::Instana.config[:collect_backtraces] = false
66
+ # end
67
+ # end
@@ -0,0 +1,198 @@
1
+ require 'test_helper'
2
+
3
+ class TracerAsyncTest < Minitest::Test
4
+ def test_same_thread_async_tracing
5
+ clear_all!
6
+
7
+ # Start tracing
8
+ ::Instana.tracer.log_start_or_continue(:rack, {:rack_start_kv => 1})
9
+
10
+ # Start an asynchronous span
11
+ span = ::Instana.tracer.log_async_entry(:my_async_op, { :entry_kv => 1})
12
+
13
+ refute_nil span
14
+ refute_nil span.context
15
+
16
+ # Current span should still be rack
17
+ assert_equal :rack, ::Instana.tracer.current_span.name
18
+
19
+ # End an asynchronous span
20
+ ::Instana.tracer.log_async_exit(:my_async_op, { :exit_kv => 1 }, span)
21
+
22
+ # Current span should still be rack
23
+ assert_equal :rack, ::Instana.tracer.current_span.name
24
+
25
+ # End tracing
26
+ ::Instana.tracer.log_end(:rack, {:rack_end_kv => 1})
27
+
28
+ spans = ::Instana.processor.queued_spans
29
+ assert_equal 2, spans.length
30
+
31
+ rack_span = find_first_span_by_name(spans, :rack)
32
+ async_span = find_first_span_by_name(spans, :my_async_op)
33
+
34
+ # Both spans have a duration
35
+ assert rack_span[:d]
36
+ assert async_span[:d]
37
+
38
+ # first_span is the parent of first_span
39
+ assert_equal rack_span[:s], async_span[:p]
40
+ # same trace id
41
+ assert_equal rack_span[:t], async_span[:t]
42
+
43
+ # KV checks
44
+ assert_equal 1, rack_span[:data][:rack_start_kv]
45
+ assert_equal 1, rack_span[:data][:rack_end_kv]
46
+ assert_equal 1, async_span[:data][:sdk][:custom][:tags][:entry_kv]
47
+ assert_equal 1, async_span[:data][:sdk][:custom][:tags][:exit_kv]
48
+ end
49
+
50
+ def test_diff_thread_async_tracing
51
+ clear_all!
52
+
53
+ # Start tracing
54
+ ::Instana.tracer.log_start_or_continue(:rack, {:rack_start_kv => 1})
55
+
56
+ t_context = ::Instana.tracer.context
57
+ refute_nil t_context.trace_id
58
+ refute_nil t_context.span_id
59
+
60
+ Thread.new do
61
+ ::Instana.tracer.log_start_or_continue(:async_thread, { :async_start => 1 }, t_context)
62
+ ::Instana.tracer.log_entry(:sleepy_time, { :tired => 1 })
63
+ # Sleep beyond the end of this root trace
64
+ sleep 0.5
65
+ ::Instana.tracer.log_exit(:sleepy_time, { :wake_up => 1})
66
+ ::Instana.tracer.log_end(:async_thread, { :async_end => 1 })
67
+ end
68
+
69
+ # Current span should still be rack
70
+ assert_equal :rack, ::Instana.tracer.current_span.name
71
+
72
+ # End tracing
73
+ ::Instana.tracer.log_end(:rack, {:rack_end_kv => 1})
74
+
75
+ assert_equal false, ::Instana.tracer.tracing?
76
+
77
+ # Sleep for 1 seconds to wait for the async thread to finish
78
+ sleep 1
79
+
80
+ spans = ::Instana.processor.queued_spans
81
+ assert_equal 3, spans.length
82
+
83
+ rack_span = find_first_span_by_name(spans, :rack)
84
+ async_span1 = find_first_span_by_name(spans, :async_thread)
85
+ async_span2 = find_first_span_by_name(spans, :sleepy_time)
86
+
87
+ # Validate the first original thread span
88
+ assert_equal :rack, rack_span[:n]
89
+ assert rack_span[:d]
90
+ assert_equal 1, rack_span[:data][:rack_start_kv]
91
+ assert_equal 1, rack_span[:data][:rack_end_kv]
92
+
93
+ # first span in second trace
94
+ assert_equal :sdk, async_span1[:n]
95
+ assert_equal :async_thread, async_span1[:data][:sdk][:name]
96
+ assert async_span1[:d]
97
+ assert_equal 1, async_span1[:data][:sdk][:custom][:tags][:async_start]
98
+ assert_equal 1, async_span1[:data][:sdk][:custom][:tags][:async_end]
99
+
100
+ # second span in second trace
101
+ assert_equal :sdk, async_span2[:n]
102
+ assert_equal :sleepy_time, async_span2[:data][:sdk][:name]
103
+ assert async_span2[:d]
104
+ assert_equal 1, async_span2[:data][:sdk][:custom][:tags][:tired]
105
+ assert_equal 1, async_span2[:data][:sdk][:custom][:tags][:wake_up]
106
+
107
+ # Validate linkage
108
+ # All spans have the same trace ID
109
+ assert rack_span[:t]==async_span1[:t] && async_span1[:t]==async_span2[:t]
110
+
111
+ assert_equal async_span2[:p], async_span1[:s]
112
+ assert_equal async_span1[:p], rack_span[:s]
113
+
114
+ assert rack_span[:t] == rack_span[:s]
115
+ assert async_span1[:t] != async_span1[:s]
116
+ assert async_span2[:t] != async_span2[:s]
117
+ end
118
+
119
+ def test_out_of_order_async_tracing
120
+ clear_all!
121
+
122
+ # Start tracing
123
+ ::Instana.tracer.log_start_or_continue(:rack, {:rack_start_kv => 1})
124
+
125
+ # Start three asynchronous spans
126
+ span1 = ::Instana.tracer.log_async_entry(:my_async_op1, { :entry_kv => 1})
127
+ span2 = ::Instana.tracer.log_async_entry(:my_async_op2, { :entry_kv => 2})
128
+ span3 = ::Instana.tracer.log_async_entry(:my_async_op3, { :entry_kv => 3})
129
+
130
+ # Current span should still be rack
131
+ assert_equal :rack, ::Instana.tracer.current_span.name
132
+
133
+ # Log info to the async spans (out of order)
134
+ span2.set_tags({ :info_kv => 2 })
135
+ span1.set_tags({ :info_kv => 1 })
136
+ span3.set_tags({ :info_kv => 3 })
137
+
138
+ # Log out of order errors to the async spans
139
+ span3.add_error(Exception.new("Async span 3"))
140
+ span2.add_error(Exception.new("Async span 3"))
141
+
142
+ # End two out of order asynchronous spans
143
+ span3.set_tags({ :exit_kv => 3 })
144
+ span3.close
145
+ span2.set_tags({ :exit_kv => 2 })
146
+ span2.close
147
+
148
+ # Current span should still be rack
149
+ assert_equal :rack, ::Instana.tracer.current_span.name
150
+
151
+ # End tracing
152
+ ::Instana.tracer.log_end(:rack, {:rack_end_kv => 1})
153
+
154
+ # Log an error to and close out the remaining async span after the parent trace has finished
155
+ span1.add_error(Exception.new("Async span 1"))
156
+ span1.set_tags({ :exit_kv => 1 })
157
+ span1.close
158
+
159
+ spans = ::Instana.processor.queued_spans
160
+ assert_equal 4, spans.length
161
+
162
+ first_span = find_first_span_by_name(spans, :rack)
163
+ second_span = find_first_span_by_name(spans, :my_async_op1)
164
+ third_span = find_first_span_by_name(spans, :my_async_op2)
165
+ fourth_span = find_first_span_by_name(spans, :my_async_op3)
166
+
167
+ # Assure all spans have completed
168
+ assert first_span.key?(:d)
169
+ assert second_span.key?(:d)
170
+ assert third_span.key?(:d)
171
+ assert fourth_span.key?(:d)
172
+
173
+ # Linkage
174
+ assert_equal first_span[:s], second_span[:p]
175
+ assert_equal first_span[:s], third_span[:p]
176
+ assert_equal first_span[:s], fourth_span[:p]
177
+
178
+ # same trace id
179
+ assert_equal first_span[:t], second_span[:t]
180
+ assert_equal first_span[:t], third_span[:t]
181
+ assert_equal first_span[:t], fourth_span[:t]
182
+
183
+ assert first_span[:n] != :sdk
184
+ assert second_span[:n] == :sdk
185
+ assert third_span[:n] == :sdk
186
+ assert fourth_span[:n] == :sdk
187
+
188
+ # KV checks
189
+ assert_equal 1, first_span[:data][:rack_start_kv]
190
+ assert_equal 1, first_span[:data][:rack_end_kv]
191
+ assert_equal 1, second_span[:data][:sdk][:custom][:tags][:entry_kv]
192
+ assert_equal 1, second_span[:data][:sdk][:custom][:tags][:exit_kv]
193
+ assert_equal 2, third_span[:data][:sdk][:custom][:tags][:entry_kv]
194
+ assert_equal 2, third_span[:data][:sdk][:custom][:tags][:exit_kv]
195
+ assert_equal 3, fourth_span[:data][:sdk][:custom][:tags][:entry_kv]
196
+ assert_equal 3, fourth_span[:data][:sdk][:custom][:tags][:exit_kv]
197
+ end
198
+ end
@@ -0,0 +1,223 @@
1
+ require 'test_helper'
2
+
3
+ class TracerTest < Minitest::Test
4
+ def test_that_it_has_a_valid_tracer
5
+ refute_nil ::Instana.tracer
6
+ assert ::Instana.tracer.is_a?(::Instana::Tracer)
7
+ end
8
+
9
+ def test_obey_tracing_config
10
+ clear_all!
11
+
12
+ ::Instana.config[:tracing][:enabled] = false
13
+ assert_equal false, ::Instana.tracer.tracing?
14
+
15
+ ::Instana.tracer.start_or_continue_trace(:rack, {:one => 1}) do
16
+ assert_equal false, ::Instana.tracer.tracing?
17
+ end
18
+
19
+ ::Instana.config[:tracing][:enabled] = true
20
+ end
21
+
22
+
23
+ def test_basic_trace_block
24
+ clear_all!
25
+
26
+ assert_equal false, ::Instana.tracer.tracing?
27
+
28
+ ::Instana.tracer.start_or_continue_trace(:rack, {:one => 1}) do
29
+ assert_equal true, ::Instana.tracer.tracing?
30
+ sleep 0.1
31
+ end
32
+
33
+ spans = ::Instana.processor.queued_spans
34
+ assert_equal 1, spans.length
35
+
36
+ first_span = spans.first
37
+ assert_equal :rack, first_span[:n]
38
+ assert first_span[:ts].is_a?(Integer)
39
+ assert first_span[:d].is_a?(Integer)
40
+ assert first_span[:d].between?(100, 130)
41
+ assert first_span.key?(:data)
42
+ assert_equal 1, first_span[:data][:one]
43
+ assert first_span.key?(:f)
44
+ assert first_span[:f].key?(:e)
45
+ assert first_span[:f].key?(:h)
46
+ assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
47
+ end
48
+
49
+ def test_errors_are_properly_propagated
50
+ clear_all!
51
+ exception_raised = false
52
+ begin
53
+ ::Instana.tracer.start_or_continue_trace(:rack, {:one => 1}) do
54
+ raise Exception.new('Error in block - this should continue to propogate outside of tracing')
55
+ end
56
+ rescue Exception
57
+ exception_raised = true
58
+ end
59
+
60
+ assert exception_raised
61
+
62
+ spans = ::Instana.processor.queued_spans
63
+ assert_equal 1, spans.length
64
+
65
+ first_span = spans.first
66
+ assert_equal :rack, first_span[:n]
67
+ assert first_span[:ts].is_a?(Integer)
68
+ assert first_span[:ts] > 0
69
+ assert first_span[:d].is_a?(Integer)
70
+ assert first_span[:d].between?(0, 5)
71
+ assert first_span.key?(:data)
72
+ assert_equal 1, first_span[:data][:one]
73
+ assert first_span.key?(:f)
74
+ assert first_span[:f].key?(:e)
75
+ assert first_span[:f].key?(:h)
76
+ assert_equal ::Instana.agent.agent_uuid, first_span[:f][:h]
77
+ assert_equal first_span[:error], true
78
+ assert_equal first_span[:ec], 1
79
+ end
80
+
81
+ def test_complex_trace_block
82
+ clear_all!
83
+ ::Instana.tracer.start_or_continue_trace(:rack, {:one => 1}) do
84
+ sleep 0.2
85
+ ::Instana.tracer.trace(:sub_block, {:sub_two => 2}) do
86
+ sleep 0.2
87
+ end
88
+ end
89
+
90
+ spans = ::Instana.processor.queued_spans
91
+ assert_equal 2, spans.length
92
+
93
+ rack_span = find_first_span_by_name(spans, :rack)
94
+ sdk_span = find_first_span_by_name(spans, :sub_block)
95
+
96
+ assert_equal rack_span[:n], :rack
97
+ assert_equal rack_span[:p], nil
98
+ assert_equal rack_span[:t], rack_span[:s]
99
+ assert_equal rack_span[:data][:one], 1
100
+
101
+ assert_equal sdk_span[:n], :sdk
102
+ assert_equal sdk_span[:data][:sdk][:name], :sub_block
103
+ assert_equal sdk_span[:data][:sdk][:type], :intermediate
104
+ assert_equal sdk_span[:k], 3
105
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_two], 2
106
+ end
107
+
108
+ def test_basic_low_level_tracing
109
+ clear_all!
110
+
111
+ assert_equal false, ::Instana.tracer.tracing?
112
+ # Start tracing
113
+ ::Instana.tracer.log_start_or_continue(:rack, {:one => 1})
114
+ assert_equal true, ::Instana.tracer.tracing?
115
+ ::Instana.tracer.log_info({:info_logged => 1})
116
+ # End tracing
117
+ ::Instana.tracer.log_end(:rack, {:close_one => 1})
118
+ assert_equal false, ::Instana.tracer.tracing?
119
+
120
+ spans = ::Instana.processor.queued_spans
121
+ assert_equal 1, spans.length
122
+ end
123
+
124
+ def test_complex_low_level_tracing
125
+ clear_all!
126
+
127
+ assert_equal false, ::Instana.tracer.tracing?
128
+
129
+ # Start tracing
130
+ ::Instana.tracer.log_start_or_continue(:rack, {:one => 1})
131
+ assert_equal true, ::Instana.tracer.tracing?
132
+ ::Instana.tracer.log_info({:info_logged => 1})
133
+
134
+ # Start tracing a sub span
135
+ ::Instana.tracer.log_entry(:sub_task)
136
+ assert_equal true, ::Instana.tracer.tracing?
137
+ ::Instana.tracer.log_info({:sub_task_info => 1})
138
+ # Exit from the sub span
139
+ ::Instana.tracer.log_exit(:sub_task, {:sub_task_exit_info => 1})
140
+ assert_equal true, ::Instana.tracer.tracing?
141
+
142
+ # End tracing
143
+ ::Instana.tracer.log_end(:rack, {:close_one => 1})
144
+ assert_equal false, ::Instana.tracer.tracing?
145
+
146
+ spans = ::Instana.processor.queued_spans
147
+ assert_equal 2, spans.length
148
+
149
+ rack_span = find_first_span_by_name(spans, :rack)
150
+ sdk_span = find_first_span_by_name(spans, :sub_task)
151
+
152
+ assert_equal :rack, rack_span[:n]
153
+ assert rack_span.key?(:data)
154
+ assert_equal rack_span[:data][:one], 1
155
+ assert_equal rack_span[:data][:info_logged], 1
156
+ assert_equal rack_span[:data][:close_one], 1
157
+
158
+ assert rack_span.key?(:f)
159
+ assert rack_span[:f].key?(:e)
160
+ assert rack_span[:f].key?(:h)
161
+ assert_equal ::Instana.agent.agent_uuid, rack_span[:f][:h]
162
+
163
+ assert_equal sdk_span[:n], :sdk
164
+ assert_equal sdk_span[:data][:sdk][:name], :sub_task
165
+ assert_equal sdk_span[:data][:sdk][:type], :intermediate
166
+ assert_equal sdk_span[:k], 3
167
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_info], 1
168
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:sub_task_exit_info], 1
169
+
170
+ end
171
+
172
+ def test_block_tracing_error_capture
173
+ clear_all!
174
+ exception_raised = false
175
+ begin
176
+ ::Instana.tracer.start_or_continue_trace(:test_trace, {:one => 1}) do
177
+ raise Exception.new("Block exception test error")
178
+ end
179
+ rescue Exception
180
+ exception_raised = true
181
+ end
182
+
183
+ assert exception_raised
184
+
185
+ spans = ::Instana.processor.queued_spans
186
+ assert_equal 1, spans.length
187
+
188
+ sdk_span = spans[0]
189
+
190
+ assert_equal sdk_span[:n], :sdk
191
+ assert_equal sdk_span[:data][:sdk][:name], :test_trace
192
+ assert_equal sdk_span[:data][:sdk][:type], :intermediate
193
+ assert_equal sdk_span[:k], 3
194
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:one], 1
195
+ assert_equal sdk_span[:error], true
196
+ assert_equal sdk_span[:ec], 1
197
+ assert_equal sdk_span.key?(:stack), true
198
+ end
199
+
200
+ def test_low_level_error_logging
201
+ clear_all!
202
+ ::Instana.tracer.log_start_or_continue(:test_trace, {:one => 1})
203
+ ::Instana.tracer.log_info({:info_logged => 1})
204
+ ::Instana.tracer.log_error(Exception.new("Low level tracing api error"))
205
+ ::Instana.tracer.log_end(:test_trace, {:close_one => 1})
206
+
207
+ spans = ::Instana.processor.queued_spans
208
+ assert_equal 1, spans.length
209
+
210
+ sdk_span = spans[0]
211
+
212
+ assert_equal sdk_span[:n], :sdk
213
+ assert_equal sdk_span[:data][:sdk][:name], :test_trace
214
+ assert_equal sdk_span[:data][:sdk][:type], :intermediate
215
+ assert_equal sdk_span[:k], 3
216
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:one], 1
217
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:info_logged], 1
218
+ assert_equal sdk_span[:data][:sdk][:custom][:tags][:close_one], 1
219
+ assert_equal sdk_span[:error], true
220
+ assert_equal sdk_span[:ec], 1
221
+ assert_equal sdk_span.key?(:stack), false
222
+ end
223
+ end