instana 2.0.0 → 2.2.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.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/lib/instana/instrumentation/instrumented_request.rb +2 -0
  3. data/lib/instana/instrumentation/net-http.rb +2 -1
  4. data/lib/instana/instrumentation/rack.rb +86 -66
  5. data/lib/instana/setup.rb +1 -0
  6. data/lib/instana/span_filtering/condition.rb +134 -0
  7. data/lib/instana/span_filtering/configuration.rb +262 -0
  8. data/lib/instana/span_filtering/filter_rule.rb +31 -0
  9. data/lib/instana/span_filtering.rb +62 -0
  10. data/lib/instana/trace/span.rb +5 -3
  11. data/lib/instana/trace/span_context.rb +10 -2
  12. data/lib/instana/trace/tracer.rb +0 -21
  13. data/lib/instana/util.rb +13 -0
  14. data/lib/instana/version.rb +1 -1
  15. metadata +7 -258
  16. data/.circleci/config.yml +0 -361
  17. data/.codeclimate.yml +0 -23
  18. data/.editorconfig +0 -10
  19. data/.fasterer.yml +0 -23
  20. data/.github/ISSUE_TEMPLATE/bug.yml +0 -39
  21. data/.github/ISSUE_TEMPLATE/config.yml +0 -8
  22. data/.github/workflows/pr_commits_signed_off.yml +0 -16
  23. data/.github/workflows/release-notification-on-slack.yml +0 -34
  24. data/.gitignore +0 -19
  25. data/.rubocop.yml +0 -34
  26. data/.rubocop_todo.yml +0 -1140
  27. data/.tekton/.currency/docs/report.md +0 -20
  28. data/.tekton/.currency/resources/requirements.txt +0 -4
  29. data/.tekton/.currency/resources/table.json +0 -100
  30. data/.tekton/.currency/scripts/generate_report.py +0 -308
  31. data/.tekton/README.md +0 -278
  32. data/.tekton/github-interceptor-secret.yaml +0 -8
  33. data/.tekton/github-pr-eventlistener.yaml +0 -104
  34. data/.tekton/github-pr-pipeline.yaml.part +0 -38
  35. data/.tekton/github-set-status-task.yaml +0 -43
  36. data/.tekton/github-webhook-ingress.yaml +0 -20
  37. data/.tekton/pipeline.yaml +0 -484
  38. data/.tekton/pipelinerun.yaml +0 -21
  39. data/.tekton/prepuller-restart-service-account.yaml +0 -31
  40. data/.tekton/ruby-tracer-prepuller-cronjob.yaml +0 -20
  41. data/.tekton/ruby-tracer-prepuller.yaml +0 -88
  42. data/.tekton/run_unittests.sh +0 -87
  43. data/.tekton/scheduled-eventlistener.yaml +0 -108
  44. data/.tekton/task.yaml +0 -453
  45. data/.tekton/tekton-triggers-eventlistener-serviceaccount.yaml +0 -29
  46. data/Appraisals +0 -124
  47. data/CONTRIBUTING.md +0 -86
  48. data/Gemfile +0 -22
  49. data/LICENSE +0 -22
  50. data/MAINTAINERS.md +0 -3
  51. data/Rakefile +0 -49
  52. data/bin/announce_release_on_slack.py +0 -103
  53. data/docker-compose.yml +0 -20
  54. data/download.sh +0 -85
  55. data/examples/otel.rb +0 -98
  56. data/examples/tracing.rb +0 -85
  57. data/extras/license_header.rb +0 -44
  58. data/gemfiles/.bundle/config +0 -2
  59. data/gemfiles/aws_30.gemfile +0 -21
  60. data/gemfiles/aws_60.gemfile +0 -16
  61. data/gemfiles/cuba_30.gemfile +0 -16
  62. data/gemfiles/cuba_40.gemfile +0 -13
  63. data/gemfiles/dalli_20.gemfile +0 -15
  64. data/gemfiles/dalli_30.gemfile +0 -12
  65. data/gemfiles/dalli_32.gemfile +0 -12
  66. data/gemfiles/excon_0100.gemfile +0 -14
  67. data/gemfiles/excon_021.gemfile +0 -17
  68. data/gemfiles/excon_079.gemfile +0 -17
  69. data/gemfiles/excon_100.gemfile +0 -14
  70. data/gemfiles/graphql_10.gemfile +0 -16
  71. data/gemfiles/graphql_20.gemfile +0 -15
  72. data/gemfiles/grpc_10.gemfile +0 -15
  73. data/gemfiles/mongo_216.gemfile +0 -15
  74. data/gemfiles/mongo_219.gemfile +0 -12
  75. data/gemfiles/net_http_01.gemfile +0 -17
  76. data/gemfiles/rack_16.gemfile +0 -15
  77. data/gemfiles/rack_20.gemfile +0 -15
  78. data/gemfiles/rack_30.gemfile +0 -13
  79. data/gemfiles/rails_42.gemfile +0 -18
  80. data/gemfiles/rails_50.gemfile +0 -19
  81. data/gemfiles/rails_52.gemfile +0 -19
  82. data/gemfiles/rails_60.gemfile +0 -19
  83. data/gemfiles/rails_61.gemfile +0 -21
  84. data/gemfiles/rails_70.gemfile +0 -18
  85. data/gemfiles/rails_71.gemfile +0 -17
  86. data/gemfiles/rails_80.gemfile +0 -17
  87. data/gemfiles/redis_40.gemfile +0 -15
  88. data/gemfiles/redis_50.gemfile +0 -13
  89. data/gemfiles/redis_51.gemfile +0 -13
  90. data/gemfiles/resque_122.gemfile +0 -16
  91. data/gemfiles/resque_1274_3scale.gemfile +0 -17
  92. data/gemfiles/resque_20.gemfile +0 -16
  93. data/gemfiles/rest_client_16.gemfile +0 -17
  94. data/gemfiles/rest_client_20.gemfile +0 -17
  95. data/gemfiles/roda_20.gemfile +0 -16
  96. data/gemfiles/roda_30.gemfile +0 -16
  97. data/gemfiles/rubocop_162.gemfile +0 -6
  98. data/gemfiles/sequel_56.gemfile +0 -16
  99. data/gemfiles/sequel_57.gemfile +0 -16
  100. data/gemfiles/sequel_58.gemfile +0 -16
  101. data/gemfiles/shoryuken_50.gemfile +0 -16
  102. data/gemfiles/shoryuken_60.gemfile +0 -13
  103. data/gemfiles/sidekiq_42.gemfile +0 -15
  104. data/gemfiles/sidekiq_50.gemfile +0 -15
  105. data/gemfiles/sidekiq_60.gemfile +0 -12
  106. data/gemfiles/sidekiq_65.gemfile +0 -12
  107. data/gemfiles/sidekiq_70.gemfile +0 -12
  108. data/gemfiles/sinatra_14.gemfile +0 -15
  109. data/gemfiles/sinatra_22.gemfile +0 -12
  110. data/gemfiles/sinatra_30.gemfile +0 -12
  111. data/gemfiles/sinatra_40.gemfile +0 -12
  112. data/instana.gemspec +0 -53
  113. data/log/.keep +0 -0
  114. data/sonar-project.properties +0 -9
  115. data/test/activator_test.rb +0 -50
  116. data/test/backend/agent_test.rb +0 -80
  117. data/test/backend/gc_snapshot_test.rb +0 -11
  118. data/test/backend/host_agent_activation_observer_test.rb +0 -73
  119. data/test/backend/host_agent_lookup_test.rb +0 -78
  120. data/test/backend/host_agent_reporting_observer_test.rb +0 -276
  121. data/test/backend/host_agent_test.rb +0 -89
  122. data/test/backend/process_info_test.rb +0 -83
  123. data/test/backend/request_client_test.rb +0 -39
  124. data/test/backend/serverless_agent_test.rb +0 -83
  125. data/test/benchmarks/bench_id_generation.rb +0 -15
  126. data/test/benchmarks/bench_opentracing.rb +0 -16
  127. data/test/config_test.rb +0 -34
  128. data/test/frameworks/cuba_test.rb +0 -61
  129. data/test/frameworks/roda_test.rb +0 -60
  130. data/test/frameworks/sinatra_test.rb +0 -71
  131. data/test/instana_test.rb +0 -37
  132. data/test/instrumentation/aws_test.rb +0 -241
  133. data/test/instrumentation/dalli_test.rb +0 -325
  134. data/test/instrumentation/excon_test.rb +0 -204
  135. data/test/instrumentation/graphql_test.rb +0 -289
  136. data/test/instrumentation/grpc_test.rb +0 -420
  137. data/test/instrumentation/mongo_test.rb +0 -68
  138. data/test/instrumentation/net_http_test.rb +0 -220
  139. data/test/instrumentation/rack_instrumented_request_test.rb +0 -211
  140. data/test/instrumentation/rack_test.rb +0 -415
  141. data/test/instrumentation/rails_action_cable_test.rb +0 -135
  142. data/test/instrumentation/rails_action_controller_test.rb +0 -218
  143. data/test/instrumentation/rails_action_mailer_test.rb +0 -66
  144. data/test/instrumentation/rails_action_view_test.rb +0 -154
  145. data/test/instrumentation/rails_active_job_test.rb +0 -65
  146. data/test/instrumentation/rails_active_record_database_missing_test.rb +0 -44
  147. data/test/instrumentation/rails_active_record_test.rb +0 -116
  148. data/test/instrumentation/redis_test.rb +0 -152
  149. data/test/instrumentation/resque_test.rb +0 -188
  150. data/test/instrumentation/rest_client_test.rb +0 -106
  151. data/test/instrumentation/sequel_test.rb +0 -111
  152. data/test/instrumentation/shoryuken_test.rb +0 -47
  153. data/test/instrumentation/sidekiq-client_test.rb +0 -169
  154. data/test/instrumentation/sidekiq-worker_test.rb +0 -180
  155. data/test/secrets_test.rb +0 -112
  156. data/test/serverless_test.rb +0 -369
  157. data/test/snapshot/deltable_test.rb +0 -17
  158. data/test/snapshot/docker_container_test.rb +0 -82
  159. data/test/snapshot/fargate_container_test.rb +0 -82
  160. data/test/snapshot/fargate_process_test.rb +0 -35
  161. data/test/snapshot/fargate_task_test.rb +0 -49
  162. data/test/snapshot/google_cloud_run_instance_test.rb +0 -74
  163. data/test/snapshot/google_cloud_run_process_test.rb +0 -33
  164. data/test/snapshot/lambda_function_test.rb +0 -37
  165. data/test/snapshot/ruby_process_test.rb +0 -32
  166. data/test/support/apps/active_record/active_record.rb +0 -24
  167. data/test/support/apps/grpc/boot.rb +0 -23
  168. data/test/support/apps/grpc/grpc_server.rb +0 -84
  169. data/test/support/apps/http_endpoint/boot.rb +0 -28
  170. data/test/support/apps/rails/boot.rb +0 -219
  171. data/test/support/apps/rails/models/block.rb +0 -21
  172. data/test/support/apps/rails/models/block6.rb +0 -21
  173. data/test/support/apps/resque/boot.rb +0 -5
  174. data/test/support/apps/resque/jobs/resque_error_job.rb +0 -22
  175. data/test/support/apps/resque/jobs/resque_fast_job.rb +0 -23
  176. data/test/support/apps/sidekiq/boot.rb +0 -25
  177. data/test/support/apps/sidekiq/jobs/sidekiq_job_1.rb +0 -9
  178. data/test/support/apps/sidekiq/jobs/sidekiq_job_2.rb +0 -10
  179. data/test/support/apps/sidekiq/worker.rb +0 -37
  180. data/test/support/helpers.rb +0 -85
  181. data/test/support/mock_timer.rb +0 -20
  182. data/test/test_helper.rb +0 -69
  183. data/test/trace/custom_test.rb +0 -233
  184. data/test/trace/id_management_test.rb +0 -78
  185. data/test/trace/instrumented_logger_test.rb +0 -39
  186. data/test/trace/processor_test.rb +0 -58
  187. data/test/trace/span_context_test.rb +0 -22
  188. data/test/trace/span_test.rb +0 -179
  189. data/test/trace/tracer_async_test.rb +0 -243
  190. data/test/trace/tracer_provider_test.rb +0 -148
  191. data/test/trace/tracer_test.rb +0 -363
  192. data/test/util_test.rb +0 -10
@@ -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