callstacking-rails 0.1.8 → 0.1.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba4839162aee95292d54812c4c9f86be937f9ff13a5765197c34a371c21940a7
4
- data.tar.gz: 56518b971c4fac333b0c2c5e645bdc92c580ff426fb62f4f72460bc2e3a95cd7
3
+ metadata.gz: 87abdbb303ead93a3e9675bb51a39d42141b5a9d4a27237a254e9e670171f399
4
+ data.tar.gz: 8d6aef27102d88c0b847c14616390dbb61ac8da2fd90af506e8a5cd0de12c6f1
5
5
  SHA512:
6
- metadata.gz: 276072fc8c408926760d2cae1949ec24ce0ebcd0b4afda094a0132761db1b127dfae00900e9c50de1a0a1af697068effe1b84b922336a2de9f25a15db5753785
7
- data.tar.gz: 53ab41b4aae0ce86466561a3381746b8853697f7927398e938604e95e4e17297ebbce6958e3e7f4be965a79c9ad488a89c7f18e21482511d2350d399a0394a9a
6
+ metadata.gz: 64489808b6674f2651f5a0abea52cf7c0e9053b1d3e47b1504febda71f21b29363152cfc3751fb65a31f3c61700e428ec1aedf2b7efbd6d41d0aa7efd4294ae3
7
+ data.tar.gz: 256bc96c37f4761e4bf03edfaa222dd044e38d589f518b844c1509fe9dce70bd5551b2e312d767a6e3eca60f65bbe862226d516bbf00e09d036b9b83b1d7cc6c
@@ -21,7 +21,11 @@ module Callstacking
21
21
  p: params.to_h,
22
22
  })
23
23
 
24
- return resp.body["trace_id"], resp.body["pulse_interval"]
24
+ if resp.status == 200
25
+ return resp.body["trace_id"], resp.body["pulse_interval"], resp.body["max_trace_entries"]
26
+ end
27
+
28
+ nil
25
29
  end
26
30
 
27
31
  def upsert(trace_id, traces)
@@ -20,6 +20,8 @@ module Callstacking
20
20
  # Application level method definitions
21
21
  return unless method_path =~ root if application_level
22
22
 
23
+ return if method_path =~ /initializer/i
24
+
23
25
  tmp_module = find_or_initialize_module
24
26
 
25
27
  return if tmp_module.nil? ||
@@ -48,7 +50,8 @@ module Callstacking
48
50
  end
49
51
 
50
52
  def find_or_initialize_module
51
- return if klass&.name == nil
53
+ name = klass&.name rescue nil
54
+ return if name.nil?
52
55
 
53
56
  module_name = "#{klass.name.gsub('::', '')}Span"
54
57
  module_index = klass.ancestors.map(&:to_s).index(module_name)
@@ -25,11 +25,13 @@ module Callstacking
25
25
  read_settings
26
26
 
27
27
  trace_id = nil
28
+ max_trace_entries = nil
28
29
 
29
30
  ActiveSupport::Notifications.subscribe("start_processing.action_controller") do |name, start, finish, id, payload|
30
- trace_id = start_request(payload[:request]&.request_id, payload[:method], payload[:controller],
31
- payload[:action], payload[:format], ::Rails.root,
32
- payload[:original_url], payload[:headers], payload[:params])
31
+ trace_id, max_trace_entries = start_request(payload[:request]&.request_id, payload[:method], payload[:controller],
32
+ payload[:action], payload[:format], ::Rails.root,
33
+ payload[:request]&.original_url,
34
+ payload[:headers], payload[:params])
33
35
  end
34
36
 
35
37
  @spans.on_call_entry do |nesting_level, order_num, klass, method_name, arguments, path, line_no|
@@ -41,7 +43,10 @@ module Callstacking
41
43
  end
42
44
 
43
45
  ActiveSupport::Notifications.subscribe("process_action.action_controller") do |name, start, finish, id, payload|
44
- complete_request(payload[:method], payload[:controller], payload[:action], payload[:format], trace_id)
46
+ complete_request(payload[:method], payload[:controller],
47
+ payload[:action], payload[:format],
48
+ payload[:request]&.original_url,
49
+ trace_id, max_trace_entries)
45
50
  end
46
51
  end
47
52
 
@@ -57,43 +62,55 @@ module Callstacking
57
62
 
58
63
  def create_call_return(coupled_callee, nesting_level, order_num, klass, method_name, path, line_no, return_val, traces)
59
64
  lock.synchronize do
60
- traces << { trace_entry: { trace_entryable_type: 'TraceCallReturn',
61
- order_num: order_num,
62
- nesting_level: nesting_level,
63
- trace_entryable_attributes: {
64
- local_variables: {},
65
- klass: klass_name(klass),
66
- line_number: line_no,
67
- path: path,
68
- method_name: method_name,
69
- return_value: return_val.inspect,
70
- coupled_callee: coupled_callee,
71
- } } }
65
+ traces << { type: 'TraceCallReturn',
66
+ order_num: order_num,
67
+ nesting_level: nesting_level,
68
+ local_variables: {},
69
+ args: {},
70
+ klass: klass_name(klass),
71
+ line_number: line_no,
72
+ path: path,
73
+ method_name: method_name,
74
+ return_value: return_value(return_val),
75
+ coupled_callee: coupled_callee,
76
+ message: nil,
77
+ }
72
78
  end
73
79
  end
80
+
74
81
  def create_call_entry(nesting_level, order_num, klass, method_name, arguments, path, line_no, traces)
75
82
  lock.synchronize do
76
- traces << { trace_entry: { trace_entryable_type: 'TraceCallEntry',
77
- order_num: order_num,
78
- nesting_level: nesting_level,
79
- trace_entryable_attributes: {
80
- args: arguments,
81
- klass: klass_name(klass),
82
- line_number: line_no,
83
- path: path,
84
- method_name: method_name,
85
- } } }
83
+ traces << { type: 'TraceCallEntry',
84
+ order_num: order_num,
85
+ nesting_level: nesting_level,
86
+ args: arguments,
87
+ klass: klass_name(klass),
88
+ line_number: line_no,
89
+ path: path,
90
+ method_name: method_name,
91
+ return_value: nil,
92
+ coupled_callee: nil,
93
+ local_variables: {},
94
+ message: nil,
95
+ }
86
96
  end
87
97
  end
88
98
 
89
99
  def create_message(message, order_num, traces)
90
100
  lock.synchronize do
91
- traces << { trace_entry: { trace_entryable_type: 'TraceMessage',
92
- order_num: order_num,
93
- nesting_level: 0,
94
- trace_entryable_attributes: {
95
- message: message
96
- } } }
101
+ traces << { type: 'TraceMessage',
102
+ order_num: order_num,
103
+ nesting_level: 0,
104
+ message: message,
105
+ args: {},
106
+ klass: nil,
107
+ line_number: nil,
108
+ path: nil,
109
+ method_name: nil,
110
+ return_value: nil,
111
+ coupled_callee: false,
112
+ local_variables: {},
113
+ }
97
114
  end
98
115
  end
99
116
 
@@ -101,30 +118,55 @@ module Callstacking
101
118
  lock.synchronize do
102
119
  return if traces.empty?
103
120
 
104
- client.upsert(trace_id, { traces: traces })
121
+ client.upsert(trace_id, { trace_entries: traces })
105
122
  traces.clear
106
123
  end
107
124
  end
108
125
  def start_request(request_id, method, controller, action, format, path, original_url, headers, params)
126
+ return if do_not_track_request?(original_url)
127
+
109
128
  request_id = request_id || SecureRandom.uuid
110
129
  Callstacking::Rails::Trace.current_request_id = request_id
111
130
 
112
- trace_id, _interval = client.create(method, controller, action, format,
113
- path, original_url, request_id, headers,
114
- params)
131
+ trace_id, _interval, max_trace_entries = client.create(method, controller, action, format,
132
+ path, original_url, request_id, headers,
133
+ params)
115
134
 
116
135
  puts "#{settings[:url] || Callstacking::Rails::Settings::PRODUCTION_URL}/traces/#{trace_id}"
117
136
 
118
137
  create_message(start_request_message(method, controller, action, format),
119
138
  spans.increment_order_num, @traces)
120
139
 
121
- trace_id
140
+ return trace_id, max_trace_entries
122
141
  end
123
142
 
124
- def complete_request(method, controller, action, format, trace_id)
143
+ def complete_request(method, controller, action, format, original_url, trace_id, max_trace_entries)
144
+ return if do_not_track_request?(original_url)
145
+
125
146
  create_message(completed_request_message(method, controller, action, format),
126
147
  spans.increment_order_num, @traces)
127
- send_traces!(trace_id, @traces)
148
+
149
+ send_traces!(trace_id, @traces[0..max_trace_entries])
150
+ end
151
+
152
+ def track_request?(url)
153
+ !(track_request?(url))
154
+ end
155
+
156
+ def do_not_track_request?(url)
157
+ url =~ /(\/stylesheets\/|\/javascripts\/|\/css\/|\/js\/|\.js|\.css)/i
158
+ end
159
+
160
+ def return_value(return_val)
161
+ return_val.inspect
162
+ rescue ThreadError
163
+ # deadlock; recursive locking (ThreadError)
164
+ # Discourse overrides ActiveSupport::Inflector methods via lib/freedom_patches/inflector_backport.rb
165
+ # when return_value.inspect is called, it triggers a subsequent call
166
+ # to the instrumented inflector method, causing another call to mutex#synchronize
167
+ # from the block of the first synchronize call
168
+
169
+ return_val.to_s rescue "****" # Can't evaluate
128
170
  end
129
171
 
130
172
  def klass_name(klass)
@@ -1,5 +1,5 @@
1
1
  module Callstacking
2
2
  module Rails
3
- VERSION = "0.1.8"
3
+ VERSION = "0.1.10"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callstacking-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Jones
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-17 00:00:00.000000000 Z
11
+ date: 2023-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -28,22 +28,16 @@ dependencies:
28
28
  name: faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.0.0
34
- - - "<"
31
+ - - "~>"
35
32
  - !ruby/object:Gem::Version
36
- version: 2.0.0
33
+ version: '1.10'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: 1.0.0
44
- - - "<"
38
+ - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: 2.0.0
40
+ version: '1.10'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: faraday-follow_redirects
49
43
  requirement: !ruby/object:Gem::Requirement