stackify-ruby-apm 1.3.1 → 1.4.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +10 -3
- data/lib/stackify_apm/agent.rb +8 -7
- data/lib/stackify_apm/config.rb +48 -13
- data/lib/stackify_apm/context/response.rb +1 -1
- data/lib/stackify_apm/context_builder.rb +0 -29
- data/lib/stackify_apm/instrumenter.rb +3 -4
- data/lib/stackify_apm/logger/log_device.rb +2 -2
- data/lib/stackify_apm/logger/logger_high_version.rb +9 -7
- data/lib/stackify_apm/logger/logger_lower_version.rb +3 -4
- data/lib/stackify_apm/normalizers.rb +4 -1
- data/lib/stackify_apm/normalizers/active_record.rb +2 -3
- data/lib/stackify_apm/response_manipulator.rb +7 -5
- data/lib/stackify_apm/root_info.rb +2 -2
- data/lib/stackify_apm/spies.rb +2 -1
- data/lib/stackify_apm/spies/curb.rb +1 -1
- data/lib/stackify_apm/spies/curb/easy.rb +5 -5
- data/lib/stackify_apm/spies/custom_instrumenter.rb +2 -2
- data/lib/stackify_apm/subscriber.rb +1 -13
- data/lib/stackify_apm/trace_logger.rb +3 -4
- data/lib/stackify_apm/transaction.rb +11 -1
- data/lib/stackify_apm/util.rb +18 -0
- data/lib/stackify_apm/version.rb +1 -1
- data/lib/stackify_apm/worker.rb +1 -2
- data/lib/stackify_ruby_apm.rb +9 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37b3e9d03e3a48f658ac93e0c7fb2bde7ff1bbe4b477d8db6307288182da1218
|
4
|
+
data.tar.gz: d85d9a3ebefa5f9fa86b232887087634c7fa3a464b8a430da6f43ec1e2a76973
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d7ad0838dc3db4eedb0f1dd9dfdc7ad7987952fcbdb8a5b1e852ecd2451b4193cf6f7e3df70046db7b9766834a23313e059bb5ea9752b965bba79c5332330d0
|
7
|
+
data.tar.gz: e5bddb17c802ee238fb73ad50b4208ff91b5072b6057726977478d61189cab9812eaef7df8153688722118fb7fbd5e69869c963d35c17a4084a33e1f16e7420b
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
stackify-ruby-apm (1.3.
|
4
|
+
stackify-ruby-apm (1.3.1)
|
5
5
|
concurrent-ruby (~> 1.0)
|
6
6
|
delegate_matcher (~> 0.4)
|
7
7
|
rufus-scheduler (~> 3.5)
|
@@ -60,7 +60,7 @@ GEM
|
|
60
60
|
domain_name (0.5.20180417)
|
61
61
|
unf (>= 0.0.5, < 1.0.0)
|
62
62
|
erubis (2.7.0)
|
63
|
-
et-orbi (1.2.
|
63
|
+
et-orbi (1.2.0)
|
64
64
|
tzinfo
|
65
65
|
fakeredis (0.7.0)
|
66
66
|
redis (>= 3.2, < 5.0)
|
@@ -68,7 +68,7 @@ GEM
|
|
68
68
|
multipart-post (>= 1.2, < 3)
|
69
69
|
file-tail (1.2.0)
|
70
70
|
tins (~> 1.0)
|
71
|
-
fugit (1.2.
|
71
|
+
fugit (1.2.0)
|
72
72
|
et-orbi (~> 1.1, >= 1.1.8)
|
73
73
|
raabro (~> 1.1)
|
74
74
|
globalid (0.4.2)
|
@@ -98,12 +98,16 @@ GEM
|
|
98
98
|
bson (>= 4.4.2, < 5.0.0)
|
99
99
|
multipart-post (2.0.0)
|
100
100
|
mysql2 (0.5.2)
|
101
|
+
mysql2 (0.5.2-x64-mingw32)
|
101
102
|
nokogiri (1.6.8.1)
|
102
103
|
mini_portile2 (~> 2.1.0)
|
104
|
+
nokogiri (1.6.8.1-x64-mingw32)
|
105
|
+
mini_portile2 (~> 2.1.0)
|
103
106
|
parallel (1.13.0)
|
104
107
|
parser (2.6.0.0)
|
105
108
|
ast (~> 2.4.0)
|
106
109
|
pg (0.21.0)
|
110
|
+
pg (0.21.0-x64-mingw32)
|
107
111
|
powerpack (0.1.2)
|
108
112
|
proc_extensions (0.2)
|
109
113
|
sourcify (~> 0.5)
|
@@ -193,6 +197,7 @@ GEM
|
|
193
197
|
activesupport (>= 4.0)
|
194
198
|
sprockets (>= 3.0.0)
|
195
199
|
sqlite3 (1.3.13)
|
200
|
+
sqlite3 (1.3.13-x64-mingw32)
|
196
201
|
stackify-api-ruby (1.0.13)
|
197
202
|
faraday (~> 0.8)
|
198
203
|
thor (0.20.3)
|
@@ -206,6 +211,7 @@ GEM
|
|
206
211
|
unf (0.1.4)
|
207
212
|
unf_ext
|
208
213
|
unf_ext (0.0.7.5)
|
214
|
+
unf_ext (0.0.7.5-x64-mingw32)
|
209
215
|
unicode-display_width (1.5.0)
|
210
216
|
webmock (3.5.1)
|
211
217
|
addressable (>= 2.3.6)
|
@@ -214,6 +220,7 @@ GEM
|
|
214
220
|
|
215
221
|
PLATFORMS
|
216
222
|
ruby
|
223
|
+
x64-mingw32
|
217
224
|
|
218
225
|
DEPENDENCIES
|
219
226
|
activerecord
|
data/lib/stackify_apm/agent.rb
CHANGED
@@ -33,10 +33,11 @@ module StackifyRubyAPM
|
|
33
33
|
pid = $PID || Process.pid
|
34
34
|
host_name = config.hostname || `hostname`
|
35
35
|
date_now = Time.now
|
36
|
-
current_trace_file = config.log_trace_path + squish(host_name) + '#' + squish(pid.to_s)
|
36
|
+
current_trace_file = config.log_trace_path + squish(host_name) + '#' + squish(pid.to_s)
|
37
37
|
|
38
38
|
if ENV['STACKIFY_RUBY_ENV'] != 'rspec'
|
39
39
|
config.tracer_logger = StackifyLogger.new(current_trace_file, config.filenum_rotate, config.logger_byte_size)
|
40
|
+
config.debug_logger
|
40
41
|
config.logtime_created = date_now.strftime('%H:%M')
|
41
42
|
Util::TraceLogWatcher.delete_trace_logs(config)
|
42
43
|
end
|
@@ -102,7 +103,7 @@ module StackifyRubyAPM
|
|
102
103
|
require "stackify_apm/spies/#{lib}"
|
103
104
|
end
|
104
105
|
|
105
|
-
debug '[Agent] Loaded spies:' + spies_name
|
106
|
+
debug '[Agent] Loaded spies: ' + spies_name if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
106
107
|
self
|
107
108
|
end
|
108
109
|
|
@@ -177,17 +178,17 @@ module StackifyRubyAPM
|
|
177
178
|
# This method will strip and remove garbage character and multiple spaces.
|
178
179
|
|
179
180
|
def self.squish(str)
|
180
|
-
str = str.
|
181
|
-
str = str.
|
182
|
-
str = str.
|
183
|
-
str = str.strip.
|
181
|
+
str = str.sub(/\A[[:space:]]+/, '')
|
182
|
+
str = str.sub(/[[:space:]]+\z/, '')
|
183
|
+
str = str.sub(/[[:space:]]+/, ' ')
|
184
|
+
str = str.strip.sub(/\s+/, '')
|
184
185
|
str
|
185
186
|
end
|
186
187
|
|
187
188
|
private
|
188
189
|
|
189
190
|
def boot_worker
|
190
|
-
debug '[Agent] Booting worker'
|
191
|
+
debug '[Agent] Booting worker' if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
191
192
|
|
192
193
|
@worker_thread = Thread.new do
|
193
194
|
Worker.new(
|
data/lib/stackify_apm/config.rb
CHANGED
@@ -21,9 +21,9 @@ module StackifyRubyAPM
|
|
21
21
|
rum_auto_injection: false,
|
22
22
|
instrument: true,
|
23
23
|
debug_logging: false,
|
24
|
-
log_path: '/usr/local/stackify/stackify-ruby-apm/log/stackify-ruby-apm.log',
|
24
|
+
log_path: StackifyRubyAPM::Util.host_os == 'WINDOWS' ? 'C:\ProgramData\Stackify\Ruby\log\stackify-ruby-apm-1.log' : '/usr/local/stackify/stackify-ruby-apm/log/stackify-ruby-apm-1.log',
|
25
25
|
log_level: Logger::INFO,
|
26
|
-
log_trace_path: '/usr/local/stackify/stackify-ruby-apm/log/',
|
26
|
+
log_trace_path: StackifyRubyAPM::Util.host_os == 'WINDOWS' ? 'C:\ProgramData\Stackify\Ruby\log\\' : '/usr/local/stackify/stackify-ruby-apm/log/',
|
27
27
|
|
28
28
|
max_queue_size: 500, # Maximum queue length of transactions before sending transactions to the APM.
|
29
29
|
flush_interval: 1, # interval with which transactions should be sent to the APM. Default value: 10 seconds
|
@@ -83,9 +83,8 @@ module StackifyRubyAPM
|
|
83
83
|
set_from_env
|
84
84
|
|
85
85
|
yield self if block_given?
|
86
|
-
|
87
|
-
|
88
|
-
load_stackify_props
|
86
|
+
build_logger if ENV['STACKIFY_RUBY_ENV'] == 'rspec'
|
87
|
+
StackifyRubyAPM::Util.host_os == 'WINDOWS' ? load_stackify_props_windows : load_stackify_props
|
89
88
|
end
|
90
89
|
|
91
90
|
attr_accessor :config_file
|
@@ -202,6 +201,13 @@ module StackifyRubyAPM
|
|
202
201
|
new_available_spies - disabled_spies
|
203
202
|
end
|
204
203
|
|
204
|
+
def debug_logger
|
205
|
+
debuger_logpath = log_path == '-' ? $stdout : log_path
|
206
|
+
logger = StackifyLogger.new(debuger_logpath, debugger_filenum_rotate, debugger_byte_size)
|
207
|
+
logger.level = log_level
|
208
|
+
self.logger = logger
|
209
|
+
end
|
210
|
+
|
205
211
|
private
|
206
212
|
|
207
213
|
def assign(options)
|
@@ -274,26 +280,55 @@ module StackifyRubyAPM
|
|
274
280
|
@device_id = nil
|
275
281
|
@client_run_domain = nil
|
276
282
|
begin
|
277
|
-
info 'Reading the stackify.properties file'
|
283
|
+
info '[Config] Reading the stackify.properties file'
|
278
284
|
IO.foreach(@stackify_properties_file) do |line|
|
279
285
|
case line.downcase
|
280
286
|
when /clientid=\d+/
|
281
|
-
|
287
|
+
cid = line.split('=')[1].strip
|
288
|
+
@client_id = "C#{cid}"
|
282
289
|
when /deviceid=\d+/
|
283
|
-
|
290
|
+
devid = line.split('=')[1].strip
|
291
|
+
@device_id = "CD#{devid}"
|
284
292
|
when /clientrumdomain=([\w\s\d\"\']+)+/i
|
285
293
|
@client_run_domain = line.split('=')[1].strip
|
286
294
|
end
|
287
295
|
end
|
288
|
-
info "stackify.properties: clientId=#{@client_id}, deviceId=#{@device_id}, client_rum_domain=#{@client_run_domain}"
|
296
|
+
info "[Config] stackify.properties: clientId=#{@client_id}, deviceId=#{@device_id}, client_rum_domain=#{@client_run_domain}"
|
297
|
+
rescue StandardError => e
|
298
|
+
info '[Config] Error occured while reading the stackify.properties file.'
|
299
|
+
info e.inspect
|
300
|
+
end
|
301
|
+
info '[Config] No clientId found from stackify.properties file.' if @client_id.nil?
|
302
|
+
info '[Config] No deviceId found from stackify.properties file.' if @device_id.nil?
|
303
|
+
info '[Config] No client RUM domain found from stackify.properties file.' if @client_run_domain.nil?
|
304
|
+
end
|
305
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
306
|
+
|
307
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
308
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
309
|
+
def load_stackify_props_windows
|
310
|
+
require 'win32ole'
|
311
|
+
@client_id = nil
|
312
|
+
@device_id = nil
|
313
|
+
@client_run_domain = nil
|
314
|
+
begin
|
315
|
+
info 'Reading the Stackify props in Environment variables'
|
316
|
+
@client_run_domain = ENV['STACKIFY_RUM_DOMAIN'] || nil
|
317
|
+
if ENV['STACKIFY_ENV']
|
318
|
+
props = ENV['STACKIFY_ENV'].split('|')
|
319
|
+
@client_id = props[0].to_s if props[0]
|
320
|
+
@device_id = props[1].to_s if props[1]
|
321
|
+
info "stackify.properties: clientId=#{@client_id}, deviceId=#{@device_id}, client_rum_domain=#{@client_run_domain}"
|
322
|
+
end
|
289
323
|
rescue StandardError => e
|
290
|
-
info 'Error occured while reading the
|
324
|
+
info 'Error occured while reading the Stackify props in Environment variables.'
|
291
325
|
info e.inspect
|
292
326
|
end
|
293
|
-
info 'No clientId found
|
294
|
-
info 'No deviceId found
|
295
|
-
info 'No client RUM domain found
|
327
|
+
info 'No clientId found in environment variables.' if @client_id.nil?
|
328
|
+
info 'No deviceId found in environment variables.' if @device_id.nil?
|
329
|
+
info 'No client RUM domain found in environment variables.' if @client_run_domain.nil?
|
296
330
|
end
|
297
331
|
# rubocop:enable Metrics/CyclomaticComplexity
|
332
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
298
333
|
end
|
299
334
|
end
|
@@ -26,7 +26,7 @@ module StackifyRubyAPM
|
|
26
26
|
transaction_id = StackifyRubyAPM.agent.current_transaction.id
|
27
27
|
client_id = StackifyRubyAPM.agent.config.client_id
|
28
28
|
device_id = StackifyRubyAPM.agent.config.device_id
|
29
|
-
headers['X-StackifyID'] = "V1|#{transaction_id}
|
29
|
+
headers['X-StackifyID'] = "V1|#{transaction_id}|#{client_id}|#{device_id}" if client_id && device_id
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -24,11 +24,8 @@ module StackifyRubyAPM
|
|
24
24
|
req = rails_req?(rack_env) ? rack_env : Rack::Request.new(rack_env)
|
25
25
|
context.request = Context::Request.new unless context.request
|
26
26
|
request = context.request
|
27
|
-
request.socket = Context::Request::Socket.new(req).to_h
|
28
|
-
request.http_version = build_http_version rack_env
|
29
27
|
request.method = req.request_method
|
30
28
|
request.url = Context::Request::Url.new(req).to_h
|
31
|
-
request.headers, request.env = get_headers_and_env(rack_env)
|
32
29
|
request.body = get_body(req)
|
33
30
|
|
34
31
|
context
|
@@ -46,31 +43,5 @@ module StackifyRubyAPM
|
|
46
43
|
defined?(ActionDispatch::Request) &&
|
47
44
|
env.is_a?(ActionDispatch::Request)
|
48
45
|
end
|
49
|
-
|
50
|
-
def get_headers_and_env(rack_env)
|
51
|
-
# In Rails < 5 ActionDispatch::Request inherits from Hash
|
52
|
-
headers =
|
53
|
-
rack_env.respond_to?(:headers) ? rack_env.headers : rack_env
|
54
|
-
|
55
|
-
headers.each_with_object([{}, {}]) do |(key, value), (http, env)|
|
56
|
-
next unless key == key.upcase
|
57
|
-
|
58
|
-
if key.start_with?('HTTP_')
|
59
|
-
http[camel_key(key)] = value
|
60
|
-
else
|
61
|
-
env[key] = value
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def camel_key(key)
|
67
|
-
key.gsub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')
|
68
|
-
end
|
69
|
-
|
70
|
-
def build_http_version(rack_env)
|
71
|
-
return unless (http_version = rack_env['HTTP_VERSION'])
|
72
|
-
|
73
|
-
http_version.gsub(%r{HTTP/}, '')
|
74
|
-
end
|
75
46
|
end
|
76
47
|
end
|
@@ -27,7 +27,7 @@ module StackifyRubyAPM
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def initialize(agent)
|
30
|
-
debug '[Instrumenter] initialize()'
|
30
|
+
debug '[Instrumenter] initialize()' if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
31
31
|
@agent = agent
|
32
32
|
@config = agent.config
|
33
33
|
|
@@ -57,7 +57,6 @@ module StackifyRubyAPM
|
|
57
57
|
# Creates a new transaction or return the currently running
|
58
58
|
#
|
59
59
|
def transaction(*args)
|
60
|
-
debug '[Instrumenter] transaction(*args)'
|
61
60
|
unless config.instrument
|
62
61
|
yield if block_given?
|
63
62
|
return
|
@@ -96,8 +95,8 @@ module StackifyRubyAPM
|
|
96
95
|
# Once the transaction is submitted it will be stored temporarily in queue
|
97
96
|
#
|
98
97
|
def submit_transaction(transaction)
|
99
|
-
debug '[Instrumenter] submit_transaction(transaction)
|
100
|
-
debug transaction.inspect
|
98
|
+
debug '[Instrumenter] submit_transaction(transaction)' if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
99
|
+
debug '[Instrumenter] submit_transaction(transaction) transaction: ' + transaction.inspect.to_s if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
101
100
|
agent.enqueue_transaction transaction
|
102
101
|
return unless config.debug_transactions
|
103
102
|
end
|
@@ -33,9 +33,9 @@ module StackifyRubyAPM
|
|
33
33
|
# Newly created file example <file>-2.log is the latest appended log
|
34
34
|
def shift_log_age
|
35
35
|
# set a temporary filename that doesn't have the increment prefix and .log format.
|
36
|
-
temp_filename = @filename.
|
36
|
+
temp_filename = @filename.to_s.sub(/\-(d*\.?\d*).log/, '')
|
37
37
|
# set a temporary file increment while stripping the current filename and retain the number
|
38
|
-
txttemp_fileincrement = @filename.
|
38
|
+
txttemp_fileincrement = @filename.to_s.sub(temp_filename, '').delete('^0-9')
|
39
39
|
# convert the string value to integer
|
40
40
|
current_fileprefix = txttemp_fileincrement.to_i
|
41
41
|
# assign as filename counter
|
@@ -12,23 +12,25 @@ module StackifyRubyAPM
|
|
12
12
|
# rubocop:disable Style/GuardClause
|
13
13
|
# rubocop:disable Metrics/ParameterLists
|
14
14
|
# rubocop:disable Lint/UnusedMethodArgument
|
15
|
-
def initialize(logdev,
|
16
|
-
|
15
|
+
def initialize(logdev,
|
16
|
+
shift_age = 0,
|
17
|
+
shift_size = 1048576,
|
18
|
+
level: DEBUG,
|
19
|
+
progname: nil,
|
20
|
+
formatter: nil,
|
21
|
+
datetime_format: nil,
|
17
22
|
shift_period_suffix: '%Y%m%d')
|
18
23
|
super(nil) # this prevents it from initializing a LogDevice
|
19
24
|
@logdev = nil
|
20
25
|
if logdev
|
21
26
|
new_logdev = logdev
|
22
27
|
if logdev.instance_of? String
|
23
|
-
temp_filename = logdev.gsub('.log', '')
|
28
|
+
temp_filename = logdev.gsub('-1.log', '')
|
24
29
|
new_logdev = temp_filename + '-1.log'
|
25
30
|
end
|
26
|
-
@logdev = LogDevice.new(new_logdev,
|
27
|
-
shift_size: shift_size,
|
28
|
-
shift_period_suffix: shift_period_suffix)
|
31
|
+
@logdev = LogDevice.new(new_logdev, shift_size: shift_size)
|
29
32
|
end
|
30
33
|
end
|
31
|
-
|
32
34
|
require 'stackify_apm/logger/log_device'
|
33
35
|
end
|
34
36
|
end
|
@@ -10,17 +10,16 @@ module StackifyRubyAPM
|
|
10
10
|
class StackifyLogger < Logger
|
11
11
|
# rubocop:disable Style/NumericLiterals
|
12
12
|
# rubocop:disable Style/GuardClause
|
13
|
-
def initialize(logdev,
|
13
|
+
def initialize(logdev, _shift_age = 0, shift_size = 1048576)
|
14
14
|
super(nil) # this prevents it from initializing a LogDevice
|
15
15
|
@logdev = nil
|
16
16
|
if logdev
|
17
17
|
new_logdev = logdev
|
18
18
|
if logdev.instance_of? String
|
19
|
-
temp_filename = logdev.gsub('.log', '')
|
19
|
+
temp_filename = logdev.gsub('-1.log', '')
|
20
20
|
new_logdev = temp_filename + '-1.log'
|
21
21
|
end
|
22
|
-
@logdev = LogDevice.new(new_logdev,
|
23
|
-
shift_size: shift_size)
|
22
|
+
@logdev = LogDevice.new(new_logdev, shift_size: shift_size)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
@@ -47,7 +47,10 @@ module StackifyRubyAPM # :nodoc:
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def for(name)
|
50
|
-
|
50
|
+
# Performance suggestion by fasterer
|
51
|
+
# Hash#fetch with second argument is slower than Hash#fetch with block.
|
52
|
+
# @normalizers.fetch(name, @default)
|
53
|
+
@normalizers.fetch(name) { @default }
|
51
54
|
end
|
52
55
|
|
53
56
|
def keys
|
@@ -28,8 +28,6 @@ module StackifyRubyAPM
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def query_variables(payload)
|
31
|
-
debug '[SqlNormalizer] query_variables payload:'
|
32
|
-
debug payload.inspect
|
33
31
|
{
|
34
32
|
CATEGORY: 'Database',
|
35
33
|
SUBCATEGORY: 'Execute',
|
@@ -42,7 +40,8 @@ module StackifyRubyAPM
|
|
42
40
|
|
43
41
|
def lookup_adapter
|
44
42
|
::ActiveRecord::Base.connection.adapter_name.downcase
|
45
|
-
rescue StandardError
|
43
|
+
rescue StandardError => error
|
44
|
+
debug '[SqlNormalizer] lookup_adapter err: ' + error.inspect.to_s
|
46
45
|
nil
|
47
46
|
end
|
48
47
|
end
|
@@ -67,10 +67,12 @@ module StackifyRubyAPM
|
|
67
67
|
client_rundomain = @config.client_run_domain
|
68
68
|
inject_flag = false
|
69
69
|
|
70
|
-
if
|
71
|
-
|
72
|
-
|
73
|
-
|
70
|
+
if client_id && device_id
|
71
|
+
if StackifyRubyAPM.check_isdomain(client_rundomain)
|
72
|
+
inject_flag = true
|
73
|
+
else
|
74
|
+
info 'Error: Stackify Client RUM Domain is invalid.'
|
75
|
+
end
|
74
76
|
end
|
75
77
|
|
76
78
|
return unless inject_flag
|
@@ -94,7 +96,7 @@ module StackifyRubyAPM
|
|
94
96
|
source = source[0...insertion_index] <<
|
95
97
|
jsfile_to_inject <<
|
96
98
|
source[insertion_index..-1]
|
97
|
-
source = source.
|
99
|
+
source = source.sub('[RUM_SCRIPT_VARIABLE]', '') if rum_variable_script
|
98
100
|
end
|
99
101
|
source
|
100
102
|
end
|
@@ -27,10 +27,10 @@ module StackifyRubyAPM
|
|
27
27
|
TRACETYPE: 'WEBAPP',
|
28
28
|
TRACE_ID: @transaction.id,
|
29
29
|
THREAD_ID: Thread.current.object_id,
|
30
|
-
TRACE_SOURCE: '
|
30
|
+
TRACE_SOURCE: 'RUBY',
|
31
31
|
TRACE_TARGET: 'RETRACE',
|
32
32
|
HOST_NAME: @config.hostname || `hostname`,
|
33
|
-
OS_TYPE:
|
33
|
+
OS_TYPE: StackifyRubyAPM::Util.host_os,
|
34
34
|
PROCESS_ID: pid,
|
35
35
|
TRACE_VERSION: '2.0'
|
36
36
|
}
|
data/lib/stackify_apm/spies.rb
CHANGED
@@ -69,8 +69,9 @@ module StackifyRubyAPM
|
|
69
69
|
def self.parse_json_config(file)
|
70
70
|
jsondata = {}
|
71
71
|
if ENV['STACKIFY_RUBY_ENV'] == 'rspec'
|
72
|
-
file = 'spec/integration/
|
72
|
+
file = 'spec/integration/stackify_spec.json'
|
73
73
|
end
|
74
|
+
|
74
75
|
return unless File.exist?(file)
|
75
76
|
|
76
77
|
File.open(file) do |f|
|
@@ -24,7 +24,7 @@ module StackifyRubyAPM
|
|
24
24
|
req = http_without_apm(verb, url, _post_body = nil, _put_data = nil, &block)
|
25
25
|
# Builds span context
|
26
26
|
#
|
27
|
-
status_code = req.status.
|
27
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
28
28
|
|
29
29
|
ctx = Span::Context.new(
|
30
30
|
CATEGORY: 'Web External',
|
@@ -30,7 +30,7 @@ module StackifyRubyAPM
|
|
30
30
|
req = perform_without_apm(*args)
|
31
31
|
# Builds span context
|
32
32
|
#
|
33
|
-
status_code = req.status.
|
33
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
34
34
|
ctx = Span::Context.new(
|
35
35
|
CATEGORY: 'Web External',
|
36
36
|
SUBCATEGORY: 'Execute',
|
@@ -55,7 +55,7 @@ module StackifyRubyAPM
|
|
55
55
|
name = "#{method} #{uri}"
|
56
56
|
type = "ext.Curb.Easy.#{method}"
|
57
57
|
req = http_post_without_apm(*args)
|
58
|
-
status_code = req.status.
|
58
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
59
59
|
|
60
60
|
ctx = Span::Context.new(
|
61
61
|
CATEGORY: 'Web External',
|
@@ -81,7 +81,7 @@ module StackifyRubyAPM
|
|
81
81
|
name = "#{method} #{uri}"
|
82
82
|
type = "ext.Curb.Easy.#{method}"
|
83
83
|
req = http_put_without_apm(url, data)
|
84
|
-
status_code = req.status.
|
84
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
85
85
|
|
86
86
|
ctx = Span::Context.new(
|
87
87
|
CATEGORY: 'Web External',
|
@@ -107,7 +107,7 @@ module StackifyRubyAPM
|
|
107
107
|
name = "#{method} #{uri}"
|
108
108
|
type = "ext.Curb.Easy.#{method}"
|
109
109
|
req = http_get_without_apm(*args)
|
110
|
-
status_code = req.status.
|
110
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
111
111
|
|
112
112
|
ctx = Span::Context.new(
|
113
113
|
CATEGORY: 'Web External',
|
@@ -133,7 +133,7 @@ module StackifyRubyAPM
|
|
133
133
|
name = "#{method} #{uri}"
|
134
134
|
type = "ext.Curb.Easy.#{method}"
|
135
135
|
req = http_delete_without_apm(*args)
|
136
|
-
status_code = req.status.
|
136
|
+
status_code = req.status.sub(/^0-9/, '').to_i
|
137
137
|
|
138
138
|
ctx = Span::Context.new(
|
139
139
|
CATEGORY: 'Web External',
|
@@ -87,8 +87,8 @@ module StackifyRubyAPM
|
|
87
87
|
tracked_func_name
|
88
88
|
end
|
89
89
|
|
90
|
-
tracked_function_name = tracked_function_tpl.
|
91
|
-
tracked_function_name = tracked_function_name.
|
90
|
+
tracked_function_name = tracked_function_tpl.sub '{{ClassName}}', current_class
|
91
|
+
tracked_function_name = tracked_function_name.sub '{{MethodName}}', current_method
|
92
92
|
|
93
93
|
# rubocop:disable Style/Next
|
94
94
|
if class_exists?(current_class)
|
@@ -12,8 +12,7 @@ module StackifyRubyAPM
|
|
12
12
|
include Log
|
13
13
|
|
14
14
|
def initialize(agent)
|
15
|
-
debug '[Subscriber] initialize()'
|
16
|
-
debug agent.inspect
|
15
|
+
debug '[Subscriber] initialize(agent)' if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
17
16
|
@agent = agent
|
18
17
|
@normalizers = Normalizers.build(agent.config)
|
19
18
|
end
|
@@ -40,11 +39,6 @@ module StackifyRubyAPM
|
|
40
39
|
def call(name, started, finished, id, payload)
|
41
40
|
return unless (transaction = @agent.current_transaction)
|
42
41
|
|
43
|
-
debug '[Subscriber] call():'
|
44
|
-
debug id
|
45
|
-
debug name
|
46
|
-
debug transaction
|
47
|
-
|
48
42
|
normalized = @normalizers.normalize(transaction, name, payload)
|
49
43
|
|
50
44
|
if started
|
@@ -77,10 +71,6 @@ module StackifyRubyAPM
|
|
77
71
|
def start(name, id, payload)
|
78
72
|
return unless (transaction = @agent.current_transaction)
|
79
73
|
|
80
|
-
debug '[Subscriber] start():'
|
81
|
-
debug id
|
82
|
-
debug name
|
83
|
-
debug transaction
|
84
74
|
normalized = @normalizers.normalize(transaction, name, payload)
|
85
75
|
|
86
76
|
span =
|
@@ -96,8 +86,6 @@ module StackifyRubyAPM
|
|
96
86
|
|
97
87
|
# [finish] Called when the rails version is NOT 3.x
|
98
88
|
def finish(_name, id, _payload)
|
99
|
-
# debug "AS::Notification#finish:#{name}:#{id}"
|
100
|
-
debug '[Subscriber] finish():'
|
101
89
|
return unless (transaction = @agent.current_transaction)
|
102
90
|
|
103
91
|
while (notification = transaction.notifications.pop)
|
@@ -19,6 +19,7 @@ module StackifyRubyAPM
|
|
19
19
|
attr_accessor :trace_file_counter
|
20
20
|
|
21
21
|
def post(transactions = [])
|
22
|
+
debug '[TraceLogger] post()' if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
22
23
|
# convert transactions to json
|
23
24
|
json_traces = []
|
24
25
|
transactions.each do |transaction|
|
@@ -29,14 +30,12 @@ module StackifyRubyAPM
|
|
29
30
|
json_traces.push(json_transaction)
|
30
31
|
end
|
31
32
|
|
32
|
-
|
33
|
-
current_datetime = date_now.strftime('%Y-%m-%d, %H:%M:%S.%6N')
|
33
|
+
current_datetime = Time.now.utc.strftime('%Y-%m-%d, %H:%M:%S.%6N')
|
34
34
|
|
35
35
|
return unless ENV['STACKIFY_RUBY_ENV'] != 'rspec'
|
36
36
|
|
37
37
|
json_traces.each do |json_trace|
|
38
|
-
|
39
|
-
@config.tracer_logger.<<(update_json)
|
38
|
+
@config.tracer_logger.<<("#{current_datetime} > #{json_trace} \n")
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
@@ -116,7 +116,17 @@ module StackifyRubyAPM
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def build_and_start_span(name, type, context, backtrace)
|
119
|
-
span =
|
119
|
+
span = Span.new(
|
120
|
+
self,
|
121
|
+
next_span_id,
|
122
|
+
name,
|
123
|
+
type,
|
124
|
+
parent_id: current_span.nil? ? -1 : current_span.id,
|
125
|
+
context: context,
|
126
|
+
http_status: @http_status
|
127
|
+
)
|
128
|
+
|
129
|
+
# span = next_span(name, type, context)
|
120
130
|
spans << span
|
121
131
|
|
122
132
|
span.original_backtrace = backtrace if backtrace && span_frames_min_duration?
|
data/lib/stackify_apm/util.rb
CHANGED
@@ -16,6 +16,24 @@ module StackifyRubyAPM
|
|
16
16
|
cmd_rake = ($PROGRAM_NAME =~ /rake$/)
|
17
17
|
StackifyRubyAPM.agent.config.instrument = false if cmd_rake
|
18
18
|
end
|
19
|
+
|
20
|
+
def self.host_os
|
21
|
+
host_os = RbConfig::CONFIG['host_os']
|
22
|
+
case host_os
|
23
|
+
when /cygwin|mswin|mingw|bccwin|wince|emx/i
|
24
|
+
'WINDOWS'
|
25
|
+
when /linux|arch/i
|
26
|
+
'LINUX'
|
27
|
+
when /sunos|solaris/i
|
28
|
+
'SOLARIS'
|
29
|
+
when /bsd/i
|
30
|
+
'BSD'
|
31
|
+
when /darwin/i
|
32
|
+
'MAC OS X'
|
33
|
+
else
|
34
|
+
"UNKNOWN #{host_os}"
|
35
|
+
end
|
36
|
+
end
|
19
37
|
end
|
20
38
|
end
|
21
39
|
require 'stackify_apm/util/inspector'
|
data/lib/stackify_apm/version.rb
CHANGED
data/lib/stackify_apm/worker.rb
CHANGED
@@ -81,7 +81,7 @@ module StackifyRubyAPM
|
|
81
81
|
def collect_and_send_transactions
|
82
82
|
return if pending_transactions.empty?
|
83
83
|
transactions = collect_batched_transactions
|
84
|
-
debug '[Worker]
|
84
|
+
debug '[Worker] collect_and_send_transactions() transactions : ' + transactions.inspect.to_s if ENV['STACKIFY_APM_LOG_LEVEL'] == '0'
|
85
85
|
begin
|
86
86
|
@trace_logger.post(transactions)
|
87
87
|
rescue ::Exception => e
|
@@ -97,7 +97,6 @@ module StackifyRubyAPM
|
|
97
97
|
return if pending_transactions.empty?
|
98
98
|
# transactions = collect_batched_transactions
|
99
99
|
# payload = @serializers.errors.build_all([msg.error])
|
100
|
-
debug '[Worker] post_error()'
|
101
100
|
# @trace_logger.post(payload, transactions[0])
|
102
101
|
end
|
103
102
|
|
data/lib/stackify_ruby_apm.rb
CHANGED
@@ -20,11 +20,12 @@ require 'stackify_apm/agent'
|
|
20
20
|
# Checks ruby version
|
21
21
|
require RUBY_VERSION.to_f >= 2.4 ? 'stackify_apm/logger/logger_high_version' : 'stackify_apm/logger/logger_lower_version'
|
22
22
|
require 'stackify_apm/helper/database_helper'
|
23
|
+
require 'stackify_apm/util'
|
23
24
|
require 'stackify_apm/config'
|
24
25
|
require 'stackify_apm/context'
|
25
26
|
require 'stackify_apm/instrumenter'
|
26
27
|
require 'stackify_apm/internal_error'
|
27
|
-
require 'stackify_apm/util'
|
28
|
+
# require 'stackify_apm/util'
|
28
29
|
require 'stackify_apm/middleware'
|
29
30
|
|
30
31
|
# Checks if the framework using is Rails
|
@@ -40,8 +41,6 @@ module StackifyRubyAPM
|
|
40
41
|
Agent.start config
|
41
42
|
end
|
42
43
|
|
43
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
44
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
45
44
|
def self.inject_rum_script
|
46
45
|
config = StackifyRubyAPM::Config.new
|
47
46
|
client_id = config.client_id
|
@@ -51,14 +50,16 @@ module StackifyRubyAPM
|
|
51
50
|
|
52
51
|
inject_flag = false
|
53
52
|
|
54
|
-
if
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
if client_id && device_id
|
54
|
+
if check_isdomain(client_rundomain)
|
55
|
+
inject_flag = true
|
56
|
+
else
|
57
|
+
info 'Error: Stackify Client RUM Domain is invalid.'
|
58
|
+
end
|
58
59
|
end
|
59
60
|
|
60
61
|
return unless inject_flag
|
61
|
-
data_request_id =
|
62
|
+
data_request_id = "V2|#{transaction_id}|#{client_id}|#{device_id}"
|
62
63
|
@rum_script_injected = true
|
63
64
|
"<script src=\"#{config.rum_script_src}\" data-host=\"#{client_rundomain}\" data-requestId=\"#{data_request_id}\"
|
64
65
|
data-a=\"#{config.application_name}\" data-e=\"#{config.environment_name}\" data-enableInternalLogging=\"#{config.debug_logging}\" type=\"text/javascript\" async></script>"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackify-ruby-apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stackify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|