solarwinds_apm 6.0.0.preV2 → 6.0.0.preV4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.sha256 +1 -1
  3. data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.sha256 +1 -1
  4. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.sha256 +1 -1
  5. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.sha256 +1 -1
  6. data/ext/oboe_metal/src/VERSION +1 -2
  7. data/ext/oboe_metal/src/oboe.h +0 -12
  8. data/ext/oboe_metal/src/oboe_swig_wrap.cc +5 -5
  9. data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +1 -9
  10. data/lib/solarwinds_apm/api/current_trace_info.rb +0 -1
  11. data/lib/solarwinds_apm/api/opentelemetry.rb +39 -0
  12. data/lib/solarwinds_apm/api/transaction_name.rb +17 -17
  13. data/lib/solarwinds_apm/api.rb +2 -0
  14. data/lib/solarwinds_apm/config.rb +3 -19
  15. data/lib/solarwinds_apm/constants.rb +2 -4
  16. data/lib/solarwinds_apm/noop/context.rb +1 -1
  17. data/lib/solarwinds_apm/oboe_init_options.rb +2 -5
  18. data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +92 -87
  19. data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +18 -17
  20. data/lib/solarwinds_apm/opentelemetry/solarwinds_propagator.rb +28 -28
  21. data/lib/solarwinds_apm/opentelemetry/solarwinds_response_propagator.rb +9 -14
  22. data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +122 -170
  23. data/lib/solarwinds_apm/otel_config.rb +47 -28
  24. data/lib/solarwinds_apm/support/lumberjack_formatter.rb +17 -2
  25. data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +5 -4
  26. data/lib/solarwinds_apm/support/transaction_cache.rb +27 -2
  27. data/lib/solarwinds_apm/support/transaction_settings.rb +2 -2
  28. data/lib/solarwinds_apm/support/txn_name_manager.rb +34 -17
  29. data/lib/solarwinds_apm/support/utils.rb +24 -0
  30. data/lib/solarwinds_apm/support.rb +2 -4
  31. data/lib/solarwinds_apm/version.rb +1 -1
  32. data/lib/solarwinds_apm.rb +2 -2
  33. metadata +13 -13
  34. data/lib/oboe.rb +0 -7
  35. data/lib/solarwinds_apm/support/transformer.rb +0 -56
@@ -6,12 +6,12 @@ module SolarWindsAPM
6
6
  module OTelConfig
7
7
  @@config = {}
8
8
  @@config_map = {}
9
-
9
+
10
10
  @@agent_enabled = true
11
11
 
12
12
  def self.disable_agent
13
13
  return unless @@agent_enabled # only show the msg once
14
-
14
+
15
15
  @@agent_enabled = false
16
16
  SolarWindsAPM.logger.warn {"[#{name}/#{__method__}] Agent disabled. No Trace exported."}
17
17
  end
@@ -25,36 +25,54 @@ module SolarWindsAPM
25
25
  def self.resolve_sampler
26
26
 
27
27
  resolve_sampler_config
28
- @@config[:sampler] =
28
+ @@config[:sampler] =
29
29
  ::OpenTelemetry::SDK::Trace::Samplers.parent_based(
30
30
  root: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]),
31
31
  remote_parent_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]),
32
32
  remote_parent_not_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]))
33
33
  end
34
34
 
35
- def self.resolve_sampler_config
35
+ def self.resolve_sampler_config
36
36
  sampler_config = {}
37
- sampler_config["trigger_trace"] = "enabled"
37
+ sampler_config["trigger_trace"] = "enabled"
38
38
  sampler_config["trigger_trace"] = nil if ENV["SW_APM_TRIGGER_TRACING_MODE"] == 'disabled'
39
39
  @@config[:sampler_config] = sampler_config
40
40
  end
41
41
 
42
42
  #
43
43
  # append/add solarwinds_response_propagator into rack instrumentation
44
- #
45
- def self.resolve_for_response_propagator
46
- response_propagator = SolarWindsAPM::OpenTelemetry::SolarWindsResponsePropagator::TextMapPropagator.new
47
- if @@config_map["OpenTelemetry::Instrumentation::Rack"]
48
- if @@config_map["OpenTelemetry::Instrumentation::Rack"][:response_propagators].instance_of?(Array)
49
- @@config_map["OpenTelemetry::Instrumentation::Rack"][:response_propagators].append(response_propagator)
44
+ #
45
+ def self.resolve_response_propagator
46
+ response_propagator = SolarWindsAPM::OpenTelemetry::SolarWindsResponsePropagator::TextMapPropagator.new
47
+ rack_setting = @@config_map["OpenTelemetry::Instrumentation::Rack"]
48
+
49
+ if rack_setting
50
+ if rack_setting[:response_propagators].instance_of?(Array)
51
+ rack_setting[:response_propagators].append(response_propagator)
52
+ elsif rack_setting[:response_propagators].nil?
53
+ rack_setting[:response_propagators] = [response_propagator]
50
54
  else
51
- @@config_map["OpenTelemetry::Instrumentation::Rack"][:response_propagators] = [response_propagator]
55
+ SolarWindsAPM.logger.warn {"[#{name}/#{__method__}] Rack response propagator resolve failed. Provided type #{rack_setting[:response_propagators].class}, please provide Array e.g. [#{rack_setting[:response_propagators]}]"}
52
56
  end
53
57
  else
54
58
  @@config_map["OpenTelemetry::Instrumentation::Rack"] = {response_propagators: [response_propagator]}
55
59
  end
56
60
  end
57
61
 
62
+ def self.obfuscate_helper(instrumentation)
63
+ if @@config_map[instrumentation] # user provided the option
64
+ @@config_map[instrumentation][:db_statement] = :obfuscate unless @@config_map[instrumentation][:db_statement] # user provided the db_statement, ignore our default setting
65
+ else
66
+ @@config_map[instrumentation] = {db_statement: :obfuscate}
67
+ end
68
+ end
69
+
70
+ def self.obfuscate_query
71
+ obfuscate_helper("OpenTelemetry::Instrumentation::Dalli")
72
+ obfuscate_helper("OpenTelemetry::Instrumentation::Mysql2")
73
+ obfuscate_helper("OpenTelemetry::Instrumentation::PG")
74
+ end
75
+
58
76
  def self.[](key)
59
77
  @@config[key.to_sym]
60
78
  end
@@ -69,7 +87,7 @@ module SolarWindsAPM
69
87
  end
70
88
 
71
89
  def self.resolve_solarwinds_processor
72
- txn_manager = SolarWindsAPM::OpenTelemetry::TxnNameManager.new
90
+ txn_manager = SolarWindsAPM::TxnNameManager.new
73
91
  exporter = SolarWindsAPM::OpenTelemetry::SolarWindsExporter.new(txn_manager: txn_manager)
74
92
  @@config[:span_processor] = SolarWindsAPM::OpenTelemetry::SolarWindsProcessor.new(exporter, txn_manager)
75
93
  end
@@ -103,39 +121,40 @@ module SolarWindsAPM
103
121
  return unless @@agent_enabled
104
122
 
105
123
  resolve_sampler
106
-
124
+
107
125
  resolve_solarwinds_propagator
108
126
  resolve_solarwinds_processor
109
- resolve_for_response_propagator
127
+ resolve_response_propagator
128
+
129
+ obfuscate_query
110
130
 
111
131
  print_config if SolarWindsAPM.logger.level.zero?
112
132
 
113
- ENV['OTEL_TRACES_EXPORTER'] = 'none' if ENV['OTEL_TRACES_EXPORTER'].nil?
114
- ::OpenTelemetry::SDK.configure do |c|
115
- c.use_all(@@config_map)
116
- end
117
-
133
+ ENV['OTEL_TRACES_EXPORTER'] = 'none' if ENV['OTEL_TRACES_EXPORTER'].to_s.empty?
134
+
135
+ ::OpenTelemetry::SDK.configure { |c| c.use_all(@@config_map) }
136
+
118
137
  validate_propagator(::OpenTelemetry.propagation.instance_variable_get(:@propagators))
119
138
 
120
139
  return unless @@agent_enabled
121
140
 
122
141
  # append our propagators
123
- ::OpenTelemetry.propagation.instance_variable_get(:@propagators).append(@@config[:propagators])
124
-
125
- # append our processors (with our exporter)
142
+ ::OpenTelemetry.propagation.instance_variable_get(:@propagators).append(@@config[:propagators])
143
+
144
+ # append our processors (with our exporter)
126
145
  ::OpenTelemetry.tracer_provider.add_span_processor(@@config[:span_processor])
127
-
146
+
128
147
  # configure sampler afterwards
129
148
  ::OpenTelemetry.tracer_provider.sampler = @@config[:sampler]
130
149
  nil
131
150
  end
132
151
 
133
- #
152
+ #
134
153
  # Allow initialize after set new value to SolarWindsAPM::Config[:key]=value
135
- #
154
+ #
136
155
  # Usage:
137
- #
138
- # Default using the use_all to load all instrumentation
156
+ #
157
+ # Default using the use_all to load all instrumentation
139
158
  # But with specific instrumentation disabled, use {:enabled: false} in config
140
159
  # SolarWindsAPM::OTelConfig.initialize_with_config do |config|
141
160
  # config["OpenTelemetry::Instrumentation::Rack"] = {"a" => "b"}
@@ -1,6 +1,21 @@
1
- # Copyright (c) 2019 SolarWinds, LLC.
1
+ # Copyright (c) 2023 SolarWinds, LLC.
2
2
  # All rights reserved.
3
3
 
4
4
  require_relative 'logger_formatter'
5
5
 
6
- Lumberjack::Formatter.prepend(SolarWindsAPM::Logger::Formatter) if SolarWindsAPM.loaded && defined?(Lumberjack::Formatter)
6
+ module SolarWindsAPM
7
+ module Lumberjack
8
+ module LogEntry
9
+ include SolarWindsAPM::Logger::Formatter # provides #insert_trace_id
10
+
11
+ def initialize(time, severity, message, progname, pid, tags)
12
+ super if SolarWindsAPM::Config[:log_traceId] == :never
13
+
14
+ message = insert_trace_id(message)
15
+ super
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ Lumberjack::LogEntry.prepend(SolarWindsAPM::Lumberjack::LogEntry) if SolarWindsAPM.loaded && defined?(Lumberjack::LogEntry)
@@ -7,12 +7,13 @@ module SolarWindsAPM
7
7
  # This ActiveRecordInstrumentation should only work for activerecord < 7.0 since after rails 7
8
8
  # this module won't be prepend to activerecord
9
9
  module ActiveRecordInstrumentation
10
- def execute(sql, *args)
11
- super(annotate_sql(sql), *args)
10
+ def execute(sql, *args, **options)
11
+ super(annotate_sql(sql), *args, **options)
12
12
  end
13
13
 
14
- def execute_and_clear(sql, *args, &block)
15
- super(annotate_sql(sql), *args, &block)
14
+ # only for postgresql adapter
15
+ def execute_and_clear(sql, *args, **options)
16
+ super(annotate_sql(sql), *args, **options)
16
17
  end
17
18
 
18
19
  def exec_query(sql, *args, **options)
@@ -1,21 +1,46 @@
1
1
  module SolarWindsAPM
2
- # Simple TransactionCache
3
- # TODO: improve cache to have lru mechanism that avoid too many values
2
+ # LRU TransactionCache with initial limit 1000
4
3
  module TransactionCache
4
+ attr_reader :capacity
5
+
5
6
  def self.initialize
7
+ @capacity = 1000
6
8
  @cache = {}
9
+ @order = []
7
10
  end
8
11
 
9
12
  def self.get(key)
13
+ return nil unless @cache.has_key?(key)
14
+
15
+ @order.delete(key)
16
+ @order.push(key)
10
17
  @cache[key]
11
18
  end
12
19
 
13
20
  def self.del(key)
14
21
  @cache.delete(key)
22
+ @order.delete(key)
23
+ end
24
+
25
+ def self.clear
26
+ @cache.clear
27
+ @order.clear
28
+ end
29
+
30
+ def self.size
31
+ @cache.size
15
32
  end
16
33
 
17
34
  def self.set(key, value)
35
+ if @cache.has_key?(key)
36
+ @cache.delete(key)
37
+ elsif @order.size >= @capacity
38
+ evict_key = @order.shift
39
+ @cache.delete(evict_key)
40
+ end
41
+
18
42
  @cache[key] = value
43
+ @order.push(key)
19
44
  SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] current TransactionCache #{@cache.inspect}"}
20
45
  end
21
46
  end
@@ -28,9 +28,9 @@ module SolarWindsAPM
28
28
  end
29
29
 
30
30
  def tracing_enabled?
31
- span_layer = "#{@name}:#{@kind}"
31
+ span_layer = "#{@kind}:#{@name}"
32
32
 
33
- enabled_regexps = SolarWindsAPM::Config[:enabled_regexps]
33
+ enabled_regexps = SolarWindsAPM::Config[:enabled_regexps]
34
34
  disabled_regexps = SolarWindsAPM::Config[:disabled_regexps]
35
35
 
36
36
  SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] enabled_regexps: #{enabled_regexps&.inspect}"}
@@ -1,25 +1,42 @@
1
1
  module SolarWindsAPM
2
- module OpenTelemetry
3
- # SolarWindsTxnNameManager
4
- class TxnNameManager
5
- def initialize
6
- @cache = {}
7
- end
2
+ # SolarWindsTxnNameManager
3
+ class TxnNameManager
4
+ def initialize
5
+ @cache = {}
6
+ @root_context_h = {}
7
+ @mutex = Mutex.new
8
+ end
8
9
 
9
- def get(key)
10
- @cache[key]
11
- end
10
+ def get(key)
11
+ @cache[key]
12
+ end
12
13
 
13
- def del(key)
14
- @cache.delete(key)
15
- end
14
+ def del(key)
15
+ @cache.delete(key)
16
+ end
16
17
 
17
- def set(key, value)
18
- SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] current cache #{@cache.inspect}"}
19
- @cache[key] = value
18
+ def set(key, value)
19
+ @cache[key] = value
20
+ SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] txn manager current cache #{@cache.inspect}"}
21
+ end
22
+
23
+ alias []= set
24
+
25
+ def set_root_context_h(key, value)
26
+ @mutex.synchronize do
27
+ @root_context_h[key] = value
20
28
  end
29
+ SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] txn manager current root_context_h #{@root_context_h.inspect}"}
30
+ end
21
31
 
22
- alias []= set
32
+ def get_root_context_h(key)
33
+ @root_context_h[key]
34
+ end
35
+
36
+ def delete_root_context_h(key)
37
+ @mutex.synchronize do
38
+ @root_context_h.delete(key)
39
+ end
23
40
  end
24
41
  end
25
- end
42
+ end
@@ -0,0 +1,24 @@
1
+ module SolarWindsAPM
2
+ # Utils
3
+ class Utils
4
+ VERSION = '00'.freeze
5
+
6
+ def self.trace_state_header(trace_state)
7
+ return nil if trace_state.nil?
8
+
9
+ arr = []
10
+ trace_state.to_h.each { |key, value| arr << "#{key}=#{value}" }
11
+ header = arr.join(",")
12
+ SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] generated trace_state_header: #{header}"}
13
+ header
14
+ end
15
+
16
+ # Generates a liboboe W3C compatible trace_context from provided OTel span context.
17
+ def self.traceparent_from_context(span_context)
18
+ flag = span_context.trace_flags.sampled?? 1 : 0
19
+ xtr = "#{VERSION}-#{span_context.hex_trace_id}-#{span_context.hex_span_id}-0#{flag}"
20
+ SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] generated traceparent: #{xtr} from #{span_context.inspect}"}
21
+ xtr
22
+ end
23
+ end
24
+ end
@@ -11,7 +11,7 @@ require_relative './support/transaction_cache'
11
11
  require_relative './support/transaction_settings'
12
12
  require_relative './support/oboe_tracing_mode'
13
13
  require_relative './support/txn_name_manager'
14
- require_relative './support/transformer'
14
+ require_relative './support/utils'
15
15
  require_relative './support/x_trace_options'
16
16
 
17
17
  if SolarWindsAPM::Config[:tag_sql]
@@ -31,10 +31,8 @@ if SolarWindsAPM::Config[:tag_sql]
31
31
  SolarWindsAPM.logger.info {"For more information, please check https://api.rubyonrails.org/classes/ActiveRecord/QueryLogs.html"}
32
32
  require_relative './support/swomarginalia/comment'
33
33
  end
34
- elsif defined?(::ActiveRecord) && ::ActiveRecord.version.to_s < '7'
34
+ elsif defined?(::ActiveRecord)
35
35
  require_relative './support/swomarginalia/load_swomarginalia'
36
36
  SolarWindsAPM::SWOMarginalia::LoadSWOMarginalia.insert
37
- else
38
- SolarWindsAPM.logger.info {"tag_sql currently is not supported in non-rails app that use active_record > 7"}
39
37
  end
40
38
  end
@@ -9,7 +9,7 @@ module SolarWindsAPM
9
9
  MAJOR = 6 # breaking,
10
10
  MINOR = 0 # feature,
11
11
  PATCH = 0 # fix => BFF
12
- PRE = 'preV2'.freeze # for pre-releases into packagecloud, set to nil for production releases into rubygems
12
+ PRE = 'preV4'.freeze # for pre-releases into packagecloud, set to nil for production releases into rubygems
13
13
 
14
14
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
15
15
  end
@@ -2,8 +2,8 @@
2
2
  # All rights reserved.
3
3
 
4
4
  begin
5
- if ENV.has_key?('SOLARWINDS_APM_ENABLED') && (ENV['SOLARWINDS_APM_ENABLED'] == 'false' || ENV['SOLARWINDS_APM_ENABLED'] == false)
6
- SolarWindsAPM.logger.warn 'SOLARWINDS_APM_ENABLED environment variable detected and was set to false; SolarWindsAPM disabled'
5
+ if ENV.has_key?('SW_APM_ENABLED') && (ENV['SW_APM_ENABLED'] == 'false' || ENV['SW_APM_ENABLED'] == false)
6
+ SolarWindsAPM.logger.warn 'SW_APM_ENABLED environment variable detected and was set to false; SolarWindsAPM disabled'
7
7
  return
8
8
  end
9
9
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solarwinds_apm
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.preV2
4
+ version: 6.0.0.preV4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maia Engeli
@@ -11,34 +11,34 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-08-08 00:00:00.000000000 Z
14
+ date: 2023-09-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: opentelemetry-sdk
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - "~>"
20
+ - - ">="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 1.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - "~>"
27
+ - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.2.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: opentelemetry-instrumentation-all
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - "~>"
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
36
  version: 0.31.0
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
43
  version: 0.31.0
44
44
  - !ruby/object:Gem::Dependency
@@ -59,16 +59,16 @@ dependencies:
59
59
  name: opentelemetry-exporter-otlp
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - "~>"
62
+ - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 0.24.0
64
+ version: 0.24.2
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - "~>"
69
+ - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: 0.24.0
71
+ version: 0.24.2
72
72
  description: Automatic tracing and metrics for Ruby applications. Get started at cloud.solarwinds.com
73
73
  email: technicalsupport@solarwinds.com
74
74
  executables: []
@@ -92,13 +92,13 @@ files:
92
92
  - ext/oboe_metal/src/oboe_api.h
93
93
  - ext/oboe_metal/src/oboe_debug.h
94
94
  - ext/oboe_metal/src/oboe_swig_wrap.cc
95
- - lib/oboe.rb
96
95
  - lib/oboe_metal.rb
97
96
  - lib/rails/generators/solarwinds_apm/install_generator.rb
98
97
  - lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb
99
98
  - lib/solarwinds_apm.rb
100
99
  - lib/solarwinds_apm/api.rb
101
100
  - lib/solarwinds_apm/api/current_trace_info.rb
101
+ - lib/solarwinds_apm/api/opentelemetry.rb
102
102
  - lib/solarwinds_apm/api/tracing.rb
103
103
  - lib/solarwinds_apm/api/transaction_name.rb
104
104
  - lib/solarwinds_apm/base.rb
@@ -130,8 +130,8 @@ files:
130
130
  - lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb
131
131
  - lib/solarwinds_apm/support/transaction_cache.rb
132
132
  - lib/solarwinds_apm/support/transaction_settings.rb
133
- - lib/solarwinds_apm/support/transformer.rb
134
133
  - lib/solarwinds_apm/support/txn_name_manager.rb
134
+ - lib/solarwinds_apm/support/utils.rb
135
135
  - lib/solarwinds_apm/support/x_trace_options.rb
136
136
  - lib/solarwinds_apm/support_report.rb
137
137
  - lib/solarwinds_apm/thread_local.rb
@@ -152,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
152
  requirements:
153
153
  - - ">="
154
154
  - !ruby/object:Gem::Version
155
- version: 2.5.0
155
+ version: 2.7.0
156
156
  required_rubygems_version: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - ">"
data/lib/oboe.rb DELETED
@@ -1,7 +0,0 @@
1
- # Copyright (c) 2016 SolarWinds, LLC.
2
- # All rights reserved.
3
-
4
- # This module is provided for backward compatibility.
5
- # It simply redirects to the solarwinds_apm module which will
6
- # also load backward compatibility support.
7
- require 'solarwinds_apm'
@@ -1,56 +0,0 @@
1
- module SolarWindsAPM
2
- module OpenTelemetry
3
- # Transformer
4
- class Transformer
5
- VERSION = '00'.freeze
6
-
7
- def self.sw_from_context(span_context)
8
- flag = span_context.trace_flags.sampled?? 1 : 0
9
- "#{span_context.hex_span_id}-0#{flag}"
10
- end
11
-
12
- def self.trace_state_header(trace_state)
13
- arr = []
14
- trace_state.to_h.each do |key, value|
15
- arr << "#{key}=#{value}"
16
- end
17
- arr.join(",")
18
- end
19
-
20
- # Generates a liboboe W3C compatible trace_context from provided OTel span context.
21
- def self.traceparent_from_context(span_context)
22
- flag = span_context.trace_flags.sampled?? 1 : 0
23
- xtr = "#{VERSION}-#{span_context.hex_trace_id}-#{span_context.hex_span_id}-0#{flag}"
24
- SolarWindsAPM.logger.debug("Generated traceparent #{xtr} from #{span_context.inspect}")
25
- xtr
26
- end
27
-
28
- # Formats tracestate sw value from span_id and liboboe decision as 16-byte span_id with 8-bit trace_flags
29
- # e.g. 1a2b3c4d5e6f7g8h-01
30
- def self.sw_from_span_and_decision(span_id, decision)
31
- [span_id, decision].join("-")
32
- end
33
-
34
- # trace_flags [Integer]
35
- def self.trace_flags_from_int(trace_flags)
36
- "0#{trace_flags}"
37
- end
38
-
39
- def self.trace_flags_from_boolean(trace_flags)
40
- trace_flags == true ? "01" : "00"
41
- end
42
-
43
- def self.sampled?(decision)
44
- decision == ::OpenTelemetry::SDK::Trace::Samplers::Decision::RECORD_AND_SAMPLE
45
- end
46
-
47
- def self.span_id_from_sw(sw_value)
48
- sw_value.split("-")[0]
49
- end
50
-
51
- def self.create_key(name_)
52
- ::OpenTelemetry::Context.create_key(name_)
53
- end
54
- end
55
- end
56
- end