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.
- checksums.yaml +7 -0
- data/.codeclimate.yml +23 -0
- data/.gitignore +16 -0
- data/.rubocop.yml +1156 -0
- data/.travis.yml +43 -0
- data/Configuration.md +149 -0
- data/Dockerfile +13 -0
- data/Gemfile +41 -0
- data/LICENSE +21 -0
- data/README.md +102 -0
- data/Rakefile +56 -0
- data/Tracing.md +145 -0
- data/Troubleshooting.md +32 -0
- data/benchmarks/Gemfile +7 -0
- data/benchmarks/id_generation.rb +12 -0
- data/benchmarks/opentracing.rb +26 -0
- data/benchmarks/rack_vanilla_vs_traced.rb +80 -0
- data/benchmarks/stackprof_rack_tracing.rb +77 -0
- data/benchmarks/time_processing.rb +12 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/examples/opentracing.rb +31 -0
- data/examples/tracing.rb +80 -0
- data/gemfiles/libraries.gemfile +71 -0
- data/gemfiles/rails32.gemfile +51 -0
- data/gemfiles/rails42.gemfile +50 -0
- data/gemfiles/rails50.gemfile +52 -0
- data/instana.gemspec +46 -0
- data/lib/instana.rb +12 -0
- data/lib/instana/agent.rb +441 -0
- data/lib/instana/agent/helpers.rb +61 -0
- data/lib/instana/agent/hooks.rb +37 -0
- data/lib/instana/agent/tasks.rb +48 -0
- data/lib/instana/base.rb +54 -0
- data/lib/instana/collector.rb +116 -0
- data/lib/instana/collectors/gc.rb +57 -0
- data/lib/instana/collectors/memory.rb +34 -0
- data/lib/instana/collectors/thread.rb +30 -0
- data/lib/instana/config.rb +79 -0
- data/lib/instana/eum/eum-test.js.erb +16 -0
- data/lib/instana/eum/eum.js.erb +14 -0
- data/lib/instana/frameworks/cuba.rb +6 -0
- data/lib/instana/frameworks/instrumentation/abstract_mysql_adapter.rb +58 -0
- data/lib/instana/frameworks/instrumentation/action_controller.rb +183 -0
- data/lib/instana/frameworks/instrumentation/action_view.rb +43 -0
- data/lib/instana/frameworks/instrumentation/active_record.rb +27 -0
- data/lib/instana/frameworks/instrumentation/mysql2_adapter.rb +81 -0
- data/lib/instana/frameworks/instrumentation/mysql_adapter.rb +56 -0
- data/lib/instana/frameworks/instrumentation/postgresql_adapter.rb +71 -0
- data/lib/instana/frameworks/rails.rb +42 -0
- data/lib/instana/frameworks/roda.rb +6 -0
- data/lib/instana/frameworks/sinatra.rb +9 -0
- data/lib/instana/helpers.rb +40 -0
- data/lib/instana/instrumentation.rb +21 -0
- data/lib/instana/instrumentation/dalli.rb +78 -0
- data/lib/instana/instrumentation/excon.rb +74 -0
- data/lib/instana/instrumentation/grpc.rb +84 -0
- data/lib/instana/instrumentation/net-http.rb +66 -0
- data/lib/instana/instrumentation/rack.rb +77 -0
- data/lib/instana/instrumentation/redis.rb +82 -0
- data/lib/instana/instrumentation/resque.rb +131 -0
- data/lib/instana/instrumentation/rest-client.rb +34 -0
- data/lib/instana/instrumentation/sidekiq-client.rb +45 -0
- data/lib/instana/instrumentation/sidekiq-worker.rb +54 -0
- data/lib/instana/opentracing/carrier.rb +4 -0
- data/lib/instana/opentracing/tracer.rb +18 -0
- data/lib/instana/rack.rb +10 -0
- data/lib/instana/setup.rb +36 -0
- data/lib/instana/test.rb +40 -0
- data/lib/instana/thread_local.rb +15 -0
- data/lib/instana/tracer.rb +392 -0
- data/lib/instana/tracing/processor.rb +92 -0
- data/lib/instana/tracing/span.rb +401 -0
- data/lib/instana/tracing/span_context.rb +33 -0
- data/lib/instana/util.rb +261 -0
- data/lib/instana/version.rb +4 -0
- data/lib/oj_check.rb +16 -0
- data/lib/opentracing.rb +6 -0
- data/test/agent/agent_test.rb +143 -0
- data/test/apps/cuba.rb +15 -0
- data/test/apps/grpc_server.rb +81 -0
- data/test/apps/roda.rb +10 -0
- data/test/apps/sinatra.rb +5 -0
- data/test/benchmarks/bench_id_generation.rb +12 -0
- data/test/benchmarks/bench_opentracing.rb +13 -0
- data/test/config_test.rb +37 -0
- data/test/frameworks/cuba_test.rb +44 -0
- data/test/frameworks/rack_test.rb +167 -0
- data/test/frameworks/rails/actioncontroller_test.rb +93 -0
- data/test/frameworks/rails/actionview3_test.rb +255 -0
- data/test/frameworks/rails/actionview4_test.rb +254 -0
- data/test/frameworks/rails/actionview5_test.rb +221 -0
- data/test/frameworks/rails/activerecord3_test.rb +134 -0
- data/test/frameworks/rails/activerecord4_test.rb +134 -0
- data/test/frameworks/rails/activerecord5_test.rb +87 -0
- data/test/frameworks/roda_test.rb +44 -0
- data/test/frameworks/sinatra_test.rb +44 -0
- data/test/instana_test.rb +27 -0
- data/test/instrumentation/dalli_test.rb +253 -0
- data/test/instrumentation/excon_test.rb +147 -0
- data/test/instrumentation/grpc_test.rb +377 -0
- data/test/instrumentation/net-http_test.rb +160 -0
- data/test/instrumentation/redis_test.rb +119 -0
- data/test/instrumentation/resque_test.rb +128 -0
- data/test/instrumentation/rest-client_test.rb +55 -0
- data/test/instrumentation/sidekiq-client_test.rb +125 -0
- data/test/instrumentation/sidekiq-worker_test.rb +173 -0
- data/test/jobs/resque_error_job.rb +22 -0
- data/test/jobs/resque_fast_job.rb +20 -0
- data/test/jobs/sidekiq_job_1.rb +6 -0
- data/test/jobs/sidekiq_job_2.rb +7 -0
- data/test/models/block.rb +18 -0
- data/test/servers/grpc_50051.rb +20 -0
- data/test/servers/helpers/sidekiq_worker_initializer.rb +27 -0
- data/test/servers/rackapp_6511.rb +25 -0
- data/test/servers/rails_3205.rb +167 -0
- data/test/servers/sidekiq/worker.rb +27 -0
- data/test/test_helper.rb +145 -0
- data/test/tracing/custom_test.rb +158 -0
- data/test/tracing/id_management_test.rb +130 -0
- data/test/tracing/opentracing_test.rb +335 -0
- data/test/tracing/trace_test.rb +67 -0
- data/test/tracing/tracer_async_test.rb +198 -0
- data/test/tracing/tracer_test.rb +223 -0
- 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
|