instana 1.217.0 → 2.0.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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +101 -225
  3. data/.tekton/.currency/scripts/generate_report.py +194 -22
  4. data/.tekton/pipeline.yaml +65 -152
  5. data/.tekton/prepuller-restart-service-account.yaml +31 -0
  6. data/.tekton/ruby-tracer-prepuller-cronjob.yaml +20 -0
  7. data/.tekton/ruby-tracer-prepuller.yaml +27 -26
  8. data/.tekton/task.yaml +31 -27
  9. data/Gemfile +5 -0
  10. data/README.md +2 -1
  11. data/Rakefile +1 -1
  12. data/examples/otel.rb +98 -0
  13. data/examples/tracing.rb +1 -0
  14. data/gemfiles/rails_61.gemfile +1 -0
  15. data/gemfiles/rails_70.gemfile +1 -0
  16. data/instana.gemspec +5 -0
  17. data/lib/instana/base.rb +4 -2
  18. data/lib/instana/instrumentation/action_cable.rb +8 -4
  19. data/lib/instana/instrumentation/action_controller.rb +2 -4
  20. data/lib/instana/instrumentation/action_mailer.rb +1 -1
  21. data/lib/instana/instrumentation/action_view.rb +4 -4
  22. data/lib/instana/instrumentation/active_job.rb +26 -13
  23. data/lib/instana/instrumentation/active_record.rb +1 -1
  24. data/lib/instana/instrumentation/aws_sdk_dynamodb.rb +1 -1
  25. data/lib/instana/instrumentation/aws_sdk_lambda.rb +1 -1
  26. data/lib/instana/instrumentation/aws_sdk_s3.rb +1 -1
  27. data/lib/instana/instrumentation/aws_sdk_sns.rb +1 -1
  28. data/lib/instana/instrumentation/aws_sdk_sqs.rb +1 -1
  29. data/lib/instana/instrumentation/dalli.rb +1 -1
  30. data/lib/instana/instrumentation/excon.rb +2 -2
  31. data/lib/instana/instrumentation/graphql.rb +3 -3
  32. data/lib/instana/instrumentation/grpc.rb +14 -13
  33. data/lib/instana/instrumentation/mongo.rb +3 -3
  34. data/lib/instana/instrumentation/net-http.rb +5 -4
  35. data/lib/instana/instrumentation/rack.rb +36 -4
  36. data/lib/instana/instrumentation/redis.rb +1 -1
  37. data/lib/instana/instrumentation/resque.rb +10 -8
  38. data/lib/instana/instrumentation/rest-client.rb +4 -4
  39. data/lib/instana/instrumentation/sequel.rb +3 -3
  40. data/lib/instana/instrumentation/shoryuken.rb +4 -1
  41. data/lib/instana/instrumentation/sidekiq-client.rb +21 -19
  42. data/lib/instana/instrumentation/sidekiq-worker.rb +22 -21
  43. data/lib/instana/instrumented_logger.rb +1 -1
  44. data/lib/instana/samplers/result.rb +32 -0
  45. data/lib/instana/samplers/samplers.rb +76 -0
  46. data/lib/instana/serverless.rb +4 -2
  47. data/lib/instana/setup.rb +4 -5
  48. data/lib/instana/trace/export.rb +36 -0
  49. data/lib/instana/{tracing → trace}/processor.rb +19 -15
  50. data/lib/instana/trace/span.rb +532 -0
  51. data/lib/instana/{tracing → trace}/span_context.rb +17 -8
  52. data/lib/instana/trace/span_kind.rb +51 -0
  53. data/lib/instana/trace/span_limits.rb +63 -0
  54. data/lib/instana/{tracer.rb → trace/tracer.rb} +106 -54
  55. data/lib/instana/trace/tracer_provider.rb +198 -0
  56. data/lib/instana/trace.rb +74 -0
  57. data/lib/instana/util.rb +11 -0
  58. data/lib/instana/version.rb +1 -1
  59. data/test/frameworks/sinatra_test.rb +2 -1
  60. data/test/instrumentation/aws_test.rb +7 -7
  61. data/test/instrumentation/dalli_test.rb +8 -8
  62. data/test/instrumentation/excon_test.rb +3 -3
  63. data/test/instrumentation/graphql_test.rb +4 -4
  64. data/test/instrumentation/grpc_test.rb +8 -8
  65. data/test/instrumentation/mongo_test.rb +1 -1
  66. data/test/instrumentation/net_http_test.rb +6 -6
  67. data/test/instrumentation/rails_action_cable_test.rb +2 -2
  68. data/test/instrumentation/rails_action_mailer_test.rb +1 -1
  69. data/test/instrumentation/rails_active_job_test.rb +1 -1
  70. data/test/instrumentation/rails_active_record_database_missing_test.rb +2 -3
  71. data/test/instrumentation/rails_active_record_test.rb +8 -7
  72. data/test/instrumentation/redis_test.rb +7 -7
  73. data/test/instrumentation/resque_test.rb +5 -5
  74. data/test/instrumentation/rest_client_test.rb +1 -2
  75. data/test/instrumentation/sequel_test.rb +12 -6
  76. data/test/instrumentation/sidekiq-client_test.rb +2 -2
  77. data/test/instrumentation/sidekiq-worker_test.rb +2 -2
  78. data/test/{tracing → trace}/custom_test.rb +32 -25
  79. data/test/{tracing → trace}/id_management_test.rb +0 -2
  80. data/test/{tracing → trace}/instrumented_logger_test.rb +1 -1
  81. data/test/{tracing → trace}/processor_test.rb +6 -6
  82. data/test/{tracing → trace}/span_context_test.rb +3 -3
  83. data/test/{tracing → trace}/span_test.rb +7 -7
  84. data/test/{tracing → trace}/tracer_async_test.rb +43 -30
  85. data/test/trace/tracer_provider_test.rb +148 -0
  86. data/test/{tracing → trace}/tracer_test.rb +48 -37
  87. metadata +105 -32
  88. data/examples/opentracing.rb +0 -35
  89. data/lib/instana/open_tracing/carrier.rb +0 -7
  90. data/lib/instana/open_tracing/instana_tracer.rb +0 -99
  91. data/lib/instana/tracing/span.rb +0 -431
  92. data/lib/opentracing.rb +0 -32
  93. data/test/tracing/opentracing_test.rb +0 -382
@@ -1,5 +1,19 @@
1
1
  # (c) Copyright IBM Corp. 2021
2
2
  # (c) Copyright Instana Inc. 2021
3
+ module OpenTelemetry
4
+ module Trace
5
+ module Propagation
6
+ module TraceContext
7
+ # A TraceParent is an implementation of the W3C trace context specification
8
+ # https://www.w3.org/TR/trace-context/
9
+ # {Trace::SpanContext}
10
+ class TraceParent
11
+ REGEXP = /^(?<version>[A-Fa-f0-9]{2})-(?<trace_id>[A-Fa-f0-9]{32})-(?<span_id>[A-Fa-f0-9]{32})-(?<flags>[A-Fa-f0-9]{2})(?<ignored>-.*)?$/
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
3
17
 
4
18
  module Instana
5
19
  module Instrumentation
@@ -15,12 +29,11 @@ module Instana
15
29
  }
16
30
  }
17
31
 
18
- ::Instana::Tracer.trace(:activejob, tags) do
32
+ ::Instana.tracer.in_span(:activejob, attributes: tags) do
19
33
  context = ::Instana.tracer.context
20
- job.arguments = [{
21
- given_arguments: job.arguments,
22
- instana_context: context ? context.to_hash : nil
23
- }]
34
+ job.arguments.append({
35
+ instana_context: context ? context.to_hash : nil
36
+ })
24
37
 
25
38
  block.call
26
39
  end
@@ -35,15 +48,15 @@ module Instana
35
48
  job_id: job.job_id
36
49
  }
37
50
  }
38
-
39
- incoming_context = if job.arguments.is_a?(Array) && job.arguments.first.is_a?(Hash)
40
- instana_context = job.arguments.first[:instana_context]
41
- job.arguments = job.arguments.first[:given_arguments]
42
- instana_context ? ::Instana::SpanContext.new(instana_context[:trace_id], instana_context[:span_id]) : nil
51
+ incoming_context = if job.arguments.is_a?(Array) && job.arguments.last.is_a?(Hash) && job.arguments.last.key?(:instana_context)
52
+ instana_context = job.arguments.last[:instana_context]
53
+ job.arguments.pop
54
+ instana_context ? ::Instana::SpanContext.new(trace_id: instana_context[:trace_id], span_id: instana_context[:span_id]) : nil
43
55
  end
44
-
45
- ::Instana::Tracer.start_or_continue_trace(:activejob, tags, incoming_context) do
46
- block.call
56
+ Trace.with_span(OpenTelemetry::Trace.non_recording_span(incoming_context)) do
57
+ ::Instana.tracer.in_span(:activejob, attributes: tags) do
58
+ block.call
59
+ end
47
60
  end
48
61
  end
49
62
  end
@@ -35,7 +35,7 @@ module Instana
35
35
 
36
36
  def maybe_trace(call_payload, name, &blk)
37
37
  if ::Instana.tracer.tracing? && !ignored?(call_payload, name)
38
- ::Instana.tracer.trace(:activerecord, call_payload, &blk)
38
+ ::Instana.tracer.in_span(:activerecord, attributes: call_payload, &blk)
39
39
  else
40
40
  yield
41
41
  end
@@ -11,7 +11,7 @@ module Instana
11
11
  table: table_name_from(context)
12
12
  }
13
13
 
14
- ::Instana.tracer.trace(:dynamodb, {dynamodb: dynamo_tags}) { @handler.call(context) }
14
+ ::Instana.tracer.in_span(:dynamodb, attributes: {dynamodb: dynamo_tags}) { @handler.call(context) }
15
15
  end
16
16
 
17
17
  private
@@ -25,7 +25,7 @@ module Instana
25
25
  type: context.params[:invocation_type]
26
26
  }.reject { |_, v| v.nil? }
27
27
 
28
- ::Instana.tracer.start_or_continue_trace(:"aws.lambda.invoke", {aws: {lambda: {invoke: tags}}}) do
28
+ ::Instana.tracer.in_span(:"aws.lambda.invoke", attributes: {aws: {lambda: {invoke: tags}}}) do
29
29
  response = @handler.call(context)
30
30
  if response.respond_to? :status_code
31
31
  ::Instana.tracer.log_info(:http => {:status => response.status_code })
@@ -12,7 +12,7 @@ module Instana
12
12
  key: key_from_context(context)
13
13
  }.reject { |_, v| v.nil? }
14
14
 
15
- ::Instana.tracer.trace(:s3, {s3: s3_tags}) { @handler.call(context) }
15
+ ::Instana.tracer.in_span(:s3, attributes: {s3: s3_tags}) { @handler.call(context) }
16
16
  end
17
17
 
18
18
  private
@@ -14,7 +14,7 @@ module Instana
14
14
  }.reject { |_, v| v.nil? }
15
15
 
16
16
  if context.operation_name == :publish
17
- ::Instana.tracer.trace(:sns, {sns: sns_tags}) { @handler.call(context) }
17
+ ::Instana.tracer.in_span(:sns, attributes: {sns: sns_tags}) { @handler.call(context) }
18
18
  else
19
19
  @handler.call(context)
20
20
  end
@@ -15,7 +15,7 @@ module Instana
15
15
 
16
16
  span_tags = tags_for(context.operation_name, context.params).reject { |_, v| v.nil? }
17
17
 
18
- ::Instana.tracer.trace(:sqs, {sqs: span_tags}) do |span|
18
+ ::Instana.tracer.in_span(:sqs, attributes: {sqs: span_tags}) do |span|
19
19
  case context.operation_name
20
20
  when :send_message
21
21
  inject_instana_headers(span, context.params)
@@ -17,7 +17,7 @@ module Instana
17
17
  entry_payload[:memcache][:command] = op
18
18
  entry_payload[:memcache][:key] = key
19
19
 
20
- ::Instana.tracer.log_entry(:memcache, entry_payload)
20
+ ::Instana.tracer.start_span(:memcache, attributes: entry_payload)
21
21
  exit_payload = { :memcache => {} }
22
22
 
23
23
  result = super(*args, &blk)
@@ -16,10 +16,10 @@ module Instana
16
16
  if datum[:pipeline] == true
17
17
  # Pass the context along in the datum so we get back on response
18
18
  # and can close out the async span
19
- datum[:instana_span] = ::Instana.tracer.log_async_entry(:excon, payload)
19
+ datum[:instana_span] = ::Instana.tracer.start_span(:excon, attributes: payload)
20
20
  t_context = datum[:instana_span].context
21
21
  else
22
- ::Instana.tracer.log_entry(:excon, payload)
22
+ ::Instana.tracer.start_span(:excon, attributes: payload)
23
23
  t_context = ::Instana.tracer.context
24
24
  end
25
25
 
@@ -35,13 +35,13 @@ module Instana
35
35
  }
36
36
 
37
37
  begin
38
- ::Instana.tracer.log_entry(:'graphql.server')
38
+ span = ::Instana.tracer.start_span(:'graphql.server', attributes: {graphql: payload})
39
39
  yield
40
40
  rescue Exception => e
41
- ::Instana.tracer.log_error(e)
41
+ span.record_exception(e)
42
42
  raise e
43
43
  ensure
44
- ::Instana.tracer.log_exit(:'graphql.server', {graphql: payload})
44
+ span.finish
45
45
  end
46
46
  end
47
47
 
@@ -22,7 +22,7 @@ module Instana
22
22
  kvs[:rpc][:call] = method
23
23
  kvs[:rpc][:call_type] = call_type
24
24
 
25
- ::Instana.tracer.log_entry(:'rpc-client', kvs)
25
+ current_span = ::Instana.tracer.start_span(:'rpc-client', attributes: kvs)
26
26
 
27
27
  context = ::Instana.tracer.context
28
28
  if context
@@ -35,11 +35,11 @@ module Instana
35
35
  super(method, *others, **options)
36
36
  rescue => e
37
37
  kvs[:rpc][:error] = true
38
- ::Instana.tracer.log_info(kvs)
39
- ::Instana.tracer.log_error(e)
38
+ current_span.set_tags(kvs)
39
+ current_span.record_exception(e)
40
40
  raise
41
41
  ensure
42
- ::Instana.tracer.log_exit(:'rpc-client', {})
42
+ current_span.finish
43
43
  end
44
44
  end
45
45
  end
@@ -60,9 +60,9 @@ module Instana
60
60
 
61
61
  incoming_context = {}
62
62
  if metadata.key?('x-instana-t')
63
- incoming_context[:trace_id] = ::Instana::Util.header_to_id(metadata['x-instana-t'])
64
- incoming_context[:span_id] = ::Instana::Util.header_to_id(metadata['x-instana-s']) if metadata.key?('x-instana-s')
65
- incoming_context[:level] = metadata['x-instana-l'] if metadata.key?('x-instana-l')
63
+ incoming_context = SpanContext.new(trace_id: ::Instana::Util.header_to_id(metadata['x-instana-t']),
64
+ span_id: metadata.key?('x-instana-s') ? ::Instana::Util.header_to_id(metadata['x-instana-s']) : nil,
65
+ level: metadata.key?('x-instana-l') ? metadata['x-instana-l'] : nil)
66
66
  end
67
67
 
68
68
  kvs[:rpc][:flavor] = :grpc
@@ -71,18 +71,19 @@ module Instana
71
71
  kvs[:rpc][:call_type] = call_type
72
72
  kvs[:rpc][:peer] = { address: active_call.peer }
73
73
 
74
- ::Instana.tracer.log_start_or_continue(
75
- :'rpc-server', kvs, incoming_context
76
- )
74
+ span = OpenTelemetry::Trace.non_recording_span(incoming_context) if incoming_context
75
+ parent_context = Trace.context_with_span(span) if incoming_context
76
+
77
+ current_span = ::Instana.tracer.start_span(:'rpc-server', attributes: kvs, with_parent: parent_context)
77
78
 
78
79
  super(active_call, mth, *others)
79
80
  rescue => e
80
81
  kvs[:rpc][:error] = true
81
- ::Instana.tracer.log_info(kvs)
82
- ::Instana.tracer.log_error(e)
82
+ current_span.set_tags(kvs)
83
+ current_span.record_exception(e)
83
84
  raise
84
85
  ensure
85
- ::Instana.tracer.log_end(:'rpc-server', {}) if ::Instana.tracer.tracing?
86
+ current_span.finish if ::Instana.tracer.tracing?
86
87
  end
87
88
  end
88
89
  end
@@ -20,19 +20,19 @@ module Instana
20
20
  json: filter_statement(event.command)
21
21
  }
22
22
 
23
- @requests[event.request_id] = ::Instana.tracer.log_async_entry(:mongo, {mongo: tags})
23
+ @requests[event.request_id] = ::Instana.tracer.start_span(:mongo, attributes: {mongo: tags})
24
24
  end
25
25
 
26
26
  def failed(event)
27
27
  span = @requests.delete(event.request_id)
28
28
  span.add_error(Exception.new(event.message))
29
29
 
30
- ::Instana.tracer.log_async_exit(:mongo, {}, span)
30
+ span.finish
31
31
  end
32
32
 
33
33
  def succeeded(event)
34
34
  span = @requests.delete(event.request_id)
35
- ::Instana.tracer.log_async_exit(:mongo, {}, span)
35
+ span.finish
36
36
  end
37
37
 
38
38
  private
@@ -12,7 +12,7 @@ module Instana
12
12
  return super(*args, &block)
13
13
  end
14
14
 
15
- ::Instana.tracer.log_entry(:'net-http')
15
+ current_span = ::Instana.tracer.start_span(:'net-http')
16
16
 
17
17
  # Send out the tracing context with the request
18
18
  request = args[0]
@@ -54,15 +54,16 @@ module Instana
54
54
  if response.code.to_i >= 500
55
55
  # Because of the 5xx response, we flag this span as errored but
56
56
  # without a backtrace (no exception)
57
- ::Instana.tracer.log_error(nil)
57
+ current_span.record_exception(nil)
58
58
  end
59
59
 
60
60
  response
61
61
  rescue => e
62
- ::Instana.tracer.log_error(e)
62
+ current_span&.record_exception(e)
63
63
  raise
64
64
  ensure
65
- ::Instana.tracer.log_exit(:'net-http', kv_payload) unless do_skip
65
+ current_span&.set_tags(kv_payload)
66
+ current_span&.finish unless do_skip
66
67
  end
67
68
 
68
69
  def skip_instrumentation?
@@ -10,14 +10,20 @@ module Instana
10
10
  @app = app
11
11
  end
12
12
 
13
- def call(env)
13
+ def call(env) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
14
14
  req = InstrumentedRequest.new(env)
15
15
  kvs = {
16
16
  http: req.request_tags
17
17
  }.reject { |_, v| v.nil? }
18
18
 
19
- current_span = ::Instana.tracer.log_start_or_continue(:rack, {}, req.incoming_context)
19
+ parent_context = extract_trace_context(req.incoming_context)
20
20
 
21
+ span = OpenTelemetry::Trace.non_recording_span(parent_context) if parent_context
22
+ parent_context = Trace.context_with_span(span) if parent_context
23
+
24
+ current_span = ::Instana.tracer.start_span(:rack, attributes: {}, with_parent: parent_context)
25
+ trace_ctx = OpenTelemetry::Trace.context_with_span(current_span)
26
+ @trace_token = OpenTelemetry::Context.attach(trace_ctx)
21
27
  status, headers, response = @app.call(env)
22
28
 
23
29
  if ::Instana.tracer.tracing?
@@ -66,7 +72,7 @@ module Instana
66
72
 
67
73
  [status, headers, response]
68
74
  rescue Exception => e
69
- ::Instana.tracer.log_error(e) if ::Instana.tracer.tracing?
75
+ current_span.record_exception(e) if ::Instana.tracer.tracing?
70
76
  raise
71
77
  ensure
72
78
  if ::Instana.tracer.tracing?
@@ -85,9 +91,35 @@ module Instana
85
91
  headers['Traceparent'] = trace_context.trace_parent_header
86
92
  headers['Server-Timing'] = "intid;desc=#{trace_context.trace_id_header}"
87
93
  end
94
+ current_span.set_tags(kvs)
95
+ OpenTelemetry::Context.detach(@trace_token) if @trace_token
96
+ current_span.finish
97
+ end
98
+ end
99
+
100
+ private
88
101
 
89
- ::Instana.tracer.log_end(:rack, kvs)
102
+ def extract_trace_context(incoming_context)
103
+ return nil unless incoming_context
104
+
105
+ parent_context = nil
106
+
107
+ if incoming_context.is_a?(Hash)
108
+ unless incoming_context.empty?
109
+ parent_context = SpanContext.new(
110
+ trace_id: incoming_context[:trace_id],
111
+ span_id: incoming_context[:span_id],
112
+ level: incoming_context[:level],
113
+ baggage: {
114
+ external_trace_id: incoming_context[:external_trace_id],
115
+ external_state: incoming_context[:external_state]
116
+ }
117
+ )
118
+ end
119
+ elsif incoming_context.is_a?(SpanContext)
120
+ parent_context = incoming_context
90
121
  end
122
+ parent_context
91
123
  end
92
124
  end
93
125
  end
@@ -66,7 +66,7 @@ module Instana
66
66
  kv_payload = { redis: {} }
67
67
 
68
68
  begin
69
- ::Instana.tracer.log_entry(:redis)
69
+ ::Instana.tracer.start_span(:redis)
70
70
 
71
71
  begin
72
72
  kv_payload[:redis][:connection] = "#{self.host}:#{self.port}"
@@ -27,7 +27,7 @@ module Instana
27
27
  if Instana.tracer.tracing?
28
28
  kvs = collect_kvs(:enqueue, klass, args)
29
29
 
30
- Instana.tracer.trace(:'resque-client', kvs) do
30
+ Instana.tracer.in_span(:'resque-client', attributes: kvs) do
31
31
  args.push(::Instana.tracer.context.to_hash) if ::Instana.config[:'resque-client'][:propagate]
32
32
  super(klass, *args)
33
33
  end
@@ -41,7 +41,7 @@ module Instana
41
41
  kvs = collect_kvs(:enqueue_to, klass, args)
42
42
  kvs[:Queue] = queue.to_s if queue
43
43
 
44
- Instana.tracer.trace(:'resque-client', kvs) do
44
+ Instana.tracer.in_span(:'resque-client', attributes: kvs) do
45
45
  args.push(::Instana.tracer.context.to_hash) if ::Instana.config[:'resque-client'][:propagate]
46
46
  super(queue, klass, *args)
47
47
  end
@@ -54,7 +54,7 @@ module Instana
54
54
  if Instana.tracer.tracing?
55
55
  kvs = collect_kvs(:dequeue, klass, args)
56
56
 
57
- Instana.tracer.trace(:'resque-client', kvs) do
57
+ Instana.tracer.in_span(:'resque-client', attributes: kvs) do
58
58
  super(klass, *args)
59
59
  end
60
60
  else
@@ -78,13 +78,15 @@ module Instana
78
78
  trace_context = if ::Instana.config[:'resque-client'][:propagate] && job.payload['args'][-1].is_a?(Hash) && job.payload['args'][-1].keys.include?('trace_id')
79
79
  context_from_wire = job.payload['args'].pop
80
80
  ::Instana::SpanContext.new(
81
- context_from_wire['trace_id'],
82
- context_from_wire['span_id']
81
+ trace_id: context_from_wire['trace_id'],
82
+ span_id: context_from_wire['span_id']
83
83
  )
84
84
  end
85
-
86
- Instana.tracer.start_or_continue_trace(:'resque-worker', kvs, trace_context) do
87
- super(job)
85
+ span = OpenTelemetry::Trace.non_recording_span(trace_context) if trace_context
86
+ Trace.with_span(span) do
87
+ Instana.tracer.in_span(:'resque-worker', attributes: kvs) do |span|
88
+ super(job)
89
+ end
88
90
  end
89
91
  end
90
92
  end
@@ -8,14 +8,14 @@ module Instana
8
8
  # Since RestClient uses net/http under the covers, we just
9
9
  # provide span visibility here. HTTP related KVs are reported
10
10
  # in the Net::HTTP instrumentation
11
- ::Instana.tracer.log_entry(:'rest-client')
11
+ span = ::Instana.tracer.start_span(:'rest-client', with_parent: OpenTelemetry::Context.current)
12
12
 
13
- super(&block)
13
+ Trace.with_span(span) { super(&block) }
14
14
  rescue => e
15
- ::Instana.tracer.log_error(e)
15
+ span.record_exception(e)
16
16
  raise
17
17
  ensure
18
- ::Instana.tracer.log_exit(:'rest-client')
18
+ span.finish
19
19
  end
20
20
  end
21
21
  end
@@ -3,7 +3,7 @@
3
3
  module Instana
4
4
  module Instrumentation
5
5
  module Sequel
6
- IGNORED_SQL = %w[BEGIN COMMIT SET].freeze
6
+ IGNORED_SQL = %w[BEGIN COMMIT SET PRAGMA].freeze
7
7
  VERSION_SELECT_STATEMENT = "SELECT VERSION()".freeze
8
8
  SANITIZE_REGEXP = /('[\s\S][^']*'|\d*\.\d+|\d+|NULL)/i
9
9
 
@@ -26,9 +26,9 @@ module Instana
26
26
  ::Instana.config[:sanitize_sql] ? sql.gsub(SANITIZE_REGEXP, '?') : sql
27
27
  end
28
28
 
29
- def maybe_trace(call_payload, &blk)
29
+ def maybe_trace(call_payload, &block)
30
30
  if ::Instana.tracer.tracing? && !ignored?(call_payload)
31
- ::Instana.tracer.trace(:sequel, call_payload, &blk)
31
+ ::Instana.tracer.in_span(:sequel, attributes: call_payload, &block)
32
32
  else
33
33
  yield
34
34
  end
@@ -15,7 +15,10 @@ module Instana
15
15
  }
16
16
 
17
17
  context = incomming_context_from(sqs_message.message_attributes)
18
- ::Instana.tracer.start_or_continue_trace(:sqs, {sqs: sqs_tags}, context, &block)
18
+ instana_context = Instana::SpanContext.new(trace_id: context[:trace_id], span_id: context[:span_id], level: context[:level])
19
+ Trace.with_span(OpenTelemetry::Trace.non_recording_span(instana_context)) do
20
+ ::Instana.tracer.in_span(:sqs, attributes: {sqs: sqs_tags}, &block)
21
+ end
19
22
  end
20
23
 
21
24
  private
@@ -5,11 +5,10 @@ module Instana
5
5
  module Instrumentation
6
6
  class SidekiqClient
7
7
  def call(worker_class, msg, queue, _redis_pool)
8
- kv_payload = { :'sidekiq-client' => {} }
9
- kv_payload[:'sidekiq-client'][:queue] = queue
10
- kv_payload[:'sidekiq-client'][:job] = worker_class.to_s
11
- kv_payload[:'sidekiq-client'][:retry] = msg['retry'].to_s
12
- ::Instana.tracer.log_entry(:'sidekiq-client', kv_payload)
8
+ kvs = { :'sidekiq-client' => {} }
9
+ kvs[:'sidekiq-client'][:queue] = queue
10
+ kvs[:'sidekiq-client'][:job] = worker_class.to_s
11
+ kvs[:'sidekiq-client'][:retry] = msg['retry'].to_s
13
12
 
14
13
  # Temporary until we move connection collection to redis
15
14
  # instrumentation
@@ -24,24 +23,27 @@ module Instana
24
23
  else # Unexpected version, continue without recording any redis-url
25
24
  break
26
25
  end
27
- kv_payload[:'sidekiq-client'][:'redis-url'] = "#{host}:#{port}"
26
+ kvs[:'sidekiq-client'][:'redis-url'] = "#{host}:#{port}"
28
27
  end
29
28
 
30
- context = ::Instana.tracer.context
31
- if context
32
- msg['X-Instana-T'] = context.trace_id_header
33
- msg['X-Instana-S'] = context.span_id_header
34
- end
29
+ Instana.tracer.in_span(:'sidekiq-client', attributes: kvs) do |span|
30
+ context = ::Instana.tracer.context
31
+ if context
32
+ msg['X-Instana-T'] = context.trace_id_header
33
+ msg['X-Instana-S'] = context.span_id_header
34
+ end
35
+
36
+ result = yield
35
37
 
36
- result = yield
38
+ if result && result['jid']
39
+ span.set_tag(:'sidekiq-client', { job_id: result['jid'] })
40
+ end
37
41
 
38
- kv_payload[:'sidekiq-client'][:job_id] = result['jid']
39
- result
40
- rescue => e
41
- ::Instana.tracer.log_error(e)
42
- raise
43
- ensure
44
- ::Instana.tracer.log_exit(:'sidekiq-client', kv_payload)
42
+ result
43
+ rescue => e
44
+ span.record_exception(e)
45
+ raise
46
+ end
45
47
  end
46
48
  end
47
49
  end
@@ -5,11 +5,11 @@ module Instana
5
5
  module Instrumentation
6
6
  class SidekiqWorker
7
7
  def call(_worker, msg, _queue)
8
- kv_payload = { :'sidekiq-worker' => {} }
9
- kv_payload[:'sidekiq-worker'][:job_id] = msg['jid']
10
- kv_payload[:'sidekiq-worker'][:queue] = msg['queue']
11
- kv_payload[:'sidekiq-worker'][:job] = msg['class'].to_s
12
- kv_payload[:'sidekiq-worker'][:retry] = msg['retry'].to_s
8
+ kvs = { :'sidekiq-worker' => {} }
9
+ kvs[:'sidekiq-worker'][:job_id] = msg['jid']
10
+ kvs[:'sidekiq-worker'][:queue] = msg['queue']
11
+ kvs[:'sidekiq-worker'][:job] = msg['class'].to_s
12
+ kvs[:'sidekiq-worker'][:retry] = msg['retry'].to_s
13
13
 
14
14
  # Temporary until we move connection collection to redis
15
15
  # instrumentation
@@ -24,29 +24,30 @@ module Instana
24
24
  else # Unexpected version, continue without recording any redis-url
25
25
  break
26
26
  end
27
- kv_payload[:'sidekiq-worker'][:'redis-url'] = "#{host}:#{port}"
27
+ kvs[:'sidekiq-worker'][:'redis-url'] = "#{host}:#{port}"
28
28
  end
29
29
 
30
- context = {}
30
+ trace_context = nil
31
31
  if msg.key?('X-Instana-T')
32
32
  trace_id = msg.delete('X-Instana-T')
33
33
  span_id = msg.delete('X-Instana-S')
34
- context[:trace_id] = ::Instana::Util.header_to_id(trace_id)
35
- context[:span_id] = ::Instana::Util.header_to_id(span_id) if span_id
34
+ trace_context = ::Instana::SpanContext.new(
35
+ trace_id: ::Instana::Util.header_to_id(trace_id),
36
+ span_id: span_id ? ::Instana::Util.header_to_id(span_id) : nil
37
+ )
36
38
  end
37
39
 
38
- ::Instana.tracer.log_start_or_continue(
39
- :'sidekiq-worker', kv_payload, context
40
- )
41
-
42
- yield
43
- rescue => e
44
- kv_payload[:'sidekiq-worker'][:error] = true
45
- ::Instana.tracer.log_info(kv_payload)
46
- ::Instana.tracer.log_error(e)
47
- raise
48
- ensure
49
- ::Instana.tracer.log_end(:'sidekiq-worker', {}) if ::Instana.tracer.tracing?
40
+ parent_non_recording_span = OpenTelemetry::Trace.non_recording_span(trace_context) if trace_context
41
+ Trace.with_span(parent_non_recording_span) do
42
+ Instana.tracer.in_span(:'sidekiq-worker', attributes: kvs) do |span|
43
+ yield
44
+ rescue => e
45
+ kvs[:'sidekiq-worker'][:error] = true
46
+ span.set_tags(kvs)
47
+ span.record_exception(e)
48
+ raise
49
+ end
50
+ end
50
51
  end
51
52
  end
52
53
  end
@@ -17,7 +17,7 @@ module Instana
17
17
  level: LEVEL_LABELS[severity],
18
18
  message: "#{message} #{progname}".strip
19
19
  }
20
- Instana::Tracer.trace(:log, {log: tags}) {}
20
+ Instana.tracer.in_span(:log, attributes: {log: tags}) {}
21
21
  end
22
22
 
23
23
  super(severity, message, progname)
@@ -0,0 +1,32 @@
1
+ # (c) Copyright IBM Corp. 2025
2
+
3
+ module Instana
4
+ module Trace
5
+ module Samplers
6
+ class Result
7
+ EMPTY_HASH = {}.freeze
8
+ attr_reader :tracestate, :attributes
9
+
10
+ def initialize(decision:, tracestate:, attributes: nil)
11
+ @decision = decision
12
+ @attributes = attributes.freeze || EMPTY_HASH
13
+ @tracestate = tracestate
14
+ end
15
+
16
+ # Returns true if this span should be sampled.
17
+ #
18
+ # @return FALSE always
19
+ def sampled?
20
+ false
21
+ end
22
+
23
+ # Returns true if this span should record events, attributes, status, etc.
24
+ #
25
+ # returns TRUE always
26
+ def recording?
27
+ true
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end