stackify-ruby-apm 1.3.1 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|