instana 1.217.1 → 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.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/lib/instana/base.rb +4 -2
  4. data/lib/instana/instrumentation/action_cable.rb +8 -4
  5. data/lib/instana/instrumentation/action_controller.rb +2 -4
  6. data/lib/instana/instrumentation/action_mailer.rb +1 -1
  7. data/lib/instana/instrumentation/action_view.rb +4 -4
  8. data/lib/instana/instrumentation/active_job.rb +20 -5
  9. data/lib/instana/instrumentation/active_record.rb +1 -1
  10. data/lib/instana/instrumentation/aws_sdk_dynamodb.rb +1 -1
  11. data/lib/instana/instrumentation/aws_sdk_lambda.rb +1 -1
  12. data/lib/instana/instrumentation/aws_sdk_s3.rb +1 -1
  13. data/lib/instana/instrumentation/aws_sdk_sns.rb +1 -1
  14. data/lib/instana/instrumentation/aws_sdk_sqs.rb +1 -1
  15. data/lib/instana/instrumentation/dalli.rb +1 -1
  16. data/lib/instana/instrumentation/excon.rb +2 -2
  17. data/lib/instana/instrumentation/graphql.rb +3 -3
  18. data/lib/instana/instrumentation/grpc.rb +14 -13
  19. data/lib/instana/instrumentation/mongo.rb +3 -3
  20. data/lib/instana/instrumentation/net-http.rb +5 -4
  21. data/lib/instana/instrumentation/rack.rb +36 -4
  22. data/lib/instana/instrumentation/redis.rb +1 -1
  23. data/lib/instana/instrumentation/resque.rb +10 -8
  24. data/lib/instana/instrumentation/rest-client.rb +4 -4
  25. data/lib/instana/instrumentation/sequel.rb +3 -3
  26. data/lib/instana/instrumentation/shoryuken.rb +4 -1
  27. data/lib/instana/instrumentation/sidekiq-client.rb +21 -19
  28. data/lib/instana/instrumentation/sidekiq-worker.rb +22 -21
  29. data/lib/instana/instrumented_logger.rb +1 -1
  30. data/lib/instana/samplers/result.rb +32 -0
  31. data/lib/instana/samplers/samplers.rb +76 -0
  32. data/lib/instana/serverless.rb +4 -2
  33. data/lib/instana/setup.rb +5 -5
  34. data/lib/instana/span_filtering/condition.rb +134 -0
  35. data/lib/instana/span_filtering/configuration.rb +262 -0
  36. data/lib/instana/span_filtering/filter_rule.rb +31 -0
  37. data/lib/instana/span_filtering.rb +62 -0
  38. data/lib/instana/trace/export.rb +36 -0
  39. data/lib/instana/{tracing → trace}/processor.rb +19 -15
  40. data/lib/instana/trace/span.rb +534 -0
  41. data/lib/instana/{tracing → trace}/span_context.rb +17 -8
  42. data/lib/instana/trace/span_kind.rb +51 -0
  43. data/lib/instana/trace/span_limits.rb +63 -0
  44. data/lib/instana/{tracer.rb → trace/tracer.rb} +106 -54
  45. data/lib/instana/trace/tracer_provider.rb +198 -0
  46. data/lib/instana/trace.rb +74 -0
  47. data/lib/instana/util.rb +11 -0
  48. data/lib/instana/version.rb +1 -1
  49. metadata +89 -267
  50. data/.circleci/config.yml +0 -485
  51. data/.codeclimate.yml +0 -23
  52. data/.editorconfig +0 -10
  53. data/.fasterer.yml +0 -23
  54. data/.github/ISSUE_TEMPLATE/bug.yml +0 -39
  55. data/.github/ISSUE_TEMPLATE/config.yml +0 -8
  56. data/.github/workflows/pr_commits_signed_off.yml +0 -16
  57. data/.github/workflows/release-notification-on-slack.yml +0 -34
  58. data/.gitignore +0 -19
  59. data/.rubocop.yml +0 -34
  60. data/.rubocop_todo.yml +0 -1140
  61. data/.tekton/.currency/docs/report.md +0 -20
  62. data/.tekton/.currency/resources/requirements.txt +0 -4
  63. data/.tekton/.currency/resources/table.json +0 -100
  64. data/.tekton/.currency/scripts/generate_report.py +0 -136
  65. data/.tekton/README.md +0 -278
  66. data/.tekton/github-interceptor-secret.yaml +0 -8
  67. data/.tekton/github-pr-eventlistener.yaml +0 -104
  68. data/.tekton/github-pr-pipeline.yaml.part +0 -38
  69. data/.tekton/github-set-status-task.yaml +0 -43
  70. data/.tekton/github-webhook-ingress.yaml +0 -20
  71. data/.tekton/pipeline.yaml +0 -571
  72. data/.tekton/pipelinerun.yaml +0 -21
  73. data/.tekton/ruby-tracer-prepuller.yaml +0 -87
  74. data/.tekton/run_unittests.sh +0 -87
  75. data/.tekton/scheduled-eventlistener.yaml +0 -108
  76. data/.tekton/task.yaml +0 -449
  77. data/.tekton/tekton-triggers-eventlistener-serviceaccount.yaml +0 -29
  78. data/Appraisals +0 -124
  79. data/CONTRIBUTING.md +0 -86
  80. data/Gemfile +0 -17
  81. data/LICENSE +0 -22
  82. data/MAINTAINERS.md +0 -3
  83. data/Rakefile +0 -49
  84. data/bin/announce_release_on_slack.py +0 -103
  85. data/docker-compose.yml +0 -20
  86. data/download.sh +0 -85
  87. data/examples/opentracing.rb +0 -35
  88. data/examples/tracing.rb +0 -84
  89. data/extras/license_header.rb +0 -44
  90. data/gemfiles/.bundle/config +0 -2
  91. data/gemfiles/aws_30.gemfile +0 -21
  92. data/gemfiles/aws_60.gemfile +0 -16
  93. data/gemfiles/cuba_30.gemfile +0 -16
  94. data/gemfiles/cuba_40.gemfile +0 -13
  95. data/gemfiles/dalli_20.gemfile +0 -15
  96. data/gemfiles/dalli_30.gemfile +0 -12
  97. data/gemfiles/dalli_32.gemfile +0 -12
  98. data/gemfiles/excon_0100.gemfile +0 -14
  99. data/gemfiles/excon_021.gemfile +0 -17
  100. data/gemfiles/excon_079.gemfile +0 -17
  101. data/gemfiles/excon_100.gemfile +0 -14
  102. data/gemfiles/graphql_10.gemfile +0 -16
  103. data/gemfiles/graphql_20.gemfile +0 -15
  104. data/gemfiles/grpc_10.gemfile +0 -15
  105. data/gemfiles/mongo_216.gemfile +0 -15
  106. data/gemfiles/mongo_219.gemfile +0 -12
  107. data/gemfiles/net_http_01.gemfile +0 -17
  108. data/gemfiles/rack_16.gemfile +0 -15
  109. data/gemfiles/rack_20.gemfile +0 -15
  110. data/gemfiles/rack_30.gemfile +0 -13
  111. data/gemfiles/rails_42.gemfile +0 -18
  112. data/gemfiles/rails_50.gemfile +0 -19
  113. data/gemfiles/rails_52.gemfile +0 -19
  114. data/gemfiles/rails_60.gemfile +0 -19
  115. data/gemfiles/rails_61.gemfile +0 -20
  116. data/gemfiles/rails_70.gemfile +0 -17
  117. data/gemfiles/rails_71.gemfile +0 -17
  118. data/gemfiles/rails_80.gemfile +0 -17
  119. data/gemfiles/redis_40.gemfile +0 -15
  120. data/gemfiles/redis_50.gemfile +0 -13
  121. data/gemfiles/redis_51.gemfile +0 -13
  122. data/gemfiles/resque_122.gemfile +0 -16
  123. data/gemfiles/resque_1274_3scale.gemfile +0 -17
  124. data/gemfiles/resque_20.gemfile +0 -16
  125. data/gemfiles/rest_client_16.gemfile +0 -17
  126. data/gemfiles/rest_client_20.gemfile +0 -17
  127. data/gemfiles/roda_20.gemfile +0 -16
  128. data/gemfiles/roda_30.gemfile +0 -16
  129. data/gemfiles/rubocop_162.gemfile +0 -6
  130. data/gemfiles/sequel_56.gemfile +0 -16
  131. data/gemfiles/sequel_57.gemfile +0 -16
  132. data/gemfiles/sequel_58.gemfile +0 -16
  133. data/gemfiles/shoryuken_50.gemfile +0 -16
  134. data/gemfiles/shoryuken_60.gemfile +0 -13
  135. data/gemfiles/sidekiq_42.gemfile +0 -15
  136. data/gemfiles/sidekiq_50.gemfile +0 -15
  137. data/gemfiles/sidekiq_60.gemfile +0 -12
  138. data/gemfiles/sidekiq_65.gemfile +0 -12
  139. data/gemfiles/sidekiq_70.gemfile +0 -12
  140. data/gemfiles/sinatra_14.gemfile +0 -15
  141. data/gemfiles/sinatra_22.gemfile +0 -12
  142. data/gemfiles/sinatra_30.gemfile +0 -12
  143. data/gemfiles/sinatra_40.gemfile +0 -12
  144. data/instana.gemspec +0 -48
  145. data/lib/instana/open_tracing/carrier.rb +0 -7
  146. data/lib/instana/open_tracing/instana_tracer.rb +0 -99
  147. data/lib/instana/tracing/span.rb +0 -431
  148. data/lib/opentracing.rb +0 -32
  149. data/log/.keep +0 -0
  150. data/sonar-project.properties +0 -9
  151. data/test/activator_test.rb +0 -50
  152. data/test/backend/agent_test.rb +0 -80
  153. data/test/backend/gc_snapshot_test.rb +0 -11
  154. data/test/backend/host_agent_activation_observer_test.rb +0 -73
  155. data/test/backend/host_agent_lookup_test.rb +0 -78
  156. data/test/backend/host_agent_reporting_observer_test.rb +0 -276
  157. data/test/backend/host_agent_test.rb +0 -89
  158. data/test/backend/process_info_test.rb +0 -83
  159. data/test/backend/request_client_test.rb +0 -39
  160. data/test/backend/serverless_agent_test.rb +0 -83
  161. data/test/benchmarks/bench_id_generation.rb +0 -15
  162. data/test/benchmarks/bench_opentracing.rb +0 -16
  163. data/test/config_test.rb +0 -34
  164. data/test/frameworks/cuba_test.rb +0 -61
  165. data/test/frameworks/roda_test.rb +0 -60
  166. data/test/frameworks/sinatra_test.rb +0 -71
  167. data/test/instana_test.rb +0 -37
  168. data/test/instrumentation/aws_test.rb +0 -241
  169. data/test/instrumentation/dalli_test.rb +0 -325
  170. data/test/instrumentation/excon_test.rb +0 -204
  171. data/test/instrumentation/graphql_test.rb +0 -289
  172. data/test/instrumentation/grpc_test.rb +0 -420
  173. data/test/instrumentation/mongo_test.rb +0 -68
  174. data/test/instrumentation/net_http_test.rb +0 -220
  175. data/test/instrumentation/rack_instrumented_request_test.rb +0 -211
  176. data/test/instrumentation/rack_test.rb +0 -415
  177. data/test/instrumentation/rails_action_cable_test.rb +0 -135
  178. data/test/instrumentation/rails_action_controller_test.rb +0 -218
  179. data/test/instrumentation/rails_action_mailer_test.rb +0 -66
  180. data/test/instrumentation/rails_action_view_test.rb +0 -154
  181. data/test/instrumentation/rails_active_job_test.rb +0 -65
  182. data/test/instrumentation/rails_active_record_database_missing_test.rb +0 -45
  183. data/test/instrumentation/rails_active_record_test.rb +0 -115
  184. data/test/instrumentation/redis_test.rb +0 -152
  185. data/test/instrumentation/resque_test.rb +0 -188
  186. data/test/instrumentation/rest_client_test.rb +0 -107
  187. data/test/instrumentation/sequel_test.rb +0 -105
  188. data/test/instrumentation/shoryuken_test.rb +0 -47
  189. data/test/instrumentation/sidekiq-client_test.rb +0 -169
  190. data/test/instrumentation/sidekiq-worker_test.rb +0 -180
  191. data/test/secrets_test.rb +0 -112
  192. data/test/serverless_test.rb +0 -369
  193. data/test/snapshot/deltable_test.rb +0 -17
  194. data/test/snapshot/docker_container_test.rb +0 -82
  195. data/test/snapshot/fargate_container_test.rb +0 -82
  196. data/test/snapshot/fargate_process_test.rb +0 -35
  197. data/test/snapshot/fargate_task_test.rb +0 -49
  198. data/test/snapshot/google_cloud_run_instance_test.rb +0 -74
  199. data/test/snapshot/google_cloud_run_process_test.rb +0 -33
  200. data/test/snapshot/lambda_function_test.rb +0 -37
  201. data/test/snapshot/ruby_process_test.rb +0 -32
  202. data/test/support/apps/active_record/active_record.rb +0 -24
  203. data/test/support/apps/grpc/boot.rb +0 -23
  204. data/test/support/apps/grpc/grpc_server.rb +0 -84
  205. data/test/support/apps/http_endpoint/boot.rb +0 -28
  206. data/test/support/apps/rails/boot.rb +0 -219
  207. data/test/support/apps/rails/models/block.rb +0 -21
  208. data/test/support/apps/rails/models/block6.rb +0 -21
  209. data/test/support/apps/resque/boot.rb +0 -5
  210. data/test/support/apps/resque/jobs/resque_error_job.rb +0 -22
  211. data/test/support/apps/resque/jobs/resque_fast_job.rb +0 -23
  212. data/test/support/apps/sidekiq/boot.rb +0 -25
  213. data/test/support/apps/sidekiq/jobs/sidekiq_job_1.rb +0 -9
  214. data/test/support/apps/sidekiq/jobs/sidekiq_job_2.rb +0 -10
  215. data/test/support/apps/sidekiq/worker.rb +0 -37
  216. data/test/support/helpers.rb +0 -85
  217. data/test/support/mock_timer.rb +0 -20
  218. data/test/test_helper.rb +0 -69
  219. data/test/tracing/custom_test.rb +0 -226
  220. data/test/tracing/id_management_test.rb +0 -80
  221. data/test/tracing/instrumented_logger_test.rb +0 -39
  222. data/test/tracing/opentracing_test.rb +0 -382
  223. data/test/tracing/processor_test.rb +0 -58
  224. data/test/tracing/span_context_test.rb +0 -22
  225. data/test/tracing/span_test.rb +0 -179
  226. data/test/tracing/tracer_async_test.rb +0 -230
  227. data/test/tracing/tracer_test.rb +0 -352
  228. data/test/util_test.rb +0 -10
data/instana.gemspec DELETED
@@ -1,48 +0,0 @@
1
- # coding: utf-8
2
-
3
- # (c) Copyright IBM Corp. 2021
4
- # (c) Copyright Instana Inc. 2016
5
-
6
- lib = File.expand_path('../lib', __FILE__)
7
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
8
- require 'instana/version'
9
-
10
- Gem::Specification.new do |spec|
11
- spec.name = "instana"
12
- spec.version = Instana::VERSION
13
- spec.authors = ["Peter Giacomo Lombardo"]
14
- spec.email = ["pglombardo@gmail.com"]
15
-
16
- spec.summary = %q{Ruby Distributed Tracing & Metrics Sensor for Instana}
17
- spec.description = %q{The Instana gem is a zero configuration tool that will automatically collect key metrics and distributed traces from your Ruby processes. Just install and go.}
18
- spec.homepage = "https://www.instana.com/"
19
-
20
- spec.metadata = {
21
- "changelog_uri" => "https://github.com/instana/ruby-sensor/releases",
22
- "documentation_uri" => "https://docs.instana.io/ecosystem/ruby/",
23
- "homepage_uri" => "https://www.instana.com/",
24
- "source_code_uri" => "https://github.com/instana/ruby-sensor",
25
- }
26
-
27
- spec.licenses = ['MIT']
28
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
29
- spec.bindir = "exe"
30
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
32
- spec.test_files = Dir.glob("{test}/**/*.rb")
33
-
34
- spec.required_ruby_version = '>= 3.0'
35
- spec.platform = defined?(JRUBY_VERSION) ? 'java' : Gem::Platform::RUBY
36
-
37
- spec.add_development_dependency "bundler", "~> 2.0"
38
- spec.add_development_dependency "rake", "~> 12.0"
39
- spec.add_development_dependency "minitest", "~> 5.20"
40
- spec.add_development_dependency "appraisal"
41
- spec.add_development_dependency "fakefs"
42
-
43
- spec.add_runtime_dependency('base64', '>= 0.1')
44
- spec.add_runtime_dependency('concurrent-ruby', '>= 1.1')
45
- spec.add_runtime_dependency('csv', '>= 0.1')
46
- spec.add_runtime_dependency('sys-proctable', '>= 1.2.2')
47
- spec.add_runtime_dependency('oj', '>=3.0.11') unless RUBY_PLATFORM =~ /java/i
48
- end
@@ -1,7 +0,0 @@
1
- # (c) Copyright IBM Corp. 2021
2
- # (c) Copyright Instana Inc. 2017
3
-
4
- module OpenTracing
5
- class Carrier < Hash
6
- end
7
- end
@@ -1,99 +0,0 @@
1
- # (c) Copyright IBM Corp. 2021
2
- # (c) Copyright Instana Inc. 2021
3
-
4
- require 'delegate'
5
- # :nocov:
6
- module OpenTracing
7
- class InstanaTracer < SimpleDelegator
8
- Span = ::Instana::Span
9
-
10
- # Start a new span
11
- #
12
- # @param operation_name [String] The name of the operation represented by the span
13
- # @param child_of [Span] A span to be used as the ChildOf reference
14
- # @param start_time [Time] the start time of the span
15
- # @param tags [Hash] Starting tags for the span
16
- #
17
- # @return [Span]
18
- #
19
- def start_span(operation_name, child_of: nil, start_time: ::Instana::Util.now_in_ms, tags: nil)
20
- new_span = if child_of && (child_of.is_a?(::Instana::Span) || child_of.is_a?(::Instana::SpanContext))
21
- Span.new(operation_name, parent_ctx: child_of, start_time: start_time)
22
- else
23
- Span.new(operation_name, start_time: start_time)
24
- end
25
- new_span.set_tags(tags) if tags
26
- new_span
27
- end
28
-
29
- # Start a new span which is the child of the current span
30
- #
31
- # @param operation_name [String] The name of the operation represented by the span
32
- # @param child_of [Span] A span to be used as the ChildOf reference
33
- # @param start_time [Time] the start time of the span
34
- # @param tags [Hash] Starting tags for the span
35
- #
36
- # @return [Span]
37
- #
38
- def start_active_span(operation_name, child_of: active_span, start_time: ::Instana::Util.now_in_ms, tags: nil)
39
- ::Instana.tracer.current_span = start_span(operation_name, child_of: child_of, start_time: start_time, tags: tags)
40
- block_given? ? yield(::Instana.tracer.current_span) : ::Instana.tracer.current_span
41
- end
42
-
43
- # Returns the currently active span
44
- #
45
- # @return [Span]
46
- #
47
- def active_span
48
- ::Instana.tracer.current_span
49
- end
50
-
51
- # Inject a span into the given carrier
52
- #
53
- # @param span_context [SpanContext]
54
- # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
55
- # @param carrier [Carrier]
56
- #
57
- def inject(span_context, format, carrier)
58
- case format
59
- when OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY
60
- ::Instana.logger.debug 'Unsupported inject format'
61
- when OpenTracing::FORMAT_RACK
62
- carrier['X-Instana-T'] = ::Instana::Util.id_to_header(span_context.trace_id)
63
- carrier['X-Instana-S'] = ::Instana::Util.id_to_header(span_context.span_id)
64
- else
65
- ::Instana.logger.debug 'Unknown inject format'
66
- end
67
- end
68
-
69
- # Extract a span from a carrier
70
- #
71
- # @param format [OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY, OpenTracing::FORMAT_RACK]
72
- # @param carrier [Carrier]
73
- #
74
- # @return [SpanContext]
75
- #
76
- def extract(format, carrier)
77
- case format
78
- when OpenTracing::FORMAT_TEXT_MAP, OpenTracing::FORMAT_BINARY
79
- ::Instana.logger.debug 'Unsupported extract format'
80
- when OpenTracing::FORMAT_RACK
81
- ::Instana::SpanContext.new(::Instana::Util.header_to_id(carrier['HTTP_X_INSTANA_T']),
82
- ::Instana::Util.header_to_id(carrier['HTTP_X_INSTANA_S']))
83
- else
84
- ::Instana.logger.debug 'Unknown inject format'
85
- nil
86
- end
87
- end
88
-
89
- def method_missing(method, *args, &block)
90
- ::Instana.logger.warn { "You are invoking `#{m}` on Instana::Tracer via OpenTracing." }
91
- super(method, *args, &block)
92
- end
93
-
94
- def respond_to_missing?(*)
95
- super(method)
96
- end
97
- end
98
- end
99
- # :nocov:
@@ -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)
data/log/.keep DELETED
File without changes
@@ -1,9 +0,0 @@
1
- sonar.projectKey=ruby-sensor
2
- sonar.sources=lib
3
- sonar.tests=test
4
- sonar.exclusions=_junit/*
5
- sonar.ruby.coverage.reportPaths=coverage/coverage.json
6
- sonar.links.homepage=https://github.com/instana/ruby-sensor/
7
- sonar.links.ci=https://circleci.com/gh/instana/ruby-sensor
8
- sonar.links.issue=https://github.com/instana/ruby-sensor/issues
9
- sonar.links.scm=https://github.com/instana/ruby-sensor/
@@ -1,50 +0,0 @@
1
- # (c) Copyright IBM Corp. 2021
2
- # (c) Copyright Instana Inc. 2021
3
-
4
- require 'test_helper'
5
-
6
- class ActivatorTest < Minitest::Test
7
- def test_start
8
- refute_nil Instana::Activator.trace_point
9
- assert Instana::Activator.trace_point.enabled?
10
- end
11
-
12
- def test_klass_call
13
- assert_equal [], Instana::Activator.call
14
- end
15
-
16
- def test_instance_call
17
- subject = Class.new(Instana::Activator) do
18
- def can_instrument?
19
- true
20
- end
21
-
22
- def instrument
23
- true
24
- end
25
- end
26
-
27
- assert_equal 1, Instana::Activator.call.length
28
- assert subject.call
29
- end
30
-
31
- def test_limited_activated_set
32
- ENV['INSTANA_ACTIVATE_SET'] = 'rack,rails'
33
- subject = activated_set
34
- assert_instance_of Set, subject
35
- assert_equal 2, subject.length
36
- assert_includes subject, 'rack'
37
- assert_includes subject, 'rails'
38
- ensure
39
- ENV.delete('INSTANA_ACTIVATE_SET')
40
- end
41
-
42
- def test_unlimited_activated_set
43
- ENV.delete('INSTANA_ACTIVATE_SET')
44
- subject = activated_set
45
- assert_instance_of Set, subject
46
- assert_equal 32, subject.length
47
- ensure
48
- ENV.delete('INSTANA_ACTIVATE_SET')
49
- end
50
- end