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.
- checksums.yaml +4 -4
- data/ext/oboe_metal/lib/liboboe-1.0-aarch64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-aarch64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-alpine-x86_64.so.sha256 +1 -1
- data/ext/oboe_metal/lib/liboboe-1.0-x86_64.so.sha256 +1 -1
- data/ext/oboe_metal/src/VERSION +1 -2
- data/ext/oboe_metal/src/oboe.h +0 -12
- data/ext/oboe_metal/src/oboe_swig_wrap.cc +5 -5
- data/lib/rails/generators/solarwinds_apm/templates/solarwinds_apm_initializer.rb +1 -9
- data/lib/solarwinds_apm/api/current_trace_info.rb +0 -1
- data/lib/solarwinds_apm/api/opentelemetry.rb +39 -0
- data/lib/solarwinds_apm/api/transaction_name.rb +17 -17
- data/lib/solarwinds_apm/api.rb +2 -0
- data/lib/solarwinds_apm/config.rb +3 -19
- data/lib/solarwinds_apm/constants.rb +2 -4
- data/lib/solarwinds_apm/noop/context.rb +1 -1
- data/lib/solarwinds_apm/oboe_init_options.rb +2 -5
- data/lib/solarwinds_apm/opentelemetry/solarwinds_exporter.rb +92 -87
- data/lib/solarwinds_apm/opentelemetry/solarwinds_processor.rb +18 -17
- data/lib/solarwinds_apm/opentelemetry/solarwinds_propagator.rb +28 -28
- data/lib/solarwinds_apm/opentelemetry/solarwinds_response_propagator.rb +9 -14
- data/lib/solarwinds_apm/opentelemetry/solarwinds_sampler.rb +122 -170
- data/lib/solarwinds_apm/otel_config.rb +47 -28
- data/lib/solarwinds_apm/support/lumberjack_formatter.rb +17 -2
- data/lib/solarwinds_apm/support/swomarginalia/swomarginalia.rb +5 -4
- data/lib/solarwinds_apm/support/transaction_cache.rb +27 -2
- data/lib/solarwinds_apm/support/transaction_settings.rb +2 -2
- data/lib/solarwinds_apm/support/txn_name_manager.rb +34 -17
- data/lib/solarwinds_apm/support/utils.rb +24 -0
- data/lib/solarwinds_apm/support.rb +2 -4
- data/lib/solarwinds_apm/version.rb +1 -1
- data/lib/solarwinds_apm.rb +2 -2
- metadata +13 -13
- data/lib/oboe.rb +0 -7
- data/lib/solarwinds_apm/support/transformer.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 713296dd9c5976499e32444e7746b7c340aa49a8cbd34df63308451f39c83615
|
4
|
+
data.tar.gz: 8efaffed12d27beb7144ea55e3180bd49eedf10075f77573591272645fe975ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c2a125a6991e69089af608f6d8c37d2716b083bd47f28c4c7d9610f8d02be31e6024107e91ad09a4e78c6200b9d608de9bd56d5b67b098a8a4a7cdd4a2a1c19
|
7
|
+
data.tar.gz: 61d4b4e5805eefe3dee96567509c4eb2378c226f38df35dabc93df999ec3a209ac8a61a4d578d7710819618e21af2701f8acb327bb684b641d2f5ede6878cbdb
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
86a0c98301b157fd2ec184e585d70e40753c721c52fbc596ab09aa3d422d5f1f
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
534122daed4a1a81a9e66828f206662ea8f6bf891fb84438cc3daef5f78a7af4
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
89936e04f0b8cddf3fb94c8a4c21d16aa780d6e4fbf4bb66eba42eb33fe15cc6
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
623f5b308759754c8d771567d5346c46e1d9b53739995a9b5594cc08f8bc6e54
|
data/ext/oboe_metal/src/VERSION
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
13.0.0
|
data/ext/oboe_metal/src/oboe.h
CHANGED
@@ -432,16 +432,6 @@ int oboe_init_reporter(const char *protocol, oboe_init_options_t *options);
|
|
432
432
|
*/
|
433
433
|
int oboe_init_options_set_defaults(oboe_init_options_t *options);
|
434
434
|
|
435
|
-
/**
|
436
|
-
* Disconnect or shut down the Oboe reporter, but allow it to be reconnect()ed.
|
437
|
-
*/
|
438
|
-
void oboe_reporter_disconnect(); /* TODO: Need implementation. */
|
439
|
-
|
440
|
-
/**
|
441
|
-
* Reconnect or restart the Oboe reporter.
|
442
|
-
*/
|
443
|
-
void oboe_reporter_reconnect(); /* TODO: Need implementation. */
|
444
|
-
|
445
435
|
/**
|
446
436
|
* tell reporter to flush all messages that are currently buffered
|
447
437
|
*/
|
@@ -712,8 +702,6 @@ void oboe_settings_rate_set(int sample_rate);
|
|
712
702
|
void oboe_settings_mode_set(int tracing_mode);
|
713
703
|
void oboe_settings_trigger_set(int trigger_mode);
|
714
704
|
|
715
|
-
int oboe_rand_get_value();
|
716
|
-
|
717
705
|
/**
|
718
706
|
* Convert a tracing mode to a printable string.
|
719
707
|
*/
|
@@ -1932,7 +1932,7 @@ SWIG_ruby_failed(VALUE SWIGUNUSEDPARM(arg1), VALUE SWIGUNUSEDPARM(arg2))
|
|
1932
1932
|
}
|
1933
1933
|
|
1934
1934
|
|
1935
|
-
/*@SWIG:/usr/
|
1935
|
+
/*@SWIG:/usr/share/swig4.0/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
|
1936
1936
|
SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE arg)
|
1937
1937
|
{
|
1938
1938
|
VALUE *args = (VALUE *)arg;
|
@@ -2120,7 +2120,7 @@ SWIG_From_std_string (const std::string& s)
|
|
2120
2120
|
#define SWIG_From_double rb_float_new
|
2121
2121
|
|
2122
2122
|
|
2123
|
-
/*@SWIG:/usr/
|
2123
|
+
/*@SWIG:/usr/share/swig4.0/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
|
2124
2124
|
SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE arg)
|
2125
2125
|
{
|
2126
2126
|
VALUE *args = (VALUE *)arg;
|
@@ -2172,7 +2172,7 @@ SWIG_AsVal_unsigned_SS_int (VALUE obj, unsigned int *val)
|
|
2172
2172
|
|
2173
2173
|
|
2174
2174
|
#ifdef SWIG_LONG_LONG_AVAILABLE
|
2175
|
-
/*@SWIG:/usr/
|
2175
|
+
/*@SWIG:/usr/share/swig4.0/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
|
2176
2176
|
SWIGINTERN VALUE SWIG_AUX_NUM2LL(VALUE arg)
|
2177
2177
|
{
|
2178
2178
|
VALUE *args = (VALUE *)arg;
|
@@ -2203,7 +2203,7 @@ SWIG_AsVal_long_SS_long (VALUE obj, long long *val)
|
|
2203
2203
|
#endif
|
2204
2204
|
|
2205
2205
|
|
2206
|
-
/*@SWIG:/usr/
|
2206
|
+
/*@SWIG:/usr/share/swig4.0/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
|
2207
2207
|
SWIGINTERN VALUE SWIG_AUX_NUM2DBL(VALUE arg)
|
2208
2208
|
{
|
2209
2209
|
VALUE *args = (VALUE *)arg;
|
@@ -2234,7 +2234,7 @@ SWIG_AsVal_double (VALUE obj, double *val)
|
|
2234
2234
|
|
2235
2235
|
|
2236
2236
|
#ifdef SWIG_LONG_LONG_AVAILABLE
|
2237
|
-
/*@SWIG:/usr/
|
2237
|
+
/*@SWIG:/usr/share/swig4.0/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
|
2238
2238
|
SWIGINTERN VALUE SWIG_AUX_NUM2ULL(VALUE arg)
|
2239
2239
|
{
|
2240
2240
|
VALUE *args = (VALUE *)arg;
|
@@ -107,11 +107,7 @@ if defined?(SolarWindsAPM::Config)
|
|
107
107
|
#
|
108
108
|
# Currently allowed array of hash
|
109
109
|
#
|
110
|
-
# and the hashes within the :
|
111
|
-
# :extensions takes an array of strings for filtering (not regular expressions!)
|
112
|
-
# :tracing defaults to :disabled, can be set to :enabled to override
|
113
|
-
# the global :disabled setting
|
114
|
-
# or:
|
110
|
+
# and the hashes within the :transaction_settings list:
|
115
111
|
# :regexp is a regular expression that is applied to the incoming path
|
116
112
|
# :opts (optional) nil(default) or Regexp::IGNORECASE (options for regexp)
|
117
113
|
# :tracing defaults to :disabled, can be set to :enabled to override
|
@@ -121,10 +117,6 @@ if defined?(SolarWindsAPM::Config)
|
|
121
117
|
# down execution.
|
122
118
|
#
|
123
119
|
SolarWindsAPM::Config[:transaction_settings] = [
|
124
|
-
# {
|
125
|
-
# extensions: %w[long_job],
|
126
|
-
# tracing: :disabled
|
127
|
-
# },
|
128
120
|
# {
|
129
121
|
# regexp: '^.*\/long_job\/.*$',
|
130
122
|
# opts: Regexp::IGNORECASE,
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SolarWindsAPM
|
2
|
+
module API
|
3
|
+
module OpenTelemetry
|
4
|
+
# Create custom span based on current last span
|
5
|
+
#
|
6
|
+
# Wrap OpenTelemetry function OpenTelemetry.tracer_provider.tracer.in_span
|
7
|
+
#
|
8
|
+
# === Argument:
|
9
|
+
#
|
10
|
+
# * +name+ - (int, default 3000) the maximum time to wait in milliseconds
|
11
|
+
# * +attributes+ - (hash, default nil)
|
12
|
+
# * +links+ - (string, default nil)
|
13
|
+
# * +start_timestamp+ - (int, default nil)
|
14
|
+
# * +kind+ - (symbol, default nil)
|
15
|
+
#
|
16
|
+
# === Example:
|
17
|
+
#
|
18
|
+
# SolarWindsAPM::API.in_span('custom_span') do |span|
|
19
|
+
# url = URI.parse("http://www.google.ca/")
|
20
|
+
# req = Net::HTTP::Get.new(url.to_s)
|
21
|
+
# res = Net::HTTP.start(url.host, url.port) {|http| http.request(req)}
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# === Returns:
|
25
|
+
# * Objective
|
26
|
+
#
|
27
|
+
def in_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, &block)
|
28
|
+
if block.nil?
|
29
|
+
SolarWindsAPM.logger.warn {"[#{name}/#{__method__}] please provide block when using in_span function"}
|
30
|
+
return
|
31
|
+
end
|
32
|
+
|
33
|
+
SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] solarwinds_apm in_span with OTEL_SERVICE_NAME #{ENV['OTEL_SERVICE_NAME']}"}
|
34
|
+
current_tracer = ::OpenTelemetry.tracer_provider.tracer(ENV['OTEL_SERVICE_NAME'])
|
35
|
+
current_tracer.in_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind, &block)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -31,27 +31,27 @@ module SolarWindsAPM
|
|
31
31
|
#
|
32
32
|
def set_transaction_name(custom_name=nil)
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
status = true
|
35
|
+
if custom_name.nil? || custom_name.empty?
|
36
|
+
status = false
|
37
|
+
elsif SolarWindsAPM::Context.toString == '99-00000000000000000000000000000000-0000000000000000-00' # noop
|
38
|
+
status = true
|
39
|
+
elsif SolarWindsAPM::OTelConfig.class_variable_get(:@@config)[:span_processor].nil?
|
39
40
|
SolarWindsAPM.logger.warn {"[#{name}/#{__method__}] Solarwinds processor is missing. Set transaction name failed."}
|
40
|
-
|
41
|
-
|
41
|
+
status = false
|
42
|
+
else
|
43
|
+
solarwinds_processor = SolarWindsAPM::OTelConfig.class_variable_get(:@@config)[:span_processor]
|
44
|
+
current_span = ::OpenTelemetry::Trace.current_span
|
45
|
+
entry_trace_id = current_span.context.hex_trace_id
|
46
|
+
entry_span_id, trace_flags = solarwinds_processor.txn_manager.get_root_context_h(entry_trace_id)&.split('-')
|
42
47
|
|
43
|
-
|
44
|
-
|
48
|
+
status = false if entry_trace_id.nil? || entry_span_id.nil? || trace_flags.nil?
|
49
|
+
status = false if entry_trace_id == '0'*32 || entry_span_id == '0'*16 || trace_flags == '00' # not sampled
|
45
50
|
|
46
|
-
|
47
|
-
SolarWindsAPM.logger.
|
48
|
-
return false
|
51
|
+
solarwinds_processor.txn_manager.set("#{entry_trace_id}-#{entry_span_id}",custom_name)
|
52
|
+
SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] Cached custom transaction name for #{entry_trace_id}-#{entry_span_id} as #{custom_name}"}
|
49
53
|
end
|
50
|
-
|
51
|
-
trace_span_id = "#{entry_trace_id}-#{entry_span_id}"
|
52
|
-
solarwinds_processor.txn_manager.set(trace_span_id,custom_name)
|
53
|
-
SolarWindsAPM.logger.debug {"[#{name}/#{__method__}] Cached custom transaction name for #{trace_span_id} as #{custom_name}"}
|
54
|
-
true
|
54
|
+
status
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
data/lib/solarwinds_apm/api.rb
CHANGED
@@ -4,11 +4,13 @@
|
|
4
4
|
require_relative './api/transaction_name'
|
5
5
|
require_relative './api/current_trace_info'
|
6
6
|
require_relative './api/tracing'
|
7
|
+
require_relative './api/opentelemetry'
|
7
8
|
|
8
9
|
module SolarWindsAPM
|
9
10
|
module API
|
10
11
|
extend SolarWindsAPM::API::TransactionName
|
11
12
|
extend SolarWindsAPM::API::CurrentTraceInfo
|
12
13
|
extend SolarWindsAPM::API::Tracing
|
14
|
+
extend SolarWindsAPM::API::OpenTelemetry
|
13
15
|
end
|
14
16
|
end
|
@@ -176,7 +176,7 @@ module SolarWindsAPM
|
|
176
176
|
|
177
177
|
# `tracing: disabled` is the default
|
178
178
|
disabled = settings.select { |v| !v.has_key?(:tracing) || v[:tracing] == :disabled }
|
179
|
-
enabled
|
179
|
+
enabled = settings.select { |v| v[:tracing] == :enabled }
|
180
180
|
|
181
181
|
SolarWindsAPM::Config[:enabled_regexps] = compile_regexp(enabled)
|
182
182
|
SolarWindsAPM::Config[:disabled_regexps] = compile_regexp(disabled)
|
@@ -184,11 +184,8 @@ module SolarWindsAPM
|
|
184
184
|
private_class_method :compile_settings
|
185
185
|
|
186
186
|
def self.compile_regexp(settings)
|
187
|
-
regexp_regexp
|
188
|
-
|
189
|
-
|
190
|
-
regexps = [regexp_regexp, extensions_regexp].flatten.compact
|
191
|
-
|
187
|
+
regexp_regexp = compile_settings_regexp(settings)
|
188
|
+
regexps = [regexp_regexp].flatten.compact
|
192
189
|
regexps.empty? ? nil : regexps
|
193
190
|
end
|
194
191
|
private_class_method :compile_regexp
|
@@ -213,19 +210,6 @@ module SolarWindsAPM
|
|
213
210
|
end
|
214
211
|
private_class_method :compile_settings_regexp
|
215
212
|
|
216
|
-
def self.compile_settings_extensions(value)
|
217
|
-
extensions = value.select do |v|
|
218
|
-
v.has_key?(:extensions) &&
|
219
|
-
v[:extensions].is_a?(Array) &&
|
220
|
-
!v[:extensions].empty?
|
221
|
-
end
|
222
|
-
extensions = extensions.map { |v| v[:extensions] }.flatten
|
223
|
-
extensions.keep_if { |v| v.is_a?(String) }
|
224
|
-
|
225
|
-
extensions.empty? ? nil : Regexp.new("(#{Regexp.union(extensions).source})(\\?.+){0,1}$")
|
226
|
-
end
|
227
|
-
private_class_method :compile_settings_extensions
|
228
|
-
|
229
213
|
def self.reset_regexps
|
230
214
|
SolarWindsAPM::Config[:enabled_regexps] = nil
|
231
215
|
SolarWindsAPM::Config[:disabled_regexps] = nil
|
@@ -20,12 +20,10 @@ module SolarWindsAPM
|
|
20
20
|
INTL_SWO_PROPAGATOR = "solarwinds_propagator".freeze
|
21
21
|
INTL_SWO_DEFAULT_PROPAGATORS = [INTL_SWO_TRACECONTEXT_PROPAGATOR, "baggage",INTL_SWO_PROPAGATOR].freeze
|
22
22
|
INTL_SWO_SUPPORT_EMAIL = "SWO-support@solarwinds.com".freeze
|
23
|
-
INTL_SWO_CURRENT_SPAN_ID = "sw-current-entry-span-id".freeze
|
24
|
-
INTL_SWO_CURRENT_TRACE_ID = "sw-current-trace-id".freeze
|
25
|
-
INTL_SWO_CURRENT_TRACE_FLAG = "sw-current-trace-flag".freeze
|
26
|
-
|
27
23
|
INTL_SWO_OTEL_SCOPE_NAME = "otel.scope.name".freeze
|
28
24
|
INTL_SWO_OTEL_SCOPE_VERSION = "otel.scope.version".freeze
|
25
|
+
INTL_SWO_OTEL_STATUS = "otel.status".freeze
|
26
|
+
INTL_SWO_OTEL_STATUS_DESCRIPTION = "otel.status_description".freeze
|
29
27
|
|
30
28
|
INTERNAL_TRIGGERED_TRACE = "TriggeredTrace".freeze
|
31
29
|
end
|
@@ -213,11 +213,8 @@ module SolarWindsAPM
|
|
213
213
|
end
|
214
214
|
|
215
215
|
def read_certificates
|
216
|
-
file =
|
217
|
-
|
218
|
-
file = ENV['SW_APM_TRUSTEDPATH'] if !ENV['SW_APM_TRUSTEDPATH'].nil? && !ENV['SW_APM_TRUSTEDPATH']&.empty?
|
219
|
-
|
220
|
-
return file if file.empty?
|
216
|
+
file = appoptics_collector?? "#{__dir__}/cert/star.appoptics.com.issuer.crt" : ENV['SW_APM_TRUSTEDPATH']
|
217
|
+
return String.new if file.nil? || file&.empty?
|
221
218
|
|
222
219
|
begin
|
223
220
|
certificate = File.open(file,"r").read
|
@@ -19,12 +19,13 @@ module SolarWindsAPM
|
|
19
19
|
|
20
20
|
def export(span_data, _timeout: nil)
|
21
21
|
return FAILURE if @shutdown
|
22
|
-
|
23
|
-
|
22
|
+
|
23
|
+
status = SUCCESS
|
24
24
|
span_data.each do |data|
|
25
|
-
log_span_data(data)
|
25
|
+
status = log_span_data(data)
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
|
+
status
|
28
29
|
end
|
29
30
|
|
30
31
|
def force_flush(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
@@ -39,64 +40,63 @@ module SolarWindsAPM
|
|
39
40
|
private
|
40
41
|
|
41
42
|
def log_span_data(span_data)
|
43
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] span_data: #{span_data.inspect}\n"}
|
44
|
+
|
45
|
+
md = build_meta_data(span_data)
|
46
|
+
event = nil
|
47
|
+
if span_data.parent_span_id != ::OpenTelemetry::Trace::INVALID_SPAN_ID
|
48
|
+
parent_md = build_meta_data(span_data, parent: true)
|
49
|
+
event = @context.createEntry(md, (span_data.start_timestamp.to_i / 1000).to_i, parent_md)
|
50
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Continue trace from parent metadata: #{parent_md.toString}."}
|
51
|
+
else
|
52
|
+
event = @context.createEntry(md, (span_data.start_timestamp.to_i / 1000).to_i)
|
53
|
+
add_info_transaction_name(span_data, event)
|
54
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Start a new trace."}
|
55
|
+
end
|
56
|
+
|
57
|
+
layer_name = "#{span_data.kind}:#{span_data.name}"
|
58
|
+
event.addInfo('Layer', layer_name)
|
59
|
+
event.addInfo('sw.span_kind', span_data.kind.to_s)
|
60
|
+
event.addInfo('Language', 'Ruby')
|
61
|
+
|
62
|
+
add_instrumentation_scope(event, span_data)
|
63
|
+
add_instrumented_framework(event, span_data)
|
64
|
+
add_span_data_attributes(event, span_data.attributes) if span_data.attributes
|
42
65
|
|
43
|
-
|
44
|
-
|
45
|
-
event = nil
|
46
|
-
|
47
|
-
if span_data.parent_span_id != ::OpenTelemetry::Trace::INVALID_SPAN_ID
|
48
|
-
|
49
|
-
parent_md = build_meta_data(span_data, parent: true)
|
50
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Continue trace from parent. parent_md: #{parent_md}, span_data: #{span_data.inspect}"}
|
51
|
-
event = @context.createEntry(md, (span_data.start_timestamp.to_i / 1000).to_i, parent_md)
|
52
|
-
else
|
53
|
-
|
54
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Start a new trace."}
|
55
|
-
event = @context.createEntry(md, (span_data.start_timestamp.to_i / 1000).to_i)
|
56
|
-
add_info_transaction_name(span_data, event)
|
57
|
-
end
|
58
|
-
|
59
|
-
event.addInfo('Layer', span_data.name)
|
60
|
-
event.addInfo('sw.span_kind', span_data.kind.to_s)
|
61
|
-
event.addInfo('Language', 'Ruby')
|
62
|
-
|
63
|
-
add_info_instrumentation_scope(event, span_data)
|
64
|
-
add_info_instrumented_framework(event, span_data)
|
65
|
-
|
66
|
-
if span_data.attributes
|
67
|
-
if span_data.attributes['http.target']
|
68
|
-
http_target = span_data.attributes['http.target']
|
69
|
-
http_target = http_target.split('?').first if SolarWindsAPM::Config[:log_args] == false # remove url parameters
|
70
|
-
event.addInfo('http.target', http_target)
|
71
|
-
span_data.attributes.each do |k, v|
|
72
|
-
next if k == 'http.target'
|
73
|
-
|
74
|
-
event.addInfo(k, v)
|
75
|
-
end
|
76
|
-
else
|
77
|
-
span_data.attributes.each { |k, v| event.addInfo(k, v) }
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
@reporter.send_report(event, with_system_timestamp: false)
|
66
|
+
event.addInfo(SolarWindsAPM::Constants::INTL_SWO_OTEL_STATUS, span_data.status.ok?? 'OK' : 'ERROR')
|
67
|
+
event.addInfo(SolarWindsAPM::Constants::INTL_SWO_OTEL_STATUS_DESCRIPTION, span_data.status.description) unless span_data.status.description.empty?
|
82
68
|
|
83
|
-
|
84
|
-
span_data.events&.each do |span_data_event|
|
85
|
-
span_data_event.name == 'exception' ? report_exception_event(span_data_event) : report_info_event(span_data_event)
|
86
|
-
end
|
69
|
+
@reporter.send_report(event, with_system_timestamp: false)
|
87
70
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Exit a trace: #{event.metadataString}"}
|
92
|
-
rescue StandardError => e
|
93
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] \n #{e.message} #{e.backtrace}\n"}
|
94
|
-
raise
|
71
|
+
# info / exception event
|
72
|
+
span_data.events&.each do |span_data_event|
|
73
|
+
span_data_event.name == 'exception' ? report_exception_event(span_data_event) : report_info_event(span_data_event)
|
95
74
|
end
|
96
75
|
|
76
|
+
event = @context.createExit((span_data.end_timestamp.to_i / 1000).to_i)
|
77
|
+
event.addInfo('Layer', layer_name)
|
78
|
+
@reporter.send_report(event, with_system_timestamp: false)
|
79
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] Exit a trace: #{event.metadataString}"}
|
80
|
+
SUCCESS
|
81
|
+
rescue StandardError => e
|
82
|
+
SolarWindsAPM.logger.info {"[#{self.class}/#{__method__}] exporter error: \n #{e.message} #{e.backtrace}\n"}
|
83
|
+
FAILURE
|
97
84
|
end
|
98
85
|
|
99
|
-
|
86
|
+
##
|
87
|
+
# extract the span_data.attributes (OpenTelemetry::SDK::Trace::SpanData.attributes)
|
88
|
+
def add_span_data_attributes(event, span_attributes)
|
89
|
+
target = 'http.target'
|
90
|
+
attributes = span_attributes.dup
|
91
|
+
attributes[target] = attributes[target].split('?').first if attributes[target] && SolarWindsAPM::Config[:log_args] == false # remove url parameters
|
92
|
+
attributes.each { |k, v| event.addInfo(k, v) }
|
93
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] span_data attributes added: #{attributes.inspect}"}
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# get instrumentation scope data: scope name and version.
|
98
|
+
# the version if the opentelemetry-instrumentation-* gem version
|
99
|
+
def add_instrumentation_scope(event, span_data)
|
100
100
|
scope_name = ""
|
101
101
|
scope_version = ""
|
102
102
|
if span_data.instrumentation_scope
|
@@ -104,14 +104,13 @@ module SolarWindsAPM
|
|
104
104
|
scope_version = span_data.instrumentation_scope.version if span_data.instrumentation_scope.version
|
105
105
|
end
|
106
106
|
event.addInfo(SolarWindsAPM::Constants::INTL_SWO_OTEL_SCOPE_NAME, scope_name)
|
107
|
-
event.addInfo(SolarWindsAPM::Constants::INTL_SWO_OTEL_SCOPE_VERSION, scope_version)
|
107
|
+
event.addInfo(SolarWindsAPM::Constants::INTL_SWO_OTEL_SCOPE_VERSION, scope_version)
|
108
108
|
end
|
109
109
|
|
110
|
-
|
111
|
-
#
|
112
|
-
#
|
113
|
-
def
|
114
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] add_info_instrumented_framework: #{span_data.instrumentation_scope.name}"}
|
110
|
+
##
|
111
|
+
# add the gem library version to event
|
112
|
+
# p.s. gem library version is not same as the opentelemetry-instrumentation-* gem version
|
113
|
+
def add_instrumented_framework(event, span_data)
|
115
114
|
scope_name = span_data.instrumentation_scope.name
|
116
115
|
scope_name = scope_name.downcase if scope_name
|
117
116
|
return unless scope_name&.include? "opentelemetry::instrumentation"
|
@@ -121,9 +120,12 @@ module SolarWindsAPM
|
|
121
120
|
|
122
121
|
framework = normalize_framework_name(framework)
|
123
122
|
framework_version = check_framework_version(framework)
|
123
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] #{span_data.instrumentation_scope.name} with #{framework} and version #{framework_version}"}
|
124
124
|
event.addInfo("Ruby.#{framework}.Version",framework_version) unless framework_version.nil?
|
125
125
|
end
|
126
126
|
|
127
|
+
##
|
128
|
+
# helper function that extract gem library version for func add_instrumented_framework
|
127
129
|
def check_framework_version(framework)
|
128
130
|
framework_version = nil
|
129
131
|
if @version_cache.keys.include? framework
|
@@ -142,10 +144,12 @@ module SolarWindsAPM
|
|
142
144
|
@version_cache[framework] = framework_version
|
143
145
|
end
|
144
146
|
end
|
145
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}]
|
147
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] current framework version cached: #{@version_cache.inspect}"}
|
146
148
|
framework_version
|
147
149
|
end
|
148
150
|
|
151
|
+
##
|
152
|
+
# helper function that convert opentelemetry instrumentation name to gem library understandable
|
149
153
|
def normalize_framework_name(framework)
|
150
154
|
case framework
|
151
155
|
when "net::http"
|
@@ -156,47 +160,48 @@ module SolarWindsAPM
|
|
156
160
|
normalized
|
157
161
|
end
|
158
162
|
|
163
|
+
##
|
159
164
|
# Add transaction name from cache to root span then removes from cache
|
160
|
-
def add_info_transaction_name(span_data,
|
165
|
+
def add_info_transaction_name(span_data, event)
|
166
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] transaction manager: #{@txn_manager.inspect}."}
|
161
167
|
trace_span_id = "#{span_data.hex_trace_id}-#{span_data.hex_span_id}"
|
162
|
-
|
163
|
-
|
164
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] txname: #{txname}"}
|
165
|
-
evt.addInfo("TransactionName", txname)
|
168
|
+
txname = @txn_manager.get(trace_span_id) || ''
|
169
|
+
event.addInfo("TransactionName", txname)
|
166
170
|
@txn_manager.del(trace_span_id)
|
167
171
|
end
|
168
172
|
|
173
|
+
##
|
174
|
+
# report exception event
|
169
175
|
def report_exception_event(span_event)
|
170
|
-
|
171
|
-
|
172
|
-
|
176
|
+
event = @context.createEvent((span_event.timestamp.to_i / 1000).to_i)
|
177
|
+
event.addInfo('Label', 'error')
|
178
|
+
event.addInfo('Spec', 'error')
|
173
179
|
|
174
180
|
unless span_event.attributes.nil?
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
181
|
+
attributes = span_event.attributes.dup
|
182
|
+
attributes.delete('exception.type') if event.addInfo('ErrorClass', attributes['exception.type'])
|
183
|
+
attributes.delete('exception.message') if event.addInfo('ErrorMsg', attributes['exception.message'])
|
184
|
+
attributes.delete('exception.stacktrace') if event.addInfo('Backtrace', attributes['exception.stacktrace'])
|
185
|
+
attributes.each { |key, value| event.addInfo(key, value) }
|
181
186
|
end
|
182
|
-
|
183
|
-
|
187
|
+
|
188
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] exception event #{event.metadataString}"}
|
189
|
+
@reporter.send_report(event, with_system_timestamp: false)
|
184
190
|
end
|
185
191
|
|
192
|
+
##
|
193
|
+
# report non-exception/info event
|
186
194
|
def report_info_event(span_event)
|
187
|
-
|
188
|
-
|
189
|
-
span_event.attributes&.each
|
190
|
-
|
191
|
-
|
192
|
-
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] info event #{evt.metadataString}"}
|
193
|
-
@reporter.send_report(evt, with_system_timestamp: false)
|
195
|
+
event = @context.createEvent((span_event.timestamp.to_i / 1000).to_i)
|
196
|
+
event.addInfo('Label', 'info')
|
197
|
+
span_event.attributes&.each { |key, value| event.addInfo(key, value) }
|
198
|
+
SolarWindsAPM.logger.debug {"[#{self.class}/#{__method__}] info event #{event.metadataString}"}
|
199
|
+
@reporter.send_report(event, with_system_timestamp: false)
|
194
200
|
end
|
195
201
|
|
196
202
|
def build_meta_data(span_data, parent: false)
|
197
203
|
flag = span_data.trace_flags.sampled?? 1 : 0
|
198
|
-
|
199
|
-
xtr = parent == false ? "#{version}-#{span_data.hex_trace_id}-#{span_data.hex_span_id}-0#{flag}" : "#{version}-#{span_data.hex_trace_id}-#{span_data.hex_parent_span_id}-0#{flag}"
|
204
|
+
xtr = parent == false ? "00-#{span_data.hex_trace_id}-#{span_data.hex_span_id}-0#{flag}" : "00-#{span_data.hex_trace_id}-#{span_data.hex_parent_span_id}-0#{flag}"
|
200
205
|
@metadata.fromString(xtr)
|
201
206
|
end
|
202
207
|
end
|