stackify-ruby-apm 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +36 -4
- data/lib/stackify_apm/instrumenter_helper.rb +69 -36
- data/lib/stackify_apm/middleware.rb +1 -1
- data/lib/stackify_apm/root_info.rb +12 -8
- data/lib/stackify_apm/serializers/errors.rb +1 -3
- data/lib/stackify_apm/spies/custom_instrumenter.rb +3 -3
- data/lib/stackify_apm/version.rb +1 -1
- 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: 9e21411e3d9be64aa1c8907e09552f6aac44ecf712e59065d1a1156381c9a278
|
4
|
+
data.tar.gz: a0b0aaa469349611840c4b222c920a87253678ab1d681969f4a5b5804cb40515
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61300001e05eb6eb32b0adfb66eead66dac56eea502fb1f64da60cfcdc51c5d33bf96f284f433441adb2488779f709307d9c05d5fc97c8271114dbf155be5413
|
7
|
+
data.tar.gz: ebd7cc6ff9e131f89ff38152135fc82eb22b8955ec417959edb4bfa63843cfbc2fce4608e8241d14832b43dc88e24dbc1c096ea2789e1cfd7d7323ea0c8eb61b
|
data/README.md
CHANGED
@@ -26,8 +26,24 @@
|
|
26
26
|
5. Build/Deploy your application
|
27
27
|
|
28
28
|
### Custom Instrumentation in Rails
|
29
|
-
|
30
|
-
|
29
|
+
1. Create `config/stackify.json` file from the root of your app and place the class name and method name in which you want to instrument.
|
30
|
+
|
31
|
+
Example stackify.json:
|
32
|
+
```
|
33
|
+
{
|
34
|
+
"instrumentation": [
|
35
|
+
{
|
36
|
+
"class": "<class name>",
|
37
|
+
"method": "<method name>",
|
38
|
+
"trackedFunctionName": "{{ClassName}}#{{MethodName}}",
|
39
|
+
"trackedFunction": <true or false>,
|
40
|
+
"transaction": <true or false>
|
41
|
+
}
|
42
|
+
]
|
43
|
+
}
|
44
|
+
```
|
45
|
+
|
46
|
+
2. In the config/initializer folder of your Rails app create a file `config/initializer/stackify.rb` and then add this configuration
|
31
47
|
|
32
48
|
Rails.configuration.to_prepare do
|
33
49
|
StackifyRubyAPM.run_custom_instrument
|
@@ -64,8 +80,24 @@ In the config/initializer folder of your Rails app create a file `config/initial
|
|
64
80
|
6. Build/Deploy your application
|
65
81
|
|
66
82
|
### Custom Instrumentation in Non-Rails
|
67
|
-
|
68
|
-
|
83
|
+
1. Create `config/stackify.json` file from the root of your app and place the class name and method name in which you want to instrument.
|
84
|
+
|
85
|
+
Example stackify.json:
|
86
|
+
```
|
87
|
+
{
|
88
|
+
"instrumentation": [
|
89
|
+
{
|
90
|
+
"class": "<class name>",
|
91
|
+
"method": "<method name>",
|
92
|
+
"trackedFunctionName": "{{ClassName}}#{{MethodName}}",
|
93
|
+
"trackedFunction": <true or false>,
|
94
|
+
"transaction": <true or false>
|
95
|
+
}
|
96
|
+
]
|
97
|
+
}
|
98
|
+
```
|
99
|
+
|
100
|
+
2. In `config.ru` file add this line: StackifyRubyAPM.run_custom_instrument
|
69
101
|
|
70
102
|
Example:
|
71
103
|
|
@@ -12,6 +12,7 @@ module StackifyRubyAPM
|
|
12
12
|
attr_accessor :custom_instrumented, :custom_class_info
|
13
13
|
@custom_instrumented = {}
|
14
14
|
@custom_class_info = {}
|
15
|
+
TRACETYPE = 'TASK'.freeze
|
15
16
|
|
16
17
|
def self.custom_instrumented_reset
|
17
18
|
@custom_instrumented.each do |custom_instrument, values|
|
@@ -26,7 +27,10 @@ module StackifyRubyAPM
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
def self.m_class(tracked_func, current_class, class_path,
|
30
|
+
def self.m_class(tracked_func, current_class, class_path, **options)
|
31
|
+
current_method = options[:current_method] || nil
|
32
|
+
tracked_function_name = options[:tracked_function_name] || nil
|
33
|
+
transaction = options[:is_transaction] || nil
|
30
34
|
module_consget = Module.const_get(current_class)
|
31
35
|
classspyitem = "#{current_class}Spy"
|
32
36
|
module_consget_spy = Module.const_get(current_class)
|
@@ -61,24 +65,37 @@ module StackifyRubyAPM
|
|
61
65
|
alias_method "#{current_method_without}", "#{current_method}"
|
62
66
|
|
63
67
|
def #{current_method}(*args, &block)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
68
|
+
if StackifyRubyAPM.current_transaction.nil? && #{!transaction.nil?}
|
69
|
+
t = StackifyRubyAPM.transaction("custom.#{current_class}.#{current_method}", TRACETYPE)
|
70
|
+
begin
|
71
|
+
req = #{current_method_without}(*args, &block)
|
72
|
+
rescue Exception => e
|
73
|
+
StackifyRubyAPM.report(e)
|
74
|
+
raise e
|
75
|
+
ensure
|
76
|
+
t.submit
|
77
|
+
end
|
78
|
+
return req
|
79
|
+
elsif StackifyRubyAPM.current_transaction
|
80
|
+
name = "Custom Instrument"
|
81
|
+
type = "#{current_class}##{current_method}"
|
82
|
+
ctx = if "#{tracked_func}" == 'true'
|
83
|
+
Span::Context.new(
|
84
|
+
CATEGORY: 'Ruby',
|
85
|
+
TRACKED_FUNC: "#{tracked_function_name}"
|
86
|
+
)
|
87
|
+
else
|
88
|
+
Span::Context.new(
|
89
|
+
CATEGORY: 'Ruby'
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
req = #{current_method_without}(*args, &block)
|
94
|
+
StackifyRubyAPM.span name, type, context: ctx do
|
81
95
|
req
|
96
|
+
end
|
97
|
+
else
|
98
|
+
return #{current_method_without}(*args, &block)
|
82
99
|
end
|
83
100
|
end
|
84
101
|
end
|
@@ -92,7 +109,10 @@ module StackifyRubyAPM
|
|
92
109
|
@custom_class_info[current_class.to_s]['model'] = true if class_path && class_path.include?('models')
|
93
110
|
end
|
94
111
|
|
95
|
-
def self.m_singleton(tracked_func, current_class, class_path,
|
112
|
+
def self.m_singleton(tracked_func, current_class, class_path, **options)
|
113
|
+
current_method = options[:current_method] || nil
|
114
|
+
tracked_function_name = options[:tracked_function_name] || nil
|
115
|
+
transaction = options[:is_transaction] || nil
|
96
116
|
module_consget = Module.const_get(current_class)
|
97
117
|
classspyitem = "#{current_class}Spy"
|
98
118
|
|
@@ -125,23 +145,36 @@ module StackifyRubyAPM
|
|
125
145
|
singleton_class.send(:alias_method, :"_self_without_apm_#{current_method}", :"#{current_method}")
|
126
146
|
|
127
147
|
def self.#{current_method}(*args, &block)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
148
|
+
if StackifyRubyAPM.current_transaction.nil? && #{!transaction.nil?}
|
149
|
+
t = StackifyRubyAPM.transaction("custom.#{current_class}.#{current_method}", TRACETYPE)
|
150
|
+
begin
|
151
|
+
req = _self_without_apm_#{current_method}(*args, &block)
|
152
|
+
rescue Exception => e
|
153
|
+
StackifyRubyAPM.report(e)
|
154
|
+
raise e
|
155
|
+
ensure
|
156
|
+
t.submit
|
157
|
+
end
|
158
|
+
return req
|
159
|
+
elsif StackifyRubyAPM.current_transaction
|
160
|
+
name = "Custom Instrument"
|
161
|
+
type = "#{current_class}##{current_method}"
|
162
|
+
ctx = if "#{tracked_func}" == 'true'
|
163
|
+
Span::Context.new(
|
164
|
+
CATEGORY: 'Ruby',
|
165
|
+
TRACKED_FUNC: "#{tracked_function_name}"
|
166
|
+
)
|
167
|
+
else
|
168
|
+
Span::Context.new(
|
169
|
+
CATEGORY: 'Ruby'
|
170
|
+
)
|
171
|
+
end
|
172
|
+
req = _self_without_apm_#{current_method}(*args, &block)
|
173
|
+
StackifyRubyAPM.span name, type, context: ctx do
|
174
|
+
req
|
175
|
+
end
|
176
|
+
else
|
177
|
+
return _self_without_apm_#{current_method}(*args, &block)
|
145
178
|
end
|
146
179
|
end
|
147
180
|
|
@@ -90,7 +90,7 @@ module StackifyRubyAPM
|
|
90
90
|
# Start of transaction building with params: name, type, context
|
91
91
|
#
|
92
92
|
def build_transaction(env)
|
93
|
-
StackifyRubyAPM.transaction 'Rack', '
|
93
|
+
StackifyRubyAPM.transaction 'Rack', 'WEBAPP', context: StackifyRubyAPM.build_context(env)
|
94
94
|
end
|
95
95
|
|
96
96
|
def running?
|
@@ -10,21 +10,18 @@ module StackifyRubyAPM
|
|
10
10
|
@config = config
|
11
11
|
end
|
12
12
|
|
13
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
14
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
13
15
|
def build
|
14
16
|
# get process id
|
15
17
|
pid = $PID || Process.pid
|
16
|
-
|
17
|
-
{
|
18
|
+
hash = {
|
18
19
|
CATEGORY: 'Ruby',
|
19
20
|
APPLICATION_PATH: '/',
|
20
21
|
APPLICATION_FILESYSTEM_PATH: @config.root_path,
|
21
22
|
APPLICATION_NAME: @config.application_name,
|
22
|
-
APPLICATION_ENV: @config.environment_name,
|
23
|
+
APPLICATION_ENV: @config.environment_name || 'Development',
|
23
24
|
REPORTING_URL: @transaction.name,
|
24
|
-
METHOD: @transaction.context.request.method,
|
25
|
-
STATUS: @transaction.context.response.status_code,
|
26
|
-
URL: @transaction.context.request.url[:full],
|
27
|
-
TRACETYPE: 'WEBAPP',
|
28
25
|
TRACE_ID: @transaction.id,
|
29
26
|
THREAD_ID: Thread.current.object_id,
|
30
27
|
TRACE_SOURCE: 'RUBY',
|
@@ -32,9 +29,16 @@ module StackifyRubyAPM
|
|
32
29
|
HOST_NAME: @config.hostname || `hostname`,
|
33
30
|
OS_TYPE: StackifyRubyAPM::Util.host_os,
|
34
31
|
PROCESS_ID: pid,
|
35
|
-
TRACE_VERSION: '2.0'
|
32
|
+
TRACE_VERSION: '2.0',
|
33
|
+
TRACETYPE: @transaction.type || 'WEBAPP'
|
36
34
|
}
|
35
|
+
hash[:METHOD] = @transaction.context.request.method if @transaction.context && @transaction.context.request && @transaction.context.request.method
|
36
|
+
hash[:STATUS] = @transaction.context.response.status_code if @transaction.context && @transaction.context.response && @transaction.context.response.status_code
|
37
|
+
hash[:URL] = @transaction.context.request.url[:full] if @transaction.context && @transaction.context.request && @transaction.context.request.url[:full]
|
38
|
+
hash
|
37
39
|
end
|
40
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
41
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
38
42
|
|
39
43
|
def self.build(config, transaction)
|
40
44
|
new(config, transaction).build
|
@@ -9,15 +9,13 @@ module StackifyRubyAPM
|
|
9
9
|
def build(error)
|
10
10
|
if (exception = error.exception)
|
11
11
|
current_timestamp = error.timestamp
|
12
|
-
|
13
12
|
base = {
|
14
|
-
CaughtBy: exception.module,
|
13
|
+
CaughtBy: exception.module != '' ? exception.module : exception.type,
|
15
14
|
Exception: exception.type,
|
16
15
|
Message: exception.message,
|
17
16
|
Timestamp: current_timestamp.round.to_s,
|
18
17
|
Frames: exception.stacktrace.to_a
|
19
18
|
}
|
20
|
-
|
21
19
|
end
|
22
20
|
|
23
21
|
base
|
@@ -26,9 +26,9 @@ module StackifyRubyAPM
|
|
26
26
|
current_method = custom_spy['method']
|
27
27
|
tracked_func = custom_spy['trackedFunction']
|
28
28
|
tracked_func_name = defined?(custom_spy['trackedFunctionName']) ? custom_spy['trackedFunctionName'] : ''
|
29
|
+
transaction = defined?(custom_spy['transaction']) ? custom_spy['transaction'] : nil
|
29
30
|
|
30
31
|
tracked_function_tpl = tracked_func_name.nil? ? '{{ClassName}}.{{MethodName}}' : tracked_func_name
|
31
|
-
|
32
32
|
tracked_function_name = tracked_function_tpl.sub '{{ClassName}}', current_class
|
33
33
|
tracked_function_name = tracked_function_name.sub '{{MethodName}}', current_method
|
34
34
|
|
@@ -45,9 +45,9 @@ module StackifyRubyAPM
|
|
45
45
|
class_path = class_location.last
|
46
46
|
|
47
47
|
if klass_method_flag
|
48
|
-
StackifyRubyAPM::InstrumenterHelper.m_class(tracked_func, current_class, class_path, current_method, tracked_function_name)
|
48
|
+
StackifyRubyAPM::InstrumenterHelper.m_class(tracked_func, current_class, class_path, current_method: current_method, tracked_function_name: tracked_function_name, is_transaction: transaction)
|
49
49
|
elsif singleton_method_flag
|
50
|
-
StackifyRubyAPM::InstrumenterHelper.m_singleton(tracked_func, current_class, class_path, current_method, tracked_function_name)
|
50
|
+
StackifyRubyAPM::InstrumenterHelper.m_singleton(tracked_func, current_class, class_path, current_method: current_method, tracked_function_name: tracked_function_name, is_transaction: transaction)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
# rubocop:enable Style/Next
|
data/lib/stackify_apm/version.rb
CHANGED
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.6.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-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|