instana 2.0.0 → 2.1.0
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 +4 -4
- data/lib/instana/setup.rb +1 -0
- data/lib/instana/span_filtering/condition.rb +134 -0
- data/lib/instana/span_filtering/configuration.rb +262 -0
- data/lib/instana/span_filtering/filter_rule.rb +31 -0
- data/lib/instana/span_filtering.rb +62 -0
- data/lib/instana/trace/span.rb +5 -3
- data/lib/instana/version.rb +1 -1
- metadata +7 -258
- data/.circleci/config.yml +0 -361
- data/.codeclimate.yml +0 -23
- data/.editorconfig +0 -10
- data/.fasterer.yml +0 -23
- data/.github/ISSUE_TEMPLATE/bug.yml +0 -39
- data/.github/ISSUE_TEMPLATE/config.yml +0 -8
- data/.github/workflows/pr_commits_signed_off.yml +0 -16
- data/.github/workflows/release-notification-on-slack.yml +0 -34
- data/.gitignore +0 -19
- data/.rubocop.yml +0 -34
- data/.rubocop_todo.yml +0 -1140
- data/.tekton/.currency/docs/report.md +0 -20
- data/.tekton/.currency/resources/requirements.txt +0 -4
- data/.tekton/.currency/resources/table.json +0 -100
- data/.tekton/.currency/scripts/generate_report.py +0 -308
- data/.tekton/README.md +0 -278
- data/.tekton/github-interceptor-secret.yaml +0 -8
- data/.tekton/github-pr-eventlistener.yaml +0 -104
- data/.tekton/github-pr-pipeline.yaml.part +0 -38
- data/.tekton/github-set-status-task.yaml +0 -43
- data/.tekton/github-webhook-ingress.yaml +0 -20
- data/.tekton/pipeline.yaml +0 -484
- data/.tekton/pipelinerun.yaml +0 -21
- data/.tekton/prepuller-restart-service-account.yaml +0 -31
- data/.tekton/ruby-tracer-prepuller-cronjob.yaml +0 -20
- data/.tekton/ruby-tracer-prepuller.yaml +0 -88
- data/.tekton/run_unittests.sh +0 -87
- data/.tekton/scheduled-eventlistener.yaml +0 -108
- data/.tekton/task.yaml +0 -453
- data/.tekton/tekton-triggers-eventlistener-serviceaccount.yaml +0 -29
- data/Appraisals +0 -124
- data/CONTRIBUTING.md +0 -86
- data/Gemfile +0 -22
- data/LICENSE +0 -22
- data/MAINTAINERS.md +0 -3
- data/Rakefile +0 -49
- data/bin/announce_release_on_slack.py +0 -103
- data/docker-compose.yml +0 -20
- data/download.sh +0 -85
- data/examples/otel.rb +0 -98
- data/examples/tracing.rb +0 -85
- data/extras/license_header.rb +0 -44
- data/gemfiles/.bundle/config +0 -2
- data/gemfiles/aws_30.gemfile +0 -21
- data/gemfiles/aws_60.gemfile +0 -16
- data/gemfiles/cuba_30.gemfile +0 -16
- data/gemfiles/cuba_40.gemfile +0 -13
- data/gemfiles/dalli_20.gemfile +0 -15
- data/gemfiles/dalli_30.gemfile +0 -12
- data/gemfiles/dalli_32.gemfile +0 -12
- data/gemfiles/excon_0100.gemfile +0 -14
- data/gemfiles/excon_021.gemfile +0 -17
- data/gemfiles/excon_079.gemfile +0 -17
- data/gemfiles/excon_100.gemfile +0 -14
- data/gemfiles/graphql_10.gemfile +0 -16
- data/gemfiles/graphql_20.gemfile +0 -15
- data/gemfiles/grpc_10.gemfile +0 -15
- data/gemfiles/mongo_216.gemfile +0 -15
- data/gemfiles/mongo_219.gemfile +0 -12
- data/gemfiles/net_http_01.gemfile +0 -17
- data/gemfiles/rack_16.gemfile +0 -15
- data/gemfiles/rack_20.gemfile +0 -15
- data/gemfiles/rack_30.gemfile +0 -13
- data/gemfiles/rails_42.gemfile +0 -18
- data/gemfiles/rails_50.gemfile +0 -19
- data/gemfiles/rails_52.gemfile +0 -19
- data/gemfiles/rails_60.gemfile +0 -19
- data/gemfiles/rails_61.gemfile +0 -21
- data/gemfiles/rails_70.gemfile +0 -18
- data/gemfiles/rails_71.gemfile +0 -17
- data/gemfiles/rails_80.gemfile +0 -17
- data/gemfiles/redis_40.gemfile +0 -15
- data/gemfiles/redis_50.gemfile +0 -13
- data/gemfiles/redis_51.gemfile +0 -13
- data/gemfiles/resque_122.gemfile +0 -16
- data/gemfiles/resque_1274_3scale.gemfile +0 -17
- data/gemfiles/resque_20.gemfile +0 -16
- data/gemfiles/rest_client_16.gemfile +0 -17
- data/gemfiles/rest_client_20.gemfile +0 -17
- data/gemfiles/roda_20.gemfile +0 -16
- data/gemfiles/roda_30.gemfile +0 -16
- data/gemfiles/rubocop_162.gemfile +0 -6
- data/gemfiles/sequel_56.gemfile +0 -16
- data/gemfiles/sequel_57.gemfile +0 -16
- data/gemfiles/sequel_58.gemfile +0 -16
- data/gemfiles/shoryuken_50.gemfile +0 -16
- data/gemfiles/shoryuken_60.gemfile +0 -13
- data/gemfiles/sidekiq_42.gemfile +0 -15
- data/gemfiles/sidekiq_50.gemfile +0 -15
- data/gemfiles/sidekiq_60.gemfile +0 -12
- data/gemfiles/sidekiq_65.gemfile +0 -12
- data/gemfiles/sidekiq_70.gemfile +0 -12
- data/gemfiles/sinatra_14.gemfile +0 -15
- data/gemfiles/sinatra_22.gemfile +0 -12
- data/gemfiles/sinatra_30.gemfile +0 -12
- data/gemfiles/sinatra_40.gemfile +0 -12
- data/instana.gemspec +0 -53
- data/log/.keep +0 -0
- data/sonar-project.properties +0 -9
- data/test/activator_test.rb +0 -50
- data/test/backend/agent_test.rb +0 -80
- data/test/backend/gc_snapshot_test.rb +0 -11
- data/test/backend/host_agent_activation_observer_test.rb +0 -73
- data/test/backend/host_agent_lookup_test.rb +0 -78
- data/test/backend/host_agent_reporting_observer_test.rb +0 -276
- data/test/backend/host_agent_test.rb +0 -89
- data/test/backend/process_info_test.rb +0 -83
- data/test/backend/request_client_test.rb +0 -39
- data/test/backend/serverless_agent_test.rb +0 -83
- data/test/benchmarks/bench_id_generation.rb +0 -15
- data/test/benchmarks/bench_opentracing.rb +0 -16
- data/test/config_test.rb +0 -34
- data/test/frameworks/cuba_test.rb +0 -61
- data/test/frameworks/roda_test.rb +0 -60
- data/test/frameworks/sinatra_test.rb +0 -71
- data/test/instana_test.rb +0 -37
- data/test/instrumentation/aws_test.rb +0 -241
- data/test/instrumentation/dalli_test.rb +0 -325
- data/test/instrumentation/excon_test.rb +0 -204
- data/test/instrumentation/graphql_test.rb +0 -289
- data/test/instrumentation/grpc_test.rb +0 -420
- data/test/instrumentation/mongo_test.rb +0 -68
- data/test/instrumentation/net_http_test.rb +0 -220
- data/test/instrumentation/rack_instrumented_request_test.rb +0 -211
- data/test/instrumentation/rack_test.rb +0 -415
- data/test/instrumentation/rails_action_cable_test.rb +0 -135
- data/test/instrumentation/rails_action_controller_test.rb +0 -218
- data/test/instrumentation/rails_action_mailer_test.rb +0 -66
- data/test/instrumentation/rails_action_view_test.rb +0 -154
- data/test/instrumentation/rails_active_job_test.rb +0 -65
- data/test/instrumentation/rails_active_record_database_missing_test.rb +0 -44
- data/test/instrumentation/rails_active_record_test.rb +0 -116
- data/test/instrumentation/redis_test.rb +0 -152
- data/test/instrumentation/resque_test.rb +0 -188
- data/test/instrumentation/rest_client_test.rb +0 -106
- data/test/instrumentation/sequel_test.rb +0 -111
- data/test/instrumentation/shoryuken_test.rb +0 -47
- data/test/instrumentation/sidekiq-client_test.rb +0 -169
- data/test/instrumentation/sidekiq-worker_test.rb +0 -180
- data/test/secrets_test.rb +0 -112
- data/test/serverless_test.rb +0 -369
- data/test/snapshot/deltable_test.rb +0 -17
- data/test/snapshot/docker_container_test.rb +0 -82
- data/test/snapshot/fargate_container_test.rb +0 -82
- data/test/snapshot/fargate_process_test.rb +0 -35
- data/test/snapshot/fargate_task_test.rb +0 -49
- data/test/snapshot/google_cloud_run_instance_test.rb +0 -74
- data/test/snapshot/google_cloud_run_process_test.rb +0 -33
- data/test/snapshot/lambda_function_test.rb +0 -37
- data/test/snapshot/ruby_process_test.rb +0 -32
- data/test/support/apps/active_record/active_record.rb +0 -24
- data/test/support/apps/grpc/boot.rb +0 -23
- data/test/support/apps/grpc/grpc_server.rb +0 -84
- data/test/support/apps/http_endpoint/boot.rb +0 -28
- data/test/support/apps/rails/boot.rb +0 -219
- data/test/support/apps/rails/models/block.rb +0 -21
- data/test/support/apps/rails/models/block6.rb +0 -21
- data/test/support/apps/resque/boot.rb +0 -5
- data/test/support/apps/resque/jobs/resque_error_job.rb +0 -22
- data/test/support/apps/resque/jobs/resque_fast_job.rb +0 -23
- data/test/support/apps/sidekiq/boot.rb +0 -25
- data/test/support/apps/sidekiq/jobs/sidekiq_job_1.rb +0 -9
- data/test/support/apps/sidekiq/jobs/sidekiq_job_2.rb +0 -10
- data/test/support/apps/sidekiq/worker.rb +0 -37
- data/test/support/helpers.rb +0 -85
- data/test/support/mock_timer.rb +0 -20
- data/test/test_helper.rb +0 -69
- data/test/trace/custom_test.rb +0 -233
- data/test/trace/id_management_test.rb +0 -78
- data/test/trace/instrumented_logger_test.rb +0 -39
- data/test/trace/processor_test.rb +0 -58
- data/test/trace/span_context_test.rb +0 -22
- data/test/trace/span_test.rb +0 -179
- data/test/trace/tracer_async_test.rb +0 -243
- data/test/trace/tracer_provider_test.rb +0 -148
- data/test/trace/tracer_test.rb +0 -363
- data/test/util_test.rb +0 -10
data/test/trace/span_test.rb
DELETED
@@ -1,179 +0,0 @@
|
|
1
|
-
# (c) Copyright IBM Corp. 2021
|
2
|
-
# (c) Copyright Instana Inc. 2021
|
3
|
-
|
4
|
-
require 'test_helper'
|
5
|
-
|
6
|
-
class SpanTest < Minitest::Test
|
7
|
-
def test_getters_setters
|
8
|
-
span = Instana::Span.new(:test)
|
9
|
-
|
10
|
-
assert_equal span[:s], span.id
|
11
|
-
assert_equal span[:t], span.trace_id
|
12
|
-
assert_nil span[:p] # parent_id of a root span is nil
|
13
|
-
assert_nil span[:d] # duration of an open span is nil
|
14
|
-
|
15
|
-
span.parent_id = 'test'
|
16
|
-
assert_equal 'test', span.parent_id
|
17
|
-
|
18
|
-
span.name = 'test'
|
19
|
-
assert_equal 'test', span[:data][:sdk][:name]
|
20
|
-
|
21
|
-
span[:t] = 'test'
|
22
|
-
assert span.key?(:t)
|
23
|
-
assert_equal 'test', span[:t]
|
24
|
-
|
25
|
-
assert span.inspect
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_builtin_span_rename
|
29
|
-
span = Instana::Span.new(:"net-http")
|
30
|
-
assert_equal :"net-http", span.name
|
31
|
-
|
32
|
-
span.name = 'test'
|
33
|
-
assert_equal 'test', span.name
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_exit_span
|
37
|
-
span = Instana::Span.new(:"net-http")
|
38
|
-
assert span.exit_span?
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_span_from_contetx
|
42
|
-
context = Instana::SpanContext.new(trace_id: 'test', span_id: 'test', level: 0)
|
43
|
-
span = Instana::Span.new(:test, context)
|
44
|
-
|
45
|
-
assert_equal 'test', span.parent_id
|
46
|
-
assert_equal 'test', span.trace_id
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_span_from_contetx_invalid
|
50
|
-
context = Instana::SpanContext.new(trace_id: nil, span_id: nil, level: 1)
|
51
|
-
span = Instana::Span.new(:test, parent_ctx: context)
|
52
|
-
|
53
|
-
assert_nil span.parent_id
|
54
|
-
refute_equal context.span_id, span.trace_id
|
55
|
-
assert_equal 1, span.context.level
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_span_collect_backtraces
|
59
|
-
Instana.config[:collect_backtraces] = true
|
60
|
-
span = Instana::Span.new(:excon)
|
61
|
-
assert span[:stack]
|
62
|
-
ensure
|
63
|
-
Instana.config[:collect_backtraces] = false
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_span_backtrace_cleaner
|
67
|
-
Instana.config[:collect_backtraces] = true
|
68
|
-
Instana.config[:backtrace_cleaner] =
|
69
|
-
->(trace) { trace.filter { |line| line.include?("lib/instana") } }
|
70
|
-
span = Instana::Span.new(:excon)
|
71
|
-
|
72
|
-
assert_equal 1, span[:stack].size
|
73
|
-
ensure
|
74
|
-
Instana.config[:backtrace_cleaner] = nil
|
75
|
-
Instana.config[:collect_backtraces] = false
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_span_stack_over_limit
|
79
|
-
def inner(depth = 50, &blk) # rubocop:disable Lint/NestedMethodDefinition
|
80
|
-
return blk.call if depth.zero?
|
81
|
-
|
82
|
-
inner(depth - 1, &blk)
|
83
|
-
end
|
84
|
-
|
85
|
-
inner do
|
86
|
-
span = Instana::Span.new(:excon)
|
87
|
-
span.add_stack(limit: 500)
|
88
|
-
assert_equal 40, span[:stack].length
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_multiple_errors
|
93
|
-
span = Instana::Span.new(:activerecord)
|
94
|
-
span.set_tag(:activerecord, {})
|
95
|
-
|
96
|
-
span.record_exception(StandardError.new('Test1'))
|
97
|
-
span.record_exception(StandardError.new('Test2'))
|
98
|
-
|
99
|
-
assert_equal 2, span[:ec]
|
100
|
-
assert_equal 'Test2', span[:data][:activerecord][:error]
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_record_exception_nil
|
104
|
-
span = Instana::Span.new(:activerecord)
|
105
|
-
span.record_exception(nil)
|
106
|
-
|
107
|
-
assert_equal 1, span[:ec]
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_set_tag_merge
|
111
|
-
span = Instana::Span.new(:excon)
|
112
|
-
span.set_tag(1024, {a: 1})
|
113
|
-
span.set_tag(1024, {b: 2})
|
114
|
-
|
115
|
-
assert_equal({'1024' => {a: 1, b: 2}}, span[:data])
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_set_tags_non_hash
|
119
|
-
span = Instana::Span.new(:excon)
|
120
|
-
assert_nil span.set_tags(0)
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_tags_standard
|
124
|
-
span = Instana::Span.new(:excon)
|
125
|
-
span.set_tag(:test, {a: 1})
|
126
|
-
|
127
|
-
assert_equal({test: {a: 1}}, span.tags)
|
128
|
-
assert_equal({a: 1}, span.tags(:test))
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_log_standard
|
132
|
-
span = Instana::Span.new(:excon)
|
133
|
-
span.log(:test, Time.now, a: 1)
|
134
|
-
|
135
|
-
assert_equal({log: {a: 1}}, span.tags)
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_log_error
|
139
|
-
time = Minitest::Mock.new
|
140
|
-
time.expect(:to_f, nil)
|
141
|
-
|
142
|
-
span = Instana::Span.new(:sdk)
|
143
|
-
span.log(:test, time, a: 1)
|
144
|
-
|
145
|
-
assert_equal({}, span.tags)
|
146
|
-
time.verify
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_inc_processed_counts
|
150
|
-
clear_all!
|
151
|
-
|
152
|
-
span = Instana::Span.new(:excon)
|
153
|
-
span.close
|
154
|
-
|
155
|
-
metrics = Instana.processor.span_metrics
|
156
|
-
|
157
|
-
assert_equal 1, metrics[:opened]
|
158
|
-
assert_equal 1, metrics[:closed]
|
159
|
-
|
160
|
-
metrics = Instana.processor.span_metrics
|
161
|
-
|
162
|
-
assert_equal 0, metrics[:opened]
|
163
|
-
assert_equal 0, metrics[:closed]
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_custom_service_name_set
|
167
|
-
service_name = 'MyVeryCustomRubyServiceNameForInstanaTesting'
|
168
|
-
ENV['INSTANA_SERVICE_NAME'] = service_name
|
169
|
-
span = Instana::Span.new(:excon)
|
170
|
-
assert_equal(service_name, span[:data][:service])
|
171
|
-
ensure
|
172
|
-
ENV.delete('INSTANA_SERVICE_NAME')
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_no_custom_service_name_set
|
176
|
-
span = Instana::Span.new(:excon)
|
177
|
-
assert_nil(span[:data][:service])
|
178
|
-
end
|
179
|
-
end
|
@@ -1,243 +0,0 @@
|
|
1
|
-
# (c) Copyright IBM Corp. 2021
|
2
|
-
# (c) Copyright Instana Inc. 2016
|
3
|
-
|
4
|
-
require 'test_helper'
|
5
|
-
|
6
|
-
class TracerAsyncTest < Minitest::Test
|
7
|
-
def test_same_thread_async_tracing
|
8
|
-
clear_all!
|
9
|
-
|
10
|
-
# Start tracing
|
11
|
-
::Instana.tracer.start_span(:rack, attributes: {:rack_start_kv => 1})
|
12
|
-
|
13
|
-
# Start an asynchronous span
|
14
|
-
span = ::Instana.tracer.log_async_entry(:my_async_op, { :entry_kv => 1})
|
15
|
-
|
16
|
-
refute_nil span
|
17
|
-
refute_nil span.context
|
18
|
-
|
19
|
-
# Current span should still be rack
|
20
|
-
assert_equal :rack, ::Instana.tracer.current_span.name
|
21
|
-
|
22
|
-
# End an asynchronous span
|
23
|
-
::Instana.tracer.log_async_exit(:my_async_op, { :exit_kv => 1 }, span)
|
24
|
-
|
25
|
-
# Current span should still be rack
|
26
|
-
assert_equal :rack, ::Instana.tracer.current_span.name
|
27
|
-
|
28
|
-
# End tracing
|
29
|
-
::Instana.tracer.log_end(:rack, {:rack_end_kv => 1})
|
30
|
-
|
31
|
-
spans = ::Instana.processor.queued_spans
|
32
|
-
assert_equal 2, spans.length
|
33
|
-
|
34
|
-
rack_span = find_first_span_by_name(spans, :rack)
|
35
|
-
async_span = find_first_span_by_name(spans, :my_async_op)
|
36
|
-
|
37
|
-
# Both spans have a duration
|
38
|
-
assert rack_span[:d]
|
39
|
-
assert async_span[:d]
|
40
|
-
|
41
|
-
# first_span is the parent of first_span
|
42
|
-
assert_equal rack_span[:s], async_span[:p]
|
43
|
-
# same trace id
|
44
|
-
assert_equal rack_span[:t], async_span[:t]
|
45
|
-
|
46
|
-
# KV checks
|
47
|
-
assert_equal 1, rack_span[:data][:rack_start_kv]
|
48
|
-
assert_equal 1, rack_span[:data][:rack_end_kv]
|
49
|
-
assert_equal 1, async_span[:data][:sdk][:custom][:tags][:entry_kv]
|
50
|
-
assert_equal 1, async_span[:data][:sdk][:custom][:tags][:exit_kv]
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_diff_thread_async_tracing
|
54
|
-
clear_all!
|
55
|
-
|
56
|
-
# Start tracing
|
57
|
-
span = ::Instana.tracer.start_span(:rack, attributes: {:rack_start_kv => 1})
|
58
|
-
|
59
|
-
t_context = ::Instana.tracer.context
|
60
|
-
refute_nil t_context.trace_id
|
61
|
-
refute_nil t_context.span_id
|
62
|
-
|
63
|
-
Thread.new do
|
64
|
-
span1 = ::Instana::Trace.with_span(OpenTelemetry::Trace.non_recording_span(t_context)) do
|
65
|
-
::Instana.tracer.start_span(:async_thread, attributes: { :async_start => 1 })
|
66
|
-
end
|
67
|
-
span2 = ::Instana::Trace.with_span(span1) do
|
68
|
-
::Instana.tracer.start_span(:sleepy_time, attributes: { :tired => 1 })
|
69
|
-
end
|
70
|
-
|
71
|
-
# Sleep beyond the end of this root trace
|
72
|
-
sleep 0.5
|
73
|
-
span2.set_tags({ :wake_up => 1})
|
74
|
-
span2.finish
|
75
|
-
span1.set_tags({:async_end => 1})
|
76
|
-
span1.finish
|
77
|
-
end
|
78
|
-
# Current span should still be rack
|
79
|
-
assert_equal :rack, ::Instana.tracer.current_span.name
|
80
|
-
span.set_tags({:rack_end_kv => 1})
|
81
|
-
span.finish
|
82
|
-
# End tracing
|
83
|
-
# ::Instana.tracer.log_end(:rack, {:rack_end_kv => 1})
|
84
|
-
|
85
|
-
assert_equal false, ::Instana.tracer.tracing?
|
86
|
-
|
87
|
-
# Sleep for 1 seconds to wait for the async thread to finish
|
88
|
-
sleep 1
|
89
|
-
|
90
|
-
spans = ::Instana.processor.queued_spans
|
91
|
-
assert_equal 3, spans.length
|
92
|
-
|
93
|
-
rack_span = find_first_span_by_name(spans, :rack)
|
94
|
-
async_span1 = find_first_span_by_name(spans, :async_thread)
|
95
|
-
async_span2 = find_first_span_by_name(spans, :sleepy_time)
|
96
|
-
|
97
|
-
# Validate the first original thread span
|
98
|
-
assert_equal :rack, rack_span[:n]
|
99
|
-
assert rack_span[:d]
|
100
|
-
assert_equal 1, rack_span[:data][:rack_start_kv]
|
101
|
-
assert_equal 1, rack_span[:data][:rack_end_kv]
|
102
|
-
|
103
|
-
# first span in second trace
|
104
|
-
assert_equal :sdk, async_span1[:n]
|
105
|
-
assert_equal :async_thread, async_span1[:data][:sdk][:name]
|
106
|
-
assert async_span1[:d]
|
107
|
-
assert_equal 1, async_span1[:data][:sdk][:custom][:tags][:async_start]
|
108
|
-
assert_equal 1, async_span1[:data][:sdk][:custom][:tags][:async_end]
|
109
|
-
|
110
|
-
# second span in second trace
|
111
|
-
assert_equal :sdk, async_span2[:n]
|
112
|
-
assert_equal :sleepy_time, async_span2[:data][:sdk][:name]
|
113
|
-
assert async_span2[:d]
|
114
|
-
assert_equal 1, async_span2[:data][:sdk][:custom][:tags][:tired]
|
115
|
-
assert_equal 1, async_span2[:data][:sdk][:custom][:tags][:wake_up]
|
116
|
-
# Validate linkage
|
117
|
-
# All spans have the same trace ID
|
118
|
-
assert rack_span[:t] == async_span1[:t] && async_span1[:t] == async_span2[:t]
|
119
|
-
|
120
|
-
assert_equal async_span2[:p], async_span1[:s]
|
121
|
-
assert_equal async_span1[:p], rack_span[:s]
|
122
|
-
|
123
|
-
assert rack_span[:t] == rack_span[:s]
|
124
|
-
assert async_span1[:t] != async_span1[:s]
|
125
|
-
assert async_span2[:t] != async_span2[:s]
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_out_of_order_async_tracing
|
129
|
-
clear_all!
|
130
|
-
|
131
|
-
# Start tracing
|
132
|
-
span = ::Instana.tracer.start_span(:rack, attributes: {:rack_start_kv => 1})
|
133
|
-
|
134
|
-
# Start three asynchronous spans
|
135
|
-
span1, span2, span3 = ::Instana::Trace.with_span(span) do
|
136
|
-
span1 = ::Instana.tracer.start_span(:my_async_op1, attributes: { :entry_kv => 1})
|
137
|
-
span2 = ::Instana.tracer.start_span(:my_async_op2, attributes: { :entry_kv => 2})
|
138
|
-
span3 = ::Instana.tracer.start_span(:my_async_op3, attributes: { :entry_kv => 3})
|
139
|
-
return span1, span2, span3
|
140
|
-
end
|
141
|
-
|
142
|
-
# Context awareness when using Opentelemetry is done through Opentelemetry::Context so the below test is invalid
|
143
|
-
# Current span should still be rack
|
144
|
-
# assert_equal :rack, ::Instana.tracer.current_span.name
|
145
|
-
|
146
|
-
# Log info to the async spans (out of order)
|
147
|
-
span2.set_tags({ :info_kv => 2 })
|
148
|
-
span1.set_tags({ :info_kv => 1 })
|
149
|
-
span3.set_tags({ :info_kv => 3 })
|
150
|
-
|
151
|
-
# Log out of order errors to the async spans
|
152
|
-
span3.record_exception(Exception.new("Async span 3"))
|
153
|
-
span2.record_exception(Exception.new("Async span 3"))
|
154
|
-
|
155
|
-
# End two out of order asynchronous spans
|
156
|
-
span3.set_tags({ :exit_kv => 3 })
|
157
|
-
span3.close
|
158
|
-
span2.set_tags({ :exit_kv => 2 })
|
159
|
-
span2.close
|
160
|
-
|
161
|
-
# Context awareness when using Opentelemetry is done through Opentelemetry::Context so the below test is invalid
|
162
|
-
# Current span should still be rack
|
163
|
-
# assert_equal :rack, ::Instana.tracer.current_span.name
|
164
|
-
|
165
|
-
# End tracing
|
166
|
-
span.set_tags({:rack_end_kv => 1})
|
167
|
-
span.finish
|
168
|
-
|
169
|
-
# Log an error to and close out the remaining async span after the parent trace has finished
|
170
|
-
span1.record_exception(Exception.new("Async span 1"))
|
171
|
-
span1.set_tags({ :exit_kv => 1 })
|
172
|
-
span1.close
|
173
|
-
|
174
|
-
spans = ::Instana.processor.queued_spans
|
175
|
-
assert_equal 4, spans.length
|
176
|
-
|
177
|
-
first_span = find_first_span_by_name(spans, :rack)
|
178
|
-
second_span = find_first_span_by_name(spans, :my_async_op1)
|
179
|
-
third_span = find_first_span_by_name(spans, :my_async_op2)
|
180
|
-
fourth_span = find_first_span_by_name(spans, :my_async_op3)
|
181
|
-
|
182
|
-
# Assure all spans have completed
|
183
|
-
assert first_span.key?(:d)
|
184
|
-
assert second_span.key?(:d)
|
185
|
-
assert third_span.key?(:d)
|
186
|
-
assert fourth_span.key?(:d)
|
187
|
-
|
188
|
-
# Linkage
|
189
|
-
assert_equal first_span[:s], second_span[:p]
|
190
|
-
assert_equal first_span[:s], third_span[:p]
|
191
|
-
assert_equal first_span[:s], fourth_span[:p]
|
192
|
-
|
193
|
-
# same trace id
|
194
|
-
assert_equal first_span[:t], second_span[:t]
|
195
|
-
assert_equal first_span[:t], third_span[:t]
|
196
|
-
assert_equal first_span[:t], fourth_span[:t]
|
197
|
-
|
198
|
-
assert first_span[:n] != :sdk
|
199
|
-
assert second_span[:n] == :sdk
|
200
|
-
assert third_span[:n] == :sdk
|
201
|
-
assert fourth_span[:n] == :sdk
|
202
|
-
|
203
|
-
# KV checks
|
204
|
-
assert_equal 1, first_span[:data][:rack_start_kv]
|
205
|
-
assert_equal 1, first_span[:data][:rack_end_kv]
|
206
|
-
assert_equal 1, second_span[:data][:sdk][:custom][:tags][:entry_kv]
|
207
|
-
assert_equal 1, second_span[:data][:sdk][:custom][:tags][:exit_kv]
|
208
|
-
assert_equal 2, third_span[:data][:sdk][:custom][:tags][:entry_kv]
|
209
|
-
assert_equal 2, third_span[:data][:sdk][:custom][:tags][:exit_kv]
|
210
|
-
assert_equal 3, fourth_span[:data][:sdk][:custom][:tags][:entry_kv]
|
211
|
-
assert_equal 3, fourth_span[:data][:sdk][:custom][:tags][:exit_kv]
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_async_helpers
|
215
|
-
clear_all!
|
216
|
-
::Instana.tracer.start_span(:rack)
|
217
|
-
|
218
|
-
span1 = ::Instana.tracer.start_span(:async, attributes: {})
|
219
|
-
span1.set_tags({a: 1})
|
220
|
-
span1.record_exception(StandardError.new('Error'))
|
221
|
-
span1.finish
|
222
|
-
|
223
|
-
spans = ::Instana.processor.queued_spans
|
224
|
-
span, = spans
|
225
|
-
|
226
|
-
assert_equal({a: 1}, span[:data][:sdk][:custom][:tags])
|
227
|
-
assert_equal(1, span[:ec])
|
228
|
-
end
|
229
|
-
|
230
|
-
def test_async_helpers_tag_exit
|
231
|
-
clear_all!
|
232
|
-
::Instana.tracer.start_span(:rack)
|
233
|
-
|
234
|
-
span1 = ::Instana.tracer.start_span(:async, attributes: {})
|
235
|
-
span1.set_tags({a: 1})
|
236
|
-
span1.finish
|
237
|
-
|
238
|
-
spans = ::Instana.processor.queued_spans
|
239
|
-
span, = spans
|
240
|
-
|
241
|
-
assert_equal({a: 1}, span[:data][:sdk][:custom][:tags])
|
242
|
-
end
|
243
|
-
end
|
@@ -1,148 +0,0 @@
|
|
1
|
-
# (c) Copyright IBM Corp. 2025
|
2
|
-
# (c) Copyright Instana Inc. 2025
|
3
|
-
|
4
|
-
require 'test_helper'
|
5
|
-
require 'instana/trace/tracer_provider'
|
6
|
-
require 'instana/trace/export'
|
7
|
-
|
8
|
-
class TracerProviderTest < Minitest::Test
|
9
|
-
def setup
|
10
|
-
@tracer_provider = Instana.tracer_provider
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_tracer
|
14
|
-
# This tests the global tracer is the same as tracer from tracer_provider
|
15
|
-
assert_equal Instana.tracer, @tracer_provider.tracer("instana_tracer")
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_shutdown_with_timeout
|
19
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
20
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
21
|
-
timeout = 10
|
22
|
-
result = @tracer_provider.shutdown(timeout: timeout)
|
23
|
-
assert_equal Instana::Trace::Export::SUCCESS, result
|
24
|
-
@span_processors = @tracer_provider.instance_variable_get(:@span_processors)
|
25
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
26
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
27
|
-
assert @tracer_provider.instance_variable_get(:@stopped)
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_shutdown_without_timeout
|
31
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
32
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
33
|
-
# @tracer = @tracer_provider.tracer('test_shutdown_without_timeout')
|
34
|
-
result = @tracer_provider.shutdown
|
35
|
-
assert_equal Instana::Trace::Export::SUCCESS, result
|
36
|
-
|
37
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
38
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
39
|
-
assert @tracer_provider.instance_variable_get(:@stopped)
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_shutdown_called_multiple_times
|
43
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
44
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
45
|
-
# @tracer = @tracer_provider.tracer('test_shutdown_called_multiple_times')
|
46
|
-
|
47
|
-
result1 = @tracer_provider.shutdown
|
48
|
-
result2 = @tracer_provider.shutdown
|
49
|
-
|
50
|
-
assert_equal Instana::Trace::Export::SUCCESS, result1
|
51
|
-
assert_equal Instana::Trace::Export::FAILURE, result2
|
52
|
-
|
53
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
54
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
55
|
-
assert @tracer_provider.instance_variable_get(:@stopped)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_shutdown_with_zero_timeout
|
59
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
60
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
61
|
-
# @tracer = @tracer_provider.tracer('test_shutdown_with_zero_timeout')
|
62
|
-
timeout = 0
|
63
|
-
result = @tracer_provider.shutdown(timeout: timeout)
|
64
|
-
assert_equal Instana::Trace::Export::TIMEOUT, result
|
65
|
-
|
66
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
67
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
68
|
-
assert @tracer_provider.instance_variable_get(:@stopped)
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_force_flush_with_timeout
|
72
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
73
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
74
|
-
timeout = 10
|
75
|
-
result = @tracer_provider.force_flush(timeout: timeout)
|
76
|
-
assert_equal Instana::Trace::Export::SUCCESS, result
|
77
|
-
@span_processors = @tracer_provider.instance_variable_get(:@span_processors)
|
78
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
79
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_force_flush_without_timeout
|
83
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
84
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
85
|
-
result = @tracer_provider.force_flush
|
86
|
-
assert_equal Instana::Trace::Export::SUCCESS, result
|
87
|
-
|
88
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
89
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_force_flush_with_zero_timeout
|
93
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
94
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
95
|
-
timeout = 0
|
96
|
-
result = @tracer_provider.force_flush(timeout: timeout)
|
97
|
-
assert_equal Instana::Trace::Export::TIMEOUT, result
|
98
|
-
|
99
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
100
|
-
assert_equal [Instana::Trace::Export::SUCCESS], @tracer_provider.instance_variable_get(:@span_processors).map(&:shutdown)
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_add_span_processor_after_shutdown
|
104
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
105
|
-
@tracer_provider.add_span_processor(DummyProcessor.new)
|
106
|
-
@tracer_provider.shutdown
|
107
|
-
result = @tracer_provider.add_span_processor(DummyProcessor.new)
|
108
|
-
assert_nil result
|
109
|
-
# No new span processor was added as tracer_provider is stopped
|
110
|
-
assert_equal 1, @tracer_provider.instance_variable_get(:@span_processors).length
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_internal_start_span_untraced
|
114
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
115
|
-
Minitest::Mock.new
|
116
|
-
result = @tracer_provider.internal_start_span('test_span', 'kind', {}, [], Time.now, nil, @instrumentation_scope)
|
117
|
-
assert_instance_of(Instana::Span, result)
|
118
|
-
# Todo add proper testcase
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_internal_start_span_traced
|
122
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
123
|
-
Minitest::Mock.new
|
124
|
-
result = @tracer_provider.internal_start_span('test_span', 'kind', {}, [], Time.now, nil, @instrumentation_scope)
|
125
|
-
assert_instance_of(Instana::Span, result)
|
126
|
-
# Todo add proper testcase
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_internal_start_span_stopped
|
130
|
-
@tracer_provider = ::Instana::Trace::TracerProvider.new
|
131
|
-
Minitest::Mock.new
|
132
|
-
result = @tracer_provider.internal_start_span('test_span', 'kind', {}, [], Time.now, nil, @instrumentation_scope)
|
133
|
-
assert_instance_of(Instana::Span, result)
|
134
|
-
# Todo add proper testcase
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
class DummyProcessor
|
139
|
-
def initialize; end
|
140
|
-
|
141
|
-
def shutdown(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
142
|
-
Instana::Trace::Export::SUCCESS
|
143
|
-
end
|
144
|
-
|
145
|
-
def force_flush(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
146
|
-
Instana::Trace::Export::SUCCESS
|
147
|
-
end
|
148
|
-
end
|