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,431 +0,0 @@
1
- # (c) Copyright IBM Corp. 2021
2
- # (c) Copyright Instana Inc. 2016
3
-
4
- module Instana
5
- class Span
6
- REGISTERED_SPANS = [ :actioncontroller, :actionview, :activerecord, :excon,
7
- :memcache, :'net-http', :rack, :render, :'rpc-client',
8
- :'rpc-server', :'sidekiq-client', :'sidekiq-worker',
9
- :redis, :'resque-client', :'resque-worker', :'graphql.server', :dynamodb, :s3, :sns, :sqs, :'aws.lambda.entry', :activejob, :log, :"mail.actionmailer",
10
- :"aws.lambda.invoke", :mongo, :sequel ].freeze
11
- ENTRY_SPANS = [ :rack, :'resque-worker', :'rpc-server', :'sidekiq-worker', :'graphql.server', :sqs,
12
- :'aws.lambda.entry' ].freeze
13
- EXIT_SPANS = [ :activerecord, :excon, :'net-http', :'resque-client',
14
- :'rpc-client', :'sidekiq-client', :redis, :dynamodb, :s3, :sns, :sqs, :log, :"mail.actionmailer",
15
- :"aws.lambda.invoke", :mongo, :sequel ].freeze
16
- HTTP_SPANS = [ :rack, :excon, :'net-http' ].freeze
17
-
18
- attr_accessor :parent
19
- attr_accessor :baggage
20
- attr_accessor :is_root
21
- attr_accessor :context
22
-
23
- def initialize(name, parent_ctx: nil, start_time: ::Instana::Util.now_in_ms)
24
- @data = {}
25
-
26
- if parent_ctx.is_a?(::Instana::Span)
27
- @parent = parent_ctx
28
- parent_ctx = parent_ctx.context
29
- end
30
-
31
- if parent_ctx.is_a?(::Instana::SpanContext)
32
- @is_root = false
33
-
34
- # If we have a parent trace, link to it
35
- if parent_ctx.trace_id
36
- @data[:t] = parent_ctx.trace_id # Trace ID
37
- @data[:p] = parent_ctx.span_id # Parent ID
38
- else
39
- @data[:t] = ::Instana::Util.generate_id
40
- end
41
-
42
- @data[:s] = ::Instana::Util.generate_id # Span ID
43
-
44
- @baggage = parent_ctx.baggage.dup
45
- @level = parent_ctx.level
46
- else
47
- # No parent specified so we're starting a new Trace - this will be the root span
48
- @is_root = true
49
- @level = 1
50
-
51
- id = ::Instana::Util.generate_id
52
- @data[:t] = id # Trace ID
53
- @data[:s] = id # Span ID
54
- end
55
-
56
- @data[:data] = {}
57
-
58
- if ENV.key?('INSTANA_SERVICE_NAME')
59
- @data[:data][:service] = ENV['INSTANA_SERVICE_NAME']
60
- end
61
-
62
- # Entity Source
63
- @data[:f] = ::Instana.agent.source
64
- # Start time
65
- if start_time.is_a?(Time)
66
- @data[:ts] = ::Instana::Util.time_to_ms(start_time)
67
- else
68
- @data[:ts] = start_time
69
- end
70
-
71
- # Check for custom tracing
72
- if REGISTERED_SPANS.include?(name.to_sym)
73
- @data[:n] = name.to_sym
74
- else
75
- configure_custom(name)
76
- end
77
-
78
- ::Instana.processor.start_span(self)
79
-
80
- # Attach a backtrace to all exit spans
81
- add_stack if ::Instana.config[:collect_backtraces] && exit_span?
82
- end
83
-
84
- # Adds a backtrace to this span
85
- #
86
- # @param limit [Integer] Limit the backtrace to the top <limit> frames
87
- #
88
- def add_stack(limit: 30, stack: Kernel.caller)
89
- cleaner = ::Instana.config[:backtrace_cleaner]
90
- stack = cleaner.call(stack) if cleaner
91
-
92
- @data[:stack] = stack
93
- .map do |call|
94
- file, line, *method = call.split(':')
95
-
96
- {
97
- c: file,
98
- n: line,
99
- m: method.join(' ')
100
- }
101
- end.take(limit > 40 ? 40 : limit)
102
- end
103
-
104
- # Log an error into the span
105
- #
106
- # @param e [Exception] The exception to be logged
107
- #
108
- def add_error(e)
109
- @data[:error] = true
110
-
111
- if @data.key?(:ec)
112
- @data[:ec] = @data[:ec] + 1
113
- else
114
- @data[:ec] = 1
115
- end
116
-
117
- # If a valid exception has been passed in, log the information about it
118
- # In case of just logging an error for things such as HTTP client 5xx
119
- # responses, an exception/backtrace may not exist.
120
- if e
121
- if e.backtrace.is_a?(Array)
122
- add_stack(stack: e.backtrace)
123
- end
124
-
125
- if HTTP_SPANS.include?(@data[:n])
126
- set_tags(:http => { :error => "#{e.class}: #{e.message}" })
127
- elsif @data[:n] == :activerecord
128
- @data[:data][:activerecord][:error] = e.message
129
- else
130
- log(:error, Time.now, message: e.message, parameters: e.class.to_s)
131
- end
132
- e.instance_variable_set(:@instana_logged, true)
133
- end
134
- self
135
- end
136
-
137
-
138
- # Configure this span to be a custom span per the
139
- # SDK generic span type.
140
- #
141
- # Default to an intermediate kind span. Can be overridden by
142
- # setting a span.kind tag.
143
- #
144
- # @param name [String] name of the span
145
- # @param kvs [Hash] list of key values to be reported in the span
146
- #
147
- def configure_custom(name)
148
- @data[:n] = :sdk
149
- @data[:data] = { :sdk => { :name => name.to_sym } }
150
- @data[:data][:sdk][:custom] = { :tags => {}, :logs => {} }
151
-
152
- if @is_root
153
- # For custom root spans (via SDK or opentracing), default to entry type
154
- @data[:k] = 1
155
- @data[:data][:sdk][:type] = :entry
156
- else
157
- @data[:k] = 3
158
- @data[:data][:sdk][:type] = :intermediate
159
- end
160
- self
161
- end
162
-
163
- # Closes out the span. This difference between this and
164
- # the finish method tells us how the tracing is being
165
- # performed (with OpenTracing or Instana default)
166
- #
167
- # @param end_time [Time] custom end time, if not now
168
- # @return [Span]
169
- #
170
- def close(end_time = ::Instana::Util.now_in_ms)
171
- if end_time.is_a?(Time)
172
- end_time = ::Instana::Util.time_to_ms(end_time)
173
- end
174
-
175
- @data[:d] = end_time - @data[:ts]
176
-
177
- # Add this span to the queue for reporting
178
- ::Instana.processor.add_span(self)
179
-
180
- self
181
- end
182
-
183
- #############################################################
184
- # Accessors
185
- #############################################################
186
-
187
- # Retrieve the context of this span.
188
- #
189
- # @return [Instana::SpanContext]
190
- #
191
- def context
192
- @context ||= ::Instana::SpanContext.new(@data[:t], @data[:s], @level, @baggage)
193
- end
194
-
195
- # Retrieve the ID for this span
196
- #
197
- # @return [Integer] the span ID
198
- def id
199
- @data[:s]
200
- end
201
-
202
- # Retrieve the Trace ID for this span
203
- #
204
- # @return [Integer] the Trace ID
205
- def trace_id
206
- @data[:t]
207
- end
208
-
209
- # Retrieve the parent ID of this span
210
- #
211
- # @return [Integer] parent span ID
212
- def parent_id
213
- @data[:p]
214
- end
215
-
216
- # Set the parent ID of this span
217
- #
218
- # @return [Integer] parent span ID
219
- def parent_id=(id)
220
- @data[:p] = id
221
- end
222
-
223
- # Get the name (operation) of this Span
224
- #
225
- # @return [String] or [Symbol] representing the span name
226
- def name
227
- if custom?
228
- @data[:data][:sdk][:name]
229
- else
230
- @data[:n]
231
- end
232
- end
233
-
234
- # Set the name (operation) for this Span
235
- #
236
- # @params name [String] or [Symbol]
237
- #
238
- def name=(n)
239
- if custom?
240
- @data[:data][:sdk][:name] = n
241
- else
242
- @data[:n] = n
243
- end
244
- end
245
-
246
- # Get the duration value for this Span
247
- #
248
- # @return [Integer] the duration in milliseconds
249
- def duration
250
- @data[:d]
251
- end
252
-
253
- # Hash accessor to the internal @data hash
254
- #
255
- def [](key)
256
- @data[key.to_sym]
257
- end
258
-
259
- # Hash setter to the internal @data hash
260
- #
261
- def []=(key, value)
262
- @data[key.to_sym] = value
263
- end
264
-
265
- # Hash key query to the internal @data hash
266
- #
267
- def key?(k)
268
- @data.key?(k.to_sym)
269
- end
270
-
271
- # Get the raw @data hash that summarizes this span
272
- #
273
- def raw
274
- @data
275
- end
276
-
277
- # Indicates whether this span is a custom or registered Span
278
- def custom?
279
- @data[:n] == :sdk
280
- end
281
-
282
- def inspect
283
- @data.inspect
284
- end
285
-
286
- # Check to see if the current span indicates an exit from application
287
- # code and into an external service
288
- def exit_span?
289
- EXIT_SPANS.include?(@data[:n])
290
- end
291
-
292
- #############################################################
293
- # OpenTracing Compatibility Methods
294
- #############################################################
295
-
296
- # Set the name of the operation
297
- # Spec: OpenTracing API
298
- #
299
- # @params name [String] or [Symbol]
300
- #
301
- def operation_name=(name)
302
- @data[:n] = name
303
- end
304
-
305
- # Set a tag value on this span
306
- # Spec: OpenTracing API
307
- #
308
- # @param key [String] the key of the tag
309
- # @param value [String, Numeric, Boolean] the value of the tag. If it's not
310
- # a String, Numeric, or Boolean it will be encoded with to_s
311
- #
312
- def set_tag(key, value)
313
- if ![Symbol, String].include?(key.class)
314
- key = key.to_s
315
- end
316
-
317
- # If <value> is not a Symbol, String, Array, Hash or Numeric - convert to string
318
- if ![Symbol, String, Array, TrueClass, FalseClass, Hash].include?(value.class) && !value.is_a?(Numeric)
319
- value = value.to_s
320
- end
321
-
322
- if custom?
323
- @data[:data][:sdk][:custom] ||= {}
324
- @data[:data][:sdk][:custom][:tags] ||= {}
325
- @data[:data][:sdk][:custom][:tags][key] = value
326
-
327
- if key.to_sym == :'span.kind'
328
- case value.to_sym
329
- when :entry, :server, :consumer
330
- @data[:data][:sdk][:type] = :entry
331
- @data[:k] = 1
332
- when :exit, :client, :producer
333
- @data[:data][:sdk][:type] = :exit
334
- @data[:k] = 2
335
- else
336
- @data[:data][:sdk][:type] = :intermediate
337
- @data[:k] = 3
338
- end
339
- end
340
- else
341
- if value.is_a?(Hash) && @data[:data][key].is_a?(Hash)
342
- @data[:data][key].merge!(value)
343
- else
344
- @data[:data][key] = value
345
- end
346
- end
347
- self
348
- end
349
-
350
- # Helper method to add multiple tags to this span
351
- #
352
- # @params tags [Hash]
353
- # @return [Span]
354
- #
355
- def set_tags(tags)
356
- return unless tags.is_a?(Hash)
357
- tags.each do |k,v|
358
- set_tag(k, v)
359
- end
360
- self
361
- end
362
-
363
- # Set a baggage item on the span
364
- # Spec: OpenTracing API
365
- #
366
- # @param key [String] the key of the baggage item
367
- # @param value [String] the value of the baggage item
368
- def set_baggage_item(key, value)
369
- @baggage ||= {}
370
- @baggage[key] = value
371
-
372
- # Init/Update the SpanContext item
373
- if @context
374
- @context.baggage = @baggage
375
- else
376
- @context ||= ::Instana::SpanContext.new(@data[:t], @data[:s], @level, @baggage)
377
- end
378
- self
379
- end
380
-
381
- # Get a baggage item
382
- # Spec: OpenTracing API
383
- #
384
- # @param key [String] the key of the baggage item
385
- # @return Value of the baggage item
386
- #
387
- def get_baggage_item(key)
388
- @baggage[key]
389
- end
390
-
391
- # Retrieve the hash of tags for this span
392
- #
393
- def tags(key = nil)
394
- if custom?
395
- tags = @data[:data][:sdk][:custom][:tags]
396
- else
397
- tags = @data[:data]
398
- end
399
- key ? tags[key] : tags
400
- end
401
-
402
- # Add a log entry to this span
403
- # Spec: OpenTracing API
404
- #
405
- # @param event [String] event name for the log
406
- # @param timestamp [Time] time of the log
407
- # @param fields [Hash] Additional information to log
408
- #
409
- def log(event = nil, timestamp = Time.now, **fields)
410
- ts = ::Instana::Util.time_to_ms(timestamp).to_s
411
- if custom?
412
- @data[:data][:sdk][:custom][:logs][ts] = fields
413
- @data[:data][:sdk][:custom][:logs][ts][:event] = event
414
- else
415
- set_tags(:log => fields)
416
- end
417
- rescue StandardError => e
418
- Instana.logger.debug { "#{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}" }
419
- end
420
-
421
- # Finish the {Span}
422
- # Spec: OpenTracing API
423
- #
424
- # @param end_time [Time] custom end time, if not now
425
- #
426
- def finish(end_time = ::Instana::Util.now_in_ms)
427
- close(end_time)
428
- self
429
- end
430
- end
431
- end
data/lib/opentracing.rb DELETED
@@ -1,32 +0,0 @@
1
- # (c) Copyright IBM Corp. 2021
2
- # (c) Copyright Instana Inc. 2017
3
-
4
- require "instana/open_tracing/carrier"
5
- require "instana/open_tracing/instana_tracer"
6
-
7
- module OpenTracing
8
- class << self
9
- # Text format for #inject and #extract
10
- FORMAT_TEXT_MAP = 1
11
-
12
- # Binary format for #inject and #extract
13
- FORMAT_BINARY = 2
14
-
15
- # Ruby Specific format to handle how Rack changes environment variables.
16
- FORMAT_RACK = 3
17
-
18
- attr_accessor :global_tracer
19
-
20
- def method_missing(method_name, *args, **kwargs, &block)
21
- @global_tracer.send(method_name, *args, **kwargs, &block)
22
- end
23
-
24
- def respond_to_missing?(name, all)
25
- @global_tracer.respond_to?(name, all)
26
- end
27
- end
28
- end
29
-
30
- # Set the global tracer to our OT tracer
31
- # which supports the OT specification
32
- OpenTracing.global_tracer = OpenTracing::InstanaTracer.new(::Instana.tracer)