solarwinds_apm 6.0.0.preV5 → 6.0.0.prev6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/ext/oboe_metal/extconf.rb +4 -3
  3. data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.sha256 +1 -1
  4. data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.sha256 +1 -1
  5. data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.sha256 +1 -1
  6. data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.sha256 +1 -1
  7. data/ext/oboe_metal/src/VERSION +1 -1
  8. data/ext/oboe_metal/src/oboe.h +56 -13
  9. data/ext/oboe_metal/src/oboe_api.cpp +105 -6
  10. data/ext/oboe_metal/src/oboe_api.h +121 -2
  11. data/ext/oboe_metal/src/oboe_debug.h +4 -315
  12. data/ext/oboe_metal/src/oboe_swig_wrap.cc +2987 -549
  13. data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +1 -1
  14. data/lib/solarwinds_apm/api/current_trace_info.rb +2 -3
  15. data/lib/solarwinds_apm/base.rb +0 -12
  16. data/lib/solarwinds_apm/config.rb +53 -15
  17. data/lib/solarwinds_apm/oboe_init_options.rb +26 -16
  18. data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +1 -1
  19. data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +1 -1
  20. data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +2 -1
  21. data/lib/solarwinds_apm/otel_config.rb +12 -29
  22. data/lib/solarwinds_apm/support/logger_formatter.rb +1 -1
  23. data/lib/solarwinds_apm/support/oboe_tracing_mode.rb +4 -4
  24. data/lib/solarwinds_apm/support/swomarginalia/comment.rb +2 -2
  25. data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +1 -1
  26. data/lib/solarwinds_apm/support/transaction_settings.rb +1 -5
  27. data/lib/solarwinds_apm/version.rb +1 -1
  28. data/lib/solarwinds_apm.rb +2 -7
  29. metadata +3 -2
@@ -147,7 +147,7 @@ if defined?(SolarWindsAPM::Config)
147
147
  # Trace options is a custom HTTP header X-Trace-Options that can be set on a request to carry additional information
148
148
  # to the agents, one such option being trigger-trace which we’ll call a trigger trace request.
149
149
  #
150
- SolarWindsAPM::Config[:trigger_tracing_mode] = 'enabled'
150
+ SolarWindsAPM::Config[:trigger_tracing_mode] = :enabled
151
151
 
152
152
  #
153
153
  # Argument logging
@@ -51,7 +51,7 @@ module SolarWindsAPM
51
51
  class TraceInfo
52
52
  attr_reader :tracestring, :trace_id, :span_id, :trace_flags, :do_log
53
53
 
54
- REGEXP = /^(?<tracestring>(?<version>[a-f0-9]{2})-(?<trace_id>[a-f0-9]{32})-(?<span_id>[a-f0-9]{16})-(?<flags>[a-f0-9]{2}))$/
54
+ REGEXP = /^(?<tracestring>(?<version>[a-f0-9]{2})-(?<trace_id>[a-f0-9]{32})-(?<span_id>[a-f0-9]{16})-(?<flags>[a-f0-9]{2}))$/.freeze # rubocop:disable Style/RedundantFreeze
55
55
  private_constant :REGEXP
56
56
 
57
57
  def initialize
@@ -98,8 +98,7 @@ module SolarWindsAPM
98
98
  # * Hash
99
99
  #
100
100
  def hash_for_log
101
- @hash_for_log = {}
102
- @hash_for_log = {trace_id: @trace_id, span_id: @span_id, trace_flags: @trace_flags, service_name: @service_name} if @do_log
101
+ @hash_for_log = @do_log ? {'trace_id' => @trace_id, 'span_id' => @span_id, 'trace_flags' => @trace_flags, 'resource.service.name' => @service_name} : {}
103
102
  end
104
103
 
105
104
  private
@@ -11,18 +11,6 @@ module SolarWindsAPMBase
11
11
  extend SolarWindsAPM::ThreadLocal
12
12
 
13
13
  attr_accessor :reporter, :loaded
14
-
15
- ##
16
- # Determines if we are running under a forking webserver
17
- #
18
- def forking_webserver?
19
- if (defined?(::Unicorn) && ($PROGRAM_NAME =~ /unicorn/i)) ||
20
- (defined?(::Puma) && ($PROGRAM_NAME =~ /puma/i))
21
- true
22
- else
23
- false
24
- end
25
- end
26
14
  end
27
15
 
28
16
  module SolarWindsAPM
@@ -12,6 +12,15 @@ module SolarWindsAPM
12
12
  # Use SolarWindsAPM::Config.show to view the entire nested hash.
13
13
  #
14
14
  module Config
15
+ LOGGER_LEVEL_MAPPING = {-1 => ::Logger::FATAL,
16
+ 0 => ::Logger::FATAL,
17
+ 1 => ::Logger::ERROR,
18
+ 2 => ::Logger::WARN,
19
+ 3 => ::Logger::INFO,
20
+ 4 => ::Logger::DEBUG,
21
+ 5 => ::Logger::DEBUG,
22
+ 6 => ::Logger::DEBUG}.freeze
23
+
15
24
  @@config = {}
16
25
  @@instrumentation = [:action_controller, :action_controller_api, :action_view,
17
26
  :active_record, :bunnyclient, :bunnyconsumer, :curb,
@@ -44,19 +53,20 @@ module SolarWindsAPM
44
53
  config_files << config_file if File.exist?(config_file)
45
54
 
46
55
  # Check for file set by env variable
47
- config_files << config_from_env if ENV.has_key?('SW_APM_CONFIG_RUBY')
56
+ config_files << config_file_from_env if ENV.has_key?('SW_APM_CONFIG_RUBY')
48
57
 
49
58
  # Check for default config file
50
59
  config_file = File.join(Dir.pwd, 'solarwinds_apm_config.rb')
51
60
  config_files << config_file if File.exist?(config_file)
52
61
 
62
+ SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] Available config_files: #{config_files.join(', ')}" }
53
63
  SolarWindsAPM.logger.warn {"[#{name}/#{__method__}] Multiple configuration files configured, using the first one listed: #{config_files.join(', ')}"} if config_files.size > 1
54
64
  load(config_files[0]) if config_files.size > 0
55
65
 
56
66
  set_log_level # sets SolarWindsAPM::Config[:debug_level], SolarWindsAPM.logger.level
57
67
  end
58
68
 
59
- def self.config_from_env
69
+ def self.config_file_from_env
60
70
  if File.exist?(ENV['SW_APM_CONFIG_RUBY']) && !File.directory?(ENV['SW_APM_CONFIG_RUBY'])
61
71
  config_file = ENV['SW_APM_CONFIG_RUBY']
62
72
  elsif File.exist?(File.join(ENV['SW_APM_CONFIG_RUBY'], 'solarwinds_apm_config.rb'))
@@ -68,11 +78,40 @@ module SolarWindsAPM
68
78
  end
69
79
 
70
80
  def self.set_log_level
71
- SolarWindsAPM::Config[:debug_level] = 3 unless (-1..6).include?(SolarWindsAPM::Config[:debug_level])
81
+ log_level = (ENV['SW_APM_DEBUG_LEVEL'] || SolarWindsAPM::Config[:debug_level] || 3).to_i
82
+
83
+ SolarWindsAPM.logger = ::Logger.new(nil) if log_level == -1
84
+
85
+ SolarWindsAPM.logger.level = LOGGER_LEVEL_MAPPING[log_level] || ::Logger::INFO # default log level info
86
+ end
87
+
88
+ def self.enable_disable_config(env_var, key, value, default, bool: false)
89
+ env_value = ENV[env_var.to_s]&.downcase
90
+ valid_env_values = bool ? %w[true false] : %w[enabled disabled]
91
+
92
+ if env_var && valid_env_values.include?(env_value)
93
+ value = bool ? true?(env_value) : env_value.to_sym
94
+ elsif env_var && !env_value.to_s.empty?
95
+ SolarWindsAPM.logger.warn("[#{name}/#{__method__}] #{env_var} must be #{valid_env_values.join('/')} (current setting is #{ENV[env_var]}). Using default value: #{default}.")
96
+ return @@config[key.to_sym] = default
97
+ end
98
+
99
+ return @@config[key.to_sym] = value unless (bool && !boolean?(value)) || (!bool && !symbol?(value))
72
100
 
73
- # let's find and use the equivalent debug level for ruby
74
- debug_level = (ENV['SW_APM_DEBUG_LEVEL'] || SolarWindsAPM::Config[:debug_level] || 3).to_i
75
- SolarWindsAPM.logger.level = debug_level < 0 ? 6 : [4 - debug_level, 0].max
101
+ SolarWindsAPM.logger.warn("[#{name}/#{__method__}] :#{key} must be a #{valid_env_values.join('/')}. Using default value: #{default}.")
102
+ @@config[key.to_sym] = default
103
+ end
104
+
105
+ def self.true?(obj)
106
+ obj.to_s.casecmp("true").zero?
107
+ end
108
+
109
+ def self.boolean?(obj)
110
+ [true, false].include?(obj)
111
+ end
112
+
113
+ def self.symbol?(obj)
114
+ [:enabled, :disabled].include?(obj)
76
115
  end
77
116
 
78
117
  ##
@@ -93,8 +132,9 @@ module SolarWindsAPM
93
132
  #
94
133
  # Initializer method to set everything up with a default configuration.
95
134
  # The defaults are read from the template configuration file.
135
+ # This will be called when require 'solarwinds_apm/config' happen
96
136
  #
97
- def self.initialize(_data={})
137
+ def self.initialize
98
138
  # for config file backward compatibility
99
139
  @@instrumentation.each {|inst| @@config[inst] = {}}
100
140
  @@config[:transaction_name] = {}
@@ -123,6 +163,7 @@ module SolarWindsAPM
123
163
  #
124
164
  # Config variable assignment method. Here we validate and store the
125
165
  # assigned value(s) and trigger any secondary action needed.
166
+ # ENV always have higher precedence
126
167
  #
127
168
  def self.[]=(key, value)
128
169
  key = key.to_sym
@@ -151,17 +192,14 @@ module SolarWindsAPM
151
192
  when :transaction_settings
152
193
  compile_settings(value)
153
194
 
195
+ when :trigger_tracing_mode
196
+ enable_disable_config('SW_APM_TRIGGER_TRACING_MODE', key, value, :enabled)
197
+
154
198
  when :tracing_mode
155
- # ALL TRACING COMMUNICATION TO OBOE IS NOW HANDLED BY TransactionSettings
156
- # Make sure that the mode is stored as a symbol
157
- @@config[key.to_sym] = value.to_sym
199
+ enable_disable_config(nil, key, value, :enabled)
158
200
 
159
201
  when :tag_sql
160
- if ENV.has_key?('SW_APM_TAG_SQL')
161
- @@config[key.to_sym] = (ENV['SW_APM_TAG_SQL'] == 'true')
162
- else
163
- @@config[key.to_sym] = value
164
- end
202
+ enable_disable_config('SW_APM_TAG_SQL', key, value, false, bool: true)
165
203
 
166
204
  else
167
205
  @@config[key.to_sym] = value
@@ -21,7 +21,7 @@ module SolarWindsAPM
21
21
  @debug_level = (ENV['SW_APM_DEBUG_LEVEL'] || SolarWindsAPM::Config[:debug_level] || 3).to_i
22
22
  # file name including path for log file
23
23
  # TODO eventually find better way to combine ruby and oboe logs
24
- @log_file_path = ENV['SW_APM_LOGFILE'] || ''
24
+ @log_file_path = ENV['SW_APM_LOG_FILEPATH'] || ''
25
25
  # maximum number of transaction names to track
26
26
  @max_transactions = (ENV['SW_APM_MAX_TRANSACTIONS'] || -1).to_i
27
27
  # maximum wait time for flushing data before terminating in milli seconds
@@ -50,7 +50,7 @@ module SolarWindsAPM
50
50
  # custom token bucket rate
51
51
  @token_bucket_rate = (ENV['SW_APM_TOKEN_BUCKET_RATE'] || -1).to_i
52
52
  # use single files in file reporter for each event
53
- @file_single = ENV['SW_APM_REPORTER_FILE_SINGLE'].to_s.downcase == 'true' ? 1 : 0
53
+ @file_single = ENV['SW_APM_REPORTER_FILE_SINGLE'].to_s.casecmp('true').zero? ? 1 : 0
54
54
  # timeout for ec2 metadata
55
55
  @ec2_md_timeout = read_and_validate_ec2_md_timeout
56
56
  @grpc_proxy = read_and_validate_proxy
@@ -59,6 +59,8 @@ module SolarWindsAPM
59
59
  # hardcoded arg for trace id format to use w3c format
60
60
  # flag for format of metric (0 = Both; 1 = AppOptics only; 2 = SWO only; default = 0)
61
61
  @metric_format = determine_the_metric_model
62
+ # log type (0 = stderr; 1 = stdout; 2 = file; 3 = null; 4 = disabled; default = 0)
63
+ @log_type = determine_oboe_log_type
62
64
  end
63
65
 
64
66
  # for testing with changed ENV vars
@@ -75,7 +77,6 @@ module SolarWindsAPM
75
77
  @max_flush_wait_time, # 4
76
78
  @events_flush_interval, # 5
77
79
  @event_flush_batch_size, # 6
78
-
79
80
  @reporter, # 7
80
81
  @host, # 8
81
82
  @service_key, # 9
@@ -89,7 +90,8 @@ module SolarWindsAPM
89
90
  @ec2_md_timeout, #17
90
91
  @grpc_proxy, #18
91
92
  0, #19 arg for lambda (no lambda for ruby yet)
92
- @metric_format #22
93
+ @metric_format, #20
94
+ @log_type #21
93
95
  ]
94
96
  end
95
97
 
@@ -170,8 +172,9 @@ module SolarWindsAPM
170
172
  "#{token}:#{service_name}"
171
173
  end
172
174
 
175
+ # In case of java-collector, please provide a dummy service key
173
176
  def validate_token(token)
174
- if (token !~ /^[0-9a-zA-Z_-]{71}$/) && ENV['SW_APM_COLLECTOR'] !~ /java-collector:1222/
177
+ unless /^[0-9a-zA-Z_-]{71}$/.match?(token)
175
178
  masked = "#{token[0..3]}...#{token[-4..]}"
176
179
  SolarWindsAPM.logger.error {"[#{self.class}/#{__method__}] SW_APM_SERVICE_KEY problem. API Token in wrong format. Masked token: #{masked}"}
177
180
  return false
@@ -181,20 +184,19 @@ module SolarWindsAPM
181
184
  end
182
185
 
183
186
  def validate_transform_service_name(service_name)
184
- service_name = 'test_ssl_collector' if ENV['SW_APM_COLLECTOR'] =~ /java-collector:1222/
185
187
  if service_name.empty?
186
188
  SolarWindsAPM.logger.error {"[#{self.class}/#{__method__}] SW_APM_SERVICE_KEY problem. Service Name is missing"}
187
189
  return false
188
190
  end
189
191
 
190
- name = service_name.dup
191
- name.downcase!
192
- name.gsub!(/[^a-z0-9.:_-]/, '')
193
- name = name[0..254]
192
+ name_ = service_name.dup
193
+ name_.downcase!
194
+ name_.gsub!(/[^a-z0-9.:_-]/, '')
195
+ name_ = name_[0..254]
194
196
 
195
- if name != service_name
196
- SolarWindsAPM.logger.warn {"[#{self.class}/#{__method__}] SW_APM_SERVICE_KEY problem. Service Name transformed from #{service_name} to #{name}"}
197
- service_name = name
197
+ if name_ != service_name
198
+ SolarWindsAPM.logger.warn {"[#{self.class}/#{__method__}] SW_APM_SERVICE_KEY problem. Service Name transformed from #{service_name} to #{name_}"}
199
+ service_name = name_
198
200
  end
199
201
  @service_name = service_name # instance variable used in testing
200
202
  true
@@ -212,7 +214,7 @@ module SolarWindsAPM
212
214
  proxy = ENV['SW_APM_PROXY'] || SolarWindsAPM::Config[:http_proxy] || ''
213
215
  return proxy if proxy == ''
214
216
 
215
- unless proxy =~ /http:\/\/.*:\d+$/
217
+ unless /http:\/\/.*:\d+$/.match?(proxy)
216
218
  SolarWindsAPM.logger.error {"[#{self.class}/#{__method__}] SW_APM_PROXY/http_proxy doesn't start with 'http://', #{proxy}"}
217
219
  return '' # try without proxy, it may work, shouldn't crash but may not report
218
220
  end
@@ -221,14 +223,15 @@ module SolarWindsAPM
221
223
  end
222
224
 
223
225
  def read_certificates
226
+ certificate = ''
227
+
224
228
  file = appoptics_collector?? "#{__dir__}/cert/star.appoptics.com.issuer.crt" : ENV['SW_APM_TRUSTEDPATH']
225
- return String.new if file.nil? || file&.empty?
229
+ return certificate if file.nil? || file&.empty?
226
230
 
227
231
  begin
228
232
  certificate = File.open(file,"r").read
229
233
  rescue StandardError => e
230
234
  SolarWindsAPM.logger.error {"[#{self.class}/#{__method__}] certificates: #{file} doesn't exist or caused by #{e.message}."}
231
- certificate = String.new
232
235
  end
233
236
 
234
237
  certificate
@@ -256,5 +259,12 @@ module SolarWindsAPM
256
259
  end
257
260
  ""
258
261
  end
262
+
263
+ def determine_oboe_log_type
264
+ log_type = 0
265
+ log_type = 2 unless ENV['SW_APM_LOG_FILEPATH'].to_s.empty?
266
+ log_type = 4 if @debug_level == -1
267
+ log_type
268
+ end
259
269
  end
260
270
  end
@@ -133,7 +133,7 @@ module SolarWindsAPM
133
133
  # helper function that extract gem library version for func add_instrumented_framework
134
134
  def check_framework_version(framework)
135
135
  framework_version = nil
136
- if @version_cache.keys.include? framework
136
+ if @version_cache.has_key?(framework)
137
137
 
138
138
  framework_version = @version_cache[framework]
139
139
  else
@@ -131,7 +131,7 @@ module SolarWindsAPM
131
131
 
132
132
  # This span from inbound HTTP request if from a SERVER by some http.method
133
133
  def span_http?(span)
134
- (span.kind == ::OpenTelemetry::Trace::SpanKind::SERVER && !span.attributes[HTTP_METHOD].nil?)
134
+ span.kind == ::OpenTelemetry::Trace::SpanKind::SERVER && !span.attributes[HTTP_METHOD].nil?
135
135
  end
136
136
 
137
137
  # Calculate if this span instance has_error
@@ -272,7 +272,8 @@ module SolarWindsAPM
272
272
  SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] trace_state_no_response #{trace_state_no_response.inspect}"}
273
273
 
274
274
  trace_state_no_response = parent_span_context.tracestate.delete(XTraceOptions.sw_xtraceoptions_response_key)
275
- no_sw_count = trace_state_no_response.to_h.reject { |k, _v| k == "sw" }.count
275
+ no_sw_count = trace_state_no_response.to_h.count { |k, _v| k != 'sw' }
276
+
276
277
  new_attributes[SW_TRACESTATE_CAPTURE_KEY] = Utils.trace_state_header(trace_state_no_response) if no_sw_count > 0
277
278
  SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] new_attributes after add_tracestate_capture_to_new_attributes: #{new_attributes.inspect}"}
278
279
 
@@ -29,20 +29,12 @@ module SolarWindsAPM
29
29
  end
30
30
 
31
31
  def self.resolve_sampler
32
-
33
- resolve_sampler_config
32
+ sampler_config = {"trigger_trace" => SolarWindsAPM::Config[:trigger_tracing_mode]}
34
33
  @@config[:sampler] =
35
34
  ::OpenTelemetry::SDK::Trace::Samplers.parent_based(
36
- root: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]),
37
- remote_parent_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]),
38
- remote_parent_not_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(@@config[:sampler_config]))
39
- end
40
-
41
- def self.resolve_sampler_config
42
- sampler_config = {}
43
- sampler_config["trigger_trace"] = "enabled"
44
- sampler_config["trigger_trace"] = nil if ENV["SW_APM_TRIGGER_TRACING_MODE"] == 'disabled'
45
- @@config[:sampler_config] = sampler_config
35
+ root: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(sampler_config),
36
+ remote_parent_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(sampler_config),
37
+ remote_parent_not_sampled: SolarWindsAPM::OpenTelemetry::SolarWindsSampler.new(sampler_config))
46
38
  end
47
39
 
48
40
  #
@@ -65,20 +57,6 @@ module SolarWindsAPM
65
57
  end
66
58
  end
67
59
 
68
- def self.obfuscate_helper(instrumentation)
69
- if @@config_map[instrumentation] # user provided the option
70
- @@config_map[instrumentation][:db_statement] = :obfuscate unless @@config_map[instrumentation][:db_statement] # user provided the db_statement, ignore our default setting
71
- else
72
- @@config_map[instrumentation] = {db_statement: :obfuscate}
73
- end
74
- end
75
-
76
- def self.obfuscate_query
77
- obfuscate_helper("OpenTelemetry::Instrumentation::Dalli")
78
- obfuscate_helper("OpenTelemetry::Instrumentation::Mysql2")
79
- obfuscate_helper("OpenTelemetry::Instrumentation::PG")
80
- end
81
-
82
60
  def self.[](key)
83
61
  @@config[key.to_sym]
84
62
  end
@@ -132,13 +110,18 @@ module SolarWindsAPM
132
110
  resolve_solarwinds_processor
133
111
  resolve_response_propagator
134
112
 
135
- obfuscate_query
136
-
137
113
  print_config if SolarWindsAPM.logger.level.zero?
138
114
 
139
115
  ENV['OTEL_TRACES_EXPORTER'] = 'none' if ENV['OTEL_TRACES_EXPORTER'].to_s.empty?
140
116
 
141
- ::OpenTelemetry::SDK.configure { |c| c.use_all(@@config_map) }
117
+ if ENV['OTEL_LOG_LEVEL'].to_s.empty?
118
+ ::OpenTelemetry::SDK.configure do |c|
119
+ c.logger = ::Logger.new($stdout, level: ::SolarWindsAPM.logger.level) # sync solarwinds_apm logger to otel log
120
+ c.use_all(@@config_map)
121
+ end
122
+ else
123
+ ::OpenTelemetry::SDK.configure { |c| c.use_all(@@config_map) }
124
+ end
142
125
 
143
126
  validate_propagator(::OpenTelemetry.propagation.instance_variable_get(:@propagators))
144
127
 
@@ -19,7 +19,7 @@ module SolarWindsAPM
19
19
  private
20
20
 
21
21
  def insert_trace_id(msg)
22
- return msg if msg =~ /trace_id=/
22
+ return msg if /trace_id=/.match?(msg)
23
23
 
24
24
  current_trace = SolarWindsAPM::API.current_trace_info
25
25
  if current_trace.do_log
@@ -17,15 +17,15 @@ module SolarWindsAPM
17
17
 
18
18
  def self.get_oboe_trace_mode(tracing_mode)
19
19
  mode = OBOE_SETTINGS_UNSET
20
- mode = OBOE_TRACE_ENABLED if tracing_mode == 'enabled'
21
- mode = OBOE_TRACE_DISABLED if tracing_mode == 'disabled'
20
+ mode = OBOE_TRACE_ENABLED if tracing_mode == :enabled
21
+ mode = OBOE_TRACE_DISABLED if tracing_mode == :disabled
22
22
  mode
23
23
  end
24
24
 
25
25
  def self.get_oboe_trigger_trace_mode(trigger_trace_mode)
26
26
  mode = OBOE_SETTINGS_UNSET
27
- mode = OBOE_TRIGGER_ENABLED if trigger_trace_mode == 'enabled'
28
- mode = OBOE_TRIGGER_DISABLED if trigger_trace_mode == 'disabled'
27
+ mode = OBOE_TRIGGER_ENABLED if trigger_trace_mode == :enabled
28
+ mode = OBOE_TRIGGER_DISABLED if trigger_trace_mode == :disabled
29
29
  mode
30
30
  end
31
31
  end
@@ -25,7 +25,7 @@ module SolarWindsAPM
25
25
  end
26
26
 
27
27
  def self.construct_comment
28
- ret = String.new
28
+ ret = +''
29
29
  components.each do |c|
30
30
  component_value = send(c)
31
31
  ret << "#{c}='#{component_value}'," if component_value.present?
@@ -107,7 +107,7 @@ module SolarWindsAPM
107
107
  marginalia_job["class"] if marginalia_job.respond_to?(:[])
108
108
  end
109
109
 
110
- DEFAULT_LINES_TO_IGNORE_REGEX = %r{\.rvm|/ruby/gems/|vendor/|marginalia|rbenv|monitor\.rb.*mon_synchronize}
110
+ DEFAULT_LINES_TO_IGNORE_REGEX = %r{\.rvm|/ruby/gems/|vendor/|marginalia|rbenv|monitor\.rb.*mon_synchronize}.freeze # rubocop:disable Style/RedundantFreeze
111
111
 
112
112
  def self.line
113
113
  SWOMarginalia::Comment.lines_to_ignore ||= DEFAULT_LINES_TO_IGNORE_REGEX
@@ -79,7 +79,7 @@ module SolarWindsAPM
79
79
 
80
80
  def self.with_annotation(comment, &block)
81
81
  SWOMarginalia::Comment.inline_annotations.push(comment)
82
- block.call if block.present?
82
+ yield if block.present?
83
83
  ensure
84
84
  SWOMarginalia::Comment.inline_annotations.pop
85
85
  end
@@ -21,15 +21,11 @@ module SolarWindsAPM
21
21
  # calculate trace mode to set either 1 or 0 based on url_path and name+kind
22
22
  # first check if url_path match, if not match, then match the name+kind
23
23
  def calculate_trace_mode
24
- tracing_mode_enabled? && tracing_enabled? ? SWO_TRACING_ENABLED : SWO_TRACING_DISABLED
24
+ SolarWindsAPM::Config[:tracing_mode] == :enabled && tracing_enabled? ? SWO_TRACING_ENABLED : SWO_TRACING_DISABLED
25
25
  end
26
26
 
27
27
  private
28
28
 
29
- def tracing_mode_enabled?
30
- SolarWindsAPM::Config[:tracing_mode] && ![:disabled, :never].include?(SolarWindsAPM::Config[:tracing_mode])
31
- end
32
-
33
29
  def tracing_enabled?
34
30
  span_layer = "#{@kind}:#{@name}"
35
31
 
@@ -12,7 +12,7 @@ module SolarWindsAPM
12
12
  MAJOR = 6 # breaking,
13
13
  MINOR = 0 # feature,
14
14
  PATCH = 0 # fix => BFF
15
- PRE = 'preV5'.freeze # for pre-releases into packagecloud, set to nil for production releases into rubygems
15
+ PRE = 'prev6'.freeze
16
16
 
17
17
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
18
18
  end
@@ -22,7 +22,7 @@ begin
22
22
  SolarWindsAPM::Config.load_config_file
23
23
  SolarWindsAPM.loaded = false
24
24
  begin
25
- if RUBY_PLATFORM =~ /linux/
25
+ if /linux/.match?(RUBY_PLATFORM)
26
26
  require_relative './libsolarwinds_apm.so'
27
27
  require 'solarwinds_apm/oboe_init_options'
28
28
  require_relative './oboe_metal' # initialize Reporter; sets SolarWindsAPM.loaded = true if successful
@@ -44,12 +44,6 @@ begin
44
44
  end
45
45
  end
46
46
 
47
- # Auto-start the Reporter unless we are running Unicorn on Heroku
48
- # In that case, we start the reporters after fork
49
- unless SolarWindsAPM.forking_webserver?
50
- SolarWindsAPM::Reporter.start if SolarWindsAPM.loaded
51
- end
52
-
53
47
  if SolarWindsAPM.loaded
54
48
  require 'solarwinds_apm/support'
55
49
  require 'solarwinds_apm/opentelemetry'
@@ -64,6 +58,7 @@ begin
64
58
  SolarWindsAPM::OTelConfig.initialize
65
59
  end
66
60
 
61
+ SolarWindsAPM::Reporter.start
67
62
  else
68
63
  SolarWindsAPM.logger.warn '=============================================================='
69
64
  SolarWindsAPM.logger.warn 'SolarWindsAPM not loaded. Tracing disabled.'
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.preV5
4
+ version: 6.0.0.prev6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maia Engeli
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-11-06 00:00:00.000000000 Z
14
+ date: 2024-01-30 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: opentelemetry-sdk
@@ -145,6 +145,7 @@ metadata:
145
145
  documentation_uri: https://documentation.solarwinds.com/en/success_center/observability/default.htm#cshid=config-ruby-agent
146
146
  homepage_uri: https://documentation.solarwinds.com/en/success_center/observability/content/intro/landing-page.html
147
147
  source_code_uri: https://github.com/solarwinds/apm-ruby
148
+ github_repo: https://github.com/solarwinds/apm-ruby.git
148
149
  post_install_message:
149
150
  rdoc_options: []
150
151
  require_paths: